From c10abc9f083759a92a5c5cf3a81ca4dda1618c56 Mon Sep 17 00:00:00 2001 From: Paul Schilling Date: Wed, 5 Feb 2025 12:15:54 +0100 Subject: [PATCH] [#2967] Fix verification email not sent - The verification email flow was previously changed to account for duplicate emails sent during registration or profile edits. This had the effect that emails were *not* automatically sent at all when the user changed their email again. --- .../accounts/views/registration.py | 6 ++-- .../mail/tests/test_verification.py | 34 ++++++++++++++++++- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/open_inwoner/accounts/views/registration.py b/src/open_inwoner/accounts/views/registration.py index 1975890c35..4c17b2f6d0 100644 --- a/src/open_inwoner/accounts/views/registration.py +++ b/src/open_inwoner/accounts/views/registration.py @@ -245,12 +245,12 @@ def get(self, request, *args, **kwargs): get_next_url_from(self.request, default=reverse("pages-root")) ) - # send verification email immediately on requesting page, but only once - if not request.session.get("verification_email_sent"): + # send verification email immediately on requesting page + if request.session.get("verification_email_sent_to") != user.email: send_user_email_verification_mail( user, next_url=get_next_url_from(self.request, default="") ) - request.session["verification_email_sent"] = True + request.session["verification_email_sent_to"] = user.email return super().get(request, *args, **kwargs) diff --git a/src/open_inwoner/mail/tests/test_verification.py b/src/open_inwoner/mail/tests/test_verification.py index 538390c753..8bdc67e8cb 100644 --- a/src/open_inwoner/mail/tests/test_verification.py +++ b/src/open_inwoner/mail/tests/test_verification.py @@ -2,7 +2,7 @@ from django.conf import settings from django.core import mail -from django.test import TestCase, override_settings +from django.test import RequestFactory, TestCase, override_settings from django.urls import reverse from django_webtest import WebTest @@ -11,6 +11,7 @@ from pyquery.pyquery import PyQuery from open_inwoner.accounts.tests.factories import UserFactory +from open_inwoner.accounts.views.registration import EmailVerificationUserView from open_inwoner.cms.profile.cms_apps import ProfileApphook from open_inwoner.cms.tests import cms_tools from open_inwoner.configurations.models import SiteConfiguration @@ -322,3 +323,34 @@ def test_unverified_user_redirects__with_next_url(self, mock_send): # email sent after submitting form mock_send.assert_called_once_with(user, target_url) + + @patch( + "open_inwoner.accounts.views.registration.send_user_email_verification_mail", + autospec=True, + ) + def test_verification_email_dupes(self, mock_send): + request_factory = RequestFactory() + user = UserFactory(email="foo@example.com") + + request = request_factory.get("/") + request.session = {} + request.user = user + + view = EmailVerificationUserView.as_view() + + # two requests with the same email: one call + view(request) + view(request) + + mock_send.assert_called_once_with(user, next_url="") + + # request with changed email: two calls + user.email = "changed@example.com" + view(request) + + self.assertEqual(len(mock_send.call_args_list), 2) + + # still two calls + view(request) + + self.assertEqual(len(mock_send.call_args_list), 2)