public static async Task SignInAsync_SuccessfulSignInWithNullContext_RaisesLoginSuccessEvent()
        {
            int eventCount = 0;
            UserLoginSuccessEvent raisedEvent = null;

            void EventCallback(UserLoginSuccessEvent evt)
            {
                eventCount++;
                raisedEvent = evt;
            }

            const string userId   = "UserId";
            const string username = "******";

            using var loginService = new LoginServiceBuilder()
                                     .WithEventServiceCallback <UserLoginSuccessEvent>(EventCallback)
                                     .WithSignInResult(IdentitySignInResult.Success)
                                     .WithFindUserResult(ApplicationUserBuilder
                                                         .Create()
                                                         .WithUserId(userId)
                                                         .WithUsername(username)
                                                         .Build())
                                     .Build();

            await loginService.SignInAsync("user", "pass", new Uri("~/", UriKind.Relative));

            eventCount.Should().Be(1);
            Assert.NotNull(raisedEvent);
            raisedEvent.ClientId.Should().BeNull();
            raisedEvent.DisplayName.Should().Be(username);
            raisedEvent.Message.Should().BeNull();
            raisedEvent.SubjectId.Should().Be(userId);
            raisedEvent.Username.Should().Be(username);
        }
예제 #2
0
 static void Test()
 {
     ApplicationUserBuilder
     .Create()
     .WithUsername(null)
     .Build();
 }
예제 #3
0
        public async Task Login_NotValidUserData_ReturnsUnauthorized()
        {
            // Arrange
            var loginRequest = new LoginRequestBuilder()
                               .WithPassword("pass12345")
                               .WithEmail("*****@*****.**")
                               .Build();
            var user = new ApplicationUserBuilder()
                       .WithEmail(loginRequest.Email)
                       .WithUsername(loginRequest.Email)
                       .WithPassword(loginRequest.Password)
                       .WithId("abcd")
                       .Build();
            var userManager = new Mock <MockUserManager>();

            userManager.Setup(x => x.FindByEmailAsync(It.IsAny <string>()))
            .Returns(Task.FromResult(user));
            userManager.Setup(x => x.CheckPasswordAsync(It.IsAny <ApplicationUser>(), It.IsAny <string>()))
            .Returns(Task.FromResult(false));
            var configurationMock = new Mock <IConfiguration>();

            configurationMock.Setup(x => x[It.IsAny <string>()])
            .Returns("SomeReallyLongAndSecretKey");
            var accountController = new AccountController(userManager.Object, configurationMock.Object);

            // Act
            var result = await accountController.Login(loginRequest);

            // Assert
            result.Should().BeAssignableTo <BadRequestResult>();
        }
