From 996647d33f766e56c4cefe87458c52776aa3c043 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Tue, 3 Sep 2024 09:40:02 +0200 Subject: [PATCH] (PC-30722)[PRO] fix: tests after NPP for all users --- api/src/pcapi/core/users/factories.py | 12 ++++-- .../core/external/external_users_test.py | 1 + api/tests/core/users/test_api.py | 36 ++++++++-------- .../routes/backoffice/autocomplete_test.py | 2 +- api/tests/routes/backoffice/offerers_test.py | 36 ++++++++-------- api/tests/routes/backoffice/pro_users_test.py | 41 ++++++++++++------- api/tests/routes/backoffice/venues_test.py | 5 +-- .../routes/pro/post_user_new_pro_nav_test.py | 28 ++++++------- api/tests/routes/pro/signin_test.py | 5 +-- api/tests/routes/pro/signup_pro_V2_test.py | 7 ++-- 10 files changed, 95 insertions(+), 78 deletions(-) diff --git a/api/src/pcapi/core/users/factories.py b/api/src/pcapi/core/users/factories.py index 53be3531734..52552244281 100644 --- a/api/src/pcapi/core/users/factories.py +++ b/api/src/pcapi/core/users/factories.py @@ -898,6 +898,12 @@ def new_pro_portal( if not create: return + if extracted: + self.pro_new_nav_state = extracted + + if kwargs.get("deactivate"): + return + # We check whether or not a UserProNewNavState because the "created" flag is always true # if the user exists but FactoryBoy tried to create it through nested data such as: # offerers_factories.UserOffererFactory(offerer1, user__email="api@example.com")) @@ -910,9 +916,7 @@ def new_pro_portal( users_models.UserProNewNavState.userId == self.id ).one_or_none() ): - db.session.add(self) - db.session.flush() - self.pro_new_nav_state = UserProNewNavStateFactory(user=self) + self.pro_new_nav_state = UserProNewNavStateFactory(user=self, **kwargs) class NonAttachedProFactory(ProFactory): @@ -1082,7 +1086,7 @@ class UserProNewNavStateFactory(BaseFactory): class Meta: model = models.UserProNewNavState - user = factory.SubFactory(ProFactory) + user = factory.SubFactory(ProFactory, new_pro_portal__deactivate=True) eligibilityDate = LazyAttribute(lambda _: datetime.utcnow()) newNavDate = LazyAttribute(lambda _: datetime.utcnow()) diff --git a/api/tests/core/external/external_users_test.py b/api/tests/core/external/external_users_test.py index 96b0e23f0c7..aa04d2eff73 100644 --- a/api/tests/core/external/external_users_test.py +++ b/api/tests/core/external/external_users_test.py @@ -97,6 +97,7 @@ def test_email_should_not_be_blacklisted_in_sendinblue_by_default(): def test_update_external_pro_user(): user = ProFactory() + assert user.email # preload the user to avoid duplicated queries with assert_no_duplicated_queries(): update_external_user(user) diff --git a/api/tests/core/users/test_api.py b/api/tests/core/users/test_api.py index 3d98bd4e672..94e299d3d11 100644 --- a/api/tests/core/users/test_api.py +++ b/api/tests/core/users/test_api.py @@ -2293,47 +2293,51 @@ def test_anonymize_user_deposits(self) -> None: class EnableNewProNavTest: def test_user_without_new_nav_state_raises(self) -> None: - user = users_factories.ProFactory() + user = users_factories.ProFactory(new_pro_portal__deactivate=True) with pytest.raises(users_exceptions.ProUserNotEligibleForNewNav): users_api.enable_new_pro_nav(user) def test_user_with_new_nav_state_not_eligible_raises(self) -> None: - pro_new_nav_state = users_factories.UserProNewNavStateFactory(eligibilityDate=None, newNavDate=None) + pro = users_factories.ProFactory(new_pro_portal__eligibilityDate=None, new_pro_portal__newNavDate=None) with pytest.raises(users_exceptions.ProUserNotEligibleForNewNav): - users_api.enable_new_pro_nav(pro_new_nav_state.user) + users_api.enable_new_pro_nav(pro) - assert not pro_new_nav_state.newNavDate + assert not pro.pro_new_nav_state.newNavDate def test_user_eligible_in_the_future_raises(self) -> None: - pro_new_nav_state = users_factories.UserProNewNavStateFactory( - eligibilityDate=datetime.datetime.utcnow() + datetime.timedelta(days=2), newNavDate=None + pro = users_factories.ProFactory( + new_pro_portal__eligibilityDate=datetime.datetime.utcnow() + datetime.timedelta(days=2), + new_pro_portal__newNavDate=None, ) with pytest.raises(users_exceptions.ProUserNotYetEligibleForNewNav): - users_api.enable_new_pro_nav(pro_new_nav_state.user) + users_api.enable_new_pro_nav(pro) - assert not pro_new_nav_state.newNavDate + assert not pro.pro_new_nav_state.newNavDate def test_user_eligible(self) -> None: - pro_new_nav_state = users_factories.UserProNewNavStateFactory( - eligibilityDate=datetime.datetime.utcnow() - datetime.timedelta(days=1), newNavDate=None + pro = users_factories.ProFactory( + new_pro_portal__eligibilityDate=datetime.datetime.utcnow() - datetime.timedelta(days=1), + new_pro_portal__newNavDate=None, ) - users_api.enable_new_pro_nav(pro_new_nav_state.user) + users_api.enable_new_pro_nav(pro) - assert pro_new_nav_state.newNavDate + assert pro.pro_new_nav_state.newNavDate def test_user_already_with_new_nav_should_not_update_date(self) -> None: yesterday_date = datetime.datetime.utcnow() - datetime.timedelta(days=1) - pro_new_nav_state = users_factories.UserProNewNavStateFactory( - eligibilityDate=yesterday_date - datetime.timedelta(days=2), newNavDate=yesterday_date + pro = users_factories.ProFactory( + new_pro_portal__eligibilityDate=yesterday_date - datetime.timedelta(days=2), + new_pro_portal__newNavDate=yesterday_date, ) + assert pro.pro_new_nav_state.newNavDate == yesterday_date - users_api.enable_new_pro_nav(pro_new_nav_state.user) + users_api.enable_new_pro_nav(pro) - assert pro_new_nav_state.newNavDate == yesterday_date + assert pro.pro_new_nav_state.newNavDate == yesterday_date class DeleteGdprExtractTest(StorageFolderManager): diff --git a/api/tests/routes/backoffice/autocomplete_test.py b/api/tests/routes/backoffice/autocomplete_test.py index 4b31dedbd0d..2e2e73c6803 100644 --- a/api/tests/routes/backoffice/autocomplete_test.py +++ b/api/tests/routes/backoffice/autocomplete_test.py @@ -232,7 +232,7 @@ def test_autocomplete_bo_users(self, authenticated_client, search_query, expecte users_factories.AdminFactory(firstName="Hugo", lastName="Admin") users_factories.AdminFactory(id=12345, firstName="Louise", lastName="Admin") users_factories.UserFactory(id=1234, firstName="Léo", lastName="Hugo") - users_factories.ProFactory(firstName="Léa", lastName="Pro") + users_factories.ProFactory(firstName="Léa", lastName="Pro", new_pro_portal__deactivate=True) self._test_autocomplete(authenticated_client, search_query, expected_texts) diff --git a/api/tests/routes/backoffice/offerers_test.py b/api/tests/routes/backoffice/offerers_test.py index 09700f26aab..207c79f0be1 100644 --- a/api/tests/routes/backoffice/offerers_test.py +++ b/api/tests/routes/backoffice/offerers_test.py @@ -128,26 +128,25 @@ def test_get_offerer(self, authenticated_client, offerer, offerer_tags): def test_get_offerer_with_new_nav_badges(self, new_nav_users, old_nav_users, authenticated_client, offerer): if new_nav_users: user_with_new_nav = users_factories.ProFactory() - users_factories.UserProNewNavStateFactory(user=user_with_new_nav) offerers_factories.UserOffererFactory(user=user_with_new_nav, offerer=offerer) if old_nav_users: - _user_exclude_from_beta_test = users_factories.ProFactory() + _user_exclude_from_beta_test = users_factories.ProFactory(new_pro_portal__deactivate=True) - user_with_nav_date_in_the_future = users_factories.ProFactory() - users_factories.UserProNewNavStateFactory( - user=user_with_nav_date_in_the_future, - eligibilityDate=None, - newNavDate=datetime.datetime.utcnow() + datetime.timedelta(days=5), + user_with_nav_date_in_the_future = users_factories.ProFactory( + new_pro_portal__eligibilityDate=None, + new_pro_portal__newNavDate=datetime.datetime.utcnow() + datetime.timedelta(days=5), ) offerers_factories.UserOffererFactory(user=user_with_nav_date_in_the_future, offerer=offerer) - user_with_old_nav = users_factories.ProFactory() - users_factories.UserProNewNavStateFactory(user=user_with_old_nav, eligibilityDate=None, newNavDate=None) + user_with_old_nav = users_factories.ProFactory( + new_pro_portal__eligibilityDate=None, + new_pro_portal__newNavDate=None, + ) offerers_factories.UserOffererFactory(user=user_with_old_nav, offerer=offerer) - eligible_user_with_inactivated_new_nav = users_factories.ProFactory() - users_factories.UserProNewNavStateFactory( - user=eligible_user_with_inactivated_new_nav, eligibilityDate=datetime.datetime.utcnow(), newNavDate=None + eligible_user_with_inactivated_new_nav = users_factories.ProFactory( + new_pro_portal__eligibilityDate=datetime.datetime.utcnow(), + new_pro_portal__newNavDate=None, ) offerers_factories.UserOffererFactory(user=eligible_user_with_inactivated_new_nav, offerer=offerer) @@ -1361,16 +1360,17 @@ def test_add_pro_user_choices(self, authenticated_client, legit_user, offerer): def test_user_offerer_details_tab_with_new_nav_tags(self, authenticated_client, offerer): user_with_new_nav = users_factories.ProFactory() - users_factories.UserProNewNavStateFactory(user=user_with_new_nav) offerers_factories.UserOffererFactory(user=user_with_new_nav, offerer=offerer) - user_with_old_nav = users_factories.ProFactory() - users_factories.UserProNewNavStateFactory(user=user_with_old_nav, eligibilityDate=None, newNavDate=None) + user_with_old_nav = users_factories.ProFactory( + new_pro_portal__eligibilityDate=None, + new_pro_portal__newNavDate=None, + ) offerers_factories.UserOffererFactory(user=user_with_old_nav, offerer=offerer) - eligible_user_with_inactivated_new_nav = users_factories.ProFactory() - users_factories.UserProNewNavStateFactory( - user=eligible_user_with_inactivated_new_nav, eligibilityDate=datetime.datetime.utcnow(), newNavDate=None + eligible_user_with_inactivated_new_nav = users_factories.ProFactory( + new_pro_portal__eligibilityDate=datetime.datetime.utcnow(), + new_pro_portal__newNavDate=None, ) offerers_factories.UserOffererFactory(user=eligible_user_with_inactivated_new_nav, offerer=offerer) diff --git a/api/tests/routes/backoffice/pro_users_test.py b/api/tests/routes/backoffice/pro_users_test.py index 9c253e16c6f..08db4b9edb5 100644 --- a/api/tests/routes/backoffice/pro_users_test.py +++ b/api/tests/routes/backoffice/pro_users_test.py @@ -165,9 +165,15 @@ def test_get_not_pro_user(self, authenticated_client): @pytest.mark.parametrize("has_new_nav", [True, False]) def test_get_pro_user_with_new_nav_badges(self, authenticated_client, has_new_nav): - user = offerers_factories.UserOffererFactory(user__phoneNumber="+33638656565", user__postalCode="29000").user if has_new_nav: - users_factories.UserProNewNavStateFactory(user=user, newNavDate=datetime.datetime.utcnow()) + user_kwargs = {"user__new_pro_portal__newNavDate": datetime.datetime.utcnow()} + else: + user_kwargs = {"user__new_pro_portal__deactivate": True} + user = offerers_factories.UserOffererFactory( + user__phoneNumber="+33638656565", + user__postalCode="29000", + **user_kwargs, + ).user url = url_for(self.endpoint, user_id=user.id) with assert_num_queries(self.expected_num_queries): @@ -188,10 +194,11 @@ def test_get_pro_user_with_new_nav_badges(self, authenticated_client, has_new_na def test_form_should_fill_pro_new_nav_state_dates(self, authenticated_client, db_session): old_newNavDate = datetime.datetime(2024, 4, 25, 8, 13, 3, 114129) old_eligibilityDate = datetime.datetime(2029, 4, 25, 8, 18, 3, 114129) - user_to_edit = offerers_factories.UserOffererFactory(user__postalCode="74000").user - user_to_edit.pro_new_nav_state = users_models.UserProNewNavState( - userId=user_to_edit.id, newNavDate=old_newNavDate, eligibilityDate=old_eligibilityDate - ) + user_to_edit = offerers_factories.UserOffererFactory( + user__postalCode="74000", + user__new_pro_portal__newNavDate=old_newNavDate, + user__new_pro_portal__eligibilityDate=old_eligibilityDate, + ).user db_session.flush() url = url_for("backoffice_web.pro_user.get", user_id=user_to_edit.id) @@ -295,7 +302,10 @@ def test_unsubscribe_from_marketing_emails(self, authenticated_client, legit_use @override_features(ENABLE_PRO_NEW_NAV_MODIFICATION=True) def test_set_new_nav_date(self, legit_user, authenticated_client): - user_to_edit = offerers_factories.UserOffererFactory(user__postalCode="74000").user + user_to_edit = offerers_factories.UserOffererFactory( + user__postalCode="74000", + user__new_pro_portal__deactivate=True, + ).user new_nav_date = datetime.datetime(2025, 6, 7, 8, 9, 10) # CEST eligibility_date = datetime.datetime(2029, 7, 7, 8, 9, 10) # CEST @@ -339,10 +349,11 @@ def test_modify_nav_date(self, legit_user, authenticated_client, eligibility_dat ) old_newNavDate = datetime.datetime(2024, 4, 25, 8, 13) old_eligibilityDate = datetime.datetime(2029, 4, 29, 8, 18) - user_to_edit = offerers_factories.UserOffererFactory(user__postalCode="74000").user - user_to_edit.pro_new_nav_state = users_models.UserProNewNavState( - userId=user_to_edit.id, newNavDate=old_newNavDate, eligibilityDate=old_eligibilityDate - ) + user_to_edit = offerers_factories.UserOffererFactory( + user__postalCode="74000", + user__new_pro_portal__newNavDate=old_newNavDate, + user__new_pro_portal__eligibilityDate=old_eligibilityDate, + ).user form_data = { "first_name": user_to_edit.firstName, "last_name": user_to_edit.lastName, @@ -464,14 +475,14 @@ def test_no_history(self, authenticated_client, pro_user): @override_features(ENABLE_PRO_NEW_NAV_MODIFICATION=True) def test_new_nav_dates_in_history(self, authenticated_client): - user = offerers_factories.UserOffererFactory().user old_eligibility_date = datetime.datetime(2024, 4, 27, 8, 13, 3, 0) old_new_nav_date = datetime.datetime(2024, 4, 28, 8, 13, 3, 0) new_eligibility_date = datetime.datetime(2024, 4, 24, 8, 11, 0, 0) new_nav_date = datetime.datetime(2024, 4, 25, 8, 11, 0, 0) - user.pro_new_nav_state = users_factories.UserProNewNavStateFactory( - user=user, eligibilityDate=new_eligibility_date, newNavDate=new_nav_date - ) + user = offerers_factories.UserOffererFactory( + user__new_pro_portal__eligibilityDate=new_eligibility_date, + user__new_pro_portal__newNavDate=new_nav_date, + ).user history_factories.ActionHistoryFactory( actionType=history_models.ActionType.INFO_MODIFIED, user=user, diff --git a/api/tests/routes/backoffice/venues_test.py b/api/tests/routes/backoffice/venues_test.py index f877b84b4ff..d3bf2f1a2ae 100644 --- a/api/tests/routes/backoffice/venues_test.py +++ b/api/tests/routes/backoffice/venues_test.py @@ -468,11 +468,10 @@ def test_get_virtual_venue(self, authenticated_client): ) def test_get_venue_with_new_nav_badges(self, authenticated_client, venue, has_new_nav, has_old_nav): if has_new_nav: - user_with_new_nav = users_factories.ProFactory() + user_with_new_nav = users_factories.ProFactory(new_pro_portal__newNavDate=datetime.utcnow()) offerers_factories.UserOffererFactory(user=user_with_new_nav, offerer=venue.managingOfferer) - users_factories.UserProNewNavStateFactory(user=user_with_new_nav, newNavDate=datetime.utcnow()) if has_old_nav: - user_with_old_nav = users_factories.ProFactory() + user_with_old_nav = users_factories.ProFactory(new_pro_portal__deactivate=True) offerers_factories.UserOffererFactory(user=user_with_old_nav, offerer=venue.managingOfferer) venue.publicName = "Le grand Rantanplan 1" diff --git a/api/tests/routes/pro/post_user_new_pro_nav_test.py b/api/tests/routes/pro/post_user_new_pro_nav_test.py index 2959837f1d3..44b27d2f346 100644 --- a/api/tests/routes/pro/post_user_new_pro_nav_test.py +++ b/api/tests/routes/pro/post_user_new_pro_nav_test.py @@ -13,34 +13,36 @@ class PostUserNewProNavTest: def test_post_user_new_pro_nav(self, client: Any) -> None: - pro_new_nav_state = users_factories.UserProNewNavStateFactory( - eligibilityDate=datetime.datetime.utcnow() - datetime.timedelta(days=1), newNavDate=None + user = users_factories.ProFactory( + new_pro_portal__eligibilityDate=datetime.datetime.utcnow() - datetime.timedelta(days=1), + new_pro_portal__newNavDate=None, ) - user = pro_new_nav_state.user client = client.with_session_auth(user.email) response = client.post("/users/new-pro-nav") assert response.status_code == 204 - assert pro_new_nav_state.newNavDate + assert user.pro_new_nav_state.newNavDate def test_post_user_new_pro_nav_not_eligible_user(self, client: Any) -> None: - pro_new_nav_state = users_factories.UserProNewNavStateFactory(eligibilityDate=None, newNavDate=None) - user = pro_new_nav_state.user + user = users_factories.ProFactory( + new_pro_portal__eligibilityDate=None, + new_pro_portal__newNavDate=None, + ) client = client.with_session_auth(user.email) response = client.post("/users/new-pro-nav") assert response.status_code == 400 - assert not pro_new_nav_state.newNavDate + assert not user.pro_new_nav_state.newNavDate def test_user_can_successfully_submit_side_nav_review(self, client, caplog): - pro_new_nav_state = users_factories.UserProNewNavStateFactory( - eligibilityDate=None, newNavDate=datetime.datetime.utcnow() + user = users_factories.ProFactory( + new_pro_portal__eligibilityDate=None, + new_pro_portal__newNavDate=datetime.datetime.utcnow(), ) - user = pro_new_nav_state.user offerer = offerers_factories.OffererFactory() offerers_factories.UserOffererFactory(user=user, offerer=offerer) @@ -68,8 +70,7 @@ def test_user_can_successfully_submit_side_nav_review(self, client, caplog): def test_user_without_new_nav_activated_cant_submit_review(self, client, caplog): users_factories.UserProNewNavStateFactory(newNavDate=datetime.datetime.utcnow()) - pro_new_nav_state = users_factories.UserProNewNavStateFactory(newNavDate=None) - user = pro_new_nav_state.user + user = users_factories.ProFactory(new_pro_portal__newNavDate=None) offerer = offerers_factories.OffererFactory() offerers_factories.UserOffererFactory(user=user, offerer=offerer) @@ -90,8 +91,7 @@ def test_user_without_new_nav_activated_cant_submit_review(self, client, caplog) assert "User with new nav activated submitting review" not in caplog.messages def test_user_cannot_submit_review_for_foreign_offerer(self, client, caplog): - pro_new_nav_state = users_factories.UserProNewNavStateFactory(newNavDate=None) - user = pro_new_nav_state.user + user = users_factories.ProFactory(new_pro_portal__newNavDate=None) offerer = offerers_factories.OffererFactory() offerers_factories.UserOffererFactory(user=user, offerer=offerer) foreign_offerer = offerers_factories.OffererFactory() diff --git a/api/tests/routes/pro/signin_test.py b/api/tests/routes/pro/signin_test.py index e9fdf3d5e04..7edfbac0824 100644 --- a/api/tests/routes/pro/signin_test.py +++ b/api/tests/routes/pro/signin_test.py @@ -149,7 +149,6 @@ def test_whith_user_offerer_and_nav_state(self, client): user_offerer = offerers_factories.UserOffererFactory( user__lastConnectionDate=datetime.datetime.utcnow(), ) - navState = users_factories.UserProNewNavStateFactory(user=user_offerer.user) data = { "identifier": user_offerer.user.email, "password": user_offerer.user.clearTextPassword, @@ -195,8 +194,8 @@ def test_whith_user_offerer_and_nav_state(self, client): "postalCode": None, "roles": ["PRO"], "navState": { - "eligibilityDate": format_into_utc_date(navState.eligibilityDate), - "newNavDate": format_into_utc_date(navState.newNavDate), + "eligibilityDate": format_into_utc_date(user_offerer.user.pro_new_nav_state.eligibilityDate), + "newNavDate": format_into_utc_date(user_offerer.user.pro_new_nav_state.newNavDate), }, } diff --git a/api/tests/routes/pro/signup_pro_V2_test.py b/api/tests/routes/pro/signup_pro_V2_test.py index df438a41c27..13da6e9c427 100644 --- a/api/tests/routes/pro/signup_pro_V2_test.py +++ b/api/tests/routes/pro/signup_pro_V2_test.py @@ -9,7 +9,6 @@ from pcapi.core.mails.transactional.sendinblue_template_ids import TransactionalEmail from pcapi.core.offerers.factories import OffererInvitationFactory from pcapi.core.users.factories import ProFactory -from pcapi.core.users.factories import UserProNewNavStateFactory from pcapi.core.users.models import User @@ -80,11 +79,11 @@ def test_user_inherit_new_nav_for_inviter(self, client): """Test the new navigation activation at creation. Only the newNavDate is set The eligibilityDate is used to distinguish between the beta test dans the A/B test so It should only be set manually """ - inviter_with_new_nav = UserProNewNavStateFactory(newNavDate=datetime.utcnow()).user + inviter_with_new_nav = ProFactory(new_pro_portal__newNavDate=datetime.utcnow()) invitation_with_new_nav = OffererInvitationFactory(user=inviter_with_new_nav) - inviter_with_old_nav = UserProNewNavStateFactory(newNavDate=None).user + inviter_with_old_nav = ProFactory(new_pro_portal__newNavDate=None) invitation_with_old_nav = OffererInvitationFactory(user=inviter_with_old_nav) - inviter_without_nav_state = ProFactory() + inviter_without_nav_state = ProFactory(new_pro_portal__deactivate=True) invitation_without_nav_state = OffererInvitationFactory(user=inviter_without_nav_state) data = BASE_DATA_PRO.copy() response = client.post("/v2/users/signup/pro", json=data | {"email": invitation_with_new_nav.email})