Skip to content

Commit

Permalink
Stabilize test_populate_job_seekers
Browse files Browse the repository at this point in the history
Remove the PK, it may fail when a user with that PK already exists.

https://github.com/gip-inclusion/les-emplois/actions/runs/8602168736/job/23571094021

[gw1] linux -- Python 3.11.8 /home/runner/work/les-emplois/les-emplois/.venv/bin/python3.11

self = <django.db.backends.utils.CursorWrapper object at 0x7f283c04ab50>
sql = 'INSERT INTO "users_user" ("password", "last_login", "is_superuser", "username", "first_name", "last_name", "is_staff"...s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING "users_user"."id"'
params = ('pbkdf2_sha256$720000$CMIMOF2wpjebftDHharSAf$JZr9+VPfyxcezMoepfCHOJeNmpyEg4kWQswHM220uSg=', None, False, 'user_name2074', 'Edward', 'Miller', ...)
ignored_wrapper_args = (False, {'connection': <DatabaseWrapper vendor='postgresql' alias='default'>, 'cursor': <django.db.backends.utils.CursorWrapper object at 0x7f283c04ab50>})

    def _execute(self, sql, params, *ignored_wrapper_args):
        # Raise a warning during app initialization (stored_app_configs is only
        # ever set during testing).
        if not apps.ready and not apps.stored_app_configs:
            warnings.warn(self.APPS_NOT_READY_WARNING_MSG, category=RuntimeWarning)
        self.db.validate_no_broken_transaction()
        with self.db.wrap_database_errors:
            if params is None:
                # params default might be backend specific.
                return self.cursor.execute(sql)
            else:
>               return self.cursor.execute(sql, params)

.venv/lib/python3.11/site-packages/django/db/backends/utils.py:105:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <django.db.backends.postgresql.base.Cursor [closed] [IDLE] (host=127.0.0.1 user=postgres database=test_itou_gw1) at 0x7f2839ae5fd0>
query = 'INSERT INTO "users_user" ("password", "last_login", "is_superuser", "username", "first_name", "last_name", "is_staff"...s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING "users_user"."id"'
params = ('pbkdf2_sha256$720000$CMIMOF2wpjebftDHharSAf$JZr9+VPfyxcezMoepfCHOJeNmpyEg4kWQswHM220uSg=', None, False, 'user_name2074', 'Edward', 'Miller', ...)

    def execute(
        self: _Self,
        query: Query,
        params: Optional[Params] = None,
        *,
        prepare: Optional[bool] = None,
        binary: Optional[bool] = None,
    ) -> _Self:
        """
        Execute a query or command to the database.
        """
        try:
            with self._conn.lock:
                self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           psycopg.errors.UniqueViolation: duplicate key value violates unique constraint "users_user_pkey"
E           DETAIL:  Key (id)=(2010) already exists.

.venv/lib/python3.11/site-packages/psycopg/cursor.py:737: UniqueViolation

The above exception was the direct cause of the following exception:

    @pytest.mark.django_db(transaction=True)
    @pytest.mark.usefixtures("metabase")
    def test_populate_job_seekers():
        QPVFactory(code="QP075019")

        # Importing this file makes a query so we need to do it inside a test
        # and before the assertNumQueries
        from itou.metabase.tables.job_seekers import get_user_age_in_years

        # First user
        #  - no job application
        #  - created by prescriber
        #  - no coords for QPV
        #  - uses PE_CONNECT
        #  - has no PE number
        #  - logged_in recently
        #  - in QPV
        user_1 = JobSeekerFactory(
            pk=2010,
            created_by=PrescriberFactory(),
            identity_provider=IdentityProvider.PE_CONNECT,
            jobseeker_profile__pole_emploi_id="",
            last_login=timezone.now(),
            jobseeker_profile__nir="179038704133768",
            post_code="33360",
            geocoding_score=1,
            coords=coords_to_geometry("48.85592", "2.41299"),
        )
        # Second user
        #  - job_application / approval from ai stock
        #  - created by an employer
        #  - outside QPV
        user_2 = JobSeekerFactory(
            pk=15752,
            created_by=EmployerFactory(),
            jobseeker_profile__nir="271049232724647",
            geocoding_score=1,
            coords=Point(0, 0),  # QPV utils is mocked
            with_pole_emploi_id=True,
        )
        job_application_2 = JobApplicationFactory(
            with_approval=True,
            approval__eligibility_diagnosis=None,
            job_seeker=user_2,
            approval__origin=Origin.AI_STOCK,
        )

        job_application_2.eligibility_diagnosis.administrative_criteria.add(*list(AdministrativeCriteria.objects.all()))

        # Third user
        #  - multiple eligibility diagnosis
        #  - last eligibility diagnosis from an employer
        #  - not an AI
        #  - outside QPV but missing geocoding score
        user_3 = JobSeekerFactory(
            pk=26587,
            jobseeker_profile__nir="297016314515713",
            with_pole_emploi_id=True,
            geocoding_score=None,
            coords=Point(0, 0),  # QPV utils is mocked
        )
        job_application_3 = JobApplicationFactory(
            job_seeker=user_3,
            created_at=datetime.datetime(2023, 1, 1, tzinfo=datetime.UTC),
            with_approval=True,
            eligibility_diagnosis__author_kind=UserKind.EMPLOYER,
            eligibility_diagnosis__author_prescriber_organization=None,
            eligibility_diagnosis__author_siae=CompanyFactory(),
            to_company__kind="ETTI",
        )
        # Older accepted job_application with no eligibility diagnosis
        # Allow to check get_hiring_company()
