public void ShouldAssignAndSendMobileUserCodeIfVerificationIsRequired(bool verifiedMobile, bool allowMobile, bool allowMobileMarketing) { var candidateId = Guid.NewGuid(); const string phoneNumber = "0123456789"; var candidate = new Candidate { EntityId = candidateId, RegistrationDetails = new RegistrationDetails { PhoneNumber = phoneNumber }, CommunicationPreferences = new CommunicationPreferences { AllowMobile = allowMobile, VerifiedMobile = verifiedMobile, AllowMobileMarketing = allowMobileMarketing } }; var codeGenerator = new Mock <ICodeGenerator>(); const string mobileVerificationCode = "1234"; codeGenerator.Setup(cg => cg.GenerateNumeric(4)).Returns(mobileVerificationCode); _getCandidateApplicationsStrategy.Setup(gca => gca.GetApplications(candidateId)).Returns(new ApprenticeshipApplicationSummary[0]); var communicationService = new Mock <ICommunicationService>(); IEnumerable <CommunicationToken> communicationTokens = new List <CommunicationToken>(0); communicationService.Setup(cs => cs.SendMessageToCandidate(candidateId, MessageTypes.SendMobileVerificationCode, It.IsAny <IEnumerable <CommunicationToken> >())).Callback <Guid, MessageTypes, IEnumerable <CommunicationToken> >((cid, mt, ct) => { communicationTokens = ct; }); var sendMobileVerificationCodeStrategy = new SendMobileVerificationCodeStrategyBuilder().With(communicationService).Build(); var saveCandidateStrategy = new SaveCandidateStrategy(_candidateWriteRepository.Object, _getCandidateApplicationsStrategy.Object, _candidateReadRepository.Object, _apprenticeshipApplicationWriteRepository.Object, _apprenticeshipApplicationReadRepository.Object, codeGenerator.Object, sendMobileVerificationCodeStrategy, null); saveCandidateStrategy.SaveCandidate(candidate); if (verifiedMobile) { candidate.CommunicationPreferences.MobileVerificationCode.Should().BeNullOrEmpty(); communicationService.Verify(cs => cs.SendMessageToCandidate(candidateId, MessageTypes.SendMobileVerificationCode, It.IsAny <IEnumerable <CommunicationToken> >()), Times.Never); } else { candidate.CommunicationPreferences.MobileVerificationCode.Should().Be(mobileVerificationCode); communicationService.Verify(cs => cs.SendMessageToCandidate(candidateId, MessageTypes.SendMobileVerificationCode, It.IsAny <IEnumerable <CommunicationToken> >()), Times.Once); var communicationTokensList = communicationTokens.ToList(); communicationTokensList.Count.Should().Be(2); communicationTokensList.Single(ct => ct.Key == CommunicationTokens.CandidateMobileNumber).Value.Should().Be(phoneNumber); communicationTokensList.Single(ct => ct.Key == CommunicationTokens.MobileVerificationCode).Value.Should().Be(mobileVerificationCode); } }
public void ShouldAssignAndSendMobileUserCodeIfVerificationIsRequired(bool verifiedMobile, bool enableText) { var candidateId = Guid.NewGuid(); const string phoneNumber = "0123456789"; var candidate = new Candidate { EntityId = candidateId, RegistrationDetails = new RegistrationDetails { PhoneNumber = phoneNumber }, CommunicationPreferences = new CommunicationPreferences { ApplicationStatusChangePreferences = new CommunicationPreference { EnableText = enableText }, ExpiringApplicationPreferences = new CommunicationPreference { EnableText = enableText }, SavedSearchPreferences = new CommunicationPreference { EnableText = enableText }, MarketingPreferences = new CommunicationPreference { EnableText = enableText }, VerifiedMobile = verifiedMobile } }; var codeGenerator = new Mock <ICodeGenerator>(); const string mobileVerificationCode = "1234"; codeGenerator.Setup(cg => cg.GenerateNumeric(4)).Returns(mobileVerificationCode); var communicationService = new Mock <ICommunicationService>(); IEnumerable <CommunicationToken> communicationTokens = new List <CommunicationToken>(0); communicationService.Setup(cs => cs.SendMessageToCandidate(candidateId, MessageTypes.SendMobileVerificationCode, It.IsAny <IEnumerable <CommunicationToken> >())).Callback <Guid, MessageTypes, IEnumerable <CommunicationToken> >((cid, mt, ct) => { communicationTokens = ct; }); var sendMobileVerificationCodeStrategy = new SendMobileVerificationCodeStrategyBuilder().With(communicationService).With(codeGenerator).Build(); var saveCandidateStrategy = new SaveCandidateStrategyBuilder().With(sendMobileVerificationCodeStrategy).Build(); saveCandidateStrategy.SaveCandidate(candidate); if (candidate.MobileVerificationRequired()) { sendMobileVerificationCodeStrategy.SendMobileVerificationCode(candidate); } if (verifiedMobile || !enableText) { candidate.CommunicationPreferences.MobileVerificationCode.Should().BeNullOrEmpty(); candidate.CommunicationPreferences.MobileVerificationCodeDateCreated.Should().NotHaveValue(); communicationService.Verify(cs => cs.SendMessageToCandidate(candidateId, MessageTypes.SendMobileVerificationCode, It.IsAny <IEnumerable <CommunicationToken> >()), Times.Never); } else { candidate.CommunicationPreferences.MobileVerificationCode.Should().Be(mobileVerificationCode); candidate.CommunicationPreferences.MobileVerificationCodeDateCreated.Should().HaveValue(); // ReSharper disable once PossibleInvalidOperationException candidate.CommunicationPreferences.MobileVerificationCodeDateCreated.Value.Should().BeCloseTo(DateTime.UtcNow, 500); communicationService.Verify(cs => cs.SendMessageToCandidate(candidateId, MessageTypes.SendMobileVerificationCode, It.IsAny <IEnumerable <CommunicationToken> >()), Times.Once); var communicationTokensList = communicationTokens.ToList(); communicationTokensList.Count.Should().Be(2); communicationTokensList.Single(ct => ct.Key == CommunicationTokens.CandidateMobileNumber).Value.Should().Be(phoneNumber); communicationTokensList.Single(ct => ct.Key == CommunicationTokens.MobileVerificationCode).Value.Should().Be(mobileVerificationCode); } }