From 97752e1d5fa2dc265d9313ad8fe9a0e10db55b3a Mon Sep 17 00:00:00 2001 From: Lebaud Antoine Date: Thu, 21 Mar 2024 11:37:23 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A9=B9(factory)=20handle=20email=20unique?= =?UTF-8?q?ness?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When generating a batch of users using Faker, there's a possibility of generating multiple users with the same email address. This breaches the uniqueness constraint set on the email field, leading to flaky tests that may fail when random behavior coincides unfavorably. Implemented a method inspired by Identity's model to ensure unique email addresses when creating user batches with Faker. Updated relevant tests for improved stability. --- src/backend/core/factories.py | 1 + src/backend/core/tests/test_models_users.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/core/factories.py b/src/backend/core/factories.py index 90aa9d3..80aca09 100644 --- a/src/backend/core/factories.py +++ b/src/backend/core/factories.py @@ -124,6 +124,7 @@ class UserFactory(factory.django.DjangoModelFactory): class Meta: model = models.User + django_get_or_create = ("email",) email = factory.Faker("email") language = factory.fuzzy.FuzzyChoice([lang[0] for lang in settings.LANGUAGES]) diff --git a/src/backend/core/tests/test_models_users.py b/src/backend/core/tests/test_models_users.py index a965e78..d522f74 100644 --- a/src/backend/core/tests/test_models_users.py +++ b/src/backend/core/tests/test_models_users.py @@ -36,13 +36,13 @@ def test_models_users_email_unique(): with pytest.raises( ValidationError, match="User with this Email address already exists." ): - factories.UserFactory(email=user.email) + models.User.objects.create(email=user.email) def test_models_users_email_several_null(): """Several users with a null value for the "email" field can co-exist.""" factories.UserFactory(email=None) - factories.UserFactory(email=None) + models.User.objects.create(email=None, password="foo.") assert models.User.objects.filter(email__isnull=True).count() == 2