public async Task Handle_GivenSavingSucceeds_ExpectSuccessfulResult() { var user = new Mock <IUser>(); user.Setup(x => x.AuthenticatorApps).Returns(new List <AuthenticatorApp> { new AuthenticatorApp(TestVariables.AuthenticatorAppId, "key", TestVariables.Now), }); user.Setup(x => x.PasswordHash).Returns(BCrypt.Net.BCrypt.HashPassword("password")); var userRepository = new Mock <IUserRepository>(); var unitOfWork = new Mock <IUnitOfWork>(); unitOfWork.Setup(x => x.SaveEntitiesAsync(It.IsAny <CancellationToken>())).ReturnsAsync(() => true); userRepository.Setup(x => x.UnitOfWork).Returns(unitOfWork.Object); userRepository.Setup(x => x.Find(It.IsAny <Guid>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => Maybe.From(user.Object)); var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>(); currentAuthenticatedUserProvider.Setup(x => x.CurrentAuthenticatedUser) .Returns(Maybe.From(new UnauthenticatedUser(TestVariables.UserId, MfaProvider.None) as ISystemUser)); var clock = new Mock <IClock>(); var handler = new RevokeAuthenticatorAppCommandHandler( userRepository.Object, clock.Object, currentAuthenticatedUserProvider.Object); var cmd = new RevokeAuthenticatorAppCommand("password"); var result = await handler.Handle(cmd, CancellationToken.None); Assert.True(result.IsSuccess); }
public async Task Handle_GivenNoUserAppearsToBeAuthenticate_ExpectFailedResult() { var user = new Mock <IUser>(); user.Setup(x => x.AuthenticatorApps).Returns(new List <AuthenticatorApp> { new AuthenticatorApp(TestVariables.AuthenticatorAppId, "key", TestVariables.Now), }); var userRepository = new Mock <IUserRepository>(); var unitOfWork = new Mock <IUnitOfWork>(); unitOfWork.Setup(x => x.SaveEntitiesAsync(It.IsAny <CancellationToken>())).ReturnsAsync(() => true); userRepository.Setup(x => x.UnitOfWork).Returns(unitOfWork.Object); userRepository.Setup(x => x.Find(It.IsAny <Guid>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => Maybe.From(user.Object)); var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>(); currentAuthenticatedUserProvider.Setup(x => x.CurrentAuthenticatedUser) .Returns(Maybe <ISystemUser> .Nothing); var clock = new Mock <IClock>(); var handler = new RevokeAuthenticatorAppCommandHandler( userRepository.Object, clock.Object, currentAuthenticatedUserProvider.Object); var cmd = new RevokeAuthenticatorAppCommand("password"); var result = await handler.Handle(cmd, CancellationToken.None); Assert.True(result.IsFailure); Assert.Equal(ErrorCodes.UserNotFound, result.Error.Code); }
public async Task Handle_GivenPasswordIsNotCorrect_ExpectFailedResultAndNoRevokeAttempted() { var user = new Mock <IUser>(); user.Setup(x => x.PasswordHash).Returns(BCrypt.Net.BCrypt.HashPassword("password")); var userRepository = new Mock <IUserRepository>(); var unitOfWork = new Mock <IUnitOfWork>(); unitOfWork.Setup(x => x.SaveEntitiesAsync(It.IsAny <CancellationToken>())).ReturnsAsync(() => true); userRepository.Setup(x => x.UnitOfWork).Returns(unitOfWork.Object); userRepository.Setup(x => x.Find(It.IsAny <Guid>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => Maybe.From(user.Object)); var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>(); currentAuthenticatedUserProvider.Setup(x => x.CurrentAuthenticatedUser) .Returns(Maybe.From(new UnauthenticatedUser(TestVariables.UserId, MfaProvider.None) as ISystemUser)); var clock = new Mock <IClock>(); var handler = new RevokeAuthenticatorAppCommandHandler( userRepository.Object, clock.Object, currentAuthenticatedUserProvider.Object); var cmd = new RevokeAuthenticatorAppCommand("wrong-password"); var result = await handler.Handle(cmd, CancellationToken.None); Assert.True(result.IsFailure); Assert.Equal(ErrorCodes.PasswordNotCorrect, result.Error.Code); user.Verify(x => x.RevokeAuthenticatorApp(It.IsAny <DateTime>()), Times.Never); }
private async Task <ResultWithError <ErrorData> > Process(RevokeAuthenticatorAppCommand request, CancellationToken cancellationToken) { var currentUser = this._currentAuthenticatedUserProvider.CurrentAuthenticatedUser; if (currentUser.HasNoValue) { return(ResultWithError.Fail(new ErrorData(ErrorCodes.UserNotFound))); } var userMaybe = await this._userRepository.Find(currentUser.Value.UserId, cancellationToken); if (userMaybe.HasNoValue) { return(ResultWithError.Fail(new ErrorData(ErrorCodes.UserNotFound))); } var user = userMaybe.Value; if (!BCrypt.Net.BCrypt.Verify(request.Password, user.PasswordHash)) { return(ResultWithError.Fail(new ErrorData(ErrorCodes.PasswordNotCorrect))); } if (user.AuthenticatorApps.All(x => x.WhenRevoked != null)) { return(ResultWithError.Fail(new ErrorData(ErrorCodes.NoAuthenticatorAppEnrolled))); } user.RevokeAuthenticatorApp(this._clock.GetCurrentInstant().ToDateTimeUtc()); return(ResultWithError.Ok <ErrorData>()); }
public void Validate_GivenAllPropertiesAreValid_ExpectValidationSuccess() { var cmd = new RevokeAuthenticatorAppCommand("password"); var validator = new RevokeAuthenticatorAppCommandValidator(); var result = validator.Validate(cmd); Assert.True(result.IsValid); }
public void Validate_GivenPasswordIsNull_ExpectValidationFailure() { var cmd = new RevokeAuthenticatorAppCommand(null); var validator = new RevokeAuthenticatorAppCommandValidator(); var result = validator.Validate(cmd); Assert.False(result.IsValid); Assert.Contains( result.Errors, failure => failure.ErrorCode.Equals(ValidationCodes.FieldIsRequired) && failure.PropertyName == "Password"); }
public async Task <ResultWithError <ErrorData> > Handle(RevokeAuthenticatorAppCommand request, CancellationToken cancellationToken) { var result = await this.Process(request, cancellationToken); var dbResult = await this._userRepository.UnitOfWork.SaveEntitiesAsync(cancellationToken); if (!dbResult) { return(ResultWithError.Fail(new ErrorData( ErrorCodes.SavingChanges, "Failed To Save Database"))); } return(result); }
private async Task <ResultWithError <ErrorData> > Process(RevokeAuthenticatorAppCommand request, CancellationToken cancellationToken) { var whenHappened = this._clock.GetCurrentInstant().ToDateTimeUtc(); var userMaybe = await this._userRepository.Find(this._currentUserService.CurrentUser.Value.UserId, cancellationToken); if (userMaybe.HasNoValue) { return(ResultWithError.Fail(new ErrorData(ErrorCodes.UserNotFound))); } var user = userMaybe.Value; if (user.AuthenticatorApps.Any(x => x.WhenRevoked != null)) { return(ResultWithError.Fail(new ErrorData(ErrorCodes.AuthenticatorAppAlreadyEnrolled))); } user.RevokeAuthenticatorApp(whenHappened); return(ResultWithError.Ok <ErrorData>()); }