public async Task Handle_GivenEmailAddressHasChangedAndNotInUse_ExpectUserToBeAdded()
        {
            var user = new Mock <IUser>();

            user.Setup(x => x.EmailAddress).Returns("email-address");

            var userQueries = new Mock <IUserQueries>();

            userQueries.Setup(x =>
                              x.CheckForPresenceOfUserByEmailAddress(It.IsAny <string>()))
            .ReturnsAsync(() => new StatusCheckModel(false));

            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 handler = new UpdateUserCoreDetailsCommandHandler(userRepository.Object, userQueries.Object);
            var cmd     = new UpdateUserCoreDetailsCommand(TestVariables.UserId, "email-address", "first-name",
                                                           "last-name", false, false, new List <Guid>());
            await handler.Handle(cmd, CancellationToken.None);

            userRepository.Verify(x => x.Update(It.IsAny <IUser>()), Times.Once);
        }
        private async Task <ResultWithError <ErrorData> > Process(
            UpdateUserCoreDetailsCommand request, CancellationToken cancellationToken)
        {
            var userMaybe = await this._userRepository.Find(request.UserId, cancellationToken);

            if (userMaybe.HasNoValue)
            {
                return(ResultWithError.Fail(new ErrorData(ErrorCodes.UserNotFound)));
            }

            var user = userMaybe.Value;

            if (!string.Equals(request.EmailAddress, user.EmailAddress, StringComparison.InvariantCultureIgnoreCase))
            {
                var statusCheck =
                    await this._userQueries.CheckForPresenceOfUserByEmailAddress(request.EmailAddress);

                if (statusCheck.IsPresent)
                {
                    return(ResultWithError.Fail(new ErrorData(ErrorCodes.UserAlreadyExists)));
                }
            }

            user.UpdateSystemAccessDetails(request.EmailAddress, request.IsLockable);
            user.UpdateProfile(request.FirstName, request.LastName);
            user.SetAdminStatus(request.IsAdmin);
            user.SetRoles(request.Roles);

            this._userRepository.Update(user);
            return(ResultWithError.Ok <ErrorData>());
        }
        public async Task Handle_GivenEmailAddressHasChangedAndInUse_ExpectFailedResult()
        {
            var user = new Mock <IUser>();

            user.Setup(x => x.EmailAddress).Returns("email-address");
            var userQueries = new Mock <IUserQueries>();

            userQueries.Setup(x =>
                              x.CheckForPresenceOfUserByEmailAddress(It.IsAny <string>()))
            .ReturnsAsync(() => new StatusCheckModel(true));
            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 handler = new UpdateUserCoreDetailsCommandHandler(userRepository.Object, userQueries.Object);
            var cmd     = new UpdateUserCoreDetailsCommand(TestVariables.UserId, "new-email-address", "first-name",
                                                           "last-name", false, false, new List <Guid>());
            var result = await handler.Handle(cmd, CancellationToken.None);

            Assert.True(result.IsFailure);
            Assert.Equal(ErrorCodes.UserAlreadyExists, result.Error.Code);
        }
        public void Validate_GivenAllPropertiesAreValid_ExpectValidationSuccess()
        {
            var cmd       = new UpdateUserCoreDetailsCommand(TestVariables.UserId, "*****@*****.**", "first-name", "last-name", true, true, new List <Guid>());
            var validator = new UpdateUserCoreDetailsCommandValidator();
            var result    = validator.Validate(cmd);

            Assert.True(result.IsValid);
        }
        public void Validate_GivenFirstNameIsNull_ExpectValidationFailure()
        {
            var cmd       = new UpdateUserCoreDetailsCommand(TestVariables.UserId, "*****@*****.**", null, "last-name", true, true, new List <Guid>());
            var validator = new UpdateUserCoreDetailsCommandValidator();
            var result    = validator.Validate(cmd);

            Assert.False(result.IsValid);
            Assert.Contains(
                result.Errors,
                failure => failure.ErrorCode.Equals(ValidationCodes.FieldIsRequired) &&
                failure.PropertyName == "FirstName");
        }
        public void Validate_GivenEmailAddressIsNotValidEmailAddress_ExpectValidationFailure()
        {
            var cmd       = new UpdateUserCoreDetailsCommand(TestVariables.UserId, "email-address", "first-name", "last-name", true, true, new List <Guid>());
            var validator = new UpdateUserCoreDetailsCommandValidator();
            var result    = validator.Validate(cmd);

            Assert.False(result.IsValid);
            Assert.Contains(
                result.Errors,
                failure => failure.ErrorCode.Equals(ValidationCodes.ValueMustBeAnEmailAddress) &&
                failure.PropertyName == "EmailAddress");
        }
        public void Validate_GivenEmailAddressIsEmpty_ExpectValidationFailure()
        {
            var cmd       = new UpdateUserCoreDetailsCommand(TestVariables.UserId, string.Empty, "first-name", "last-name", true, true, new List <Guid>());
            var validator = new UpdateUserCoreDetailsCommandValidator();
            var result    = validator.Validate(cmd);

            Assert.False(result.IsValid);
            Assert.Contains(
                result.Errors,
                failure => failure.ErrorCode.Equals(ValidationCodes.FieldIsRequired) &&
                failure.PropertyName == "EmailAddress");
        }
        public void Constructor_GiveValidArguments_PropertiesAreSet()
        {
            var command = new UpdateUserCoreDetailsCommand(TestVariables.UserId, "email-address", "first-name",
                                                           "last-name", false, true, new List <Guid> {
                TestVariables.RoleId
            });

            Assert.Equal(TestVariables.UserId, command.UserId);
            Assert.Equal("email-address", command.EmailAddress);
            Assert.Equal("first-name", command.FirstName);
            Assert.Equal("last-name", command.LastName);
            Assert.False(command.IsLockable);
            Assert.Single(command.Roles);
        }
        public async Task <ResultWithError <ErrorData> > Handle(
            UpdateUserCoreDetailsCommand 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_GivenNotUserInSystem_ExpectFailedResult()
        {
            var userQueries    = new Mock <IUserQueries>();
            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 <IUser> .Nothing);

            var handler = new UpdateUserCoreDetailsCommandHandler(userRepository.Object, userQueries.Object);
            var cmd     = new UpdateUserCoreDetailsCommand(TestVariables.UserId, "email-address", "first-name",
                                                           "last-name", false, false, new List <Guid>());
            var result = await handler.Handle(cmd, CancellationToken.None);

            Assert.True(result.IsFailure);
            Assert.Equal(ErrorCodes.UserNotFound, result.Error.Code);
        }
        public async Task Handle_GivenSavingSucceeds_ExpectSuccessfulResult()
        {
            var user = new Mock <IUser>();

            user.Setup(x => x.EmailAddress).Returns("email-address");
            var userQueries = new Mock <IUserQueries>();

            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 handler = new UpdateUserCoreDetailsCommandHandler(userRepository.Object, userQueries.Object);
            var cmd     = new UpdateUserCoreDetailsCommand(TestVariables.UserId, "email-address", "first-name",
                                                           "last-name", false, false, new List <Guid>());
            var result = await handler.Handle(cmd, CancellationToken.None);

            Assert.True(result.IsSuccess);
        }