Ejemplo n.º 1
0
        public SendAccountRemindersStrategy Build()
        {
            var strategy = new SendAccountRemindersStrategy(_configurationService.Object, _userWriteRepository.Object, _candidateWriteRepository.Object, _auditRepository.Object, _communicationService.Object, _logService.Object);

            strategy.SetSuccessor(_successor);
            return(strategy);
        }
        public SendAccountRemindersStrategy Build()
        {
            var strategy = new SendAccountRemindersStrategy(_configurationService.Object, _communicationService.Object);

            strategy.SetSuccessor(_successor);
            return(strategy);
        }
        private static void Assert(bool shouldSendReminder, SendAccountRemindersStrategy strategy, Mock <IHousekeepingStrategy> successor, Mock <ICommunicationService> communicationService, User user, Candidate candidate)
        {
            CommunicationToken[] communicationTokens = null;
            communicationService.Setup(s => s.SendMessageToCandidate(user.EntityId, MessageTypes.SendActivationCodeReminder, It.IsAny <IEnumerable <CommunicationToken> >()))
            .Callback <Guid, MessageTypes, IEnumerable <CommunicationToken> >((id, mt, ct) =>
            {
                communicationTokens = ct.ToArray();
            });

            strategy.Handle(user, candidate);

            if (shouldSendReminder)
            {
                //Strategy handled the request
                successor.Verify(s => s.Handle(user, candidate), Times.Never);

                //Message was sent
                communicationService.Verify(s => s.SendMessageToCandidate(candidate.EntityId, MessageTypes.SendActivationCodeReminder, It.IsAny <IEnumerable <CommunicationToken> >()), Times.Once);

                var activationCodeExpiryInDays          = user.ActivateCodeExpiry.HasValue ? (user.ActivateCodeExpiry.Value - DateTime.UtcNow).Days : 0;
                var activationCodeExpiryInDaysFormatted = activationCodeExpiryInDays == 1 ? "1 day" : string.Format("{0} days", activationCodeExpiryInDays);
                if (user.ActivateCodeExpiry != null)
                {
                    activationCodeExpiryInDaysFormatted += " on " + user.ActivateCodeExpiry.Value.ToLongDateString();
                }

                var expectedCommunicationTokens = new[]
                {
                    new CommunicationToken(CommunicationTokens.CandidateFirstName, candidate.RegistrationDetails.FirstName),
                    new CommunicationToken(CommunicationTokens.ActivationCode, user.ActivationCode),
                    new CommunicationToken(CommunicationTokens.ActivationCodeExpiryDays, activationCodeExpiryInDaysFormatted),
                    new CommunicationToken(CommunicationTokens.Username, candidate.RegistrationDetails.EmailAddress)
                };

                communicationTokens.ShouldBeEquivalentTo(expectedCommunicationTokens);
            }
            else
            {
                //Strategy did not handle the request
                successor.Verify(s => s.Handle(user, candidate), Times.Once);

                //Message was not sent
                communicationService.Verify(s => s.SendMessageToCandidate(user.EntityId, MessageTypes.SendActivationCodeReminder, It.IsAny <IEnumerable <CommunicationToken> >()), Times.Never);
                communicationTokens.Should().BeNull();
            }
        }
        private static void Assert(bool shouldSetDormant, bool shouldSendReminder, SendAccountRemindersStrategy strategy, Mock <IHousekeepingStrategy> successor, Mock <IUserWriteRepository> userWriteRepository, Mock <ICandidateWriteRepository> candidateWriteRepository, Mock <ICommunicationService> communicationService, User user, Candidate candidate)
        {
            User savedUser = null;

            userWriteRepository.Setup(r => r.Save(It.IsAny <User>())).Callback <User>(u => savedUser = u);
            Candidate savedCandidate = null;

            candidateWriteRepository.Setup(r => r.Save(It.IsAny <Candidate>())).Callback <Candidate>(c => savedCandidate = c);

            CommunicationToken[] communicationTokens = null;
            communicationService.Setup(s => s.SendMessageToCandidate(user.EntityId, MessageTypes.SendDormantAccountReminder, It.IsAny <IEnumerable <CommunicationToken> >()))
            .Callback <Guid, MessageTypes, IEnumerable <CommunicationToken> >((id, mt, ct) =>
            {
                communicationTokens = ct.ToArray();
            });

            strategy.Handle(user, candidate);

            if (shouldSetDormant)
            {
                //User and Candidate were updated
                userWriteRepository.Verify(r => r.Save(It.IsAny <User>()), Times.Once);
                savedUser.Should().NotBeNull();
                candidateWriteRepository.Verify(r => r.Save(It.IsAny <Candidate>()), Times.Once);
                savedCandidate.Should().NotBeNull();

                //User was set as dormant and comms were disabled
                savedUser.Status.Should().Be(UserStatuses.Dormant);
                CandidateHelper.IndividualCommunicationPreferences(savedCandidate.CommunicationPreferences)
                .Any(p => p.EnableEmail && p.EnableText)
                .Should()
                .BeFalse();
            }
            else
            {
                //User and Candidate were not updated
                userWriteRepository.Verify(r => r.Save(It.IsAny <User>()), Times.Never);
                candidateWriteRepository.Verify(r => r.Save(It.IsAny <Candidate>()), Times.Never);

                savedUser.Should().BeNull();
                savedCandidate.Should().BeNull();
            }

            if (shouldSendReminder)
            {
                //Strategy handled the request
                successor.Verify(s => s.Handle(user, candidate), Times.Never);

                //Message was sent
                communicationService.Verify(s => s.SendMessageToCandidate(candidate.EntityId, MessageTypes.SendDormantAccountReminder, It.IsAny <IEnumerable <CommunicationToken> >()), Times.Once);
                communicationTokens.Should().NotBeNull();

                var lastLogin                = user.LastLogin ?? DateTime.UtcNow;
                var lastLoginInDays          = (DateTime.UtcNow - lastLogin).Days;
                var lastLoginInDaysFormatted = lastLoginInDays > 270 ? "almost a year" : string.Format("{0} days", lastLoginInDays);

                var expectedCommunicationTokens = new[]
                {
                    new CommunicationToken(CommunicationTokens.CandidateFirstName, candidate.RegistrationDetails.FirstName),
                    new CommunicationToken(CommunicationTokens.LastLogin, lastLoginInDaysFormatted),
                    new CommunicationToken(CommunicationTokens.AccountExpiryDate, lastLogin.AddDays(365).ToLongDateString()),
                    new CommunicationToken(CommunicationTokens.Username, candidate.RegistrationDetails.EmailAddress)
                };

                communicationTokens.ShouldBeEquivalentTo(expectedCommunicationTokens);
            }
            else
            {
                //Strategy did not handle the request
                successor.Verify(s => s.Handle(user, candidate), Times.Once);

                //Message was not sent
                communicationService.Verify(s => s.SendMessageToCandidate(user.EntityId, MessageTypes.SendActivationCodeReminder, It.IsAny <IEnumerable <CommunicationToken> >()), Times.Never);
                communicationTokens.Should().BeNull();
            }
        }