public void NewUserRegistration()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";

            var candidate = new CandidateBuilder(Guid.Empty).EmailAddress(emailAddress).Build();

            var strategy = new RegisterCandidateStrategyBuilder().Build();

            strategy.RegisterCandidate(candidate, password);
        }
        public void NewUserRegistrationSendsActivationCode()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";

            var candidate = new CandidateBuilder(Guid.Empty).EmailAddress(emailAddress).Build();

            var communicationService = new Mock <ICommunicationService>();
            var strategy             = new RegisterCandidateStrategyBuilder().With(communicationService).Build();

            strategy.RegisterCandidate(candidate, password);

            communicationService.Verify(s => s.SendMessageToCandidate(It.Is <Guid>(g => g != Guid.Empty), MessageTypes.SendActivationCode, It.IsAny <CommunicationToken[]>()), Times.Once);
        }
        public void NewUserRegistrationRegistersUserAccount()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";

            var candidate = new CandidateBuilder(Guid.Empty).EmailAddress(emailAddress).Build();

            var userAccountService = new Mock <IUserAccountService>();
            var strategy           = new RegisterCandidateStrategyBuilder().With(userAccountService).Build();

            strategy.RegisterCandidate(candidate, password);

            userAccountService.Verify(s => s.Register(emailAddress, It.Is <Guid>(g => g != Guid.Empty), It.IsAny <string>(), UserRoles.Candidate), Times.Once);
        }
        public void NewUserRegistrationCreatesAuthenticationEntity()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";

            var candidate = new CandidateBuilder(Guid.Empty).EmailAddress(emailAddress).Build();

            var authenticationService = new Mock <IAuthenticationService>();
            var strategy = new RegisterCandidateStrategyBuilder().With(authenticationService).Build();

            strategy.RegisterCandidate(candidate, password);

            authenticationService.Verify(s => s.CreateUser(It.Is <Guid>(g => g != Guid.Empty), password), Times.Once);
        }
        public void NewUserRegistrationCreatesNewGuid()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";

            var candidate = new CandidateBuilder(Guid.Empty).EmailAddress(emailAddress).Build();

            var       candidateWriteRepository = new Mock <ICandidateWriteRepository>();
            Candidate savedCandidate           = null;

            candidateWriteRepository.Setup(r => r.Save(It.IsAny <Candidate>())).Returns <Candidate>(c => c).Callback <Candidate>(c => savedCandidate = c);
            var strategy = new RegisterCandidateStrategyBuilder().With(candidateWriteRepository).Build();

            strategy.RegisterCandidate(candidate, password);

            savedCandidate.Should().NotBeNull();
            savedCandidate.EntityId.Should().NotBeEmpty();
        }
        public void RegisteringUserPendingDeletionIsValid()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";
            var          candidateId  = Guid.NewGuid();

            var candidate = new CandidateBuilder(candidateId).EmailAddress(emailAddress).Build();
            var user      = new UserBuilder(emailAddress, candidateId).WithStatus(UserStatuses.PendingDeletion).Build();

            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(emailAddress, false)).Returns(user);
            var strategy = new RegisterCandidateStrategyBuilder().With(userReadRepository).With(userReadRepository).Build();

            Action action = () => strategy.RegisterCandidate(candidate, password);

            action.ShouldNotThrow <CustomException>();
        }
        public void ExistingUserMustNotBeActive()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";
            var          candidateId  = Guid.NewGuid();

            var candidate = new CandidateBuilder(candidateId).EmailAddress(emailAddress).Build();
            var user      = new UserBuilder(emailAddress, candidateId).Activated(true).Build();

            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(emailAddress, false)).Returns(user);
            var strategy = new RegisterCandidateStrategyBuilder().With(userReadRepository).Build();

            Action action = () => strategy.RegisterCandidate(candidate, password);

            action.ShouldThrow <CustomException>();
        }
        public void RegisteringUserPendingDeletionSendsActivationCode()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";
            var          candidateId  = Guid.NewGuid();

            var candidate = new CandidateBuilder(candidateId).EmailAddress(emailAddress).Build();
            var user      = new UserBuilder(emailAddress, candidateId).WithStatus(UserStatuses.PendingDeletion).Build();

            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(emailAddress, false)).Returns(user);
            var communicationService = new Mock <ICommunicationService>();
            var strategy             = new RegisterCandidateStrategyBuilder().With(userReadRepository).With(communicationService).Build();

            strategy.RegisterCandidate(candidate, password);

            communicationService.Verify(s => s.SendMessageToCandidate(It.Is <Guid>(g => g != Guid.Empty), MessageTypes.SendActivationCode, It.IsAny <CommunicationToken[]>()), Times.Once);
        }
        public void RegisteringUserPendingDeletionRegistersUserAccount()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";
            var          candidateId  = Guid.NewGuid();

            var candidate = new CandidateBuilder(candidateId).EmailAddress(emailAddress).Build();
            var user      = new UserBuilder(emailAddress, candidateId).WithStatus(UserStatuses.PendingDeletion).Build();

            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(emailAddress, false)).Returns(user);
            var userAccountService = new Mock <IUserAccountService>();
            var strategy           = new RegisterCandidateStrategyBuilder().With(userReadRepository).With(userAccountService).Build();

            strategy.RegisterCandidate(candidate, password);

            userAccountService.Verify(s => s.Register(emailAddress, It.Is <Guid>(g => g != Guid.Empty), It.IsAny <string>(), UserRoles.Candidate), Times.Once);
        }
        public void RegisteringExistingUnactivatedUserDoesntReRegisterUser()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";
            var          candidateId  = Guid.NewGuid();

            var candidate = new CandidateBuilder(candidateId).EmailAddress(emailAddress).Build();
            var user      = new UserBuilder(emailAddress, candidateId).Activated(false).Build();

            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(emailAddress, false)).Returns(user);
            var userAccountService = new Mock <IUserAccountService>();
            var strategy           = new RegisterCandidateStrategyBuilder().With(userReadRepository).With(userAccountService).Build();

            strategy.RegisterCandidate(candidate, password);

            userAccountService.Verify(s => s.Register(emailAddress, candidateId, It.IsAny <string>(), UserRoles.Candidate), Times.Never);
        }
        public void RegisteringExistingUnactivatedExpiredUserIsValid()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";
            var          candidateId  = Guid.NewGuid();

            var candidate = new CandidateBuilder(candidateId).EmailAddress(emailAddress).Build();
            var user      = new UserBuilder(emailAddress, candidateId).Activated(false).Build();

            user.ActivateCodeExpiry = DateTime.UtcNow.AddMonths(-2);

            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(emailAddress, false)).Returns(user);
            var strategy = new RegisterCandidateStrategyBuilder().With(userReadRepository).Build();

            Action action = () => strategy.RegisterCandidate(candidate, password);

            action.ShouldNotThrow <CustomException>();
        }
        public void RegisteringExistingUnactivatedExpiredUserSendsActivationCode()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";
            var          candidateId  = Guid.NewGuid();

            var candidate = new CandidateBuilder(candidateId).EmailAddress(emailAddress).Build();
            var user      = new UserBuilder(emailAddress, candidateId).Activated(false).Build();

            user.ActivateCodeExpiry = DateTime.UtcNow.AddMonths(-2);

            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(emailAddress, false)).Returns(user);
            var communicationService = new Mock <ICommunicationService>();
            var strategy             = new RegisterCandidateStrategyBuilder().With(userReadRepository).With(communicationService).Build();

            strategy.RegisterCandidate(candidate, password);

            communicationService.Verify(s => s.SendMessageToCandidate(candidateId, MessageTypes.SendActivationCode, It.IsAny <CommunicationToken[]>()), Times.Once);
        }
        public void RegisteringExistingUnactivatedExpiredUserDoesntResetPassword()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";
            var          candidateId  = Guid.NewGuid();

            var candidate = new CandidateBuilder(candidateId).EmailAddress(emailAddress).Build();
            var user      = new UserBuilder(emailAddress, candidateId).Activated(false).Build();

            user.ActivateCodeExpiry = DateTime.UtcNow.AddMonths(-2);

            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(emailAddress, false)).Returns(user);
            var authenticationService = new Mock <IAuthenticationService>();
            var strategy = new RegisterCandidateStrategyBuilder().With(userReadRepository).With(authenticationService).Build();

            strategy.RegisterCandidate(candidate, password);

            authenticationService.Verify(s => s.ResetUserPassword(candidateId, password), Times.Once);
        }
        public void RegisteringUserPendingDeletionCreatesNewGuid()
        {
            const string emailAddress = "*****@*****.**";
            const string password     = "******";
            var          candidateId  = Guid.NewGuid();

            var candidate = new CandidateBuilder(candidateId).EmailAddress(emailAddress).Build();
            var user      = new UserBuilder(emailAddress, candidateId).WithStatus(UserStatuses.PendingDeletion).Build();

            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(emailAddress, false)).Returns(user);
            var       candidateWriteRepository = new Mock <ICandidateWriteRepository>();
            Candidate savedCandidate           = null;

            candidateWriteRepository.Setup(r => r.Save(It.IsAny <Candidate>())).Returns <Candidate>(c => c).Callback <Candidate>(c => savedCandidate = c);
            var strategy = new RegisterCandidateStrategyBuilder().With(userReadRepository).With(candidateWriteRepository).Build();

            strategy.RegisterCandidate(candidate, password);

            savedCandidate.Should().NotBeNull();
            savedCandidate.EntityId.Should().NotBeEmpty();
        }