diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index a4e5d9d8..fe94cd5f 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -740,6 +740,8 @@ class InvitationSerializer(serializers.ModelSerializer): if self.instance is None: attrs["issuer"] = user + attrs["email"] = attrs["email"].lower() + return attrs def validate_role(self, role): diff --git a/src/backend/core/tests/documents/test_api_document_invitations.py b/src/backend/core/tests/documents/test_api_document_invitations.py index 33d99d8a..94c5f881 100644 --- a/src/backend/core/tests/documents/test_api_document_invitations.py +++ b/src/backend/core/tests/documents/test_api_document_invitations.py @@ -596,6 +596,32 @@ def test_api_document_invitations_create_cannot_invite_existing_users(): } +def test_api_document_invitations_create_lower_email(): + """ + No matter the case, the email should be converted to lowercase. + """ + user = factories.UserFactory() + document = factories.DocumentFactory(users=[(user, "owner")]) + + # Build an invitation to the email of an existing identity in the db + invitation_values = { + "email": "GuEst@example.com", + "role": random.choice(models.RoleChoices.values), + } + + client = APIClient() + client.force_login(user) + + response = client.post( + f"/api/v1.0/documents/{document.id!s}/invitations/", + invitation_values, + format="json", + ) + + assert response.status_code == 201 + assert response.json()["email"] == "guest@example.com" + + # Update