예제 #4
0
        private static (ApplicationUser RepoUser, OrganisationUserModel ExpectedUser) CreateApplicationUserTestData(
            bool disabled)
        {
            var repositoryApplicationUser = ApplicationUserBuilder
                                            .Create()
                                            .WithFirstName(Guid.NewGuid().ToString())
                                            .WithLastName(Guid.NewGuid().ToString())
                                            .WithPhoneNumber(Guid.NewGuid().ToString())
                                            .WithEmailAddress(Guid.NewGuid().ToString())
                                            .WithDisabled(disabled)
                                            .Build();

            return(
                RepoUser : repositoryApplicationUser,
                ExpectedUser : new OrganisationUserModel
            {
                UserId = repositoryApplicationUser.Id,
                EmailAddress = repositoryApplicationUser.Email,
                PhoneNumber = repositoryApplicationUser.PhoneNumber,
                FirstName = repositoryApplicationUser.FirstName,
                LastName = repositoryApplicationUser.LastName,
                IsDisabled = repositoryApplicationUser.Disabled
            }
                );
        }
        public async Task ValidateAsync_DuplicateEmailAddress_ReturnsFailure()
        {
            const string duplicateEmailAddress = "*****@*****.**";

            var context = ApplicationUserValidatorTestContext.Setup();

            context.ApplicationUserByEmail = ApplicationUserBuilder
                                             .Create()
                                             .WithEmailAddress(duplicateEmailAddress)
                                             .Build();

            var sut = context.ApplicationUserValidator;

            var user = ApplicationUserBuilder
                       .Create()
                       .WithEmailAddress(duplicateEmailAddress)
                       .Build();

            var actual = await sut.ValidateAsync(user);

            var expected = Result.Failure(new List <ErrorDetails> {
                new ErrorDetails("EmailAlreadyExists", "EmailAddress")
            });

            actual.Should().Be(expected);
        }
        public static async Task SignInAsync_FailedSignInWithNullContext_RaisesLoginFailureEvent()
        {
            const string username = "******";

            int eventCount = 0;
            UserLoginFailureEvent raisedEvent = null;

            void EventCallback(UserLoginFailureEvent evt)
            {
                eventCount++;
                raisedEvent = evt;
            }

            using var loginService = new LoginServiceBuilder()
                                     .WithFindUserResult(ApplicationUserBuilder.Create().WithUsername(username).Build())
                                     .WithEventServiceCallback <UserLoginFailureEvent>(EventCallback)
                                     .WithSignInResult(IdentitySignInResult.Failed)
                                     .Build();

            await loginService.SignInAsync(username, "pass", null);

            eventCount.Should().Be(1);
            Assert.NotNull(raisedEvent);
            raisedEvent.ClientId.Should().BeNull();
            raisedEvent.Message.Should().Be(LoginService.ValidateUserMessage);
            raisedEvent.Username.Should().Be(username);
        }
        public async Task GetFilteredBooks_UserHasOneCurrentlyReadingBook_ReturnsOneBook()
        {
            // Arrange
            var tenDaysAgo  = DateTime.Now.Subtract(new TimeSpan(10, 0, 0, 0));
            var fiveDaysAgo = DateTime.Now.Subtract(new TimeSpan(5, 0, 0, 0));
            var userOne     = new ApplicationUserBuilder().WithId("1").Build();
            var userTwo     = new ApplicationUserBuilder().WithId("2").Build();
            var data        = new List <Book>
            {
                new BookBuilder().WithUser(userOne)
                .WithReadingStart(tenDaysAgo)
                .WithReadingEnd(fiveDaysAgo)
                .Build(),
                new BookBuilder().WithUser(userOne)
                .WithReadingStart(tenDaysAgo)
                .Build(),
                new BookBuilder().WithUser(userTwo)
                .WithReadingStart(tenDaysAgo)
                .Build()
            };
            var dbset        = GenerateEnumerableDbSetMock(data.AsQueryable());
            var context      = GenerateEnumerableContextMock(dbset);
            var booksService = new BooksService(context.Object);
            var filters      = new BookFiltersBuilder()
                               .WithCurrentlyReadingStatus(true)
                               .Build();

            // Act
            var result = await booksService.GetFilteredBooks(userOne.Id, filters);

            // Assert
            result.Should().HaveCount(1);
        }
        public async Task GetFilteredBooks_UserHasTwoBooksWithYear_ReturnsTwoBooks()
        {
            // Arrange
            var userOne = new ApplicationUserBuilder().WithId("1").Build();
            var userTwo = new ApplicationUserBuilder().WithId("2").Build();
            var data    = new List <Book>
            {
                new BookBuilder().WithUser(userOne).WithYear(2015).Build(),
                new BookBuilder().WithUser(userOne).WithYear(2010).Build(),
                new BookBuilder().WithUser(userTwo).WithYear(2010).Build()
            };
            var dbset        = GenerateEnumerableDbSetMock(data.AsQueryable());
            var context      = GenerateEnumerableContextMock(dbset);
            var booksService = new BooksService(context.Object);
            var filters      = new BookFiltersBuilder()
                               .WithPublicationYearSince(2005)
                               .WithPublicationYearTo(2015)
                               .Build();

            // Act
            var result = await booksService.GetFilteredBooks(userOne.Id, filters);

            // Assert
            result.Should().HaveCount(2);
        }
