@@ -50,6 +50,27 @@ class UserPasswordResetFacadeTest extends Unit
5050 */
5151 protected const USER_STATUS_ACTIVE = 'active ' ;
5252
53+ /**
54+ * @uses \Orm\Zed\UserPasswordReset\Persistence\Map\SpyResetPasswordTableMap::COL_STATUS_EXPIRED
55+ *
56+ * @var string
57+ */
58+ protected const PASSWORD_RESET_STATUS_EXPIRED = 'expired ' ;
59+
60+ /**
61+ * @uses \Orm\Zed\UserPasswordReset\Persistence\Map\SpyResetPasswordTableMap::COL_STATUS_ACTIVE
62+ *
63+ * @var string
64+ */
65+ protected const PASSWORD_RESET_STATUS_ACTIVE = 'active ' ;
66+
67+ /**
68+ * @uses \Orm\Zed\UserPasswordReset\Persistence\Map\SpyResetPasswordTableMap::COL_STATUS_USED
69+ *
70+ * @var string
71+ */
72+ protected const PASSWORD_RESET_STATUS_USED = 'used ' ;
73+
5374 /**
5475 * @var \SprykerTest\Zed\UserPasswordReset\UserPasswordResetBusinessTester
5576 */
@@ -129,7 +150,7 @@ public function testResetPasswordResetsPasswordAndResetPasswordCode(): void
129150 /**
130151 * @return void
131152 */
132- public function testIsValidPasswordResetTokenReturnsTrueFotValidToken (): void
153+ public function testIsValidPasswordResetTokenReturnsTrueForValidToken (): void
133154 {
134155 // Arrange
135156 $ userTransfer = $ this ->tester ->haveUser ([
@@ -151,7 +172,7 @@ public function testIsValidPasswordResetTokenReturnsTrueFotValidToken(): void
151172 /**
152173 * @return void
153174 */
154- public function testIsValidPasswordResetTokenReturnsFalseFotInvalidToken (): void
175+ public function testIsValidPasswordResetTokenReturnsFalseForInvalidToken (): void
155176 {
156177 // Arrange
157178 $ userTransfer = $ this ->tester ->haveUser ([
@@ -199,4 +220,105 @@ public function testRequestPasswordResetReturnsFalseForNonActiveUser(): void
199220 // Assert
200221 $ this ->assertFalse ($ isPasswordResetSuccessfully , 'It is not possible to request restore password for non active user ' );
201222 }
223+
224+ /**
225+ * @return void
226+ */
227+ public function testRequestPasswordResetReturnsFalseForUsedToken (): void
228+ {
229+ // Arrange
230+ $ userTransfer = $ this ->tester ->haveUser ([
231+ UserTransfer::USERNAME => static ::TEST_MAIL ,
232+ ]);
233+
234+ $ this ->tester ->getUserPasswordReset ()->requestPasswordReset (
235+ (new UserPasswordResetRequestTransfer ())
236+ ->setEmail ($ userTransfer ->getUsername ()),
237+ );
238+
239+ $ resetPasswordTransfer = $ this ->tester ->findResetPasswordTransferByIdUser ($ userTransfer ->getIdUser ())
240+ ->setCreatedAt ((new DateTime ('-1 minute ' ))->format ('Y-m-d H:i:s ' ))
241+ ->setStatus (static ::PASSWORD_RESET_STATUS_USED );
242+
243+ $ this ->tester ->updateResetPasswordByIdAuthResetPassword (
244+ $ resetPasswordTransfer ->getIdResetPassword (),
245+ $ resetPasswordTransfer ,
246+ );
247+
248+ // Act
249+ $ isValidUsedPasswordResetToken = $ this ->tester ->getUserPasswordReset ()->isValidPasswordResetToken ($ resetPasswordTransfer ->getCode ());
250+
251+ // Assert
252+ $ this ->assertFalse ($ isValidUsedPasswordResetToken );
253+ }
254+
255+ /**
256+ * @return void
257+ */
258+ public function testRequestPasswordResetReturnsFalseForExpiredToken (): void
259+ {
260+ // Arrange
261+ $ userTransfer = $ this ->tester ->haveUser ([
262+ UserTransfer::USERNAME => static ::TEST_MAIL ,
263+ ]);
264+
265+ $ this ->tester ->getUserPasswordReset ()->requestPasswordReset (
266+ (new UserPasswordResetRequestTransfer ())
267+ ->setEmail ($ userTransfer ->getUsername ()),
268+ );
269+
270+ $ resetPasswordTransfer = $ this ->tester ->findResetPasswordTransferByIdUser ($ userTransfer ->getIdUser ())
271+ ->setCreatedAt ((new DateTime ('-1 minute ' ))->format ('Y-m-d H:i:s ' ))
272+ ->setStatus (static ::PASSWORD_RESET_STATUS_EXPIRED );
273+
274+ $ this ->tester ->updateResetPasswordByIdAuthResetPassword (
275+ $ resetPasswordTransfer ->getIdResetPassword (),
276+ $ resetPasswordTransfer ,
277+ );
278+
279+ // Act
280+ $ isValidUsedPasswordResetToken = $ this ->tester ->getUserPasswordReset ()->isValidPasswordResetToken ($ resetPasswordTransfer ->getCode ());
281+
282+ // Assert
283+ $ this ->assertFalse ($ isValidUsedPasswordResetToken );
284+ }
285+
286+ /**
287+ * @return void
288+ */
289+ public function testRequestPasswordResetWillInvalidatePreviousResetsWhenANewResetIsRequested (): void
290+ {
291+ // Arrange
292+ $ userTransfer = $ this ->tester ->haveUser ([
293+ UserTransfer::USERNAME => static ::TEST_MAIL ,
294+ ]);
295+
296+ $ this ->tester ->getUserPasswordReset ()->requestPasswordReset (
297+ (new UserPasswordResetRequestTransfer ())
298+ ->setEmail ($ userTransfer ->getUsername ()),
299+ );
300+
301+ $ resetPasswordTransfer = $ this ->tester ->findResetPasswordTransferByIdUser ($ userTransfer ->getIdUser ())
302+ ->setCreatedAt ((new DateTime ('-2 minutes ' ))->format ('Y-m-d H:i:s ' ))
303+ ->setStatus (static ::PASSWORD_RESET_STATUS_ACTIVE );
304+
305+ $ this ->tester ->updateResetPasswordByIdAuthResetPassword (
306+ $ resetPasswordTransfer ->getIdResetPassword (),
307+ $ resetPasswordTransfer ,
308+ );
309+
310+ // Act
311+ $ isPasswordResetRequestSuccessfully = $ this ->tester ->getUserPasswordReset ()->requestPasswordReset (
312+ (new UserPasswordResetRequestTransfer ())
313+ ->setEmail ($ userTransfer ->getUsername ()),
314+ );
315+
316+ $ invalidatedResetPasswordTransfer = $ this ->tester ->findResetPasswordTransferByIdAuthResetPassword (
317+ $ resetPasswordTransfer ->getIdResetPassword (),
318+ );
319+
320+ // Assert
321+ $ this ->assertTrue ($ isPasswordResetRequestSuccessfully , 'It is not possible to request restore password for non active user ' );
322+ $ this ->assertEquals (static ::PASSWORD_RESET_STATUS_EXPIRED , $ invalidatedResetPasswordTransfer ->getStatus ());
323+ }
202324}
0 commit comments