public void ShouldUpdateUserProviderWhenEmailVerificationCodeIsValid()
        {
            // Arrange.
            const string username = "******";
            const string emailVerificationCode = "ABC123";

            var providerUser = new ProviderUser
            {
                Status = ProviderUserStatus.Registered,
                EmailVerificationCode = emailVerificationCode,
                EmailVerifiedDate     = null
            };

            _mockUserProfileService
            .Setup(mock => mock.GetProviderUser(username))
            .Returns(providerUser);

            var providerUserProvider = new ProviderUserProviderBuilder()
                                       .With(_mockUserProfileService)
                                       .Build();

            // Act.
            var result = providerUserProvider.ValidateEmailVerificationCode(username, emailVerificationCode);

            // Assert.
            result.Should().BeTrue();

            _mockUserProfileService.Verify(mock =>
                                           mock.UpdateProviderUser(providerUser), Times.Once);

            providerUser.Status.Should().Be(ProviderUserStatus.EmailVerified);
            providerUser.EmailVerificationCode.Should().BeNull();
            providerUser.EmailVerifiedDate.Should().BeCloseTo(DateTime.UtcNow, 1000);
        }
        public void ShouldValidateEmailVerificationCodeCaseInsensitive(
            string savedEmailVerificationCode, string enteredEmailVerificationCode)
        {
            // Arrange.
            const string username = "******";

            var providerUser = new ProviderUser
            {
                EmailVerificationCode = savedEmailVerificationCode
            };

            _mockUserProfileService
            .Setup(mock => mock.GetProviderUser(username))
            .Returns(providerUser);

            var providerUserProvider = new ProviderUserProviderBuilder()
                                       .With(_mockUserProfileService)
                                       .Build();

            // Act.
            var result = providerUserProvider.ValidateEmailVerificationCode(username, enteredEmailVerificationCode);

            // Assert.
            result.Should().BeTrue();
        }
        public void ShouldSendEmailVerificationCodeToExistingProviderUserWhenEmailChanges(
            string originalEmailAddress, string newEmailAddress, bool expectToSendVerificationCodeEmail)
        {
            // Arrange.
            const string username = "******";
            const string ukprn    = "1000000";

            var existingProviderUser = new Fixture()
                                       .Build <ProviderUser>()
                                       .With(each => each.Email, originalEmailAddress)
                                       .Create();

            _mockUserProfileService
            .Setup(mock => mock
                   .GetProviderUser(username))
            .Returns(existingProviderUser);

            var providerUser = new Fixture()
                               .Build <ProviderUser>()
                               .With(each => each.Email, originalEmailAddress)
                               .Create();

            _mockUserProfileService
            .Setup(mock => mock
                   .UpdateProviderUser(It.IsAny <ProviderUser>()))
            .Returns(providerUser);

            var providerUserProvider = new ProviderUserProviderBuilder()
                                       .With(_mockUserProfileService)
                                       .With(_mockProviderService)
                                       .With(_mockProviderUserAccountService)
                                       .Build();

            var originalViewModel = new Fixture()
                                    .Build <ProviderUserViewModel>()
                                    .With(each => each.EmailAddress, newEmailAddress)
                                    .Create();

            // Act.
            providerUserProvider.SaveProviderUser(
                username, ukprn, originalViewModel);

            // Assert.
            var expectedTimes = expectToSendVerificationCodeEmail ? 1 : 0;

            _mockProviderUserAccountService.Verify(mock =>
                                                   mock.SendEmailVerificationCode(username), Times.Exactly(expectedTimes));
        }
        public void ShouldSendEmailVerificationCodeToNewProviderUser()
        {
            // Arrange.
            const string username = "******";

            _mockUserProfileService
            .Setup(mock => mock
                   .GetProviderUser(username))
            .Returns(default(ProviderUser));

            var providerUser = new Fixture()
                               .Build <ProviderUser>()
                               .Create();

            _mockUserProfileService
            .Setup(mock => mock
                   .CreateProviderUser(It.IsAny <ProviderUser>()))
            .Returns(providerUser);

            var provider = new Fixture()
                           .Build <Provider>()
                           .Create();

            _mockProviderService
            .Setup(mock =>
                   mock.GetProvider(provider.Ukprn, true))
            .Returns(provider);

            var providerUserProvider = new ProviderUserProviderBuilder()
                                       .With(_mockUserProfileService)
                                       .With(_mockProviderService)
                                       .With(_mockProviderUserAccountService)
                                       .Build();

            var originalViewModel = new Fixture()
                                    .Build <ProviderUserViewModel>()
                                    .With(each => each.EmailAddress, "*****@*****.**")
                                    .Create();

            // Act.
            providerUserProvider.SaveProviderUser(
                username, provider.Ukprn, originalViewModel);

            // Assert.
            _mockProviderUserAccountService.Verify(mock =>
                                                   mock.SendEmailVerificationCode(username), Times.Once);
        }
        public void ShouldSaveExistingProviderUser()
        {
            // Arrange.
            const string username = "******";
            const string ukprn    = "1000000";

            var existingProviderUser = new Fixture()
                                       .Build <ProviderUser>()
                                       .Create();

            _mockUserProfileService
            .Setup(mock => mock
                   .GetProviderUser(username))
            .Returns(existingProviderUser);

            _mockUserProfileService
            .Setup(mock => mock
                   .UpdateProviderUser(It.IsAny <ProviderUser>()))
            .Returns <ProviderUser>(providerUser => providerUser);

            var providerUserProvider = new ProviderUserProviderBuilder()
                                       .With(_mockUserProfileService)
                                       .With(_mockProviderService)
                                       .Build();

            var originalViewModel = new Fixture()
                                    .Build <ProviderUserViewModel>()
                                    .Create();

            // Act.
            var savedViewModel = providerUserProvider.SaveProviderUser(
                username, ukprn, originalViewModel);

            // Assert.
            savedViewModel.Should().NotBeNull();

            savedViewModel.Fullname.Should().Be(originalViewModel.Fullname);
            savedViewModel.EmailAddress.Should().Be(originalViewModel.EmailAddress);
            savedViewModel.PhoneNumber.Should().Be(originalViewModel.PhoneNumber);
            savedViewModel.DefaultProviderSiteId.Should().Be(originalViewModel.DefaultProviderSiteId);
            savedViewModel.EmailAddressVerified.Should().Be(false);
        }
        public void ShouldSaveNewProviderUser()
        {
            // Arrange.
            const string username = "******";

            _mockUserProfileService
            .Setup(mock => mock
                   .GetProviderUser(username))
            .Returns(default(ProviderUser));

            var newProviderUser = default(ProviderUser);

            _mockUserProfileService
            .Setup(mock => mock
                   .CreateProviderUser(It.IsAny <ProviderUser>()))
            .Returns <ProviderUser>(providerUser => providerUser)
            .Callback <ProviderUser>(providerUser =>
            {
                newProviderUser = providerUser;
            });

            var provider = new Fixture()
                           .Build <Provider>()
                           .Create();

            _mockProviderService
            .Setup(mock =>
                   mock.GetProvider(provider.Ukprn, true))
            .Returns(provider);

            var providerUserProvider = new ProviderUserProviderBuilder()
                                       .With(_mockUserProfileService)
                                       .With(_mockProviderService)
                                       .Build();

            var originalViewModel = new Fixture()
                                    .Build <ProviderUserViewModel>()
                                    .Create();

            // Act.
            var savedViewModel = providerUserProvider.SaveProviderUser(
                username, provider.Ukprn, originalViewModel);

            // Assert: calls.
            _mockProviderService.Verify(mock =>
                                        mock.GetProvider(provider.Ukprn, true), Times.Once);

            // Assert: saved provider user.
            newProviderUser.ProviderId.Should().Be(provider.ProviderId);
            newProviderUser.ProviderUserGuid.Should().NotBe(Guid.Empty);
            newProviderUser.Status.Should().Be(ProviderUserStatus.Registered);

            // Assert: view model
            savedViewModel.Should().NotBeNull();

            savedViewModel.Fullname.Should().Be(originalViewModel.Fullname);
            savedViewModel.EmailAddress.Should().Be(originalViewModel.EmailAddress);
            savedViewModel.PhoneNumber.Should().Be(originalViewModel.PhoneNumber);
            savedViewModel.DefaultProviderSiteId.Should().Be(originalViewModel.DefaultProviderSiteId);
            savedViewModel.EmailAddressVerified.Should().Be(false);
        }