예제 #9
0
        public static async Task GetProfileDataAsync_GivenAnApplicationUserExistsWithOrganisationFunctionBuyer_ReturnsExpectedClaimList()
        {
            var expectedApplicationUser = ApplicationUserBuilder
                                          .Create()
                                          .WithEmailAddress("*****@*****.**")
                                          .WithFirstName("Bob")
                                          .WithLastName("Smith")
                                          .WithOrganisationFunction(OrganisationFunction.Buyer)
                                          .Build();

            Mock <IUsersRepository> applicationUserRepositoryMock = new Mock <IUsersRepository>();

            applicationUserRepositoryMock
            .Setup(r => r.GetByIdAsync(It.IsAny <string>()))
            .ReturnsAsync(expectedApplicationUser);

            var expectedOrganisation = OrganisationBuilder
                                       .Create()
                                       .Build();

            Mock <IOrganisationRepository> organisationRepositoryMock = new Mock <IOrganisationRepository>();

            organisationRepositoryMock
            .Setup(r => r.GetByIdAsync(It.IsAny <Guid>()))
            .ReturnsAsync(expectedOrganisation);

            var sut = ProfileServiceBuilder
                      .Create()
                      .WithUserRepository(applicationUserRepositoryMock.Object)
                      .WithOrganisationRepository(organisationRepositoryMock.Object)
                      .Build();

            var profileDataRequestContext = ProfileDataRequestContextBuilder
                                            .Create()
                                            .WithSubjectId(expectedApplicationUser.Id)
                                            .Build();

            await sut.GetProfileDataAsync(profileDataRequestContext);

            var expected = new List <(string, string)>
            {
                (Subject, expectedApplicationUser.Id),
                (PreferredUserName, expectedApplicationUser.UserName),
                (JwtRegisteredClaimNames.UniqueName, expectedApplicationUser.UserName),
                (GivenName, expectedApplicationUser.FirstName),
                (FamilyName, expectedApplicationUser.LastName),
                (Name, $"{expectedApplicationUser.FirstName} {expectedApplicationUser.LastName}"),
                (Email, expectedApplicationUser.Email),
                (EmailVerified, expectedApplicationUser.EmailConfirmed.ToString(CultureInfo.CurrentCulture).ToLowerInvariant()),
                (ApplicationClaimTypes.PrimaryOrganisationId, expectedApplicationUser.PrimaryOrganisationId.ToString()),
                (ApplicationClaimTypes.PrimaryOrganisationName, expectedOrganisation.Name),
                (ApplicationClaimTypes.OrganisationFunction, expectedApplicationUser.OrganisationFunction.DisplayName),
                (ApplicationClaimTypes.Ordering, Manage),
                (ApplicationClaimTypes.Organisation, View),
            };

            var actual = profileDataRequestContext.IssuedClaims.Select(item => (item.Type, item.Value));

            actual.Should().BeEquivalentTo(expected);
        }
예제 #10
0
        public async Task GetUserConsentAsync_CatalogueAgreementNotSigned_ReturnsConsentWithNoScopes()
        {
            const string clientId  = "SomeClient";
            const string subjectId = "JulesVerneId";

            var expectedConsent = new Consent
            {
                ClientId   = clientId,
                Expiration = DateTime.MaxValue,
                Scopes     = null,
                SubjectId  = subjectId,
            };

            var user = ApplicationUserBuilder.Create().Build();
            var mockUsersRepository = new Mock <IUsersRepository>();

            mockUsersRepository.Setup(
                u => u.GetByIdAsync(It.Is <string>(s => s.Equals(subjectId, StringComparison.Ordinal))))
            .ReturnsAsync(user);

            var store = new CatalogueAgreementConsentStore(Mock.Of <IScopeRepository>(), mockUsersRepository.Object);

            var actualConsent = await store.GetUserConsentAsync(subjectId, clientId);

            actualConsent.Should().BeEquivalentTo(expectedConsent, o => o.Excluding(c => c.CreationTime));
        }
예제 #11
0
        public void NormalizedUserName_Trimmed()
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithUsername("  Test  ")
                         .Build();

            actual.NormalizedUserName.Should().Be("TEST");
        }
