Coverage for src/tests/modules/identity/test_accept_user_invitation.py: 100%
64 statements
« prev ^ index » next coverage.py v7.11.0, created at 2024-01-01 00:00 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2024-01-01 00:00 +0000
1"""Module for testing the use case 'Accept User Invitation'."""
3import pytest
5from kwai_bc_identity.accept_user_invitation import (
6 AcceptUserInvitation,
7 AcceptUserInvitationCommand,
8)
9from kwai_bc_identity.user_invitations.user_invitation_db_repository import (
10 UserInvitationDbRepository,
11)
12from kwai_bc_identity.users.user_account import UserAccountEntity
13from kwai_bc_identity.users.user_account_db_repository import (
14 UserAccountDbRepository,
15)
16from kwai_core.db.database import Database
17from kwai_core.db.uow import UnitOfWork
18from kwai_core.domain.exceptions import UnprocessableException
19from kwai_core.domain.presenter import Presenter
20from kwai_core.domain.value_objects.email_address import EmailAddress
21from kwai_core.domain.value_objects.name import Name
22from kwai_core.domain.value_objects.timestamp import Timestamp
25pytestmark = [pytest.mark.db]
28class DummyPresenter(Presenter[UserAccountEntity]):
29 """A dummy presenter for testing AcceptUserInvitation."""
31 def __init__(self):
32 self._entity = None
34 def present(self, use_case_result: UserAccountEntity) -> None:
35 self._entity = use_case_result
37 @property
38 def entity(self) -> UserAccountEntity:
39 """Return the entity returned by the use case."""
40 return self._entity
43async def test_accept_user_invitation(
44 database: Database,
45 make_user_account_in_db,
46 make_user_invitation,
47 make_user_invitation_in_db,
48):
49 """Test accepting a user invitation."""
50 user = await make_user_account_in_db()
51 user_invitation = await make_user_invitation_in_db(
52 user_invitation=make_user_invitation(
53 email=EmailAddress(email="anton.geesink@kwai.com"),
54 name=Name(first_name="Anton", last_name="Geesink"),
55 user=user,
56 )
57 )
59 presenter = DummyPresenter()
60 command = AcceptUserInvitationCommand(
61 uuid=str(user_invitation.uuid),
62 first_name=user_invitation.name.first_name,
63 last_name=user_invitation.name.last_name,
64 remark="Created with test_accept_user_invitation",
65 password="Test1234",
66 )
68 user_account_repo = UserAccountDbRepository(database)
70 async with UnitOfWork(database):
71 await AcceptUserInvitation(
72 UserInvitationDbRepository(database),
73 user_account_repo,
74 presenter,
75 ).execute(command)
77 assert presenter.entity, "There should be a new user account"
79 async with UnitOfWork(database):
80 await user_account_repo.delete(presenter.entity)
83async def test_dont_accept_revoked_user_invitation(
84 database: Database,
85 make_user_account_in_db,
86 make_user_invitation,
87 make_user_invitation_in_db,
88):
89 """Test if accepting a revoked user invitation results in an exception."""
90 user = await make_user_account_in_db()
91 user_invitation = await make_user_invitation_in_db(
92 user_invitation=make_user_invitation(
93 email=EmailAddress(email="anton.geesink@kwai.com"),
94 name=Name(first_name="Anton", last_name="Geesink"),
95 user=user,
96 revoked=True,
97 )
98 )
100 presenter = DummyPresenter()
101 command = AcceptUserInvitationCommand(
102 uuid=str(user_invitation.uuid),
103 first_name=user_invitation.name.first_name,
104 last_name=user_invitation.name.last_name,
105 remark="Created with test_dont_accept_revoked_user_invitation",
106 password="Test1234",
107 )
109 user_account_repo = UserAccountDbRepository(database)
111 with pytest.raises(
112 UnprocessableException,
113 match=f"The user invitation with id {user_invitation.uuid} is revoked.",
114 ):
115 await AcceptUserInvitation(
116 UserInvitationDbRepository(database),
117 user_account_repo,
118 presenter,
119 ).execute(command)
122async def test_dont_accept_expired_user_invitation(
123 database: Database,
124 make_user_account_in_db,
125 make_user_invitation,
126 make_user_invitation_in_db,
127):
128 """Test if accepting an expired user invitation results in an exception."""
129 user = await make_user_account_in_db()
130 user_invitation = await make_user_invitation_in_db(
131 user_invitation=make_user_invitation(
132 email=EmailAddress(email="anton.geesink@kwai.com"),
133 name=Name(first_name="Anton", last_name="Geesink"),
134 user=user,
135 expired_at=Timestamp.create_with_delta(days=-1),
136 )
137 )
139 presenter = DummyPresenter()
140 command = AcceptUserInvitationCommand(
141 uuid=str(user_invitation.uuid),
142 first_name=user_invitation.name.first_name,
143 last_name=user_invitation.name.last_name,
144 remark="Created with test_dont_accept_expired_user_invitation",
145 password="Test1234",
146 )
148 user_account_repo = UserAccountDbRepository(database)
150 with pytest.raises(
151 UnprocessableException,
152 match=f"The user invitation with id {user_invitation.uuid} is expired.",
153 ):
154 await AcceptUserInvitation(
155 UserInvitationDbRepository(database),
156 user_account_repo,
157 presenter,
158 ).execute(command)
161async def test_dont_accept_already_accepted_user_invitation(
162 database: Database,
163 make_user_account_in_db,
164 make_user_invitation,
165 make_user_invitation_in_db,
166):
167 """Test if accepting an already accepted user invitation results in an exception."""
168 user = await make_user_account_in_db()
169 user_invitation = await make_user_invitation_in_db(
170 user_invitation=make_user_invitation(
171 email=EmailAddress(email="anton.geesink@kwai.com"),
172 name=Name(first_name="Anton", last_name="Geesink"),
173 user=user,
174 confirmed_at=Timestamp.create_now(),
175 )
176 )
178 presenter = DummyPresenter()
179 command = AcceptUserInvitationCommand(
180 uuid=str(user_invitation.uuid),
181 first_name=user_invitation.name.first_name,
182 last_name=user_invitation.name.last_name,
183 remark="Created with test_dont_accept_already_accepted_user_invitation",
184 password="Test1234",
185 )
187 user_account_repo = UserAccountDbRepository(database)
189 with pytest.raises(
190 UnprocessableException,
191 match=f"The user invitation with id {user_invitation.uuid} was already accepted.",
192 ):
193 await AcceptUserInvitation(
194 UserInvitationDbRepository(database),
195 user_account_repo,
196 presenter,
197 ).execute(command)
200async def test_dont_accept_user_invitation_with_used_email(
201 database: Database,
202 make_user,
203 make_user_account,
204 make_user_account_in_db,
205 make_user_invitation,
206 make_user_invitation_in_db,
207):
208 """Test if accepting a user invitation with an already used email fails."""
209 user = await make_user_account_in_db(
210 user_account=make_user_account(
211 user=make_user(email=EmailAddress(email="anton.geesink@kwai.com"))
212 )
213 )
214 user_invitation = await make_user_invitation_in_db(
215 user_invitation=make_user_invitation(
216 email=EmailAddress(email="anton.geesink@kwai.com"),
217 name=Name(first_name="Anton", last_name="Geesink"),
218 user=user,
219 )
220 )
222 presenter = DummyPresenter()
223 command = AcceptUserInvitationCommand(
224 uuid=str(user_invitation.uuid),
225 first_name=user_invitation.name.first_name,
226 last_name=user_invitation.name.last_name,
227 remark="Created with test_dont_accept_user_invitation_with_used_email",
228 password="Test1234",
229 )
231 user_account_repo = UserAccountDbRepository(database)
233 with pytest.raises(
234 UnprocessableException,
235 match=f"A user with email {user_invitation.email} already exists.",
236 ):
237 await AcceptUserInvitation(
238 UserInvitationDbRepository(database),
239 user_account_repo,
240 presenter,
241 ).execute(command)