@@ -403,6 +403,130 @@ public void ChangePassword()
403403 Assert . That ( user . Password , Is . Not . EqualTo ( passwordHash ) ) ;
404404 Assert . That ( user . Salt , Is . Not . EqualTo ( salt ) ) ;
405405 Assert . That ( user . PasswordExpiresAt , Is . EqualTo ( currentDateTime . AddDays ( 90 ) ) ) ;
406+ Assert . That ( user . AuthenticationTokens , Is . Empty ) ;
407+ Assert . That ( user . AccessTokens , Is . Empty ) ;
408+ Assert . That ( user . OneTimePasswords , Is . Empty ) ;
409+ } ) ;
410+ }
411+
412+ [ Test ]
413+ public void ResetPasswordWithTokenIsNull ( )
414+ {
415+ var user = new User
416+ {
417+ Login = "test" ,
418+ DisplayName = "test" ,
419+ Email = "test@localhost.local" ,
420+ } ;
421+
422+ var timeProvider = Substitute . For < TimeProvider > ( ) ;
423+ var passwordService = Substitute . For < IPasswordService > ( ) ;
424+
425+ Assert . Throws < ArgumentNullException > ( ( ) =>
426+ user . ResetPassword ( timeProvider , passwordService , null ! , string . Empty ) ) ;
427+ }
428+
429+ [ Test ]
430+ public void ResetPasswordWithExpiredToken ( )
431+ {
432+ var currentTime = DateTimeOffset . UtcNow ;
433+
434+ var user = new User
435+ {
436+ Login = "test" ,
437+ DisplayName = "test" ,
438+ Email = "test@localhost.local" ,
439+ } ;
440+ var oneTimePassword = new OneTimePassword
441+ {
442+ Token = "token" ,
443+ ExpiresAt = currentTime . AddDays ( - 1 ) ,
444+ Purpose = OneTimePasswordPurpose . PasswordReset ,
445+ User = user ,
446+ } ;
447+ user . AddOneTimePassword ( oneTimePassword ) ;
448+
449+ var timeProvider = Substitute . For < TimeProvider > ( ) ;
450+ timeProvider
451+ . GetUtcNow ( )
452+ . Returns ( currentTime ) ;
453+
454+ var passwordService = Substitute . For < IPasswordService > ( ) ;
455+
456+ Assert . Throws < DomainException > ( ( ) =>
457+ user . ResetPassword ( timeProvider , passwordService , oneTimePassword , string . Empty ) ) ;
458+ }
459+
460+ [ Test ]
461+ public void ResetPasswordWithLockedUser ( )
462+ {
463+ var currentTime = DateTimeOffset . UtcNow ;
464+
465+ var user = new User
466+ {
467+ Login = "test" ,
468+ DisplayName = "test" ,
469+ Email = "test@localhost.local" ,
470+ } ;
471+ var oneTimePassword = new OneTimePassword
472+ {
473+ Token = "token" ,
474+ ExpiresAt = currentTime . AddDays ( 1 ) ,
475+ Purpose = OneTimePasswordPurpose . PasswordReset ,
476+ User = user ,
477+ } ;
478+ user . AddOneTimePassword ( oneTimePassword ) ;
479+ user . Lock ( ) ;
480+
481+ var timeProvider = Substitute . For < TimeProvider > ( ) ;
482+ timeProvider
483+ . GetUtcNow ( )
484+ . Returns ( currentTime ) ;
485+
486+ var passwordService = Substitute . For < IPasswordService > ( ) ;
487+
488+ Assert . Throws < DomainException > ( ( ) =>
489+ user . ResetPassword ( timeProvider , passwordService , oneTimePassword , string . Empty ) ) ;
490+ }
491+
492+ [ Test ]
493+ public void ResetPassword ( )
494+ {
495+ var currentTime = DateTimeOffset . UtcNow ;
496+ const string password = "12345678" ;
497+
498+ var user = new User
499+ {
500+ Login = "test" ,
501+ DisplayName = "test" ,
502+ Email = "test@localhost.local" ,
503+ } ;
504+ var oneTimePassword = new OneTimePassword
505+ {
506+ Token = "token" ,
507+ ExpiresAt = currentTime . AddDays ( 1 ) ,
508+ Purpose = OneTimePasswordPurpose . PasswordReset ,
509+ User = user ,
510+ } ;
511+ user . AddOneTimePassword ( oneTimePassword ) ;
512+
513+ var timeProvider = Substitute . For < TimeProvider > ( ) ;
514+ timeProvider
515+ . GetUtcNow ( )
516+ . Returns ( currentTime ) ;
517+
518+ var passwordService = Substitute . For < IPasswordService > ( ) ;
519+ passwordService
520+ . GeneratePasswordHash ( password )
521+ . Returns ( ( new byte [ 64 ] , new byte [ 16 ] ) ) ;
522+
523+ user . ResetPassword ( timeProvider , passwordService , oneTimePassword , password ) ;
524+
525+ Assert . Multiple ( ( ) =>
526+ {
527+ Assert . That ( user . Password , Is . Not . Null ) ;
528+ Assert . That ( user . Salt , Is . Not . Null ) ;
529+ Assert . That ( user . OneTimePasswords , Is . Empty ) ;
406530 } ) ;
407531 }
408532}
0 commit comments