예제 #12
0
        public void NormalizedUserName_SetUserName_ReturnsNormalizedUserName(string input, string expected)
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithUsername(input)
                         .Build();

            actual.NormalizedUserName.Should().Be(expected);
        }
예제 #13
0
        public void LastName_Trimmed()
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithLastName("  Smith  ")
                         .Build();

            actual.LastName.Should().Be("Smith");
        }
예제 #14
0
        public void PhoneNumber_Trimmed()
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithPhoneNumber("  0123456  ")
                         .Build();

            actual.PhoneNumber.Should().Be("0123456");
        }
예제 #15
0
        public void NormalizedEmail_SetEmail_ReturnsNormalizedEmail(string input, string expected)
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithEmailAddress(input)
                         .Build();

            actual.NormalizedEmail.Should().Be(expected);
        }
예제 #16
0
        public void EmailAddress_Trimmed()
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithEmailAddress("  [email protected]  ")
                         .Build();

            actual.Email.Should().Be("*****@*****.**");
        }
예제 #17
0
        public void FirstName_Trimmed()
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithFirstName("  Dan  ")
                         .Build();

            actual.FirstName.Should().Be("Dan");
        }
        public static void UserName_Trimmed()
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithUsername("  Test  ")
                         .Build();

            actual.UserName.Should().Be("Test");
        }
        public static void Constructor_String_ApplicationUser_InitializesExpectedMembers()
        {
            const string expectedToken = "TokenToken";
            var          expectedUser  = ApplicationUserBuilder.Create().Build();

            var token = new PasswordResetToken(expectedToken, expectedUser);

            token.Token.Should().Be(expectedToken);
            token.User.Should().Be(expectedUser);
        }
예제 #20
0
        public void DisplayName_ReturnsExpectedValue()
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithFirstName("Burt")
                         .WithLastName("Reynolds")
                         .Build();

            actual.DisplayName.Should().Be("Burt Reynolds");
        }
예제 #21
0
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

            var postBuilder            = new PostBuilder(builder.Entity <Post>());
            var pageBuilder            = new PageBuilder(builder.Entity <Page>());
            var categoryBuilder        = new CategoryBuilder(builder.Entity <Category>());
            var feedbackBuilder        = new FeedbackBuilder(builder.Entity <Feedback>());
            var applicationUserBuilder = new ApplicationUserBuilder(builder.Entity <ApplicationUser>());
        }
예제 #22
0
        public void MarkAsDisabled_DisabledIsTrue()
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithDisabled(false)
                         .Build();

            actual.MarkAsDisabled();

            actual.Disabled.Should().BeTrue();
        }
예제 #23
0
        public void MarkCatalogueAgreementAsSigned_CatalogueAgreementSignedIsTrue()
        {
            var actual = ApplicationUserBuilder
                         .Create()
                         .WithCatalogueAgreementSigned(false)
                         .Build();

            actual.MarkCatalogueAgreementAsSigned();

            actual.CatalogueAgreementSigned.Should().BeTrue();
        }
예제 #24
0
        public static async Task DisableUser_UserRepository_UpdateAsync_CalledOnce()
        {
            var context    = UsersControllerTestContext.Setup();
            var controller = context.Controller;

            context.User = ApplicationUserBuilder.Create().WithDisabled(false).Build();

            await controller.DisableUserAsync(context.User.Id);

            context.UsersRepositoryMock.Verify(r => r.GetByIdAsync(context.User.Id));
            context.UsersRepositoryMock.Verify(r => r.UpdateAsync(context.User));
        }