>       JobApplicationFactory(
            job_seeker=user_3,
            with_approval=True,
            approval=job_application_3.approval,
            eligibility_diagnosis=None,
            created_at=datetime.datetime(2022, 1, 1, tzinfo=datetime.UTC),
        )

tests/metabase/management/test_populate_metabase_emplois.py:192:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
.venv/lib/python3.11/site-packages/factory/base.py:40: in __call__
    return cls.create(**kwargs)
.venv/lib/python3.11/site-packages/factory/base.py:528: in create
    return cls._generate(enums.CREATE_STRATEGY, kwargs)
.venv/lib/python3.11/site-packages/factory/django.py:121: in _generate
    return super()._generate(strategy, params)
.venv/lib/python3.11/site-packages/factory/base.py:465: in _generate
    return step.build()
.venv/lib/python3.11/site-packages/factory/builder.py:270: in build
    step.resolve(pre)
.venv/lib/python3.11/site-packages/factory/builder.py:211: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
.venv/lib/python3.11/site-packages/factory/builder.py:356: in __getattr__
    value = value.evaluate_pre(
.venv/lib/python3.11/site-packages/factory/declarations.py:543: in evaluate_pre
    return self._unwrap_evaluate_pre(
.venv/lib/python3.11/site-packages/factory/declarations.py:58: in _unwrap_evaluate_pre
    return wrapped.evaluate_pre(
.venv/lib/python3.11/site-packages/factory/declarations.py:543: in evaluate_pre
    return self._unwrap_evaluate_pre(
.venv/lib/python3.11/site-packages/factory/declarations.py:58: in _unwrap_evaluate_pre
    return wrapped.evaluate_pre(
.venv/lib/python3.11/site-packages/factory/declarations.py:543: in evaluate_pre
    return self._unwrap_evaluate_pre(
.venv/lib/python3.11/site-packages/factory/declarations.py:58: in _unwrap_evaluate_pre
    return wrapped.evaluate_pre(
.venv/lib/python3.11/site-packages/factory/declarations.py:67: in evaluate_pre
    return self.evaluate(instance, step, context)
.venv/lib/python3.11/site-packages/factory/declarations.py:457: in evaluate
    return step.recurse(subfactory, extra, force_sequence=force_sequence)
.venv/lib/python3.11/site-packages/factory/builder.py:228: in recurse
    return builder.build(parent_step=self, force_sequence=force_sequence)
.venv/lib/python3.11/site-packages/factory/builder.py:274: in build
    instance = self.factory_meta.instantiate(
.venv/lib/python3.11/site-packages/factory/base.py:317: in instantiate
    return self.factory._create(model, *args, **kwargs)
.venv/lib/python3.11/site-packages/factory/django.py:174: in _create
    return manager.create(*args, **kwargs)
.venv/lib/python3.11/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
.venv/lib/python3.11/site-packages/django/db/models/query.py:679: in create
    obj.save(force_insert=True, using=self.db)
itou/users/models.py:302: in save
    super().save(*args, **kwargs)
.venv/lib/python3.11/site-packages/django/contrib/auth/base_user.py:78: in save
    super().save(*args, **kwargs)
.venv/lib/python3.11/site-packages/django/db/models/base.py:822: in save
    self.save_base(
.venv/lib/python3.11/site-packages/django/db/models/base.py:909: in save_base
    updated = self._save_table(
.venv/lib/python3.11/site-packages/django/db/models/base.py:1067: in _save_table
    results = self._do_insert(
.venv/lib/python3.11/site-packages/django/db/models/base.py:1108: in _do_insert
    return manager._insert(
.venv/lib/python3.11/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
.venv/lib/python3.11/site-packages/django/db/models/query.py:1847: in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py:1823: in execute_sql
    cursor.execute(sql, params)
.venv/lib/python3.11/site-packages/sentry_sdk/integrations/django/__init__.py:641: in execute
    result = real_execute(self, sql, params)
.venv/lib/python3.11/site-packages/django/db/backends/utils.py:79: in execute
    return self._execute_with_wrappers(
.venv/lib/python3.11/site-packages/django/db/backends/utils.py:92: in _execute_with_wrappers
    return executor(sql, params, many, context)
.venv/lib/python3.11/site-packages/django/db/backends/utils.py:100: in _execute
    with self.db.wrap_database_errors:
.venv/lib/python3.11/site-packages/django/db/utils.py:91: in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
.venv/lib/python3.11/site-packages/django/db/backends/utils.py:105: in _execute
    return self.cursor.execute(sql, params)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <django.db.backends.postgresql.base.Cursor [closed] [IDLE] (host=127.0.0.1 user=postgres database=test_itou_gw1) at 0x7f2839ae5fd0>
query = 'INSERT INTO "users_user" ("password", "last_login", "is_superuser", "username", "first_name", "last_name", "is_staff"...s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING "users_user"."id"'
params = ('pbkdf2_sha256$720000$CMIMOF2wpjebftDHharSAf$JZr9+VPfyxcezMoepfCHOJeNmpyEg4kWQswHM220uSg=', None, False, 'user_name2074', 'Edward', 'Miller', ...)

    def execute(
        self: _Self,
        query: Query,
        params: Optional[Params] = None,
        *,
        prepare: Optional[bool] = None,
        binary: Optional[bool] = None,
    ) -> _Self:
        """
        Execute a query or command to the database.
        """
        try:
            with self._conn.lock:
                self._conn.wait(
                    self._execute_gen(query, params, prepare=prepare, binary=binary)
                )
        except e._NO_TRACEBACK as ex:
>           raise ex.with_traceback(None)
E           django.db.utils.IntegrityError: duplicate key value violates unique constraint "users_user_pkey"
E           DETAIL:  Key (id)=(2010) already exists.

.venv/lib/python3.11/site-packages/psycopg/cursor.py:737: IntegrityError
=========================== short test summary info ============================
FAILED tests/metabase/management/test_populate_metabase_emplois.py::test_populate_job_seekers - django.db.utils.IntegrityError: duplicate key value violates unique constraint "users_user_pkey"
DETAIL:  Key (id)=(2010) already exists.
================== 1 failed, 2531 passed in 234.20s (0:03:54) ==================
  • Loading branch information
francoisfreitag committed Apr 16, 2024
1 parent 8e65d3b commit cec17df
Showing 1 changed file with 3 additions and 6 deletions.
9 changes: 3 additions & 6 deletions tests/metabase/management/test_populate_metabase_emplois.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,6 @@ def test_populate_job_seekers():
# - logged_in recently
# - in QPV
user_1 = JobSeekerFactory(
pk=2010,
created_by=PrescriberFactory(),
identity_provider=IdentityProvider.PE_CONNECT,
jobseeker_profile__pole_emploi_id="",
Expand All @@ -150,7 +149,6 @@ def test_populate_job_seekers():
# - created by an employer
# - outside QPV
user_2 = JobSeekerFactory(
pk=15752,
created_by=EmployerFactory(),
jobseeker_profile__nir="271049232724647",
geocoding_score=1,
Expand All @@ -172,7 +170,6 @@ def test_populate_job_seekers():
# - not an AI
# - outside QPV but missing geocoding score
user_3 = JobSeekerFactory(
pk=26587,
jobseeker_profile__nir="297016314515713",
with_pole_emploi_id=True,
geocoding_score=None,
Expand Down Expand Up @@ -227,7 +224,7 @@ def test_populate_job_seekers():

assert rows == [
(
2010,
user_1.pk,
"28e41a0abf44151d54b9006aa6308d71d15284f7cc83a200b8fc6a9ffdf58352",
"Homme",
79,
Expand Down Expand Up @@ -278,7 +275,7 @@ def test_populate_job_seekers():
datetime.date.today() - datetime.timedelta(days=1),
),
(
15752,
user_2.pk,
"d4d74522c83e8371e4ccafa994a70bb802b59d8e143177cf048e71c9b9d2e34a",
"Femme",
71,
Expand Down Expand Up @@ -329,7 +326,7 @@ def test_populate_job_seekers():
datetime.date.today() - datetime.timedelta(days=1),
),
(
26587,
user_3.pk,
"2eb53772722d3026b539173c62ba7adc1756e5ab1f03b95ce4026c27d177bd34",
"Femme",
97,
Expand Down

0 comments on commit cec17df

Please sign in to comment.