From 7bebf13d889197d564db5c9403979748c8dccea0 Mon Sep 17 00:00:00 2001 From: Marie PUPO JEAMMET Date: Fri, 13 Jun 2025 15:56:06 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B(domains)=20reduce=20logs=20around?= =?UTF-8?q?=20domain=20invitations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reduce logs and add tests around domain invitations --- src/backend/mailbox_manager/signals.py | 7 ++++-- .../test_api_domain_invitations_create.py | 23 +++++++++++++++++++ .../tests/models/test_invitations.py | 11 ++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/backend/mailbox_manager/signals.py b/src/backend/mailbox_manager/signals.py index f39db92..edfb8d5 100644 --- a/src/backend/mailbox_manager/signals.py +++ b/src/backend/mailbox_manager/signals.py @@ -23,7 +23,6 @@ def convert_domain_invitations(sender, created, instance, **kwargs): # pylint: Convert valid domain invitations to domain accesses for a given user. Expired invitations are ignored. """ - logger.info("Convert domain invitations for user %s", instance) if created: valid_domain_invitations = MailDomainInvitation.objects.filter( email=instance.email, @@ -36,6 +35,11 @@ def convert_domain_invitations(sender, created, instance, **kwargs): # pylint: if not valid_domain_invitations.exists(): return + logger.info( + "Converting %s domain invitations for new user %s", + len(valid_domain_invitations), + instance, + ) MailDomainAccess.objects.bulk_create( [ MailDomainAccess( @@ -46,4 +50,3 @@ def convert_domain_invitations(sender, created, instance, **kwargs): # pylint: ) valid_domain_invitations.delete() - logger.info("Invitations converted to domain accesses for user %s", instance) diff --git a/src/backend/mailbox_manager/tests/api/invitations/test_api_domain_invitations_create.py b/src/backend/mailbox_manager/tests/api/invitations/test_api_domain_invitations_create.py index 5616a5b..9b25d24 100644 --- a/src/backend/mailbox_manager/tests/api/invitations/test_api_domain_invitations_create.py +++ b/src/backend/mailbox_manager/tests/api/invitations/test_api_domain_invitations_create.py @@ -141,3 +141,26 @@ def test_api_domain_invitations__should_not_create_duplicate_invitations(): assert response.json()["__all__"] == [ "Mail domain invitation with this Email address and Domain already exists." ] + + +def test_api_domain_invitations__should_not_invite_when_user_already_exists(): + """Already existing users should not be invited but given access directly.""" + existing_user = core_factories.UserFactory() + + # Grant privileged role on the domain to the user + access = factories.MailDomainAccessFactory(role=enums.MailDomainRoleChoices.OWNER) + + client = APIClient() + client.force_login(access.user) + invitation_values = serializers.MailDomainInvitationSerializer( + factories.MailDomainInvitationFactory.build(email=existing_user.email) + ).data + response = client.post( + f"/api/v1.0/mail-domains/{access.domain.slug}/invitations/", + invitation_values, + format="json", + ) + assert response.status_code == status.HTTP_400_BAD_REQUEST + assert response.json()["email"] == [ + "This email is already associated to a registered user." + ] diff --git a/src/backend/mailbox_manager/tests/models/test_invitations.py b/src/backend/mailbox_manager/tests/models/test_invitations.py index e08254d..d084614 100644 --- a/src/backend/mailbox_manager/tests/models/test_invitations.py +++ b/src/backend/mailbox_manager/tests/models/test_invitations.py @@ -38,11 +38,15 @@ def test_models_domain_invitations__is_expired(): assert expired_invitation.is_expired is True -def test_models_domain_invitation__should_convert_invitations_to_accesses_upon_joining(): +def test_models_domain_invitation__should_convert_invitations_to_accesses_upon_joining( + caplog, +): """ Upon creating a new user, domain invitations linked to that email should be converted to accesses and then deleted. """ + caplog.set_level("INFO") + # Two invitations to the same mail but to different domains email = "future_admin@example.com" invitation_to_domain1 = factories.MailDomainInvitationFactory( @@ -81,3 +85,8 @@ def test_models_domain_invitation__should_convert_invitations_to_accesses_upon_j assert models.MailDomainInvitation.objects.filter( domain=invitation_to_domain2.domain, email=other_invitation.email ).exists() # the other invitation remains + + log_messages = [msg.message for msg in caplog.records] + assert ( + f"Converting 2 domain invitations for new user {str(new_user)}" in log_messages + )