private async Task <ResultWithError <ErrorData> > Process( RequestAccountVerificationCommand request, CancellationToken cancellationToken) { var whenHappened = this._clock.GetCurrentInstant().ToDateTimeUtc(); var userMaybe = await this._userRepository.FindByEmailAddress(request.EmailAddress, cancellationToken); if (userMaybe.HasNoValue) { return(ResultWithError.Fail(new ErrorData(ErrorCodes.UserNotFound))); } var user = userMaybe.Value; if (user.IsVerified) { return(ResultWithError.Fail(new ErrorData( ErrorCodes.UserIsAlreadyVerified))); } var token = user.GenerateNewAccountConfirmationToken( whenHappened, whenHappened.AddHours(this._identitySettings.ConfirmationTokenLifetime)); this._userRepository.Update(user); return(ResultWithError.Ok <ErrorData>()); }
private async Task <ResultWithError <ErrorData> > Process( RequestAccountVerificationCommand request, CancellationToken cancellationToken) { var userMaybe = await this._userRepository.FindByEmailAddress(request.EmailAddress, cancellationToken); if (userMaybe.HasNoValue) { return(ResultWithError.Fail(new ErrorData(ErrorCodes.UserNotFound))); } var user = userMaybe.Value; if (user.IsVerified) { return(ResultWithError.Fail(new ErrorData( ErrorCodes.UserIsAlreadyVerified))); } var token = user.GenerateNewAccountConfirmationToken( this._clock.GetCurrentInstant().ToDateTimeUtc(), TimeSpan.FromHours(this._securitySettings.AccountVerificationTokenLifetime)); user.AddDomainEvent(new AccountConfirmationTokenGeneratedEvent(user.EmailAddress, user.Profile.FirstName, user.Profile.LastName, token)); this._userRepository.Update(user); return(ResultWithError.Ok <ErrorData>()); }
public async Task Handle_GivenSavingSucceeds_ExpectSuccessfulResult() { var user = new Mock <IUser>(); user.Setup(x => x.Profile).Returns(new Profile(Guid.NewGuid(), "first-name", "last-name")); 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.FindByEmailAddress(It.IsAny <string>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => Maybe.From(user.Object)); var securitySettings = new Mock <IOptions <SecuritySettings> >(); securitySettings.Setup(x => x.Value).Returns(new SecuritySettings()); var clock = new Mock <IClock>(); var handler = new RequestAccountVerificationCommandHandler(userRepository.Object, securitySettings.Object, clock.Object); var cmd = new RequestAccountVerificationCommand("email-address"); var result = await handler.Handle(cmd, CancellationToken.None); Assert.True(result.IsSuccess); }
public async Task Handle_GivenUserIsNotVerified_ExpectNewTokenGeneratedAndDomainEventRaised() { var user = new Mock <IUser>(); user.Setup(x => x.Profile).Returns(new Profile(Guid.NewGuid(), "first-name", "last-name")); 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.FindByEmailAddress(It.IsAny <string>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => Maybe.From(user.Object)); var securitySettings = new Mock <IOptions <SecuritySettings> >(); securitySettings.Setup(x => x.Value).Returns(new SecuritySettings()); var clock = new Mock <IClock>(); var handler = new RequestAccountVerificationCommandHandler(userRepository.Object, securitySettings.Object, clock.Object); var cmd = new RequestAccountVerificationCommand("email-address"); await handler.Handle(cmd, CancellationToken.None); user.Verify(x => x.GenerateNewAccountConfirmationToken(It.IsAny <DateTime>(), It.IsAny <TimeSpan>()), Times.Once); userRepository.Verify(x => x.Update(It.IsAny <IUser>()), Times.Once); user.Verify(x => x.AddDomainEvent(It.IsAny <AccountConfirmationTokenGeneratedEvent>())); }
public void Validate_GivenAllPropertiesAreValid_ExpectValidationSuccess() { var cmd = new RequestAccountVerificationCommand("*****@*****.**"); var validator = new RequestAccountVerificationCommandValidator(); var result = validator.Validate(cmd); Assert.True(result.IsValid); }
public void Validate_GivenEmailAddressIsEmpty_ExpectValidationFailure() { var cmd = new RequestAccountVerificationCommand(string.Empty); var validator = new RequestAccountVerificationCommandValidator(); var result = validator.Validate(cmd); Assert.False(result.IsValid); Assert.Contains( result.Errors, failure => failure.ErrorCode.Equals(ValidationCodes.FieldIsRequired) && failure.PropertyName == "EmailAddress"); }
public void Validate_GivenEmailAddressIsNotValid_ExpectValidationFailure() { var cmd = new RequestAccountVerificationCommand("email.address@com"); var validator = new RequestAccountVerificationCommandValidator(); var result = validator.Validate(cmd); Assert.False(result.IsValid); Assert.Contains( result.Errors, failure => failure.ErrorCode.Equals(ValidationCodes.ValueMustBeAnEmailAddress) && failure.PropertyName == "EmailAddress"); }
public async Task <ResultWithError <ErrorData> > Handle( RequestAccountVerificationCommand 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); }
public async Task Handle_GivenUserDoesNotExist_ExpectFailedResult() { 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.FindByEmailAddress(It.IsAny <string>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => Maybe <IUser> .Nothing); var securitySettings = new Mock <IOptions <SecuritySettings> >(); securitySettings.Setup(x => x.Value).Returns(new SecuritySettings()); var clock = new Mock <IClock>(); var handler = new RequestAccountVerificationCommandHandler(userRepository.Object, securitySettings.Object, clock.Object); var cmd = new RequestAccountVerificationCommand("email-address"); var result = await handler.Handle(cmd, CancellationToken.None); Assert.True(result.IsFailure); Assert.Equal(ErrorCodes.UserNotFound, result.Error.Code); }
public void Constructor_GiveValidArguments_PropertiesAreSet() { var command = new RequestAccountVerificationCommand("email-address"); Assert.Equal("email-address", command.EmailAddress); }