Skip to content

Commit

Permalink
(PC-30722)[PRO] fix: tests after NPP for all users
Browse files Browse the repository at this point in the history
  • Loading branch information
xordoquy committed Sep 3, 2024
1 parent 0e7c36d commit 84a1610
Show file tree
Hide file tree
Showing 9 changed files with 94 additions and 77 deletions.
12 changes: 8 additions & 4 deletions api/src/pcapi/core/users/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -898,6 +898,12 @@ def new_pro_portal(
if not create:
return

if extracted:
self.pro_new_nav_state = extracted

if "deactivate" in kwargs:
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="[email protected]"))
Expand All @@ -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):
Expand Down Expand Up @@ -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())

Expand Down
1 change: 1 addition & 0 deletions api/tests/core/external/external_users_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
36 changes: 20 additions & 16 deletions api/tests/core/users/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
36 changes: 18 additions & 18 deletions api/tests/routes/backoffice/offerers_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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)

Expand Down
41 changes: 26 additions & 15 deletions api/tests/routes/backoffice/pro_users_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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)

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
5 changes: 2 additions & 3 deletions api/tests/routes/backoffice/venues_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
28 changes: 14 additions & 14 deletions api/tests/routes/pro/post_user_new_pro_nav_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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)

Expand All @@ -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()
Expand Down
5 changes: 2 additions & 3 deletions api/tests/routes/pro/signin_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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),
},
}

Expand Down
7 changes: 3 additions & 4 deletions api/tests/routes/pro/signup_pro_V2_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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})
Expand Down

0 comments on commit 84a1610

Please sign in to comment.