예제 #25
0
        public async Task EnableUserAsync_UserRepository_UpdateAsync_CalledOnce()
        {
            var context = UsersControllerTestContext.Setup();

            using var controller = context.Controller;

            context.User = ApplicationUserBuilder.Create().WithDisabled(true).Build();

            await controller.EnableUserAsync(context.User.Id);

            context.UsersRepositoryMock.Verify(x => x.GetByIdAsync(context.User.Id), Times.Once);
            context.UsersRepositoryMock.Verify(x => x.UpdateAsync(context.User), Times.Once);
        }
        public async Task ValidateAsync_ValidApplicationUser_ReturnsSuccess()
        {
            var context = ApplicationUserValidatorTestContext.Setup();
            var sut     = context.ApplicationUserValidator;

            var user = ApplicationUserBuilder
                       .Create()
                       .Build();

            var actual = await sut.ValidateAsync(user);

            actual.Should().Be(Result.Success());
        }
        public async Task GetProfileDataAsync_GivenAnApplicationUserWithTheName_ReturnsExpectedClaimList(
            string firstname,
            string lastname,
            string expectedName)
        {
            var expectedApplicationUser = ApplicationUserBuilder
                                          .Create()
                                          .WithFirstName(firstname)
                                          .WithLastName(lastname)
                                          .Build();

            Mock <IUsersRepository> applicationUserRepositoryMock = new Mock <IUsersRepository>();

            applicationUserRepositoryMock.Setup(x => x.GetByIdAsync(It.IsAny <string>()))
            .ReturnsAsync(expectedApplicationUser);

            var expectedOrganisation = OrganisationBuilder
                                       .Create()
                                       .Build();

            Mock <IOrganisationRepository> organisationRespositoryMock = new Mock <IOrganisationRepository>();

            organisationRespositoryMock.Setup(r => r.GetByIdAsync(It.IsAny <Guid>()))
            .ReturnsAsync(expectedOrganisation);


            var sut = ProfileServiceBuilder
                      .Create()
                      .WithUserRepository(applicationUserRepositoryMock.Object)
                      .WithOrganisationRepository(organisationRespositoryMock.Object)
                      .Build();

            var profileDataRequestContext = ProfileDataRequestContextBuilder
                                            .Create()
                                            .WithSubjectId(expectedApplicationUser.Id)
                                            .Build();

            await sut.GetProfileDataAsync(profileDataRequestContext);

            var expected = new List <KeyValuePair <string, string> >
            {
                new KeyValuePair <string, string>(Name, expectedName),
            };

            var actual = profileDataRequestContext.IssuedClaims
                         .Where(item => Name.Equals(item.Type, StringComparison.Ordinal))
                         .Select(item => new KeyValuePair <string, string>(item.Type, item.Value));

            actual.Should().BeEquivalentTo(expected);
        }
예제 #28
0
        public async Task StoreUserConsentAsync_UpdatesRepository()
        {
            var user = ApplicationUserBuilder.Create().Build();
            var mockUsersRepository = new Mock <IUsersRepository>();

            mockUsersRepository.Setup(u => u.GetByIdAsync(It.IsAny <string>()))
            .ReturnsAsync(user);

            var store = new CatalogueAgreementConsentStore(Mock.Of <IScopeRepository>(), mockUsersRepository.Object);

            await store.StoreUserConsentAsync(new Consent());

            mockUsersRepository.Verify(r => r.UpdateAsync(It.Is <ApplicationUser>(u => u == user)), Times.Once());
        }
예제 #29
0
        public static void GetPasswordResetCallback_ReturnsExpectedValue()
        {
            const string url = "https://nhs.uk/reset";

            var expectedUri = new Uri(url);

            var context  = new PasswordResetCallbackContext(url);
            var callback = context.Callback;

            var actualUri = callback.GetPasswordResetCallback(
                new PasswordResetToken("Token", ApplicationUserBuilder.Create().Build()));

            actualUri.Should().Be(expectedUri);
        }
예제 #30
0
        public static async Task DisableUserAsync_GetUserByIdAndDisableThem_ReturnsOk()
        {
            var context = UsersControllerTestContext.Setup();

            var controller = context.Controller;

            context.User = ApplicationUserBuilder.Create().WithDisabled(false).Build();

            var result = await controller.DisableUserAsync(context.User.Id);

            result.Should().BeOfType <NoContentResult>();

            context.User.Disabled.Should().BeTrue();
        }