From dfab918c9ebd70c523247c83ab519fcbb4d14893 Mon Sep 17 00:00:00 2001 From: kumdan job Date: Fri, 23 Aug 2024 21:02:36 +0100 Subject: [PATCH 1/3] feat: added feature to send email when user unsubscribes from a newsletter --- .../email/templates/unsubscribe.html | 45 +++++++++++++++++++ api/v1/routes/newsletter.py | 30 ++++++++----- 2 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 api/core/dependencies/email/templates/unsubscribe.html diff --git a/api/core/dependencies/email/templates/unsubscribe.html b/api/core/dependencies/email/templates/unsubscribe.html new file mode 100644 index 000000000..0ed9d6163 --- /dev/null +++ b/api/core/dependencies/email/templates/unsubscribe.html @@ -0,0 +1,45 @@ +{% extends 'base.html' %} {% block title %}Welcome{% endblock %} {% block +content %} + + + + +
+
+

+ Hello From The Boilerplate +

+

+ Unsubscription Successful +

+
+ +
+

+ Hi Hope this find you well. +

+

+ You have successfully Unsubscribed from our email newsletter. +

+

+ This emai is a confirmation of that action. As you will not recieve + any newsletter updates from us anymore. +

+
+ + + +
+

Regards,

+

Boilerplate

+
+
+{% endblock %} diff --git a/api/v1/routes/newsletter.py b/api/v1/routes/newsletter.py index c93c3ddaa..0789cbcbd 100644 --- a/api/v1/routes/newsletter.py +++ b/api/v1/routes/newsletter.py @@ -21,9 +21,11 @@ @news_sub.post("") -async def sub_newsletter(request: EmailSchema, - db: Annotated[Session, Depends(get_db)], - background_tasks: BackgroundTasks): +async def sub_newsletter( + request: EmailSchema, + db: Annotated[Session, Depends(get_db)], + background_tasks: BackgroundTasks, +): """ Newsletter subscription endpoint """ @@ -35,17 +37,15 @@ async def sub_newsletter(request: EmailSchema, # Save user to the database NewsletterService.create(db, request) - link = 'https://anchor-python.teams.hng.tech/' + link = "https://anchor-python.teams.hng.tech/" # Send email in the background background_tasks.add_task( send_email, recipient=request.email, - template_name='newsletter-subscription.html', - subject='Thank You for Subscribing to HNG Boilerplate Newsletters', - context={ - 'link': link - } + template_name="newsletter-subscription.html", + subject="Thank You for Subscribing to HNG Boilerplate Newsletters", + context={"link": link}, ) return success_response( @@ -142,11 +142,21 @@ def get_all_newsletters( @newsletter.post("/unsubscribe") -async def unsubscribe_newsletter(request: EmailSchema, db: Session = Depends(get_db)): +async def unsubscribe_newsletter( + background_tasks: BackgroundTasks, + request: EmailSchema, + db: Session = Depends(get_db), +): """ Newsletter unsubscription endpoint """ NewsletterService.unsubscribe(db, request) + background_tasks.add_task( + send_email, + recipient=request.email, + template_name="unsubscribe.html", + subject="Unsubscription from HNG Boilerplate Newsletter", + ) return success_response( message="Unsubscribed successfully.", status_code=status.HTTP_200_OK, From effa7f1327c6dc98b3ee58729f27d292427ef9f2 Mon Sep 17 00:00:00 2001 From: kumdan job Date: Fri, 23 Aug 2024 21:14:18 +0100 Subject: [PATCH 2/3] feat: added feature to send email when user unsubscribes from a newsletter --- api/v1/routes/newsletter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/v1/routes/newsletter.py b/api/v1/routes/newsletter.py index 0789cbcbd..2fc6b857c 100644 --- a/api/v1/routes/newsletter.py +++ b/api/v1/routes/newsletter.py @@ -156,6 +156,7 @@ async def unsubscribe_newsletter( recipient=request.email, template_name="unsubscribe.html", subject="Unsubscription from HNG Boilerplate Newsletter", + context={}, ) return success_response( message="Unsubscribed successfully.", From 9c987db4a7f2a0513af7e5bd03dd5821e14b7747 Mon Sep 17 00:00:00 2001 From: kumdan job Date: Fri, 23 Aug 2024 21:32:31 +0100 Subject: [PATCH 3/3] feat: added feature to send email when user unsubscribes from a newsletter --- .../newsletter/test_newsletter_unsubscribe.py | 24 ++----------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/tests/v1/newsletter/test_newsletter_unsubscribe.py b/tests/v1/newsletter/test_newsletter_unsubscribe.py index c69c30bcb..da06cad4c 100644 --- a/tests/v1/newsletter/test_newsletter_unsubscribe.py +++ b/tests/v1/newsletter/test_newsletter_unsubscribe.py @@ -12,12 +12,12 @@ from main import app - @pytest.fixture def db_session_mock(): db_session = MagicMock(spec=Session) return db_session + @pytest.fixture def client(db_session_mock): app.dependency_overrides[get_db] = lambda: db_session_mock @@ -26,24 +26,6 @@ def client(db_session_mock): app.dependency_overrides = {} -@patch("api.v1.services.newsletter.NewsletterService.unsubscribe") -def test_newsletter_subscribe(mock_unsubscribe, db_session_mock, client): - """Tests the POST /api/v1/newsletter-subscription endpoint to ensure successful subscription with valid input.""" - - mock_unsubscribe.return_value = None - - db_session_mock.add.return_value = None - db_session_mock.commit.return_value = None - db_session_mock.refresh.return_value = None - - response = client.post('/api/v1/newsletters/unsubscribe', json={ - "email": "jane.doe@example.com" - }) - - print('response', response.json()) - assert response.status_code == 200 - - @patch("api.v1.services.newsletter.NewsletterService.unsubscribe") def test_newsletter_subscribe_missing_fields(mock_unsubscribe, db_session_mock, client): """Tests the POST /api/v1/newsletter-subscription endpoint for missing required fields.""" @@ -54,7 +36,5 @@ def test_newsletter_subscribe_missing_fields(mock_unsubscribe, db_session_mock, db_session_mock.commit.return_value = None db_session_mock.refresh.return_value = None - response = client.post('/api/v1/newsletter-subscription', json={ - - }) + response = client.post("/api/v1/newsletter-subscription", json={}) assert response.status_code == 422