From f51af820a5ccf2268b785c62140b29bbb5a24e83 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Tue, 10 Apr 2018 18:26:13 -0700 Subject: [PATCH] [Fixes #1742, #1722, #1706, #1725, #1688] Fixes multiple issues * Update test infrastructure to use the latest bits. * Add tests for different types of users. * Logout must redirect instead of just rendering the page so that the identity in the request gets properly updated * Remove IUserFactory and IdentityUserFactory. * Added tests to verify that the default UI endpoints are not accessible when the default UI is not enabled. * Update the user name at the same time when the email is updated. --- .../IdentitySample.DefaultUI/appsettings.json | 2 +- .../Pages/Account/ExternalLogin.cshtml.cs | 38 +- .../Identity/Pages/Account/Logout.cshtml.cs | 4 +- .../Pages/Account/Manage/Index.cshtml | 2 +- .../Pages/Account/Manage/Index.cshtml.cs | 9 + .../Identity/Pages/Account/Register.cshtml.cs | 38 +- src/UI/Areas/Identity/Services/EmailSender.cs | 2 +- src/UI/IUserFactory.cs | 20 - src/UI/IdentityBuilderUIExtensions.cs | 26 - src/UI/UserFactory.cs | 17 - .../ApplicationUserAuthorizationTests.cs | 16 + .../ApplicationUserLoginTests.cs | 16 + .../ApplicationUserManagementTests.cs | 16 + .../ApplicationUserRegistrationTests.cs | 16 + .../AuthorizationTests.cs | 84 ++-- .../Extensions/ResponseAssert.cs | 5 + .../IdentityUserAuthorizationTests.cs | 16 + .../IdentityUserLoginTests.cs | 16 + .../IdentityUserManagementTests.cs | 16 + .../IdentityUserRegistrationTests.cs | 16 + .../Infrastructure/CookieContainerHandler.cs | 38 -- ...ctionalTestsServiceCollectionExtensions.cs | 4 +- .../Infrastructure/ServerFactory.cs | 80 +-- test/Identity.FunctionalTests/LoginTests.cs | 289 +++++------ .../ManagementTests.cs | 376 ++++++++------ .../NoIdentityAddedTests.cs | 71 +++ .../Pages/Account/Manage/Index.cs | 25 + .../PocoUserAuthorizationTests.cs | 16 + .../PocoUserTests/PocoUserLoginTests.cs | 16 + .../PocoUserTests/PocoUserManagementTests.cs | 16 + .../PocoUserRegistrationTests.cs | 16 + .../RegistrationTests.cs | 56 ++- test/Identity.FunctionalTests/UserStories.cs | 13 +- test/Identity.Test/IdentityBuilderTest.cs | 136 ++--- test/Identity.Test/IdentityOptionsTest.cs | 4 +- test/Identity.Test/NoopRoleStore.cs | 26 +- test/Identity.Test/NoopUserStore.cs | 26 +- test/Identity.Test/PasswordValidatorTest.cs | 30 +- test/Identity.Test/RoleManagerTest.cs | 46 +- test/Identity.Test/RoleValidatorTest.cs | 10 +- .../SecurityStampValidatorTest.cs | 48 +- test/Identity.Test/SignInManagerTest.cs | 96 ++-- .../UserClaimsPrincipalFactoryTest.cs | 20 +- test/Identity.Test/UserManagerTest.cs | 470 +++++++++--------- test/Identity.Test/UserValidatorTest.cs | 14 +- test/InMemory.Test/ControllerTest.cs | 24 +- test/InMemory.Test/FunctionalTest.cs | 14 +- test/InMemory.Test/InMemoryStore.cs | 8 +- test/InMemory.Test/InMemoryStoreTest.cs | 26 +- test/InMemory.Test/InMemoryUserStore.cs | 8 +- test/InMemory.Test/InMemoryUserStoreTest.cs | 16 +- test/Shared/{TestRole.cs => PocoRole.cs} | 14 +- .../{TestRoleClaim.cs => PocoRoleClaim.cs} | 4 +- test/Shared/{TestUser.cs => PocoUser.cs} | 27 +- .../{TestUserClaim.cs => PocoUserClaim.cs} | 4 +- .../{TestUserLogin.cs => PocoUserLogin.cs} | 4 +- .../{TestUserRole.cs => PocoUserRole.cs} | 4 +- .../{TestUserToken.cs => PocoUserToken.cs} | 4 +- .../ApplicationUserStartup.cs | 15 + .../Data/ApplicationDbContext.cs | 15 + .../Data/ApplicationUser.cs | 11 + .../Identity.DefaultUI.WebSite.csproj | 7 +- .../NoIdentityStartup.cs | 63 +++ .../Pages/Shared/_LoginPartial.cshtml | 7 +- .../Identity.DefaultUI.WebSite/PocoUser.cs | 9 + .../PocoUserStartup.cs | 36 ++ .../Identity.DefaultUI.WebSite/Startup.cs | 61 +-- .../Identity.DefaultUI.WebSite/StartupBase.cs | 70 +++ 68 files changed, 1596 insertions(+), 1172 deletions(-) delete mode 100644 src/UI/IUserFactory.cs delete mode 100644 src/UI/UserFactory.cs create mode 100644 test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserAuthorizationTests.cs create mode 100644 test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserLoginTests.cs create mode 100644 test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserManagementTests.cs create mode 100644 test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserRegistrationTests.cs create mode 100644 test/Identity.FunctionalTests/IdentityUserTests/IdentityUserAuthorizationTests.cs create mode 100644 test/Identity.FunctionalTests/IdentityUserTests/IdentityUserLoginTests.cs create mode 100644 test/Identity.FunctionalTests/IdentityUserTests/IdentityUserManagementTests.cs create mode 100644 test/Identity.FunctionalTests/IdentityUserTests/IdentityUserRegistrationTests.cs delete mode 100644 test/Identity.FunctionalTests/Infrastructure/CookieContainerHandler.cs create mode 100644 test/Identity.FunctionalTests/NoIdentityAddedTests.cs create mode 100644 test/Identity.FunctionalTests/PocoUserTests/PocoUserAuthorizationTests.cs create mode 100644 test/Identity.FunctionalTests/PocoUserTests/PocoUserLoginTests.cs create mode 100644 test/Identity.FunctionalTests/PocoUserTests/PocoUserManagementTests.cs create mode 100644 test/Identity.FunctionalTests/PocoUserTests/PocoUserRegistrationTests.cs rename test/Shared/{TestRole.cs => PocoRole.cs} (81%) rename test/Shared/{TestRoleClaim.cs => PocoRoleClaim.cs} (89%) rename test/Shared/{TestUser.cs => PocoUser.cs} (80%) rename test/Shared/{TestUserClaim.cs => PocoUserClaim.cs} (89%) rename test/Shared/{TestUserLogin.cs => PocoUserLogin.cs} (90%) rename test/Shared/{TestUserRole.cs => PocoUserRole.cs} (86%) rename test/Shared/{TestUserToken.cs => PocoUserToken.cs} (89%) create mode 100644 test/WebSites/Identity.DefaultUI.WebSite/ApplicationUserStartup.cs create mode 100644 test/WebSites/Identity.DefaultUI.WebSite/Data/ApplicationDbContext.cs create mode 100644 test/WebSites/Identity.DefaultUI.WebSite/Data/ApplicationUser.cs create mode 100644 test/WebSites/Identity.DefaultUI.WebSite/NoIdentityStartup.cs create mode 100644 test/WebSites/Identity.DefaultUI.WebSite/PocoUser.cs create mode 100644 test/WebSites/Identity.DefaultUI.WebSite/PocoUserStartup.cs create mode 100644 test/WebSites/Identity.DefaultUI.WebSite/StartupBase.cs diff --git a/samples/IdentitySample.DefaultUI/appsettings.json b/samples/IdentitySample.DefaultUI/appsettings.json index 9adcb1012d..f781a53564 100644 --- a/samples/IdentitySample.DefaultUI/appsettings.json +++ b/samples/IdentitySample.DefaultUI/appsettings.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-IdentitySample.DefaultUI-d97faff4-1cfe-4c5d-b031-aa23aeb03a5e;Trusted_Connection=True;MultipleActiveResultSets=true" + "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-IdentitySample.DefaultUI-47781151-7d38-4b7b-8fe4-9a8b299f124f;Trusted_Connection=True;MultipleActiveResultSets=true" }, "Logging": { "IncludeScopes": false, diff --git a/src/UI/Areas/Identity/Pages/Account/ExternalLogin.cshtml.cs b/src/UI/Areas/Identity/Pages/Account/ExternalLogin.cshtml.cs index 2017cd257c..a0e5205d46 100644 --- a/src/UI/Areas/Identity/Pages/Account/ExternalLogin.cshtml.cs +++ b/src/UI/Areas/Identity/Pages/Account/ExternalLogin.cshtml.cs @@ -4,6 +4,7 @@ using System; using System.ComponentModel.DataAnnotations; using System.Security.Claims; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; @@ -44,18 +45,20 @@ namespace Microsoft.AspNetCore.Identity.UI.Pages.Account.Internal { private readonly SignInManager _signInManager; private readonly UserManager _userManager; - private readonly IUserFactory _userFactory; + private readonly IUserStore _userStore; + private readonly IUserEmailStore _emailStore; private readonly ILogger _logger; public ExternalLoginModel( SignInManager signInManager, UserManager userManager, - IUserFactory userFactory, + IUserStore userStore, ILogger logger) { _signInManager = signInManager; _userManager = userManager; - _userFactory = userFactory; + _userStore = userStore; + _emailStore = GetEmailStore(); _logger = logger; } @@ -127,7 +130,11 @@ namespace Microsoft.AspNetCore.Identity.UI.Pages.Account.Internal if (ModelState.IsValid) { - var user = _userFactory.CreateUser(email: Input.Email, userName: Input.Email); + var user = CreateUser(); + + await _userStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); + await _emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None); + var result = await _userManager.CreateAsync(user); if (result.Succeeded) { @@ -149,5 +156,28 @@ namespace Microsoft.AspNetCore.Identity.UI.Pages.Account.Internal ReturnUrl = returnUrl; return Page(); } + + private TUser CreateUser() + { + try + { + return Activator.CreateInstance(); + } + catch + { + throw new InvalidOperationException($"Can't create an instance of '{nameof(TUser)}'. " + + $"Ensure that '{nameof(TUser)}' is not an abstract class and has a parameterless constructor, or alternatively " + + $"override the external login page in /Areas/Identity/Pages/Account/ExternalLogin.cshtml"); + } + } + + private IUserEmailStore GetEmailStore() + { + if (!_userManager.SupportsUserEmail) + { + throw new NotSupportedException("The default UI requires a user store with email support."); + } + return (IUserEmailStore)_userStore; + } } } diff --git a/src/UI/Areas/Identity/Pages/Account/Logout.cshtml.cs b/src/UI/Areas/Identity/Pages/Account/Logout.cshtml.cs index 30c2253631..e82b846ca0 100644 --- a/src/UI/Areas/Identity/Pages/Account/Logout.cshtml.cs +++ b/src/UI/Areas/Identity/Pages/Account/Logout.cshtml.cs @@ -42,7 +42,9 @@ namespace Microsoft.AspNetCore.Identity.UI.Pages.Account.Internal } else { - return Page(); + // This needs to be a redirect so that the browser performs a new + // request and the identity for the user gets updated. + return RedirectToPage(); } } } diff --git a/src/UI/Areas/Identity/Pages/Account/Manage/Index.cshtml b/src/UI/Areas/Identity/Pages/Account/Manage/Index.cshtml index 2f803385ea..c7d3da0bd6 100644 --- a/src/UI/Areas/Identity/Pages/Account/Manage/Index.cshtml +++ b/src/UI/Areas/Identity/Pages/Account/Manage/Index.cshtml @@ -35,7 +35,7 @@ - + diff --git a/src/UI/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs b/src/UI/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs index 0534aa97ee..d7ad2f1ddc 100644 --- a/src/UI/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs +++ b/src/UI/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs @@ -104,6 +104,15 @@ namespace Microsoft.AspNetCore.Identity.UI.Pages.Account.Manage.Internal var userId = await _userManager.GetUserIdAsync(user); throw new InvalidOperationException($"Unexpected error occurred setting email for user with ID '{userId}'."); } + + // In our UI email and user name are one and the same, so when we update the email + // we need to update the user name. + var setUserNameResult = await _userManager.SetUserNameAsync(user, Input.Email); + if (!setUserNameResult.Succeeded) + { + var userId = await _userManager.GetUserIdAsync(user); + throw new InvalidOperationException($"Unexpected error occurred setting name for user with ID '{userId}'."); + } } var phoneNumber = await _userManager.GetPhoneNumberAsync(user); diff --git a/src/UI/Areas/Identity/Pages/Account/Register.cshtml.cs b/src/UI/Areas/Identity/Pages/Account/Register.cshtml.cs index ded2d74162..d431b0d0b2 100644 --- a/src/UI/Areas/Identity/Pages/Account/Register.cshtml.cs +++ b/src/UI/Areas/Identity/Pages/Account/Register.cshtml.cs @@ -4,6 +4,7 @@ using System; using System.ComponentModel.DataAnnotations; using System.Text.Encodings.Web; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity.UI.Services; @@ -49,21 +50,23 @@ namespace Microsoft.AspNetCore.Identity.UI.Pages.Account.Internal internal class RegisterModel : RegisterModel where TUser : class { private readonly SignInManager _signInManager; - private readonly IUserFactory _userFactory; private readonly UserManager _userManager; + private readonly IUserStore _userStore; + private readonly IUserEmailStore _emailStore; private readonly ILogger _logger; private readonly IEmailSender _emailSender; public RegisterModel( UserManager userManager, + IUserStore userStore, SignInManager signInManager, - IUserFactory userFactory, ILogger logger, IEmailSender emailSender) { _userManager = userManager; + _userStore = userStore; + _emailStore = GetEmailStore(); _signInManager = signInManager; - _userFactory = userFactory; _logger = logger; _emailSender = emailSender; } @@ -78,8 +81,12 @@ namespace Microsoft.AspNetCore.Identity.UI.Pages.Account.Internal returnUrl = returnUrl ?? Url.Content("~/"); if (ModelState.IsValid) { - var user = _userFactory.CreateUser(email: Input.Email, userName: Input.Email); + var user = CreateUser(); + + await _userStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); + await _emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None); var result = await _userManager.CreateAsync(user, Input.Password); + if (result.Succeeded) { _logger.LogInformation("User created a new account with password."); @@ -107,5 +114,28 @@ namespace Microsoft.AspNetCore.Identity.UI.Pages.Account.Internal // If we got this far, something failed, redisplay form return Page(); } + + private TUser CreateUser() + { + try + { + return Activator.CreateInstance(); + } + catch + { + throw new InvalidOperationException($"Can't create an instance of '{nameof(TUser)}'. " + + $"Ensure that '{nameof(TUser)}' is not an abstract class and has a parameterless constructor, or alternatively " + + $"override the register page in /Areas/Identity/Pages/Account/Register.cshtml"); + } + } + + private IUserEmailStore GetEmailStore() + { + if (!_userManager.SupportsUserEmail) + { + throw new NotSupportedException("The default UI requires a user store with email support."); + } + return (IUserEmailStore)_userStore; + } } } diff --git a/src/UI/Areas/Identity/Services/EmailSender.cs b/src/UI/Areas/Identity/Services/EmailSender.cs index 3f43609555..33ef0f0cac 100644 --- a/src/UI/Areas/Identity/Services/EmailSender.cs +++ b/src/UI/Areas/Identity/Services/EmailSender.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; namespace Microsoft.AspNetCore.Identity.UI.Services { - public class EmailSender : IEmailSender + internal class EmailSender : IEmailSender { public Task SendEmailAsync(string email, string subject, string htmlMessage) { diff --git a/src/UI/IUserFactory.cs b/src/UI/IUserFactory.cs deleted file mode 100644 index 92f004b1ef..0000000000 --- a/src/UI/IUserFactory.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNetCore.Identity.UI -{ - /// - /// Provides an abstraction for instantiating the given user type. - /// - /// The type of user. - public interface IUserFactory where TUser : class - { - /// - /// Creates an instance of a user and assigns the provided values. - /// - /// Email address - /// User name - /// Created user - TUser CreateUser(string email, string userName); - } -} diff --git a/src/UI/IdentityBuilderUIExtensions.cs b/src/UI/IdentityBuilderUIExtensions.cs index d6be81b923..398a4101eb 100644 --- a/src/UI/IdentityBuilderUIExtensions.cs +++ b/src/UI/IdentityBuilderUIExtensions.cs @@ -37,13 +37,6 @@ namespace Microsoft.AspNetCore.Identity .MakeGenericType(builder.UserType)); builder.Services.TryAddTransient(); - if (TryGetIdentityUserType(builder.UserType, out var primaryKeyType)) - { - var userFactoryType = typeof(IUserFactory<>).MakeGenericType(builder.UserType); - var defaultUserFactoryType = typeof(UserFactory<,>).MakeGenericType(builder.UserType, primaryKeyType); - builder.Services.TryAddSingleton(userFactoryType, defaultUserFactoryType); - } - return builder; } @@ -71,24 +64,5 @@ namespace Microsoft.AspNetCore.Identity } }); } - - private static bool TryGetIdentityUserType(Type userType, out Type primaryKeyType) - { - primaryKeyType = null; - - var baseType = userType.BaseType; - while (baseType != null) - { - if (baseType.IsGenericType && - baseType.GetGenericTypeDefinition() == typeof(IdentityUser<>)) - { - primaryKeyType = baseType.GetGenericArguments()[0]; - return true; - } - baseType = baseType.BaseType; - } - - return false; - } } } diff --git a/src/UI/UserFactory.cs b/src/UI/UserFactory.cs deleted file mode 100644 index b56ce47498..0000000000 --- a/src/UI/UserFactory.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNetCore.Identity.UI -{ - internal class UserFactory : IUserFactory - where TUser : IdentityUser, new() - where TKey : IEquatable - { - public TUser CreateUser(string email, string userName) - { - return new TUser() { Email = email, UserName = userName }; - } - } -} diff --git a/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserAuthorizationTests.cs b/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserAuthorizationTests.cs new file mode 100644 index 0000000000..e9503e6aea --- /dev/null +++ b/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserAuthorizationTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Identity.DefaultUI.WebSite.Data; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class ApplicationUserAuthorizationTests : AuthorizationTests + { + public ApplicationUserAuthorizationTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserLoginTests.cs b/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserLoginTests.cs new file mode 100644 index 0000000000..936b7d8149 --- /dev/null +++ b/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserLoginTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Identity.DefaultUI.WebSite.Data; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class ApplicationUserLoginTests : LoginTests + { + public ApplicationUserLoginTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserManagementTests.cs b/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserManagementTests.cs new file mode 100644 index 0000000000..66e9d09b6c --- /dev/null +++ b/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserManagementTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Identity.DefaultUI.WebSite.Data; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class ApplicationUserManagementTests : ManagementTests + { + public ApplicationUserManagementTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserRegistrationTests.cs b/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserRegistrationTests.cs new file mode 100644 index 0000000000..2c7052083f --- /dev/null +++ b/test/Identity.FunctionalTests/ApplicationUserTests/ApplicationUserRegistrationTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Identity.DefaultUI.WebSite.Data; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class ApplicationUserRegistrationTests : RegistrationTests + { + public ApplicationUserRegistrationTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/AuthorizationTests.cs b/test/Identity.FunctionalTests/AuthorizationTests.cs index e3c2dfb541..c4a1b43083 100644 --- a/test/Identity.FunctionalTests/AuthorizationTests.cs +++ b/test/Identity.FunctionalTests/AuthorizationTests.cs @@ -3,20 +3,24 @@ using System.Net; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Testing; using Xunit; using Xunit.Abstractions; namespace Microsoft.AspNetCore.Identity.FunctionalTests { - public class AuthorizationTests : LoggedTest, IClassFixture + public abstract class AuthorizationTests : IClassFixture> + where TStartup : class + where TContext : DbContext { - public AuthorizationTests(ServerFactory serverFactory, ITestOutputHelper output) : base(output) + public AuthorizationTests(ServerFactory serverFactory) { ServerFactory = serverFactory; } - public ServerFactory ServerFactory { get; } + public ServerFactory ServerFactory { get; } public static TheoryData AuthorizedPages => new TheoryData @@ -40,18 +44,16 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests [MemberData(nameof(AuthorizedPages))] public async Task AnonymousUserCantAccessAuthorizedPages(string url) { - using (StartLog(out var loggerFactory, $"{nameof(AnonymousUserCantAccessAuthorizedPages)}_{WebUtility.UrlEncode(url)}")) - { - // Arrange - var client = ServerFactory.CreateDefaultClient(loggerFactory); + // Arrange + var client = ServerFactory + .CreateClient(); - // Act - var response = await client.GetAsync(url); + // Act + var response = await client.GetAsync(url); - // Assert - var location = ResponseAssert.IsRedirect(response); - Assert.StartsWith("/Identity/Account/Login?", location.PathAndQuery); - } + // Assert + var location = ResponseAssert.IsRedirect(response); + Assert.StartsWith("/Identity/Account/Login?", location.PathAndQuery); } // The routes commented below are not directly accessible by @@ -79,18 +81,17 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests [MemberData(nameof(RouteableAuthorizedPages))] public async Task AuthenticatedUserCanAccessAuthorizedPages(string url) { - using (StartLog(out var loggerFactory, $"{nameof(AuthenticatedUserCanAccessAuthorizedPages)}_{WebUtility.UrlEncode(url)}")) - { - // Arrange - var client = ServerFactory.CreateDefaultClient(loggerFactory); - await UserStories.RegisterNewUserAsync(client); + // Arrange + var client = ServerFactory + .CreateClient(); - // Act - var response = await client.GetAsync(url); + await UserStories.RegisterNewUserAsync(client); - // Assert - await ResponseAssert.IsHtmlDocumentAsync(response); - } + // Act + var response = await client.GetAsync(url); + + // Assert + await ResponseAssert.IsHtmlDocumentAsync(response); } // The routes commented below are not directly accessible by @@ -115,17 +116,15 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests [MemberData(nameof(UnauthorizedPages))] public async Task AnonymousUserCanAccessNotAuthorizedPages(string url) { - using (StartLog(out var loggerFactory, $"{nameof(AnonymousUserCanAccessNotAuthorizedPages)}_{WebUtility.UrlEncode(url)}")) - { - // Arrange - var client = ServerFactory.CreateDefaultClient(loggerFactory); + // Arrange + var client = ServerFactory + .CreateClient(); - // Act - var response = await client.GetAsync(url); + // Act + var response = await client.GetAsync(url); - // Assert - await ResponseAssert.IsHtmlDocumentAsync(response); - } + // Assert + await ResponseAssert.IsHtmlDocumentAsync(response); } public static TheoryData UnauthorizedPagesAllowAnonymous => @@ -142,19 +141,18 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests [MemberData(nameof(UnauthorizedPagesAllowAnonymous))] public async Task AnonymousUserAllowedAccessToPages_WithGlobalAuthorizationFilter(string url) { - using (StartLog(out var loggerFactory, $"{nameof(AnonymousUserAllowedAccessToPages_WithGlobalAuthorizationFilter)}_{WebUtility.UrlEncode(url)}")) - { - // Arrange - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureServices(services => services.SetupGlobalAuthorizeFilter())); - var client = ServerFactory.CreateDefaultClient(server); + // Arrange + void TestServicesConfiguration(IServiceCollection services) => + services.SetupGlobalAuthorizeFilter(); - // Act - var response = await client.GetAsync(url); + var client = ServerFactory.WithWebHostBuilder(whb => whb.ConfigureServices(TestServicesConfiguration)) + .CreateClient(); - // Assert - await ResponseAssert.IsHtmlDocumentAsync(response); - } + // Act + var response = await client.GetAsync(url); + + // Assert + await ResponseAssert.IsHtmlDocumentAsync(response); } } } diff --git a/test/Identity.FunctionalTests/Extensions/ResponseAssert.cs b/test/Identity.FunctionalTests/Extensions/ResponseAssert.cs index 351d9be064..208112a086 100644 --- a/test/Identity.FunctionalTests/Extensions/ResponseAssert.cs +++ b/test/Identity.FunctionalTests/Extensions/ResponseAssert.cs @@ -53,5 +53,10 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests } } } + + internal static void IsOK(HttpResponseMessage download) + { + Assert.Equal(HttpStatusCode.OK, download.StatusCode); + } } } diff --git a/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserAuthorizationTests.cs b/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserAuthorizationTests.cs new file mode 100644 index 0000000000..457aa2f0fe --- /dev/null +++ b/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserAuthorizationTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class IdentityUserAuthorizationTests : AuthorizationTests + { + public IdentityUserAuthorizationTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserLoginTests.cs b/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserLoginTests.cs new file mode 100644 index 0000000000..6cfc15dca7 --- /dev/null +++ b/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserLoginTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class IdentityUserLoginTests : LoginTests + { + public IdentityUserLoginTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserManagementTests.cs b/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserManagementTests.cs new file mode 100644 index 0000000000..ffb53cce85 --- /dev/null +++ b/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserManagementTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class IdentityUserManagementTests : ManagementTests + { + public IdentityUserManagementTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserRegistrationTests.cs b/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserRegistrationTests.cs new file mode 100644 index 0000000000..692b7e5db2 --- /dev/null +++ b/test/Identity.FunctionalTests/IdentityUserTests/IdentityUserRegistrationTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class IdentityUserRegistrationTests : RegistrationTests + { + public IdentityUserRegistrationTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/Infrastructure/CookieContainerHandler.cs b/test/Identity.FunctionalTests/Infrastructure/CookieContainerHandler.cs deleted file mode 100644 index 458b335782..0000000000 --- a/test/Identity.FunctionalTests/Infrastructure/CookieContainerHandler.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Net; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.AspNetCore.Identity.FunctionalTests -{ - public class CookieContainerHandler : DelegatingHandler - { - public CookieContainerHandler(HttpMessageHandler innerHandler) - : base(innerHandler) - { - } - - public CookieContainer Container { get; } = new CookieContainer(); - - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - var cookieHeader = Container.GetCookieHeader(request.RequestUri); - request.Headers.Add("Cookie", cookieHeader); - - var response = await base.SendAsync(request, cancellationToken); - - if (response.Headers.TryGetValues("Set-Cookie", out var setCookieHeaders)) - { - foreach (var header in setCookieHeaders) - { - Container.SetCookies(response.RequestMessage.RequestUri, header); - } - } - - return response; - } - } -} diff --git a/test/Identity.FunctionalTests/Infrastructure/FunctionalTestsServiceCollectionExtensions.cs b/test/Identity.FunctionalTests/Infrastructure/FunctionalTestsServiceCollectionExtensions.cs index 2ea424972e..6c4be2e45c 100644 --- a/test/Identity.FunctionalTests/Infrastructure/FunctionalTestsServiceCollectionExtensions.cs +++ b/test/Identity.FunctionalTests/Infrastructure/FunctionalTestsServiceCollectionExtensions.cs @@ -17,8 +17,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests { public static class FunctionalTestsServiceCollectionExtensions { - public static IServiceCollection SetupTestDatabase(this IServiceCollection services, string databaseName) => - services.AddDbContext(options => + public static IServiceCollection SetupTestDatabase(this IServiceCollection services, string databaseName) where TContext : DbContext => + services.AddDbContext(options => options.UseInMemoryDatabase(databaseName, memoryOptions => { })); public static IServiceCollection SetupTestThirdPartyLogin(this IServiceCollection services) => diff --git a/test/Identity.FunctionalTests/Infrastructure/ServerFactory.cs b/test/Identity.FunctionalTests/Infrastructure/ServerFactory.cs index 0991a6880f..af4a6d9b81 100644 --- a/test/Identity.FunctionalTests/Infrastructure/ServerFactory.cs +++ b/test/Identity.FunctionalTests/Infrastructure/ServerFactory.cs @@ -2,81 +2,33 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; -using System.IO; -using System.Net.Http; -using System.Runtime.CompilerServices; -using Identity.DefaultUI.WebSite; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.TestHost; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.Identity.FunctionalTests { - public class ServerFactory : IDisposable + public class ServerFactory: WebApplicationFactory + where TStartup : class + where TContext : DbContext { - private bool disposedValue = false; - private IList _disposableServers = new List(); - - public TestServer CreateServer( - ILoggerFactory loggerFactory, - Action configureBuilder, - [CallerMemberName] string isolationKey = "") + public ServerFactory() { - var builder = WebHostBuilderFactory - .CreateFromTypesAssemblyEntryPoint(new string[] { }) - .UseSolutionRelativeContentRoot(Path.Combine("test", "WebSites", "Identity.DefaultUI.WebSite")) - .ConfigureServices(collection => collection.AddSingleton(loggerFactory)) - .ConfigureServices(sc => sc.SetupTestDatabase(isolationKey) + ClientOptions.AllowAutoRedirect = false; + ClientOptions.BaseAddress = new Uri("https://localhost"); + } + + protected override void ConfigureWebHost(IWebHostBuilder builder) + { + base.ConfigureWebHost(builder); + builder.UseStartup(); + builder.ConfigureServices(sc => sc.SetupTestDatabase(Guid.NewGuid().ToString()) .AddMvc() // Mark the cookie as essential for right now, as Identity uses it on // several places to pass important data in post-redirect-get flows. .AddCookieTempDataProvider(o => o.Cookie.IsEssential = true)); - - configureBuilder(builder); - - var server = new TestServer(builder); - _disposableServers.Add(server); - return server; - } - - public TestServer CreateDefaultServer(ILoggerFactory loggerFactory, [CallerMemberName] string isolationKey = "") => - CreateServer(loggerFactory, b => { }, isolationKey); - - public HttpClient CreateDefaultClient(TestServer server) - { - var client = new HttpClient(new CookieContainerHandler(server.CreateHandler())) - { - BaseAddress = new Uri("https://localhost") - }; - - return client; - } - - public HttpClient CreateDefaultClient(ILoggerFactory loggerFactory) => - CreateDefaultClient(CreateDefaultServer(loggerFactory)); - - protected virtual void Dispose(bool disposing) - { - if (!disposedValue) - { - if (disposing) - { - foreach (var disposable in _disposableServers) - { - disposable?.Dispose(); - } - } - - _disposableServers = null; - disposedValue = true; - } - } - - public void Dispose() - { - Dispose(true); } } } diff --git a/test/Identity.FunctionalTests/LoginTests.cs b/test/Identity.FunctionalTests/LoginTests.cs index 6bf75b7634..89c6ce3581 100644 --- a/test/Identity.FunctionalTests/LoginTests.cs +++ b/test/Identity.FunctionalTests/LoginTests.cs @@ -5,249 +5,228 @@ using System; using System.Linq; using System.Threading.Tasks; using Identity.DefaultUI.WebSite; -using Microsoft.Extensions.Logging.Testing; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; using Xunit; using Xunit.Abstractions; using Xunit.Sdk; namespace Microsoft.AspNetCore.Identity.FunctionalTests { - public class LoginTests : LoggedTest, IClassFixture + public abstract class LoginTests : IClassFixture> + where TStartup : class + where TContext : DbContext { - public LoginTests(ServerFactory serverFactory, ITestOutputHelper output) : base(output) + public LoginTests(ServerFactory serverFactory) { ServerFactory = serverFactory; } - public ServerFactory ServerFactory { get; } + public ServerFactory ServerFactory { get; } [Fact] public async Task CanLogInWithAPreviouslyRegisteredUser() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var server = ServerFactory.CreateDefaultServer(loggerFactory); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + // Arrange + var client = ServerFactory.CreateClient(); + var newClient = ServerFactory.CreateClient(); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - // Act & Assert - await UserStories.RegisterNewUserAsync(client, userName, password); + // Act & Assert + await UserStories.RegisterNewUserAsync(client, userName, password); - // Use a new client to simulate a new browser session. - await UserStories.LoginExistingUserAsync(newClient, userName, password); - } + // Use a new client to simulate a new browser session. + await UserStories.LoginExistingUserAsync(newClient, userName, password); } [Fact] public async Task CanLogInWithTwoFactorAuthentication() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var server = ServerFactory.CreateDefaultServer(loggerFactory); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + // Arrange + var client = ServerFactory.CreateClient(); + var newClient = ServerFactory.CreateClient(); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); - var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); + var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); + var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); - var twoFactorKey = showRecoveryCodes.Context.AuthenticatorKey; + var twoFactorKey = showRecoveryCodes.Context.AuthenticatorKey; - // Act & Assert - // Use a new client to simulate a new browser session. - await UserStories.LoginExistingUser2FaAsync(newClient, userName, password, twoFactorKey); - } + // Act & Assert + // Use a new client to simulate a new browser session. + await UserStories.LoginExistingUser2FaAsync(newClient, userName, password, twoFactorKey); } [Fact] public async Task CanLogInWithTwoFactorAuthentication_WithGlobalAuthorizeFilter() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureServices(services => services.SetupGlobalAuthorizeFilter())); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + // Arrange + var client = ServerFactory.CreateClient(); + var newClient = ServerFactory.CreateClient(); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); - var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); + var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); + var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); - var twoFactorKey = showRecoveryCodes.Context.AuthenticatorKey; + var twoFactorKey = showRecoveryCodes.Context.AuthenticatorKey; - // Act & Assert - // Use a new client to simulate a new browser session. - await UserStories.LoginExistingUser2FaAsync(newClient, userName, password, twoFactorKey); - } + // Act & Assert + // Use a new client to simulate a new browser session. + await UserStories.LoginExistingUser2FaAsync(newClient, userName, password, twoFactorKey); } [Fact] public async Task CanLogInWithRecoveryCode() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var server = ServerFactory.CreateDefaultServer(loggerFactory); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + // Arrange + var client = ServerFactory.CreateClient(); + var newClient = ServerFactory.CreateClient(); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); - var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); + var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); + var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); - var recoveryCode = showRecoveryCodes.Context.RecoveryCodes.First(); + var recoveryCode = showRecoveryCodes.Context.RecoveryCodes.First(); - // Act & Assert - // Use a new client to simulate a new browser session. - await UserStories.LoginExistingUserRecoveryCodeAsync(newClient, userName, password, recoveryCode); - } + // Act & Assert + // Use a new client to simulate a new browser session. + await UserStories.LoginExistingUserRecoveryCodeAsync(newClient, userName, password, recoveryCode); } [Fact] public async Task CanLogInWithRecoveryCode_WithGlobalAuthorizeFilter() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureServices(services => services.SetupGlobalAuthorizeFilter())); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + // Arrange + void ConfigureTestServices(IServiceCollection services) => + services.SetupGlobalAuthorizeFilter(); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var server = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)); + var client = server.CreateClient(); + var newClient = server.CreateClient(); - var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); - var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - var recoveryCode = showRecoveryCodes.Context.RecoveryCodes.First(); + var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); + var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); - // Act & Assert - // Use a new client to simulate a new browser session. - await UserStories.LoginExistingUserRecoveryCodeAsync(newClient, userName, password, recoveryCode); - } + var recoveryCode = showRecoveryCodes.Context.RecoveryCodes.First(); + + // Act & Assert + // Use a new client to simulate a new browser session. + await UserStories.LoginExistingUserRecoveryCodeAsync(newClient, userName, password, recoveryCode); } [Fact] public async Task CannotLogInWithoutRequiredEmailConfirmation() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var emailSender = new ContosoEmailSender(); - var server = ServerFactory.CreateServer(loggerFactory, builder => - { - builder.ConfigureServices(services => services - .SetupTestEmailSender(emailSender) - .SetupEmailRequired()); - }); + // Arrange - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + var emailSender = new ContosoEmailSender(); + void ConfigureTestServices(IServiceCollection services) => services + .SetupTestEmailSender(emailSender) + .SetupEmailRequired(); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var server = ServerFactory.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)); - var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); + var client = server.CreateClient(); + var newClient = server.CreateClient(); - // Act & Assert - // Use a new client to simulate a new browser session. - await Assert.ThrowsAnyAsync(() => UserStories.LoginExistingUserAsync(newClient, userName, password)); - } + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; + + var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); + + // Act & Assert + // Use a new client to simulate a new browser session. + await Assert.ThrowsAnyAsync(() => UserStories.LoginExistingUserAsync(newClient, userName, password)); } [Fact] public async Task CanLogInAfterConfirmingEmail() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var emailSender = new ContosoEmailSender(); - var server = ServerFactory.CreateServer(loggerFactory, builder => - { - builder.ConfigureServices(services => services - .SetupTestEmailSender(emailSender) - .SetupEmailRequired()); - }); + // Arrange + var emailSender = new ContosoEmailSender(); + void ConfigureTestServices(IServiceCollection services) => services + .SetupTestEmailSender(emailSender) + .SetupEmailRequired(); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + var server = ServerFactory.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var client = server.CreateClient(); + var newClient = server.CreateClient(); - var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - // Act & Assert - // Use a new client to simulate a new browser session. - var email = Assert.Single(emailSender.SentEmails); - await UserStories.ConfirmEmailAsync(email, newClient); + var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); - await UserStories.LoginExistingUserAsync(newClient, userName, password); - } + // Act & Assert + // Use a new client to simulate a new browser session. + var email = Assert.Single(emailSender.SentEmails); + await UserStories.ConfirmEmailAsync(email, newClient); + + await UserStories.LoginExistingUserAsync(newClient, userName, password); } [Fact] public async Task CanLoginWithASocialLoginProvider() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureServices(services => services.SetupTestThirdPartyLogin())); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + // Arrange + void ConfigureTestServices(IServiceCollection services) => + services.SetupTestThirdPartyLogin(); - var guid = Guid.NewGuid(); - var userName = $"{guid}"; - var email = $"{guid}@example.com"; + var server = ServerFactory.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)); - // Act & Assert - await UserStories.RegisterNewUserWithSocialLoginAsync(client, userName, email); - await UserStories.LoginWithSocialLoginAsync(newClient, userName); - } + var client = server.CreateClient(); + var newClient = server.CreateClient(); + + var guid = Guid.NewGuid(); + var userName = $"{guid}"; + var email = $"{guid}@example.com"; + + // Act & Assert + await UserStories.RegisterNewUserWithSocialLoginAsync(client, userName, email); + await UserStories.LoginWithSocialLoginAsync(newClient, userName); } [Fact] public async Task CanLogInAfterResettingThePassword() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var emailSender = new ContosoEmailSender(); - var server = ServerFactory.CreateServer(loggerFactory, b => b.ConfigureServices(s => - s.SetupTestEmailSender(emailSender))); - var client = ServerFactory.CreateDefaultClient(server); - var resetPasswordClient = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + // Arrange + var emailSender = new ContosoEmailSender(); + void ConfigureTestServices(IServiceCollection services) => services + .SetupTestEmailSender(emailSender); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; - var newPassword = $"!New.Password1$"; + var server = ServerFactory.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)); - await UserStories.RegisterNewUserAsync(client, userName, password); - var registrationEmail = Assert.Single(emailSender.SentEmails); - await UserStories.ConfirmEmailAsync(registrationEmail, client); + var client = server.CreateClient(); + var resetPasswordClient = server.CreateClient(); + var newClient = server.CreateClient(); - // Act & Assert - await UserStories.ForgotPasswordAsync(resetPasswordClient, userName); - Assert.Equal(2, emailSender.SentEmails.Count); - var email = emailSender.SentEmails[1]; - await UserStories.ResetPasswordAsync(resetPasswordClient, email, userName, newPassword); - await UserStories.LoginExistingUserAsync(newClient, userName, newPassword); - } + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; + var newPassword = $"!New.Password1$"; + + await UserStories.RegisterNewUserAsync(client, userName, password); + var registrationEmail = Assert.Single(emailSender.SentEmails); + await UserStories.ConfirmEmailAsync(registrationEmail, client); + + // Act & Assert + await UserStories.ForgotPasswordAsync(resetPasswordClient, userName); + Assert.Equal(2, emailSender.SentEmails.Count); + var email = emailSender.SentEmails[1]; + await UserStories.ResetPasswordAsync(resetPasswordClient, email, userName, newPassword); + await UserStories.LoginExistingUserAsync(newClient, userName, newPassword); } } } diff --git a/test/Identity.FunctionalTests/ManagementTests.cs b/test/Identity.FunctionalTests/ManagementTests.cs index 5720d6ecc9..9b888f3925 100644 --- a/test/Identity.FunctionalTests/ManagementTests.cs +++ b/test/Identity.FunctionalTests/ManagementTests.cs @@ -8,192 +8,221 @@ using System.Net; using System.Security.Claims; using System.Threading.Tasks; using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.AspNetCore.TestHost; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Testing; using Xunit; using Xunit.Abstractions; namespace Microsoft.AspNetCore.Identity.FunctionalTests { - public class ManagementTests : LoggedTest, IClassFixture + public abstract class ManagementTests : IClassFixture> + where TStartup : class + where TContext : DbContext { - public ManagementTests(ServerFactory serverFactory, ITestOutputHelper output) : base(output) + public ManagementTests(ServerFactory serverFactory) { ServerFactory = serverFactory; } - public ServerFactory ServerFactory { get; } + public ServerFactory ServerFactory { get; } [Fact] public async Task CanEnableTwoFactorAuthentication() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var client = ServerFactory.CreateDefaultClient(loggerFactory); + // Arrange + var client = ServerFactory + .CreateClient(); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - var index = await UserStories.RegisterNewUserAsync(client, userName, password); + var index = await UserStories.RegisterNewUserAsync(client, userName, password); - // Act & Assert - await UserStories.EnableTwoFactorAuthentication(index); - } + // Act & Assert + await UserStories.EnableTwoFactorAuthentication(index); } [Fact] public async Task CanConfirmEmail() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var emails = new ContosoEmailSender(); - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureServices(s => s.SetupTestEmailSender(emails))); - var client = ServerFactory.CreateDefaultClient(server); + // Arrange + var emails = new ContosoEmailSender(); + void ConfigureTestServices(IServiceCollection services) => + services.SetupTestEmailSender(emails); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var client = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)) + .CreateClient(); - var index = await UserStories.RegisterNewUserAsync(client, userName, password); - var manageIndex = await UserStories.SendEmailConfirmationLinkAsync(index); + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - // Act & Assert - Assert.Equal(2, emails.SentEmails.Count); - var email = emails.SentEmails[1]; - await UserStories.ConfirmEmailAsync(email, client); - } + var index = await UserStories.RegisterNewUserAsync(client, userName, password); + var manageIndex = await UserStories.SendEmailConfirmationLinkAsync(index); + + // Act & Assert + Assert.Equal(2, emails.SentEmails.Count); + var email = emails.SentEmails[1]; + await UserStories.ConfirmEmailAsync(email, client); + } + + [Fact] + public async Task CanChangeEmail() + { + // Arrange + var emails = new ContosoEmailSender(); + var client = ServerFactory + .CreateClient(); + + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; + var newEmail = "updatedEmail@example.com"; + + var index = await UserStories.RegisterNewUserAsync(client, userName, password); + var manageIndex = await UserStories.SendUpdateProfileAsync(index, newEmail); + + // Act & Assert + var pageUserName = manageIndex.GetUserName(); + Assert.Equal(newEmail, pageUserName); + var pageEmail = manageIndex.GetEmail(); + Assert.Equal(newEmail, pageEmail); } [Fact] public async Task CanChangePassword() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var principals = new List(); - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureTestServices(s => s.SetupGetUserClaimsPrincipal(user => principals.Add(user), IdentityConstants.ApplicationScheme))); + // Arrange + var principals = new List(); + void ConfigureTestServices(IServiceCollection services) => + services.SetupGetUserClaimsPrincipal(user => principals.Add(user), IdentityConstants.ApplicationScheme); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + var server = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureTestServices(ConfigureTestServices)); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = "!Test.Password1"; + var client = server.CreateClient(); + var newClient = server.CreateClient(); - var index = await UserStories.RegisterNewUserAsync(client, userName, password); + var userName = $"{Guid.NewGuid()}@example.com"; + var password = "!Test.Password1"; - // Act 1 - var changedPassword = await UserStories.ChangePasswordAsync(index, "!Test.Password1", "!Test.Password2"); + var index = await UserStories.RegisterNewUserAsync(client, userName, password); - // Assert 1 - // RefreshSignIn generates a new security stamp claim - AssertClaimsNotEqual(principals[0], principals[1], "AspNet.Identity.SecurityStamp"); + // Act 1 + var changedPassword = await UserStories.ChangePasswordAsync(index, "!Test.Password1", "!Test.Password2"); - // Act 2 - await UserStories.LoginExistingUserAsync(newClient, userName, "!Test.Password2"); + // Assert 1 + // RefreshSignIn generates a new security stamp claim + AssertClaimsNotEqual(principals[0], principals[1], "AspNet.Identity.SecurityStamp"); - // Assert 2 - // Signing in again with a different client uses the same security stamp claim - AssertClaimsEqual(principals[1], principals[2], "AspNet.Identity.SecurityStamp"); - } + // Act 2 + await UserStories.LoginExistingUserAsync(newClient, userName, "!Test.Password2"); + + // Assert 2 + // Signing in again with a different client uses the same security stamp claim + AssertClaimsEqual(principals[1], principals[2], "AspNet.Identity.SecurityStamp"); } [Fact] public async Task CanSetPasswordWithExternalLogin() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var principals = new List(); - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureTestServices(s => s.SetupTestThirdPartyLogin() - .SetupGetUserClaimsPrincipal(user => principals.Add(user), IdentityConstants.ApplicationScheme))); + // Arrange + var principals = new List(); + void ConfigureTestServices(IServiceCollection services) => + services + .SetupTestThirdPartyLogin() + .SetupGetUserClaimsPrincipal(user => principals.Add(user), IdentityConstants.ApplicationScheme); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + var server = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureTestServices(ConfigureTestServices)); - var guid = Guid.NewGuid(); - var userName = $"{guid}"; - var email = $"{guid}@example.com"; + var client = server.CreateClient(); + var newClient = server.CreateClient(); + var loginAfterSetPasswordClient = server.CreateClient(); - // Act 1 - var index = await UserStories.RegisterNewUserWithSocialLoginAsync(client, userName, email); - index = await UserStories.LoginWithSocialLoginAsync(newClient, userName); + var guid = Guid.NewGuid(); + var userName = $"{guid}"; + var email = $"{guid}@example.com"; - // Assert 1 - Assert.NotNull(principals[1].Identities.Single().Claims.Single(c => c.Type == ClaimTypes.AuthenticationMethod).Value); + // Act 1 + var index = await UserStories.RegisterNewUserWithSocialLoginAsync(client, userName, email); + index = await UserStories.LoginWithSocialLoginAsync(newClient, userName); - // Act 2 - await UserStories.SetPasswordAsync(index, "!Test.Password2"); + // Assert 1 + Assert.NotNull(principals[1].Identities.Single().Claims.Single(c => c.Type == ClaimTypes.AuthenticationMethod).Value); - // Assert 2 - // RefreshSignIn uses the same AuthenticationMethod claim value - AssertClaimsEqual(principals[1], principals[2], ClaimTypes.AuthenticationMethod); + // Act 2 + await UserStories.SetPasswordAsync(index, "!Test.Password2"); - // Act & Assert 3 - // Can log in with the password set above - await UserStories.LoginExistingUserAsync(ServerFactory.CreateDefaultClient(server), email, "!Test.Password2"); - } + // Assert 2 + // RefreshSignIn uses the same AuthenticationMethod claim value + AssertClaimsEqual(principals[1], principals[2], ClaimTypes.AuthenticationMethod); + + // Act & Assert 3 + // Can log in with the password set above + await UserStories.LoginExistingUserAsync(loginAfterSetPasswordClient, email, "!Test.Password2"); } [Fact] public async Task CanRemoveExternalLogin() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var principals = new List(); - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureTestServices(s => s.SetupTestThirdPartyLogin() - .SetupGetUserClaimsPrincipal(user => principals.Add(user), IdentityConstants.ApplicationScheme))); + // Arrange + var principals = new List(); + void ConfigureTestServices(IServiceCollection services) => + services + .SetupTestThirdPartyLogin() + .SetupGetUserClaimsPrincipal(user => principals.Add(user), IdentityConstants.ApplicationScheme); - var client = ServerFactory.CreateDefaultClient(server); + var server = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureTestServices(ConfigureTestServices)); - var guid = Guid.NewGuid(); - var userName = $"{guid}"; - var email = $"{guid}@example.com"; + var client = server.CreateClient(); - // Act - var index = await UserStories.RegisterNewUserAsync(client, email, "!TestPassword1"); - var linkLogin = await UserStories.LinkExternalLoginAsync(index, email); - await UserStories.RemoveExternalLoginAsync(linkLogin, email); + var guid = Guid.NewGuid(); + var userName = $"{guid}"; + var email = $"{guid}@example.com"; - // RefreshSignIn generates a new security stamp claim - AssertClaimsNotEqual(principals[0], principals[1], "AspNet.Identity.SecurityStamp"); - } + // Act + var index = await UserStories.RegisterNewUserAsync(client, email, "!TestPassword1"); + var linkLogin = await UserStories.LinkExternalLoginAsync(index, email); + await UserStories.RemoveExternalLoginAsync(linkLogin, email); + + // RefreshSignIn generates a new security stamp claim + AssertClaimsNotEqual(principals[0], principals[1], "AspNet.Identity.SecurityStamp"); } [Fact] public async Task CanResetAuthenticator() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var principals = new List(); - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureTestServices(s => s.SetupTestThirdPartyLogin() - .SetupGetUserClaimsPrincipal(user => principals.Add(user), IdentityConstants.ApplicationScheme))); + // Arrange + var principals = new List(); + void ConfigureTestServices(IServiceCollection services) => + services + .SetupTestThirdPartyLogin() + .SetupGetUserClaimsPrincipal(user => principals.Add(user), IdentityConstants.ApplicationScheme); - var client = ServerFactory.CreateDefaultClient(server); - var newClient = ServerFactory.CreateDefaultClient(server); + var server = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureTestServices(ConfigureTestServices)); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var client = server.CreateClient(); + var newClient = server.CreateClient(); - // Act - var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); - var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); - var twoFactorKey = showRecoveryCodes.Context.AuthenticatorKey; + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - // Use a new client to simulate a new browser session. - var index = await UserStories.LoginExistingUser2FaAsync(newClient, userName, password, twoFactorKey); - await UserStories.ResetAuthenticator(index); + // Act + var loggedIn = await UserStories.RegisterNewUserAsync(client, userName, password); + var showRecoveryCodes = await UserStories.EnableTwoFactorAuthentication(loggedIn); + var twoFactorKey = showRecoveryCodes.Context.AuthenticatorKey; - // RefreshSignIn generates a new security stamp claim - AssertClaimsNotEqual(principals[1], principals[2], "AspNet.Identity.SecurityStamp"); - } + // Use a new client to simulate a new browser session. + var index = await UserStories.LoginExistingUser2FaAsync(newClient, userName, password, twoFactorKey); + await UserStories.ResetAuthenticator(index); + + // RefreshSignIn generates a new security stamp claim + AssertClaimsNotEqual(principals[1], principals[2], "AspNet.Identity.SecurityStamp"); } [Theory] @@ -203,74 +232,93 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests [InlineData(true, true)] public async Task CanDownloadPersonalData(bool twoFactor, bool social) { - using (StartLog(out var loggerFactory)) + // Arrange + void ConfigureTestServices(IServiceCollection services) => + services.SetupTestThirdPartyLogin(); + + var client = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureTestServices(ConfigureTestServices)) + .CreateClient(); + + var userName = $"{Guid.NewGuid()}@example.com"; + var guid = Guid.NewGuid(); + var email = userName; + + var index = social + ? await UserStories.RegisterNewUserWithSocialLoginAsync(client, userName, email) + : await UserStories.RegisterNewUserAsync(client, email, "!TestPassword1"); + + if (twoFactor) { - // Arrange - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureTestServices(s => s.SetupTestThirdPartyLogin())); + await UserStories.EnableTwoFactorAuthentication(index); + } - var client = ServerFactory.CreateDefaultClient(server); + // Act & Assert + var jsonData = await UserStories.DownloadPersonalData(index, userName); + Assert.NotNull(jsonData); + Assert.True(jsonData.ContainsKey("Id")); + Assert.NotNull(jsonData["Id"]); + Assert.True(jsonData.ContainsKey("UserName")); + Assert.Equal(userName, (string)jsonData["UserName"]); + Assert.True(jsonData.ContainsKey("Email")); + Assert.Equal(userName, (string)jsonData["Email"]); + Assert.True(jsonData.ContainsKey("EmailConfirmed")); + Assert.False((bool)jsonData["EmailConfirmed"]); + Assert.True(jsonData.ContainsKey("PhoneNumber")); + Assert.Equal("null", (string)jsonData["PhoneNumber"]); + Assert.True(jsonData.ContainsKey("PhoneNumberConfirmed")); + Assert.False((bool)jsonData["PhoneNumberConfirmed"]); + Assert.Equal(twoFactor, (bool)jsonData["TwoFactorEnabled"]); - var userName = $"{Guid.NewGuid()}@example.com"; - var guid = Guid.NewGuid(); - var email = userName; + if (twoFactor) + { + Assert.NotNull(jsonData["Authenticator Key"]); + } + else + { + Assert.Null((string)jsonData["Authenticator Key"]); + } - var index = social - ? await UserStories.RegisterNewUserWithSocialLoginAsync(client, userName, email) - : await UserStories.RegisterNewUserAsync(client, email, "!TestPassword1"); - - if (twoFactor) - { - await UserStories.EnableTwoFactorAuthentication(index); - } - - // Act & Assert - var jsonData = await UserStories.DownloadPersonalData(index, userName); - Assert.Contains($"\"Id\":\"", jsonData); - Assert.Contains($"\"UserName\":\"{userName}\"", jsonData); - Assert.Contains($"\"Email\":\"{userName}\"", jsonData); - Assert.Contains($"\"EmailConfirmed\":\"False\"", jsonData); - Assert.Contains($"\"PhoneNumber\":\"null\"", jsonData); - Assert.Contains($"\"PhoneNumberConfirmed\":\"False\"", jsonData); - Assert.Contains($"\"TwoFactorEnabled\":\"{twoFactor}\"", jsonData); - Assert.Equal(twoFactor, jsonData.Contains($"\"Authenticator Key\":\"")); - Assert.Equal(social, jsonData.Contains($"\"Contoso external login provider key\":\"{userName}\"")); + if (social) + { + Assert.Equal(userName, (string)jsonData["Contoso external login provider key"]); + } + else + { + Assert.Null((string)jsonData["Contoso external login provider key"]); } } [Fact] public async Task GetOnDownloadPersonalData_ReturnsNotFound() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var client = ServerFactory.CreateDefaultClient(loggerFactory); - await UserStories.RegisterNewUserAsync(client); + // Arrange + var client = ServerFactory + .CreateClient(); - // Act - var response = await client.GetAsync("/Identity/Account/Manage/DownloadPersonalData"); + await UserStories.RegisterNewUserAsync(client); - // Assert - Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); - } + // Act + var response = await client.GetAsync("/Identity/Account/Manage/DownloadPersonalData"); + + // Assert + Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } [Fact] public async Task CanDeleteUser() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var client = ServerFactory.CreateDefaultClient(loggerFactory); + // Arrange + var client = ServerFactory + .CreateClient(); - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; - var index = await UserStories.RegisterNewUserAsync(client, userName, password); + var index = await UserStories.RegisterNewUserAsync(client, userName, password); - // Act & Assert - await UserStories.DeleteUser(index, password); - } + // Act & Assert + await UserStories.DeleteUser(index, password); } private void AssertClaimsEqual(ClaimsPrincipal expectedPrincipal, ClaimsPrincipal actualPrincipal, string claimType) diff --git a/test/Identity.FunctionalTests/NoIdentityAddedTests.cs b/test/Identity.FunctionalTests/NoIdentityAddedTests.cs new file mode 100644 index 0000000000..466a9da538 --- /dev/null +++ b/test/Identity.FunctionalTests/NoIdentityAddedTests.cs @@ -0,0 +1,71 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Net; +using System.Threading.Tasks; +using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging.Testing; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests +{ + public class NoIdentityAddedTests : IClassFixture> + { + public NoIdentityAddedTests(ServerFactory serverFactory) + { + ServerFactory = serverFactory; + } + + public ServerFactory ServerFactory { get; } + + [Theory] + [MemberData(nameof(IdentityEndpoints))] + public async Task QueryingIdentityEndpointsReturnsNotFoundWhenIdentityIsNotPresent(string endpoint) + { + // Arrange + void ConfigureTestServices(IServiceCollection services) { return; }; + + var client = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)) + .CreateClient(); + + // Act + var response = await client.GetAsync(endpoint); + + Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); + } + + public static TheoryData IdentityEndpoints => new TheoryData + { + "/Identity/Account/AccessDenied", + "/Identity/Account/ConfirmEmail", + "/Identity/Account/ExternalLogin", + "/Identity/Account/ForgotPassword", + "/Identity/Account/ForgotPasswordConfirmation", + "/Identity/Account/Lockout", + "/Identity/Account/Login", + "/Identity/Account/LoginWith2fa", + "/Identity/Account/LoginWithRecoveryCode", + "/Identity/Account/Logout", + "/Identity/Account/Register", + "/Identity/Account/ResetPassword", + "/Identity/Account/ResetPasswordConfirmation", + "/Identity/Account/Manage/ChangePassword", + "/Identity/Account/Manage/DeletePersonalData", + "/Identity/Account/Manage/Disable2fa", + "/Identity/Account/Manage/DownloadPersonalData", + "/Identity/Account/Manage/EnableAuthenticator", + "/Identity/Account/Manage/ExternalLogins", + "/Identity/Account/Manage/GenerateRecoveryCodes", + "/Identity/Account/Manage/Index", + "/Identity/Account/Manage/PersonalData", + "/Identity/Account/Manage/ResetAuthenticator", + "/Identity/Account/Manage/SetPassword", + "/Identity/Account/Manage/ShowRecoveryCodes", + "/Identity/Account/Manage/TwoFactorAuthentication", + }; + } +} diff --git a/test/Identity.FunctionalTests/Pages/Account/Manage/Index.cs b/test/Identity.FunctionalTests/Pages/Account/Manage/Index.cs index 255339e6dc..55ee865ba3 100644 --- a/test/Identity.FunctionalTests/Pages/Account/Manage/Index.cs +++ b/test/Identity.FunctionalTests/Pages/Account/Manage/Index.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using AngleSharp.Dom.Html; @@ -16,6 +18,9 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests.Account.Manage private readonly IHtmlAnchorElement _externalLoginLink; private readonly IHtmlAnchorElement _personalDataLink; private readonly IHtmlFormElement _updateProfileForm; + private readonly IHtmlElement _emailInput; + private readonly IHtmlElement _userNameInput; + private readonly IHtmlElement _updateProfileButton; private readonly IHtmlElement _confirmEmailButton; public static readonly string Path = "/"; @@ -33,6 +38,9 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests.Account.Manage } _personalDataLink = HtmlAssert.HasLink("#personal-data", manage); _updateProfileForm = HtmlAssert.HasForm("#profile-form", manage); + _emailInput = HtmlAssert.HasElement("#Input_Email", manage); + _userNameInput = HtmlAssert.HasElement("#Username", manage); + _updateProfileButton = HtmlAssert.HasElement("#update-profile-button", manage); if (!Context.EmailConfirmed) { _confirmEmailButton = HtmlAssert.HasElement("button#email-verification", manage); @@ -67,6 +75,19 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests.Account.Manage return new Index(Client, manage, Context); } + internal async Task SendUpdateProfileAsync(string newEmail) + { + var response = await Client.SendAsync(_updateProfileForm, _updateProfileButton, new Dictionary + { + ["Input_Email"] = newEmail + }); + var goToManage = ResponseAssert.IsRedirect(response); + var manageResponse = await Client.GetAsync(goToManage); + var manage = await ResponseAssert.IsHtmlDocumentAsync(manageResponse); + + return new Index(Client, manage, Context); + } + public async Task ClickChangePasswordLinkAsync() { var goToChangePassword = await Client.GetAsync(_changePasswordLink.Href); @@ -74,6 +95,10 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests.Account.Manage return new ChangePassword(Client, changePasswordDocument, Context); } + internal string GetEmail() => _emailInput.GetAttribute("value"); + + internal object GetUserName() => _userNameInput.GetAttribute("value"); + public async Task ClickChangePasswordLinkExternalLoginAsync() { var response = await Client.GetAsync(_changePasswordLink.Href); diff --git a/test/Identity.FunctionalTests/PocoUserTests/PocoUserAuthorizationTests.cs b/test/Identity.FunctionalTests/PocoUserTests/PocoUserAuthorizationTests.cs new file mode 100644 index 0000000000..26457077d4 --- /dev/null +++ b/test/Identity.FunctionalTests/PocoUserTests/PocoUserAuthorizationTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class PocoUserAuthorizationTests : AuthorizationTests + { + public PocoUserAuthorizationTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/PocoUserTests/PocoUserLoginTests.cs b/test/Identity.FunctionalTests/PocoUserTests/PocoUserLoginTests.cs new file mode 100644 index 0000000000..8bea3d6a27 --- /dev/null +++ b/test/Identity.FunctionalTests/PocoUserTests/PocoUserLoginTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class PocoUserLoginTests : LoginTests + { + public PocoUserLoginTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/PocoUserTests/PocoUserManagementTests.cs b/test/Identity.FunctionalTests/PocoUserTests/PocoUserManagementTests.cs new file mode 100644 index 0000000000..2f39e71e8e --- /dev/null +++ b/test/Identity.FunctionalTests/PocoUserTests/PocoUserManagementTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class PocoUserManagementTests : ManagementTests + { + public PocoUserManagementTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/PocoUserTests/PocoUserRegistrationTests.cs b/test/Identity.FunctionalTests/PocoUserTests/PocoUserRegistrationTests.cs new file mode 100644 index 0000000000..3547ea988e --- /dev/null +++ b/test/Identity.FunctionalTests/PocoUserTests/PocoUserRegistrationTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Identity.FunctionalTests.IdentityUserTests +{ + public class PocoUserRegistrationTests : RegistrationTests + { + public PocoUserRegistrationTests(ServerFactory serverFactory) : base(serverFactory) + { + } + } +} diff --git a/test/Identity.FunctionalTests/RegistrationTests.cs b/test/Identity.FunctionalTests/RegistrationTests.cs index a040c17af5..b239323e9d 100644 --- a/test/Identity.FunctionalTests/RegistrationTests.cs +++ b/test/Identity.FunctionalTests/RegistrationTests.cs @@ -3,54 +3,58 @@ using System; using System.Threading.Tasks; -using Microsoft.Extensions.Logging.Testing; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; using Xunit; -using Xunit.Abstractions; namespace Microsoft.AspNetCore.Identity.FunctionalTests { - public class RegistrationTests : LoggedTest, IClassFixture + public abstract class RegistrationTests : IClassFixture> + where TStartup : class + where TContext : DbContext { - public RegistrationTests(ServerFactory serverFactory, ITestOutputHelper output) : base(output) + public RegistrationTests(ServerFactory serverFactory) { ServerFactory = serverFactory; } - public ServerFactory ServerFactory { get; } + public ServerFactory ServerFactory { get; } [Fact] public async Task CanRegisterAUser() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var client = ServerFactory.CreateDefaultClient(loggerFactory); + // Arrange + void ConfigureTestServices(IServiceCollection services) { return; }; - var userName = $"{Guid.NewGuid()}@example.com"; - var password = $"!Test.Password1$"; + var client = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)) + .CreateClient(); - // Act & Assert - await UserStories.RegisterNewUserAsync(client, userName, password); - } + var userName = $"{Guid.NewGuid()}@example.com"; + var password = $"!Test.Password1$"; + + // Act & Assert + await UserStories.RegisterNewUserAsync(client, userName, password); } [Fact] public async Task CanRegisterWithASocialLoginProvider() { - using (StartLog(out var loggerFactory)) - { - // Arrange - var server = ServerFactory.CreateServer(loggerFactory, builder => - builder.ConfigureServices(services => services.SetupTestThirdPartyLogin())); - var client = ServerFactory.CreateDefaultClient(server); + // Arrange + void ConfigureTestServices(IServiceCollection services) => + services + .SetupTestThirdPartyLogin(); - var guid = Guid.NewGuid(); - var userName = $"{guid}"; - var email = $"{guid}@example.com"; + var client = ServerFactory + .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)) + .CreateClient(); - // Act & Assert - await UserStories.RegisterNewUserWithSocialLoginAsync(client, userName, email); - } + var guid = Guid.NewGuid(); + var userName = $"{guid}"; + var email = $"{guid}@example.com"; + + // Act & Assert + await UserStories.RegisterNewUserWithSocialLoginAsync(client, userName, email); } } } diff --git a/test/Identity.FunctionalTests/UserStories.cs b/test/Identity.FunctionalTests/UserStories.cs index 74b6bdec55..4bded7e564 100644 --- a/test/Identity.FunctionalTests/UserStories.cs +++ b/test/Identity.FunctionalTests/UserStories.cs @@ -8,6 +8,8 @@ using AngleSharp.Dom.Html; using Identity.DefaultUI.WebSite; using Microsoft.AspNetCore.Identity.FunctionalTests.Account; using Microsoft.AspNetCore.Identity.FunctionalTests.Account.Manage; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using Xunit; namespace Microsoft.AspNetCore.Identity.FunctionalTests @@ -53,6 +55,12 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests return await manage.SendConfirmationEmailAsync(); } + internal static async Task SendUpdateProfileAsync(Index index, string newEmail) + { + var manage = await index.ClickManageLinkAsync(); + return await manage.SendUpdateProfileAsync(newEmail); + } + internal static async Task LoginWithSocialLoginAsync(HttpClient client, string userName) { var index = await Index.CreateAsync( @@ -185,12 +193,13 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests return await deleteUser.Delete(password); } - internal static async Task DownloadPersonalData(Index index, string userName) + internal static async Task DownloadPersonalData(Index index, string userName) { var manage = await index.ClickManageLinkAsync(); var personalData = await manage.ClickPersonalDataLinkAsync(); var download = await personalData.SubmitDownloadForm(); - return await download.Content.ReadAsStringAsync(); + ResponseAssert.IsOK(download); + return JsonConvert.DeserializeObject(await download.Content.ReadAsStringAsync()); } } } diff --git a/test/Identity.Test/IdentityBuilderTest.cs b/test/Identity.Test/IdentityBuilderTest.cs index 7fa2de9229..e2cded94dc 100644 --- a/test/Identity.Test/IdentityBuilderTest.cs +++ b/test/Identity.Test/IdentityBuilderTest.cs @@ -20,25 +20,25 @@ namespace Microsoft.AspNetCore.Identity.Test public void AddRolesServicesAdded() { var services = new ServiceCollection(); - services.AddIdentityCore(o => { }) - .AddRoles() + services.AddIdentityCore(o => { }) + .AddRoles() .AddRoleStore(); var sp = services.BuildServiceProvider(); - Assert.NotNull(sp.GetRequiredService>()); - Assert.IsType(sp.GetRequiredService>()); - Assert.NotNull(sp.GetRequiredService>()); + Assert.NotNull(sp.GetRequiredService>()); + Assert.IsType(sp.GetRequiredService>()); + Assert.NotNull(sp.GetRequiredService>()); } [Fact] public void AddRolesWithoutStoreWillError() { var services = new ServiceCollection(); - services.AddIdentityCore(o => { }) - .AddRoles(); + services.AddIdentityCore(o => { }) + .AddRoles(); var sp = services.BuildServiceProvider(); - Assert.NotNull(sp.GetRequiredService>()); - Assert.Null(sp.GetService>()); - Assert.Throws(() => sp.GetService>()); + Assert.NotNull(sp.GetRequiredService>()); + Assert.Null(sp.GetService>()); + Assert.Throws(() => sp.GetService>()); } @@ -47,8 +47,8 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity().AddUserStore(); - var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; + services.AddIdentity().AddUserStore(); + var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } @@ -57,8 +57,8 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity().AddRoleStore(); - var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; + services.AddIdentity().AddRoleStore(); + var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } @@ -68,12 +68,12 @@ namespace Microsoft.AspNetCore.Identity.Test var services = new ServiceCollection() .AddLogging() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity() + services.AddIdentity() .AddClaimsPrincipalFactory() .AddUserManager() .AddUserStore() .AddRoleStore(); - var thingy = services.BuildServiceProvider().GetRequiredService>() as MyClaimsPrincipalFactory; + var thingy = services.BuildServiceProvider().GetRequiredService>() as MyClaimsPrincipalFactory; Assert.NotNull(thingy); } @@ -82,8 +82,8 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity().AddRoleValidator(); - var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; + services.AddIdentity().AddRoleValidator(); + var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } @@ -92,8 +92,8 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity().AddUserValidator(); - var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; + services.AddIdentity().AddUserValidator(); + var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } @@ -102,8 +102,8 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity().AddPasswordValidator(); - var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; + services.AddIdentity().AddPasswordValidator(); + var thingy = services.BuildServiceProvider().GetRequiredService>() as MyUberThingy; Assert.NotNull(thingy); } @@ -112,10 +112,10 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity() + services.AddIdentity() .AddUserStore() .AddUserManager(); - var myUserManager = services.BuildServiceProvider().GetRequiredService(typeof(UserManager)) as MyUserManager; + var myUserManager = services.BuildServiceProvider().GetRequiredService(typeof(UserManager)) as MyUserManager; Assert.NotNull(myUserManager); } @@ -124,10 +124,10 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity() + services.AddIdentity() .AddRoleStore() .AddRoleManager(); - var myRoleManager = services.BuildServiceProvider().GetRequiredService>() as MyRoleManager; + var myRoleManager = services.BuildServiceProvider().GetRequiredService>() as MyRoleManager; Assert.NotNull(myRoleManager); } @@ -138,13 +138,13 @@ namespace Microsoft.AspNetCore.Identity.Test .AddSingleton(new ConfigurationBuilder().Build()) .AddHttpContextAccessor() .AddLogging(); - services.AddIdentity() + services.AddIdentity() .AddUserStore() .AddRoleStore() .AddUserManager() .AddClaimsPrincipalFactory() .AddSignInManager(); - var myUserManager = services.BuildServiceProvider().GetRequiredService(typeof(SignInManager)) as MySignInManager; + var myUserManager = services.BuildServiceProvider().GetRequiredService(typeof(SignInManager)) as MySignInManager; Assert.NotNull(myUserManager); } @@ -153,16 +153,16 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity(); + services.AddIdentity(); var provider = services.BuildServiceProvider(); - var userValidator = provider.GetRequiredService>() as UserValidator; + var userValidator = provider.GetRequiredService>() as UserValidator; Assert.NotNull(userValidator); - var pwdValidator = provider.GetRequiredService>() as PasswordValidator; + var pwdValidator = provider.GetRequiredService>() as PasswordValidator; Assert.NotNull(pwdValidator); - var hasher = provider.GetRequiredService>() as PasswordHasher; + var hasher = provider.GetRequiredService>() as PasswordHasher; Assert.NotNull(hasher); } @@ -171,7 +171,7 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - services.AddIdentity().AddDefaultTokenProviders(); + services.AddIdentity().AddDefaultTokenProviders(); var provider = services.BuildServiceProvider(); var tokenProviders = provider.GetRequiredService>().Value.Tokens.ProviderMap.Values; @@ -183,7 +183,7 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - var builder = services.AddIdentity(); + var builder = services.AddIdentity(); Assert.Throws(() => builder.AddUserManager()); Assert.Throws(() => builder.AddRoleManager()); Assert.Throws(() => builder.AddSignInManager()); @@ -194,29 +194,29 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddSingleton(new ConfigurationBuilder().Build()); - var builder = services.AddIdentity(); + var builder = services.AddIdentity(); Assert.Throws(() => builder.AddTokenProvider("whatevs")); Assert.Throws(() => builder.AddTokenProvider("whatevs", typeof(object))); } - private class MyUberThingy : IUserValidator, IPasswordValidator, IRoleValidator, IUserStore, IRoleStore + private class MyUberThingy : IUserValidator, IPasswordValidator, IRoleValidator, IUserStore, IRoleStore { - public Task CreateAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task CreateAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task CreateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task CreateAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task DeleteAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task DeleteAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task DeleteAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task DeleteAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } @@ -226,123 +226,123 @@ namespace Microsoft.AspNetCore.Identity.Test throw new NotImplementedException(); } - public Task FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetNormalizedRoleNameAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetNormalizedRoleNameAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetNormalizedUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetNormalizedUserNameAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetRoleIdAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetRoleIdAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetRoleNameAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetRoleNameAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetUserIdAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetUserIdAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetUserNameAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetNormalizedRoleNameAsync(TestRole role, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetNormalizedRoleNameAsync(PocoRole role, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetNormalizedUserNameAsync(TestUser user, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetNormalizedUserNameAsync(PocoUser user, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetRoleNameAsync(TestRole role, string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetRoleNameAsync(PocoRole role, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetUserNameAsync(TestUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetUserNameAsync(PocoUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task UpdateAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task UpdateAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task UpdateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task UpdateAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task ValidateAsync(RoleManager manager, TestRole role) + public Task ValidateAsync(RoleManager manager, PocoRole role) { throw new NotImplementedException(); } - public Task ValidateAsync(UserManager manager, TestUser user) + public Task ValidateAsync(UserManager manager, PocoUser user) { throw new NotImplementedException(); } - public Task ValidateAsync(UserManager manager, TestUser user, string password) + public Task ValidateAsync(UserManager manager, PocoUser user, string password) { throw new NotImplementedException(); } - Task IRoleStore.FindByIdAsync(string roleId, CancellationToken cancellationToken) + Task IRoleStore.FindByIdAsync(string roleId, CancellationToken cancellationToken) { throw new NotImplementedException(); } - Task IRoleStore.FindByNameAsync(string roleName, CancellationToken cancellationToken) + Task IRoleStore.FindByNameAsync(string roleName, CancellationToken cancellationToken) { throw new NotImplementedException(); } } - private class MySignInManager : SignInManager + private class MySignInManager : SignInManager { - public MySignInManager(UserManager manager, IHttpContextAccessor context, IUserClaimsPrincipalFactory claimsFactory) : base(manager, context, claimsFactory, null, null, null) { } + public MySignInManager(UserManager manager, IHttpContextAccessor context, IUserClaimsPrincipalFactory claimsFactory) : base(manager, context, claimsFactory, null, null, null) { } } - private class MyUserManager : UserManager + private class MyUserManager : UserManager { - public MyUserManager(IUserStore store) : base(store, null, null, null, null, null, null, null, null) { } + public MyUserManager(IUserStore store) : base(store, null, null, null, null, null, null, null, null) { } } - private class MyClaimsPrincipalFactory : UserClaimsPrincipalFactory + private class MyClaimsPrincipalFactory : UserClaimsPrincipalFactory { - public MyClaimsPrincipalFactory(UserManager userManager, RoleManager roleManager, IOptions optionsAccessor) : base(userManager, roleManager, optionsAccessor) + public MyClaimsPrincipalFactory(UserManager userManager, RoleManager roleManager, IOptions optionsAccessor) : base(userManager, roleManager, optionsAccessor) { } } - private class MyRoleManager : RoleManager + private class MyRoleManager : RoleManager { - public MyRoleManager(IRoleStore store, - IEnumerable> roleValidators) : base(store, null, null, null, null) + public MyRoleManager(IRoleStore store, + IEnumerable> roleValidators) : base(store, null, null, null, null) { } diff --git a/test/Identity.Test/IdentityOptionsTest.cs b/test/Identity.Test/IdentityOptionsTest.cs index 400ea15d21..19eff76eab 100644 --- a/test/Identity.Test/IdentityOptionsTest.cs +++ b/test/Identity.Test/IdentityOptionsTest.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNetCore.Identity.Test public void CanCustomizeIdentityOptions() { var services = new ServiceCollection().Configure(options => options.Password.RequiredLength = -1); - services.AddIdentity(); + services.AddIdentity(); var serviceProvider = services.BuildServiceProvider(); var setup = serviceProvider.GetRequiredService>(); @@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Identity.Test public void CanSetupIdentityOptions() { var services = new ServiceCollection(); - services.AddIdentity(options => options.User.RequireUniqueEmail = true); + services.AddIdentity(options => options.User.RequireUniqueEmail = true); var serviceProvider = services.BuildServiceProvider(); var optionsGetter = serviceProvider.GetRequiredService>(); diff --git a/test/Identity.Test/NoopRoleStore.cs b/test/Identity.Test/NoopRoleStore.cs index 087690b9f8..9185578d04 100644 --- a/test/Identity.Test/NoopRoleStore.cs +++ b/test/Identity.Test/NoopRoleStore.cs @@ -6,58 +6,58 @@ using System.Threading.Tasks; namespace Microsoft.AspNetCore.Identity.Test { - public class NoopRoleStore : IRoleStore + public class NoopRoleStore : IRoleStore { - public Task CreateAsync(TestRole user, CancellationToken cancellationToken = default(CancellationToken)) + public Task CreateAsync(PocoRole user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Success); } - public Task UpdateAsync(TestRole user, CancellationToken cancellationToken = default(CancellationToken)) + public Task UpdateAsync(PocoRole user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Success); } - public Task GetRoleNameAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetRoleNameAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(null); } - public Task SetRoleNameAsync(TestRole role, string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetRoleNameAsync(PocoRole role, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task FindByIdAsync(string roleId, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByIdAsync(string roleId, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult(null); + return Task.FromResult(null); } - public Task FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult(null); + return Task.FromResult(null); } public void Dispose() { } - public Task DeleteAsync(TestRole user, CancellationToken cancellationToken = default(CancellationToken)) + public Task DeleteAsync(PocoRole user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Success); } - public Task GetRoleIdAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetRoleIdAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(null); } - public Task GetNormalizedRoleNameAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetNormalizedRoleNameAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(null); } - public Task SetNormalizedRoleNameAsync(TestRole role, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetNormalizedRoleNameAsync(PocoRole role, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } diff --git a/test/Identity.Test/NoopUserStore.cs b/test/Identity.Test/NoopUserStore.cs index bb30ed6f68..16d380b347 100644 --- a/test/Identity.Test/NoopUserStore.cs +++ b/test/Identity.Test/NoopUserStore.cs @@ -7,58 +7,58 @@ using System.Threading.Tasks; namespace Microsoft.AspNetCore.Identity.Test { - public class NoopUserStore : IUserStore + public class NoopUserStore : IUserStore { - public Task GetUserIdAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetUserIdAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(user.Id); } - public Task GetUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetUserNameAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(user.UserName); } - public Task SetUserNameAsync(TestUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetUserNameAsync(PocoUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task CreateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task CreateAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Success); } - public Task UpdateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task UpdateAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Success); } - public Task FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult(null); + return Task.FromResult(null); } - public Task FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult(null); + return Task.FromResult(null); } public void Dispose() { } - public Task DeleteAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task DeleteAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Success); } - public Task GetNormalizedUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetNormalizedUserNameAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(null); } - public Task SetNormalizedUserNameAsync(TestUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetNormalizedUserNameAsync(PocoUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } diff --git a/test/Identity.Test/PasswordValidatorTest.cs b/test/Identity.Test/PasswordValidatorTest.cs index 36897ad437..89ac413a44 100644 --- a/test/Identity.Test/PasswordValidatorTest.cs +++ b/test/Identity.Test/PasswordValidatorTest.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task ValidateThrowsWithNullTest() { // Setup - var validator = new PasswordValidator(); + var validator = new PasswordValidator(); // Act // Assert @@ -42,8 +42,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task FailsIfTooShortTests(string input) { const string error = "Passwords must be at least 6 characters."; - var manager = MockHelpers.TestUserManager(); - var valid = new PasswordValidator(); + var manager = MockHelpers.TestUserManager(); + var valid = new PasswordValidator(); manager.Options.Password.RequireUppercase = false; manager.Options.Password.RequireNonAlphanumeric = false; manager.Options.Password.RequireLowercase = false; @@ -56,8 +56,8 @@ namespace Microsoft.AspNetCore.Identity.Test [InlineData("aaaaaaaaaaa")] public async Task SuccessIfLongEnoughTests(string input) { - var manager = MockHelpers.TestUserManager(); - var valid = new PasswordValidator(); + var manager = MockHelpers.TestUserManager(); + var valid = new PasswordValidator(); manager.Options.Password.RequireUppercase = false; manager.Options.Password.RequireNonAlphanumeric = false; manager.Options.Password.RequireLowercase = false; @@ -70,8 +70,8 @@ namespace Microsoft.AspNetCore.Identity.Test [InlineData("aaaaaaaaaaa")] public async Task FailsWithoutRequiredNonAlphanumericTests(string input) { - var manager = MockHelpers.TestUserManager(); - var valid = new PasswordValidator(); + var manager = MockHelpers.TestUserManager(); + var valid = new PasswordValidator(); manager.Options.Password.RequireUppercase = false; manager.Options.Password.RequireNonAlphanumeric = true; manager.Options.Password.RequireLowercase = false; @@ -87,8 +87,8 @@ namespace Microsoft.AspNetCore.Identity.Test [InlineData("!!!!!!")] public async Task SucceedsWithRequiredNonAlphanumericTests(string input) { - var manager = MockHelpers.TestUserManager(); - var valid = new PasswordValidator(); + var manager = MockHelpers.TestUserManager(); + var valid = new PasswordValidator(); manager.Options.Password.RequireUppercase = false; manager.Options.Password.RequireNonAlphanumeric = true; manager.Options.Password.RequireLowercase = false; @@ -103,8 +103,8 @@ namespace Microsoft.AspNetCore.Identity.Test [InlineData("abcdabcdabcdabcdabcdabcdabcd", 5)] public async Task FailsWithoutRequiredUniqueCharsTests(string input, int uniqueChars) { - var manager = MockHelpers.TestUserManager(); - var valid = new PasswordValidator(); + var manager = MockHelpers.TestUserManager(); + var valid = new PasswordValidator(); manager.Options.Password.RequireUppercase = false; manager.Options.Password.RequireNonAlphanumeric = false; manager.Options.Password.RequireLowercase = false; @@ -124,8 +124,8 @@ namespace Microsoft.AspNetCore.Identity.Test [InlineData("this is a long password with many chars", 10)] public async Task SucceedsWithRequiredUniqueCharsTests(string input, int uniqueChars) { - var manager = MockHelpers.TestUserManager(); - var valid = new PasswordValidator(); + var manager = MockHelpers.TestUserManager(); + var valid = new PasswordValidator(); manager.Options.Password.RequireUppercase = false; manager.Options.Password.RequireNonAlphanumeric = false; manager.Options.Password.RequireLowercase = false; @@ -149,8 +149,8 @@ namespace Microsoft.AspNetCore.Identity.Test const string lowerError = "Passwords must have at least one lowercase ('a'-'z')."; const string digitError = "Passwords must have at least one digit ('0'-'9')."; const string lengthError = "Passwords must be at least 6 characters."; - var manager = MockHelpers.TestUserManager(); - var valid = new PasswordValidator(); + var manager = MockHelpers.TestUserManager(); + var valid = new PasswordValidator(); var errors = new List(); if ((errorMask & Errors.Length) != Errors.None) { diff --git a/test/Identity.Test/RoleManagerTest.cs b/test/Identity.Test/RoleManagerTest.cs index 4e82ec6f1a..acb16e9b3c 100644 --- a/test/Identity.Test/RoleManagerTest.cs +++ b/test/Identity.Test/RoleManagerTest.cs @@ -17,8 +17,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CreateCallsStore() { // Setup - var store = new Mock>(); - var role = new TestRole { Name = "Foo" }; + var store = new Mock>(); + var role = new PocoRole { Name = "Foo" }; store.Setup(s => s.CreateAsync(role, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); store.Setup(s => s.GetRoleNameAsync(role, CancellationToken.None)).Returns(Task.FromResult(role.Name)).Verifiable(); store.Setup(s => s.SetNormalizedRoleNameAsync(role, role.Name.ToUpperInvariant(), CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); @@ -36,8 +36,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task UpdateCallsStore() { // Setup - var store = new Mock>(); - var role = new TestRole { Name = "Foo" }; + var store = new Mock>(); + var role = new PocoRole { Name = "Foo" }; store.Setup(s => s.UpdateAsync(role, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); store.Setup(s => s.GetRoleNameAsync(role, CancellationToken.None)).Returns(Task.FromResult(role.Name)).Verifiable(); store.Setup(s => s.SetNormalizedRoleNameAsync(role, role.Name.ToUpperInvariant(), CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); @@ -63,8 +63,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task FindByNameCallsStoreWithNormalizedName() { // Setup - var store = new Mock>(); - var role = new TestRole { Name = "Foo" }; + var store = new Mock>(); + var role = new PocoRole { Name = "Foo" }; store.Setup(s => s.FindByNameAsync("FOO", CancellationToken.None)).Returns(Task.FromResult(role)).Verifiable(); var manager = MockHelpers.TestRoleManager(store.Object); @@ -80,8 +80,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanFindByNameCallsStoreWithoutNormalizedName() { // Setup - var store = new Mock>(); - var role = new TestRole { Name = "Foo" }; + var store = new Mock>(); + var role = new PocoRole { Name = "Foo" }; store.Setup(s => s.FindByNameAsync(role.Name, CancellationToken.None)).Returns(Task.FromResult(role)).Verifiable(); var manager = MockHelpers.TestRoleManager(store.Object); manager.KeyNormalizer = null; @@ -98,8 +98,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task RoleExistsCallsStoreWithNormalizedName() { // Setup - var store = new Mock>(); - var role = new TestRole { Name = "Foo" }; + var store = new Mock>(); + var role = new PocoRole { Name = "Foo" }; store.Setup(s => s.FindByNameAsync("FOO", CancellationToken.None)).Returns(Task.FromResult(role)).Verifiable(); var manager = MockHelpers.TestRoleManager(store.Object); @@ -124,7 +124,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task RoleManagerPublicNullChecks() { Assert.Throws("store", - () => new RoleManager(null, null, null, null, null)); + () => new RoleManager(null, null, null, null, null)); var manager = CreateRoleManager(new NotImplementedStore()); await Assert.ThrowsAsync("role", async () => await manager.CreateAsync(null)); await Assert.ThrowsAsync("role", async () => await manager.UpdateAsync(null)); @@ -146,49 +146,49 @@ namespace Microsoft.AspNetCore.Identity.Test await Assert.ThrowsAsync(() => manager.DeleteAsync(null)); } - private static RoleManager CreateRoleManager(IRoleStore roleStore) + private static RoleManager CreateRoleManager(IRoleStore roleStore) { return MockHelpers.TestRoleManager(roleStore); } - private class NotImplementedStore : IRoleStore + private class NotImplementedStore : IRoleStore { - public Task CreateAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task CreateAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task UpdateAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task UpdateAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task DeleteAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task DeleteAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetRoleIdAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetRoleIdAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetRoleNameAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetRoleNameAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetRoleNameAsync(TestRole role, string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetRoleNameAsync(PocoRole role, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task FindByIdAsync(string roleId, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByIdAsync(string roleId, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task FindByNameAsync(string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByNameAsync(string roleName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } @@ -198,12 +198,12 @@ namespace Microsoft.AspNetCore.Identity.Test throw new NotImplementedException(); } - public Task GetNormalizedRoleNameAsync(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetNormalizedRoleNameAsync(PocoRole role, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetNormalizedRoleNameAsync(TestRole role, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetNormalizedRoleNameAsync(PocoRole role, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } diff --git a/test/Identity.Test/RoleValidatorTest.cs b/test/Identity.Test/RoleValidatorTest.cs index 9f6040ca34..848c7a8258 100644 --- a/test/Identity.Test/RoleValidatorTest.cs +++ b/test/Identity.Test/RoleValidatorTest.cs @@ -13,8 +13,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task ValidateThrowsWithNull() { // Setup - var validator = new RoleValidator(); - var manager = MockHelpers.TestRoleManager(); + var validator = new RoleValidator(); + var manager = MockHelpers.TestRoleManager(); // Act // Assert @@ -28,9 +28,9 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task ValidateFailsWithTooShortRoleName(string input) { // Setup - var validator = new RoleValidator(); - var manager = MockHelpers.TestRoleManager(); - var user = new TestRole {Name = input}; + var validator = new RoleValidator(); + var manager = MockHelpers.TestRoleManager(); + var user = new PocoRole {Name = input}; // Act var result = await validator.ValidateAsync(manager, user); diff --git a/test/Identity.Test/SecurityStampValidatorTest.cs b/test/Identity.Test/SecurityStampValidatorTest.cs index a4634dd1bf..fe8d15a274 100644 --- a/test/Identity.Test/SecurityStampValidatorTest.cs +++ b/test/Identity.Test/SecurityStampValidatorTest.cs @@ -70,7 +70,7 @@ namespace Microsoft.AspNetCore.Identity.Test [InlineData(false)] public async Task OnValidatePrincipalTestSuccess(bool isPersistent) { - var user = new TestUser("test"); + var user = new PocoUser("test"); var httpContext = new Mock(); await RunApplicationCookieTest(user, httpContext, /*shouldStampValidate*/true, async () => @@ -92,19 +92,19 @@ namespace Microsoft.AspNetCore.Identity.Test }); } - private async Task RunApplicationCookieTest(TestUser user, Mock httpContext, bool shouldStampValidate, Func testCode) + private async Task RunApplicationCookieTest(PocoUser user, Mock httpContext, bool shouldStampValidate, Func testCode) { - var userManager = MockHelpers.MockUserManager(); - var claimsManager = new Mock>(); + var userManager = MockHelpers.MockUserManager(); + var claimsManager = new Mock>(); var identityOptions = new Mock>(); identityOptions.Setup(a => a.Value).Returns(new IdentityOptions()); var options = new Mock>(); options.Setup(a => a.Value).Returns(new SecurityStampValidatorOptions { ValidationInterval = TimeSpan.Zero }); var contextAccessor = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(httpContext.Object); - var signInManager = new Mock>(userManager.Object, + var signInManager = new Mock>(userManager.Object, contextAccessor.Object, claimsManager.Object, identityOptions.Object, null, new Mock().Object); - signInManager.Setup(s => s.ValidateSecurityStampAsync(It.IsAny())).ReturnsAsync(shouldStampValidate ? user : default(TestUser)).Verifiable(); + signInManager.Setup(s => s.ValidateSecurityStampAsync(It.IsAny())).ReturnsAsync(shouldStampValidate ? user : default(PocoUser)).Verifiable(); if (shouldStampValidate) { @@ -117,7 +117,7 @@ namespace Microsoft.AspNetCore.Identity.Test var services = new ServiceCollection(); services.AddSingleton(options.Object); services.AddSingleton(signInManager.Object); - services.AddSingleton(new SecurityStampValidator(options.Object, signInManager.Object, new SystemClock())); + services.AddSingleton(new SecurityStampValidator(options.Object, signInManager.Object, new SystemClock())); httpContext.Setup(c => c.RequestServices).Returns(services.BuildServiceProvider()); await testCode.Invoke(); @@ -127,7 +127,7 @@ namespace Microsoft.AspNetCore.Identity.Test [Fact] public async Task OnValidateIdentityRejectsWhenValidateSecurityStampFails() { - var user = new TestUser("test"); + var user = new PocoUser("test"); var httpContext = new Mock(); await RunApplicationCookieTest(user, httpContext, /*shouldStampValidate*/false, async () => @@ -150,23 +150,23 @@ namespace Microsoft.AspNetCore.Identity.Test [Fact] public async Task OnValidateIdentityRejectsWhenNoIssuedUtc() { - var user = new TestUser("test"); + var user = new PocoUser("test"); var httpContext = new Mock(); - var userManager = MockHelpers.MockUserManager(); + var userManager = MockHelpers.MockUserManager(); var identityOptions = new Mock>(); identityOptions.Setup(a => a.Value).Returns(new IdentityOptions()); - var claimsManager = new Mock>(); + var claimsManager = new Mock>(); var options = new Mock>(); options.Setup(a => a.Value).Returns(new SecurityStampValidatorOptions { ValidationInterval = TimeSpan.Zero }); var contextAccessor = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(httpContext.Object); - var signInManager = new Mock>(userManager.Object, + var signInManager = new Mock>(userManager.Object, contextAccessor.Object, claimsManager.Object, identityOptions.Object, null, new Mock().Object); - signInManager.Setup(s => s.ValidateSecurityStampAsync(It.IsAny())).ReturnsAsync(default(TestUser)).Verifiable(); + signInManager.Setup(s => s.ValidateSecurityStampAsync(It.IsAny())).ReturnsAsync(default(PocoUser)).Verifiable(); var services = new ServiceCollection(); services.AddSingleton(options.Object); services.AddSingleton(signInManager.Object); - services.AddSingleton(new SecurityStampValidator(options.Object, signInManager.Object, new SystemClock())); + services.AddSingleton(new SecurityStampValidator(options.Object, signInManager.Object, new SystemClock())); httpContext.Setup(c => c.RequestServices).Returns(services.BuildServiceProvider()); var id = new ClaimsIdentity(IdentityConstants.ApplicationScheme); id.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id)); @@ -186,24 +186,24 @@ namespace Microsoft.AspNetCore.Identity.Test [Fact] public async Task OnValidateIdentityDoesNotRejectsWhenNotExpired() { - var user = new TestUser("test"); + var user = new PocoUser("test"); var httpContext = new Mock(); - var userManager = MockHelpers.MockUserManager(); + var userManager = MockHelpers.MockUserManager(); var identityOptions = new Mock>(); identityOptions.Setup(a => a.Value).Returns(new IdentityOptions()); - var claimsManager = new Mock>(); + var claimsManager = new Mock>(); var options = new Mock>(); options.Setup(a => a.Value).Returns(new SecurityStampValidatorOptions { ValidationInterval = TimeSpan.FromDays(1) }); var contextAccessor = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(httpContext.Object); - var signInManager = new Mock>(userManager.Object, + var signInManager = new Mock>(userManager.Object, contextAccessor.Object, claimsManager.Object, identityOptions.Object, null, new Mock().Object); signInManager.Setup(s => s.ValidateSecurityStampAsync(It.IsAny())).Throws(new Exception("Shouldn't be called")); signInManager.Setup(s => s.SignInAsync(user, false, null)).Throws(new Exception("Shouldn't be called")); var services = new ServiceCollection(); services.AddSingleton(options.Object); services.AddSingleton(signInManager.Object); - services.AddSingleton(new SecurityStampValidator(options.Object, signInManager.Object, new SystemClock())); + services.AddSingleton(new SecurityStampValidator(options.Object, signInManager.Object, new SystemClock())); httpContext.Setup(c => c.RequestServices).Returns(services.BuildServiceProvider()); var id = new ClaimsIdentity(IdentityConstants.ApplicationScheme); id.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id)); @@ -221,25 +221,25 @@ namespace Microsoft.AspNetCore.Identity.Test private async Task RunRememberClientCookieTest(bool shouldStampValidate, bool validationSuccess) { - var user = new TestUser("test"); + var user = new PocoUser("test"); var httpContext = new Mock(); - var userManager = MockHelpers.MockUserManager(); + var userManager = MockHelpers.MockUserManager(); userManager.Setup(u => u.GetUserIdAsync(user)).ReturnsAsync(user.Id).Verifiable(); - var claimsManager = new Mock>(); + var claimsManager = new Mock>(); var identityOptions = new Mock>(); identityOptions.Setup(a => a.Value).Returns(new IdentityOptions()); var options = new Mock>(); options.Setup(a => a.Value).Returns(new SecurityStampValidatorOptions { ValidationInterval = TimeSpan.Zero }); var contextAccessor = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(httpContext.Object); - var signInManager = new Mock>(userManager.Object, + var signInManager = new Mock>(userManager.Object, contextAccessor.Object, claimsManager.Object, identityOptions.Object, null, new Mock().Object); signInManager.Setup(s => s.ValidateTwoFactorSecurityStampAsync(It.IsAny())).ReturnsAsync(shouldStampValidate ? user : default).Verifiable(); var services = new ServiceCollection(); services.AddSingleton(options.Object); services.AddSingleton(signInManager.Object); - services.AddSingleton(new TwoFactorSecurityStampValidator(options.Object, signInManager.Object, new SystemClock())); + services.AddSingleton(new TwoFactorSecurityStampValidator(options.Object, signInManager.Object, new SystemClock())); httpContext.Setup(c => c.RequestServices).Returns(services.BuildServiceProvider()); var principal = await signInManager.Object.StoreRememberClient(user); diff --git a/test/Identity.Test/SignInManagerTest.cs b/test/Identity.Test/SignInManagerTest.cs index 05709478e6..4ac34d4d0c 100644 --- a/test/Identity.Test/SignInManagerTest.cs +++ b/test/Identity.Test/SignInManagerTest.cs @@ -67,13 +67,13 @@ namespace Microsoft.AspNetCore.Identity.Test [Fact] public void ConstructorNullChecks() { - Assert.Throws("userManager", () => new SignInManager(null, null, null, null, null, null)); - var userManager = MockHelpers.MockUserManager().Object; - Assert.Throws("contextAccessor", () => new SignInManager(userManager, null, null, null, null, null)); + Assert.Throws("userManager", () => new SignInManager(null, null, null, null, null, null)); + var userManager = MockHelpers.MockUserManager().Object; + Assert.Throws("contextAccessor", () => new SignInManager(userManager, null, null, null, null, null)); var contextAccessor = new Mock(); var context = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(context.Object); - Assert.Throws("claimsFactory", () => new SignInManager(userManager, contextAccessor.Object, null, null, null, null)); + Assert.Throws("claimsFactory", () => new SignInManager(userManager, contextAccessor.Object, null, null, null, null)); } //[Fact] @@ -108,7 +108,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task PasswordSignInReturnsLockedOutWhenLockedOut() { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.SupportsUserLockout).Returns(true).Verifiable(); manager.Setup(m => m.IsLockedOutAsync(user)).ReturnsAsync(true).Verifiable(); @@ -116,14 +116,14 @@ namespace Microsoft.AspNetCore.Identity.Test var context = new Mock(); var contextAccessor = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(context.Object); - var roleManager = MockHelpers.MockRoleManager(); + var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); var options = new Mock>(); options.Setup(a => a.Value).Returns(identityOptions); - var claimsFactory = new UserClaimsPrincipalFactory(manager.Object, roleManager.Object, options.Object); + var claimsFactory = new UserClaimsPrincipalFactory(manager.Object, roleManager.Object, options.Object); var logStore = new StringBuilder(); - var logger = MockHelpers.MockILogger>(logStore); - var helper = new SignInManager(manager.Object, contextAccessor.Object, claimsFactory, options.Object, logger.Object, new Mock().Object); + var logger = MockHelpers.MockILogger>(logStore); + var helper = new SignInManager(manager.Object, contextAccessor.Object, claimsFactory, options.Object, logger.Object, new Mock().Object); // Act var result = await helper.PasswordSignInAsync(user.UserName, "bogus", false, false); @@ -139,7 +139,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CheckPasswordSignInReturnsLockedOutWhenLockedOut() { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.SupportsUserLockout).Returns(true).Verifiable(); manager.Setup(m => m.IsLockedOutAsync(user)).ReturnsAsync(true).Verifiable(); @@ -147,14 +147,14 @@ namespace Microsoft.AspNetCore.Identity.Test var context = new Mock(); var contextAccessor = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(context.Object); - var roleManager = MockHelpers.MockRoleManager(); + var roleManager = MockHelpers.MockRoleManager(); var identityOptions = new IdentityOptions(); var options = new Mock>(); options.Setup(a => a.Value).Returns(identityOptions); - var claimsFactory = new UserClaimsPrincipalFactory(manager.Object, roleManager.Object, options.Object); + var claimsFactory = new UserClaimsPrincipalFactory(manager.Object, roleManager.Object, options.Object); var logStore = new StringBuilder(); - var logger = MockHelpers.MockILogger>(logStore); - var helper = new SignInManager(manager.Object, contextAccessor.Object, claimsFactory, options.Object, logger.Object, new Mock().Object); + var logger = MockHelpers.MockILogger>(logStore); + var helper = new SignInManager(manager.Object, contextAccessor.Object, claimsFactory, options.Object, logger.Object, new Mock().Object); // Act var result = await helper.CheckPasswordSignInAsync(user, "bogus", false); @@ -166,9 +166,9 @@ namespace Microsoft.AspNetCore.Identity.Test manager.Verify(); } - private static Mock> SetupUserManager(TestUser user) + private static Mock> SetupUserManager(PocoUser user) { - var manager = MockHelpers.MockUserManager(); + var manager = MockHelpers.MockUserManager(); manager.Setup(m => m.FindByNameAsync(user.UserName)).ReturnsAsync(user); manager.Setup(m => m.FindByIdAsync(user.Id)).ReturnsAsync(user); manager.Setup(m => m.GetUserIdAsync(user)).ReturnsAsync(user.Id.ToString()); @@ -176,17 +176,17 @@ namespace Microsoft.AspNetCore.Identity.Test return manager; } - private static SignInManager SetupSignInManager(UserManager manager, HttpContext context, StringBuilder logStore = null, IdentityOptions identityOptions = null) + private static SignInManager SetupSignInManager(UserManager manager, HttpContext context, StringBuilder logStore = null, IdentityOptions identityOptions = null) { var contextAccessor = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(context); - var roleManager = MockHelpers.MockRoleManager(); + var roleManager = MockHelpers.MockRoleManager(); identityOptions = identityOptions ?? new IdentityOptions(); var options = new Mock>(); options.Setup(a => a.Value).Returns(identityOptions); - var claimsFactory = new UserClaimsPrincipalFactory(manager, roleManager.Object, options.Object); - var sm = new SignInManager(manager, contextAccessor.Object, claimsFactory, options.Object, null, new Mock().Object); - sm.Logger = MockHelpers.MockILogger>(logStore ?? new StringBuilder()).Object; + var claimsFactory = new UserClaimsPrincipalFactory(manager, roleManager.Object, options.Object); + var sm = new SignInManager(manager, contextAccessor.Object, claimsFactory, options.Object, null, new Mock().Object); + sm.Logger = MockHelpers.MockILogger>(logStore ?? new StringBuilder()).Object; return sm; } @@ -196,7 +196,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanPasswordSignIn(bool isPersistent) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.SupportsUserLockout).Returns(true).Verifiable(); manager.Setup(m => m.IsLockedOutAsync(user)).ReturnsAsync(false).Verifiable(); @@ -220,7 +220,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanPasswordSignInWithNoLogger() { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.SupportsUserLockout).Returns(true).Verifiable(); manager.Setup(m => m.IsLockedOutAsync(user)).ReturnsAsync(false).Verifiable(); @@ -245,7 +245,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task PasswordSignInWorksWithNonTwoFactorStore() { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.SupportsUserLockout).Returns(true).Verifiable(); manager.Setup(m => m.IsLockedOutAsync(user)).ReturnsAsync(false).Verifiable(); @@ -272,7 +272,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task PasswordSignInRequiresVerification(bool supportsLockout) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.SupportsUserLockout).Returns(supportsLockout).Verifiable(); if (supportsLockout) @@ -312,7 +312,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task ExternalSignInRequiresVerificationIfNotBypassed(bool bypass) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; const string loginProvider = "login"; const string providerKey = "fookey"; var manager = SetupUserManager(user); @@ -351,9 +351,9 @@ namespace Microsoft.AspNetCore.Identity.Test auth.Verify(); } - private class GoodTokenProvider : AuthenticatorTokenProvider + private class GoodTokenProvider : AuthenticatorTokenProvider { - public override Task ValidateAsync(string purpose, string token, UserManager manager, TestUser user) + public override Task ValidateAsync(string purpose, string token, UserManager manager, PocoUser user) { return Task.FromResult(true); } @@ -368,7 +368,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanTwoFactorAuthenticatorSignIn(string providerName, bool isPersistent, bool rememberClient) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; const string code = "3123"; var manager = SetupUserManager(user); manager.Setup(m => m.SupportsUserLockout).Returns(true).Verifiable(); @@ -378,7 +378,7 @@ namespace Microsoft.AspNetCore.Identity.Test var context = new DefaultHttpContext(); var auth = MockAuth(context); var helper = SetupSignInManager(manager.Object, context); - var twoFactorInfo = new SignInManager.TwoFactorAuthenticationInfo { UserId = user.Id }; + var twoFactorInfo = new SignInManager.TwoFactorAuthenticationInfo { UserId = user.Id }; if (providerName != null) { helper.Options.Tokens.AuthenticatorTokenProvider = providerName; @@ -413,7 +413,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanTwoFactorRecoveryCodeSignIn(bool supportsLockout, bool externalLogin) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; const string bypassCode = "someCode"; var manager = SetupUserManager(user); manager.Setup(m => m.SupportsUserLockout).Returns(supportsLockout).Verifiable(); @@ -425,7 +425,7 @@ namespace Microsoft.AspNetCore.Identity.Test var context = new DefaultHttpContext(); var auth = MockAuth(context); var helper = SetupSignInManager(manager.Object, context); - var twoFactorInfo = new SignInManager.TwoFactorAuthenticationInfo { UserId = user.Id }; + var twoFactorInfo = new SignInManager.TwoFactorAuthenticationInfo { UserId = user.Id }; var loginProvider = "loginprovider"; var id = helper.StoreTwoFactorInfo(user.Id, externalLogin ? loginProvider : null); if (externalLogin) @@ -462,7 +462,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanExternalSignIn(bool isPersistent, bool supportsLockout) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; const string loginProvider = "login"; const string providerKey = "fookey"; var manager = SetupUserManager(user); @@ -501,7 +501,7 @@ namespace Microsoft.AspNetCore.Identity.Test bool externalLogin) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var context = new DefaultHttpContext(); var auth = MockAuth(context); var loginProvider = "loginprovider"; @@ -516,9 +516,9 @@ namespace Microsoft.AspNetCore.Identity.Test auth.Setup(a => a.AuthenticateAsync(context, IdentityConstants.ApplicationScheme)) .Returns(Task.FromResult(authResult)).Verifiable(); var manager = SetupUserManager(user); - var signInManager = new Mock>(manager.Object, + var signInManager = new Mock>(manager.Object, new HttpContextAccessor { HttpContext = context }, - new Mock>().Object, + new Mock>().Object, null, null, new Mock().Object) { CallBase = true }; //signInManager.Setup(s => s.SignInAsync(user, It.Is(p => p.IsPersistent == isPersistent), @@ -554,7 +554,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanTwoFactorSignIn(bool isPersistent, bool supportsLockout, bool externalLogin, bool rememberClient) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); var provider = "twofactorprovider"; var code = "123456"; @@ -568,7 +568,7 @@ namespace Microsoft.AspNetCore.Identity.Test var context = new DefaultHttpContext(); var auth = MockAuth(context); var helper = SetupSignInManager(manager.Object, context); - var twoFactorInfo = new SignInManager.TwoFactorAuthenticationInfo { UserId = user.Id }; + var twoFactorInfo = new SignInManager.TwoFactorAuthenticationInfo { UserId = user.Id }; var loginProvider = "loginprovider"; var id = helper.StoreTwoFactorInfo(user.Id, externalLogin ? loginProvider : null); if (externalLogin) @@ -612,7 +612,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task RememberClientStoresUserId() { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); var context = new DefaultHttpContext(); var auth = MockAuth(context); @@ -639,7 +639,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task RememberBrowserSkipsTwoFactorVerificationSignIn(bool isPersistent) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.GetTwoFactorEnabledAsync(user)).ReturnsAsync(true).Verifiable(); IList providers = new List(); @@ -678,7 +678,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task SignOutCallsContextResponseSignOut() { // Setup - var manager = MockHelpers.TestUserManager(); + var manager = MockHelpers.TestUserManager(); var context = new DefaultHttpContext(); var auth = MockAuth(context); auth.Setup(a => a.SignOutAsync(context, IdentityConstants.ApplicationScheme, It.IsAny())).Returns(Task.FromResult(0)).Verifiable(); @@ -697,7 +697,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task PasswordSignInFailsWithWrongPassword() { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.SupportsUserLockout).Returns(true).Verifiable(); manager.Setup(m => m.IsLockedOutAsync(user)).ReturnsAsync(false).Verifiable(); @@ -721,8 +721,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task PasswordSignInFailsWithUnknownUser() { // Setup - var manager = MockHelpers.MockUserManager(); - manager.Setup(m => m.FindByNameAsync("bogus")).ReturnsAsync(default(TestUser)).Verifiable(); + var manager = MockHelpers.MockUserManager(); + manager.Setup(m => m.FindByNameAsync("bogus")).ReturnsAsync(default(PocoUser)).Verifiable(); var context = new Mock(); var helper = SetupSignInManager(manager.Object, context.Object); @@ -739,7 +739,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task PasswordSignInFailsWithWrongPasswordCanAccessFailedAndLockout() { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); var lockedout = false; manager.Setup(m => m.AccessFailedAsync(user)).Returns(() => @@ -766,7 +766,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CheckPasswordSignInFailsWithWrongPasswordCanAccessFailedAndLockout() { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); var lockedout = false; manager.Setup(m => m.AccessFailedAsync(user)).Returns(() => @@ -795,7 +795,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanRequireConfirmedEmailForPasswordSignIn(bool confirmed) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.IsEmailConfirmedAsync(user)).ReturnsAsync(confirmed).Verifiable(); if (confirmed) @@ -843,7 +843,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanRequireConfirmedPhoneNumberForPasswordSignIn(bool confirmed) { // Setup - var user = new TestUser { UserName = "Foo" }; + var user = new PocoUser { UserName = "Foo" }; var manager = SetupUserManager(user); manager.Setup(m => m.IsPhoneNumberConfirmedAsync(user)).ReturnsAsync(confirmed).Verifiable(); var context = new DefaultHttpContext(); diff --git a/test/Identity.Test/UserClaimsPrincipalFactoryTest.cs b/test/Identity.Test/UserClaimsPrincipalFactoryTest.cs index 3af673d10d..befed38dd9 100644 --- a/test/Identity.Test/UserClaimsPrincipalFactoryTest.cs +++ b/test/Identity.Test/UserClaimsPrincipalFactoryTest.cs @@ -17,14 +17,14 @@ namespace Microsoft.AspNetCore.Identity.Test [Fact] public async Task CreateIdentityNullChecks() { - var userManager = MockHelpers.MockUserManager().Object; - var roleManager = MockHelpers.MockRoleManager().Object; + var userManager = MockHelpers.MockUserManager().Object; + var roleManager = MockHelpers.MockRoleManager().Object; var options = new Mock>(); Assert.Throws("optionsAccessor", - () => new UserClaimsPrincipalFactory(userManager, roleManager, options.Object)); + () => new UserClaimsPrincipalFactory(userManager, roleManager, options.Object)); var identityOptions = new IdentityOptions(); options.Setup(a => a.Value).Returns(identityOptions); - var factory = new UserClaimsPrincipalFactory(userManager, roleManager, options.Object); + var factory = new UserClaimsPrincipalFactory(userManager, roleManager, options.Object); await Assert.ThrowsAsync("user", async () => await factory.CreateAsync(null)); } @@ -39,9 +39,9 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task EnsureClaimsIdentityHasExpectedClaims(bool supportRoles, bool supportClaims, bool supportRoleClaims) { // Setup - var userManager = MockHelpers.MockUserManager(); - var roleManager = MockHelpers.MockRoleManager(); - var user = new TestUser { UserName = "Foo" }; + var userManager = MockHelpers.MockUserManager(); + var roleManager = MockHelpers.MockRoleManager(); + var user = new PocoUser { UserName = "Foo" }; userManager.Setup(m => m.SupportsUserClaim).Returns(supportClaims); userManager.Setup(m => m.SupportsUserRole).Returns(supportRoles); userManager.Setup(m => m.GetUserIdAsync(user)).ReturnsAsync(user.Id); @@ -59,8 +59,8 @@ namespace Microsoft.AspNetCore.Identity.Test } userManager.Object.Options = new IdentityOptions(); - var admin = new TestRole() { Name = "Admin" }; - var local = new TestRole() { Name = "Local" }; + var admin = new PocoRole() { Name = "Admin" }; + var local = new PocoRole() { Name = "Local" }; var adminClaims = new[] { new Claim("AdminClaim1", "Value1"), new Claim("AdminClaim2", "Value2") }; var localClaims = new[] { new Claim("LocalClaim1", "Value1"), new Claim("LocalClaim2", "Value2") }; if (supportRoleClaims) @@ -74,7 +74,7 @@ namespace Microsoft.AspNetCore.Identity.Test var options = new Mock>(); var identityOptions = new IdentityOptions(); options.Setup(a => a.Value).Returns(identityOptions); - var factory = new UserClaimsPrincipalFactory(userManager.Object, roleManager.Object, options.Object); + var factory = new UserClaimsPrincipalFactory(userManager.Object, roleManager.Object, options.Object); // Act var principal = await factory.CreateAsync(user); diff --git a/test/Identity.Test/UserManagerTest.cs b/test/Identity.Test/UserManagerTest.cs index 19b7c283d0..174f9bdc1a 100644 --- a/test/Identity.Test/UserManagerTest.cs +++ b/test/Identity.Test/UserManagerTest.cs @@ -23,11 +23,11 @@ namespace Microsoft.AspNetCore.Identity.Test var config = new ConfigurationBuilder().Build(); var services = new ServiceCollection() .AddSingleton(config) - .AddTransient, NoopUserStore>(); - services.AddIdentity(); + .AddTransient, NoopUserStore>(); + services.AddIdentity(); services.AddHttpContextAccessor(); services.AddLogging(); - var manager = services.BuildServiceProvider().GetRequiredService>(); + var manager = services.BuildServiceProvider().GetRequiredService>(); Assert.NotNull(manager.PasswordHasher); Assert.NotNull(manager.Options); } @@ -38,30 +38,30 @@ namespace Microsoft.AspNetCore.Identity.Test var config = new ConfigurationBuilder().Build(); var services = new ServiceCollection() .AddSingleton(config) - .AddTransient, NoopUserStore>() + .AddTransient, NoopUserStore>() .AddHttpContextAccessor(); services.AddLogging(); - services.AddIdentity() + services.AddIdentity() .AddUserManager() .AddRoleManager(); var provider = services.BuildServiceProvider(); - Assert.Same(provider.GetRequiredService>(), + Assert.Same(provider.GetRequiredService>(), provider.GetRequiredService()); - Assert.Same(provider.GetRequiredService>(), + Assert.Same(provider.GetRequiredService>(), provider.GetRequiredService()); } - public class CustomUserManager : UserManager + public class CustomUserManager : UserManager { - public CustomUserManager() : base(new Mock>().Object, null, null, null, null, null, null, null, null) + public CustomUserManager() : base(new Mock>().Object, null, null, null, null, null, null, null, null) { } } - public class CustomRoleManager : RoleManager + public class CustomRoleManager : RoleManager { - public CustomRoleManager() : base(new Mock>().Object, null, null, null, null) + public CustomRoleManager() : base(new Mock>().Object, null, null, null, null) { } } @@ -69,12 +69,12 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CreateCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; store.Setup(s => s.CreateAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); store.Setup(s => s.GetUserNameAsync(user, CancellationToken.None)).Returns(Task.FromResult(user.UserName)).Verifiable(); store.Setup(s => s.SetNormalizedUserNameAsync(user, user.UserName.ToUpperInvariant(), CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); - var userManager = MockHelpers.TestUserManager(store.Object); + var userManager = MockHelpers.TestUserManager(store.Object); // Act var result = await userManager.CreateAsync(user); @@ -88,14 +88,14 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CreateCallsUpdateEmailStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo", Email = "Foo@foo.com" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo", Email = "Foo@foo.com" }; store.Setup(s => s.CreateAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); store.Setup(s => s.GetUserNameAsync(user, CancellationToken.None)).Returns(Task.FromResult(user.UserName)).Verifiable(); store.Setup(s => s.GetEmailAsync(user, CancellationToken.None)).Returns(Task.FromResult(user.Email)).Verifiable(); store.Setup(s => s.SetNormalizedEmailAsync(user, user.Email.ToUpperInvariant(), CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); store.Setup(s => s.SetNormalizedUserNameAsync(user, user.UserName.ToUpperInvariant(), CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); - var userManager = MockHelpers.TestUserManager(store.Object); + var userManager = MockHelpers.TestUserManager(store.Object); // Act var result = await userManager.CreateAsync(user); @@ -109,8 +109,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task DeleteCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; store.Setup(s => s.DeleteAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); var userManager = MockHelpers.TestUserManager(store.Object); @@ -126,8 +126,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task UpdateCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; store.Setup(s => s.GetUserNameAsync(user, CancellationToken.None)).Returns(Task.FromResult(user.UserName)).Verifiable(); store.Setup(s => s.SetNormalizedUserNameAsync(user, user.UserName.ToUpperInvariant(), CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); store.Setup(s => s.UpdateAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); @@ -145,8 +145,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task UpdateWillUpdateNormalizedEmail() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo", Email = "email" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo", Email = "email" }; store.Setup(s => s.GetUserNameAsync(user, CancellationToken.None)).Returns(Task.FromResult(user.UserName)).Verifiable(); store.Setup(s => s.GetEmailAsync(user, CancellationToken.None)).Returns(Task.FromResult(user.Email)).Verifiable(); store.Setup(s => s.SetNormalizedUserNameAsync(user, user.UserName.ToUpperInvariant(), CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); @@ -166,8 +166,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task SetUserNameCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser(); + var store = new Mock>(); + var user = new PocoUser(); store.Setup(s => s.SetUserNameAsync(user, "foo", CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); store.Setup(s => s.GetUserNameAsync(user, CancellationToken.None)).Returns(Task.FromResult("foo")).Verifiable(); store.Setup(s => s.SetNormalizedUserNameAsync(user, "FOO", CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); @@ -186,10 +186,10 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task FindByIdCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; store.Setup(s => s.FindByIdAsync(user.Id, CancellationToken.None)).Returns(Task.FromResult(user)).Verifiable(); - var userManager = MockHelpers.TestUserManager(store.Object); + var userManager = MockHelpers.TestUserManager(store.Object); // Act var result = await userManager.FindByIdAsync(user.Id); @@ -203,10 +203,10 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task FindByNameCallsStoreWithNormalizedName() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; store.Setup(s => s.FindByNameAsync(user.UserName.ToUpperInvariant(), CancellationToken.None)).Returns(Task.FromResult(user)).Verifiable(); - var userManager = MockHelpers.TestUserManager(store.Object); + var userManager = MockHelpers.TestUserManager(store.Object); // Act var result = await userManager.FindByNameAsync(user.UserName); @@ -220,8 +220,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanFindByNameCallsStoreWithoutNormalizedName() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; store.Setup(s => s.FindByNameAsync(user.UserName, CancellationToken.None)).Returns(Task.FromResult(user)).Verifiable(); var userManager = MockHelpers.TestUserManager(store.Object); userManager.KeyNormalizer = null; @@ -238,8 +238,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task FindByEmailCallsStoreWithNormalizedEmail() { // Setup - var store = new Mock>(); - var user = new TestUser { Email = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { Email = "Foo" }; store.Setup(s => s.FindByEmailAsync(user.Email.ToUpperInvariant(), CancellationToken.None)).Returns(Task.FromResult(user)).Verifiable(); var userManager = MockHelpers.TestUserManager(store.Object); @@ -255,8 +255,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CanFindByEmailCallsStoreWithoutNormalizedEmail() { // Setup - var store = new Mock>(); - var user = new TestUser { Email = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { Email = "Foo" }; store.Setup(s => s.FindByEmailAsync(user.Email, CancellationToken.None)).Returns(Task.FromResult(user)).Verifiable(); var userManager = MockHelpers.TestUserManager(store.Object); userManager.KeyNormalizer = null; @@ -273,8 +273,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task AddToRolesCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var roles = new string[] { "A", "B", "C", "C" }; store.Setup(s => s.AddToRoleAsync(user, "A", CancellationToken.None)) .Returns(Task.FromResult(0)) @@ -296,7 +296,7 @@ namespace Microsoft.AspNetCore.Identity.Test store.Setup(s => s.IsInRoleAsync(user, "C", CancellationToken.None)) .Returns(Task.FromResult(false)) .Verifiable(); - var userManager = MockHelpers.TestUserManager(store.Object); + var userManager = MockHelpers.TestUserManager(store.Object); // Act var result = await userManager.AddToRolesAsync(user, roles); @@ -311,8 +311,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task AddToRolesFailsIfUserInRole() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var roles = new[] { "A", "B", "C" }; store.Setup(s => s.AddToRoleAsync(user, "A", CancellationToken.None)) .Returns(Task.FromResult(0)) @@ -334,8 +334,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task RemoveFromRolesCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var roles = new[] { "A", "B", "C" }; store.Setup(s => s.RemoveFromRoleAsync(user, "A", CancellationToken.None)) .Returns(Task.FromResult(0)) @@ -356,7 +356,7 @@ namespace Microsoft.AspNetCore.Identity.Test store.Setup(s => s.IsInRoleAsync(user, "C", CancellationToken.None)) .Returns(Task.FromResult(true)) .Verifiable(); - var userManager = MockHelpers.TestUserManager(store.Object); + var userManager = MockHelpers.TestUserManager(store.Object); // Act var result = await userManager.RemoveFromRolesAsync(user, roles); @@ -370,8 +370,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task RemoveFromRolesFailsIfNotInRole() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var roles = new string[] { "A", "B", "C" }; store.Setup(s => s.RemoveFromRoleAsync(user, "A", CancellationToken.None)) .Returns(Task.FromResult(0)) @@ -382,7 +382,7 @@ namespace Microsoft.AspNetCore.Identity.Test store.Setup(s => s.IsInRoleAsync(user, "B", CancellationToken.None)) .Returns(Task.FromResult(false)) .Verifiable(); - var userManager = MockHelpers.TestUserManager(store.Object); + var userManager = MockHelpers.TestUserManager(store.Object); // Act var result = await userManager.RemoveFromRolesAsync(user, roles); @@ -396,8 +396,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task AddClaimsCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var claims = new Claim[] { new Claim("1", "1"), new Claim("2", "2"), new Claim("3", "3") }; store.Setup(s => s.AddClaimsAsync(user, claims, CancellationToken.None)) .Returns(Task.FromResult(0)) @@ -417,8 +417,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task AddClaimCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var claim = new Claim("1", "1"); store.Setup(s => s.AddClaimsAsync(user, It.IsAny>(), CancellationToken.None)) .Returns(Task.FromResult(0)) @@ -438,8 +438,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task UpdateClaimCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var claim = new Claim("1", "1"); var newClaim = new Claim("1", "2"); store.Setup(s => s.ReplaceClaimAsync(user, It.IsAny(), It.IsAny(), CancellationToken.None)) @@ -460,9 +460,9 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CheckPasswordWillRehashPasswordWhenNeeded() { // Setup - var store = new Mock>(); - var hasher = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var hasher = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var pwd = "password"; var hashed = "hashed"; var rehashed = "rehashed"; @@ -471,7 +471,7 @@ namespace Microsoft.AspNetCore.Identity.Test .ReturnsAsync(hashed) .Verifiable(); store.Setup(s => s.SetPasswordHashAsync(user, It.IsAny(), CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); - store.Setup(x => x.UpdateAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(IdentityResult.Success)); + store.Setup(x => x.UpdateAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(IdentityResult.Success)); hasher.Setup(s => s.VerifyHashedPassword(user, hashed, pwd)).Returns(PasswordVerificationResult.SuccessRehashNeeded).Verifiable(); hasher.Setup(s => s.HashPassword(user, pwd)).Returns(rehashed).Verifiable(); @@ -491,9 +491,9 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task CreateFailsWithNullSecurityStamp() { // Setup - var store = new Mock>(); + var store = new Mock>(); var manager = MockHelpers.TestUserManager(store.Object); - var user = new TestUser { UserName = "nulldude" }; + var user = new PocoUser { UserName = "nulldude" }; store.Setup(s => s.GetSecurityStampAsync(user, It.IsAny())).ReturnsAsync(default(string)).Verifiable(); // Act @@ -508,9 +508,9 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task UpdateFailsWithNullSecurityStamp() { // Setup - var store = new Mock>(); + var store = new Mock>(); var manager = MockHelpers.TestUserManager(store.Object); - var user = new TestUser { UserName = "nulldude" }; + var user = new PocoUser { UserName = "nulldude" }; store.Setup(s => s.GetSecurityStampAsync(user, It.IsAny())).ReturnsAsync(default(string)).Verifiable(); // Act @@ -527,8 +527,8 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task RemoveClaimsCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var claims = new Claim[] { new Claim("1", "1"), new Claim("2", "2"), new Claim("3", "3") }; store.Setup(s => s.RemoveClaimsAsync(user, claims, CancellationToken.None)) .Returns(Task.FromResult(0)) @@ -548,14 +548,14 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task RemoveClaimCallsStore() { // Setup - var store = new Mock>(); - var user = new TestUser { UserName = "Foo" }; + var store = new Mock>(); + var user = new PocoUser { UserName = "Foo" }; var claim = new Claim("1", "1"); store.Setup(s => s.RemoveClaimsAsync(user, It.IsAny>(), CancellationToken.None)) .Returns(Task.FromResult(0)) .Verifiable(); store.Setup(s => s.UpdateAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable(); - var userManager = MockHelpers.TestUserManager(store.Object); + var userManager = MockHelpers.TestUserManager(store.Object); // Act var result = await userManager.RemoveClaimAsync(user, claim); @@ -606,7 +606,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task TokenMethodsThrowWithNoTokenProvider() { var manager = MockHelpers.TestUserManager(new NoopUserStore()); - var user = new TestUser(); + var user = new PocoUser(); await Assert.ThrowsAsync( async () => await manager.GenerateUserTokenAsync(user, "bogus", null)); await Assert.ThrowsAsync( @@ -629,16 +629,16 @@ namespace Microsoft.AspNetCore.Identity.Test [Fact] public async Task SecurityStampMethodsFailWhenStoreNotImplemented() { - var store = new Mock>(); - store.Setup(x => x.GetUserIdAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(Guid.NewGuid().ToString())); + var store = new Mock>(); + store.Setup(x => x.GetUserIdAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(Guid.NewGuid().ToString())); var manager = MockHelpers.TestUserManager(store.Object); Assert.False(manager.SupportsUserSecurityStamp); await Assert.ThrowsAsync(() => manager.UpdateSecurityStampAsync(null)); await Assert.ThrowsAsync(() => manager.GetSecurityStampAsync(null)); await Assert.ThrowsAsync( - () => manager.VerifyChangePhoneNumberTokenAsync(new TestUser(), "1", "111-111-1111")); + () => manager.VerifyChangePhoneNumberTokenAsync(new PocoUser(), "1", "111-111-1111")); await Assert.ThrowsAsync( - () => manager.GenerateChangePhoneNumberTokenAsync(new TestUser(), "111-111-1111")); + () => manager.GenerateChangePhoneNumberTokenAsync(new PocoUser(), "111-111-1111")); } [Fact] @@ -663,19 +663,19 @@ namespace Microsoft.AspNetCore.Identity.Test await Assert.ThrowsAsync(async () => await manager.GetClaimsAsync(null)); } - private class ATokenProvider : IUserTwoFactorTokenProvider + private class ATokenProvider : IUserTwoFactorTokenProvider { - public Task CanGenerateTwoFactorTokenAsync(UserManager manager, TestUser user) + public Task CanGenerateTwoFactorTokenAsync(UserManager manager, PocoUser user) { throw new NotImplementedException(); } - public Task GenerateAsync(string purpose, UserManager manager, TestUser user) + public Task GenerateAsync(string purpose, UserManager manager, PocoUser user) { throw new NotImplementedException(); } - public Task ValidateAsync(string purpose, string token, UserManager manager, TestUser user) + public Task ValidateAsync(string purpose, string token, UserManager manager, PocoUser user) { throw new NotImplementedException(); } @@ -690,12 +690,12 @@ namespace Microsoft.AspNetCore.Identity.Test .AddSingleton(config) .AddLogging(); - services.AddIdentity(o => o.Tokens.ProviderMap.Add("A", new TokenProviderDescriptor(typeof(ATokenProvider)) + services.AddIdentity(o => o.Tokens.ProviderMap.Add("A", new TokenProviderDescriptor(typeof(ATokenProvider)) { ProviderInstance = provider })).AddUserStore(); - var manager = services.BuildServiceProvider().GetService>(); - Assert.ThrowsAsync(() => manager.GenerateUserTokenAsync(new TestUser(), "A", "purpose")); + var manager = services.BuildServiceProvider().GetService>(); + Assert.ThrowsAsync(() => manager.GenerateUserTokenAsync(new PocoUser(), "A", "purpose")); } [Fact] @@ -703,9 +703,9 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddLogging(); - services.AddIdentity(o => o.Stores.ProtectPersonalData = true) + services.AddIdentity(o => o.Stores.ProtectPersonalData = true) .AddUserStore(); - var e = Assert.Throws(() => services.BuildServiceProvider().GetService>()); + var e = Assert.Throws(() => services.BuildServiceProvider().GetService>()); Assert.Contains("Store does not implement IProtectedUserStore", e.Message); } @@ -714,20 +714,20 @@ namespace Microsoft.AspNetCore.Identity.Test { var services = new ServiceCollection() .AddLogging(); - services.AddIdentity(o => o.Stores.ProtectPersonalData = true) + services.AddIdentity(o => o.Stores.ProtectPersonalData = true) .AddUserStore(); - var e = Assert.Throws(() => services.BuildServiceProvider().GetService>()); + var e = Assert.Throws(() => services.BuildServiceProvider().GetService>()); Assert.Contains("No IPersonalDataProtector service was registered", e.Message); } - private class ProtectedStore : IProtectedUserStore + private class ProtectedStore : IProtectedUserStore { - public Task CreateAsync(TestUser user, CancellationToken cancellationToken) + public Task CreateAsync(PocoUser user, CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task DeleteAsync(TestUser user, CancellationToken cancellationToken) + public Task DeleteAsync(PocoUser user, CancellationToken cancellationToken) { throw new NotImplementedException(); } @@ -737,42 +737,42 @@ namespace Microsoft.AspNetCore.Identity.Test throw new NotImplementedException(); } - public Task FindByIdAsync(string userId, CancellationToken cancellationToken) + public Task FindByIdAsync(string userId, CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken) + public Task FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task GetNormalizedUserNameAsync(TestUser user, CancellationToken cancellationToken) + public Task GetNormalizedUserNameAsync(PocoUser user, CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task GetUserIdAsync(TestUser user, CancellationToken cancellationToken) + public Task GetUserIdAsync(PocoUser user, CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task GetUserNameAsync(TestUser user, CancellationToken cancellationToken) + public Task GetUserNameAsync(PocoUser user, CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task SetNormalizedUserNameAsync(TestUser user, string normalizedName, CancellationToken cancellationToken) + public Task SetNormalizedUserNameAsync(PocoUser user, string normalizedName, CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task SetUserNameAsync(TestUser user, string userName, CancellationToken cancellationToken) + public Task SetUserNameAsync(PocoUser user, string userName, CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task UpdateAsync(TestUser user, CancellationToken cancellationToken) + public Task UpdateAsync(PocoUser user, CancellationToken cancellationToken) { throw new NotImplementedException(); } @@ -787,12 +787,12 @@ namespace Microsoft.AspNetCore.Identity.Test .AddSingleton(config) .AddLogging(); - services.AddIdentity(o => o.Tokens.ProviderMap.Add(TokenOptions.DefaultProvider, new TokenProviderDescriptor(typeof(ATokenProvider)) + services.AddIdentity(o => o.Tokens.ProviderMap.Add(TokenOptions.DefaultProvider, new TokenProviderDescriptor(typeof(ATokenProvider)) { ProviderInstance = provider })).AddUserStore().AddDefaultTokenProviders(); - var manager = services.BuildServiceProvider().GetService>(); - Assert.ThrowsAsync(() => manager.GenerateUserTokenAsync(new TestUser(), TokenOptions.DefaultProvider, "purpose")); + var manager = services.BuildServiceProvider().GetService>(); + Assert.ThrowsAsync(() => manager.GenerateUserTokenAsync(new PocoUser(), TokenOptions.DefaultProvider, "purpose")); } [Fact] @@ -882,16 +882,16 @@ namespace Microsoft.AspNetCore.Identity.Test // TODO: Can switch to Mock eventually var manager = MockHelpers.TestUserManager(new EmptyStore()); manager.PasswordValidators.Clear(); - manager.PasswordValidators.Add(new BadPasswordValidator()); - IdentityResultAssert.IsFailure(await manager.CreateAsync(new TestUser(), "password"), - BadPasswordValidator.ErrorMessage); + manager.PasswordValidators.Add(new BadPasswordValidator()); + IdentityResultAssert.IsFailure(await manager.CreateAsync(new PocoUser(), "password"), + BadPasswordValidator.ErrorMessage); } [Fact] public async Task ResetTokenCallNoopForTokenValueZero() { - var user = new TestUser() { UserName = Guid.NewGuid().ToString() }; - var store = new Mock>(); + var user = new PocoUser() { UserName = Guid.NewGuid().ToString() }; + var store = new Mock>(); store.Setup(x => x.ResetAccessFailedCountAsync(user, It.IsAny())).Returns(() => { throw new Exception(); @@ -905,7 +905,7 @@ namespace Microsoft.AspNetCore.Identity.Test public async Task ManagerPublicNullChecks() { Assert.Throws("store", - () => new UserManager(null, null, null, null, null, null, null, null, null)); + () => new UserManager(null, null, null, null, null, null, null, null, null)); var manager = MockHelpers.TestUserManager(new NotImplementedStore()); @@ -913,7 +913,7 @@ namespace Microsoft.AspNetCore.Identity.Test await Assert.ThrowsAsync("user", async () => await manager.CreateAsync(null, null)); await Assert.ThrowsAsync("password", - async () => await manager.CreateAsync(new TestUser(), null)); + async () => await manager.CreateAsync(new PocoUser(), null)); await Assert.ThrowsAsync("user", async () => await manager.UpdateAsync(null)); await Assert.ThrowsAsync("user", async () => await manager.DeleteAsync(null)); await Assert.ThrowsAsync("claim", async () => await manager.AddClaimAsync(null, null)); @@ -927,8 +927,8 @@ namespace Microsoft.AspNetCore.Identity.Test async () => await manager.RemoveLoginAsync(null, "", null)); await Assert.ThrowsAsync("email", async () => await manager.FindByEmailAsync(null)); Assert.Throws("provider", () => manager.RegisterTokenProvider("whatever", null)); - await Assert.ThrowsAsync("roles", async () => await manager.AddToRolesAsync(new TestUser(), null)); - await Assert.ThrowsAsync("roles", async () => await manager.RemoveFromRolesAsync(new TestUser(), null)); + await Assert.ThrowsAsync("roles", async () => await manager.AddToRolesAsync(new PocoUser(), null)); + await Assert.ThrowsAsync("roles", async () => await manager.RemoveFromRolesAsync(new PocoUser(), null)); } [Fact] @@ -1082,392 +1082,392 @@ namespace Microsoft.AspNetCore.Identity.Test } private class EmptyStore : - IUserPasswordStore, - IUserClaimStore, - IUserLoginStore, - IUserEmailStore, - IUserPhoneNumberStore, - IUserLockoutStore, - IUserTwoFactorStore, - IUserRoleStore, - IUserSecurityStampStore + IUserPasswordStore, + IUserClaimStore, + IUserLoginStore, + IUserEmailStore, + IUserPhoneNumberStore, + IUserLockoutStore, + IUserTwoFactorStore, + IUserRoleStore, + IUserSecurityStampStore { - public Task> GetClaimsAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetClaimsAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult>(new List()); } - public Task AddClaimsAsync(TestUser user, IEnumerable claim, CancellationToken cancellationToken = default(CancellationToken)) + public Task AddClaimsAsync(PocoUser user, IEnumerable claim, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task ReplaceClaimAsync(TestUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default(CancellationToken)) + public Task ReplaceClaimAsync(PocoUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task RemoveClaimsAsync(TestUser user, IEnumerable claim, CancellationToken cancellationToken = default(CancellationToken)) + public Task RemoveClaimsAsync(PocoUser user, IEnumerable claim, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task SetEmailAsync(TestUser user, string email, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetEmailAsync(PocoUser user, string email, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task GetEmailAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetEmailAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(""); } - public Task GetEmailConfirmedAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetEmailConfirmedAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(false); } - public Task SetEmailConfirmedAsync(TestUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetEmailConfirmedAsync(PocoUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task FindByEmailAsync(string email, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByEmailAsync(string email, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult(null); + return Task.FromResult(null); } - public Task GetLockoutEndDateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetLockoutEndDateAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(DateTimeOffset.MinValue); } - public Task SetLockoutEndDateAsync(TestUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetLockoutEndDateAsync(PocoUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task IncrementAccessFailedCountAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task IncrementAccessFailedCountAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task ResetAccessFailedCountAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task ResetAccessFailedCountAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task GetAccessFailedCountAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetAccessFailedCountAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task GetLockoutEnabledAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetLockoutEnabledAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(false); } - public Task SetLockoutEnabledAsync(TestUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetLockoutEnabledAsync(PocoUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task AddLoginAsync(TestUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken)) + public Task AddLoginAsync(PocoUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task RemoveLoginAsync(TestUser user, string loginProvider, string providerKey, CancellationToken cancellationToken = default(CancellationToken)) + public Task RemoveLoginAsync(PocoUser user, string loginProvider, string providerKey, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task> GetLoginsAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetLoginsAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult>(new List()); } - public Task FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult(null); + return Task.FromResult(null); } public void Dispose() { } - public Task SetUserNameAsync(TestUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetUserNameAsync(PocoUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task CreateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task CreateAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Success); } - public Task UpdateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task UpdateAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Success); } - public Task DeleteAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task DeleteAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Success); } - public Task FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult(null); + return Task.FromResult(null); } - public Task FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult(null); + return Task.FromResult(null); } - public Task SetPasswordHashAsync(TestUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetPasswordHashAsync(PocoUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task GetPasswordHashAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetPasswordHashAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(null); } - public Task HasPasswordAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task HasPasswordAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(false); } - public Task SetPhoneNumberAsync(TestUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetPhoneNumberAsync(PocoUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task GetPhoneNumberAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetPhoneNumberAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(""); } - public Task GetPhoneNumberConfirmedAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetPhoneNumberConfirmedAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(false); } - public Task SetPhoneNumberConfirmedAsync(TestUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetPhoneNumberConfirmedAsync(PocoUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task AddToRoleAsync(TestUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task AddToRoleAsync(PocoUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task RemoveFromRoleAsync(TestUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task RemoveFromRoleAsync(PocoUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task> GetRolesAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetRolesAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult>(new List()); } - public Task IsInRoleAsync(TestUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task IsInRoleAsync(PocoUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(false); } - public Task SetSecurityStampAsync(TestUser user, string stamp, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetSecurityStampAsync(PocoUser user, string stamp, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task GetSecurityStampAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetSecurityStampAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(""); } - public Task SetTwoFactorEnabledAsync(TestUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetTwoFactorEnabledAsync(PocoUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task GetTwoFactorEnabledAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetTwoFactorEnabledAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(false); } - public Task GetUserIdAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetUserIdAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(null); } - public Task GetUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetUserNameAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(null); } - public Task GetNormalizedUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetNormalizedUserNameAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(null); } - public Task SetNormalizedUserNameAsync(TestUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetNormalizedUserNameAsync(PocoUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult>(new List()); + return Task.FromResult>(new List()); } - public Task> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult>(new List()); + return Task.FromResult>(new List()); } - public Task GetNormalizedEmailAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetNormalizedEmailAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(""); } - public Task SetNormalizedEmailAsync(TestUser user, string normalizedEmail, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetNormalizedEmailAsync(PocoUser user, string normalizedEmail, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } } - private class NoOpTokenProvider : IUserTwoFactorTokenProvider + private class NoOpTokenProvider : IUserTwoFactorTokenProvider { public string Name { get; } = "Noop"; - public Task GenerateAsync(string purpose, UserManager manager, TestUser user) + public Task GenerateAsync(string purpose, UserManager manager, PocoUser user) { return Task.FromResult("Test"); } - public Task ValidateAsync(string purpose, string token, UserManager manager, TestUser user) + public Task ValidateAsync(string purpose, string token, UserManager manager, PocoUser user) { return Task.FromResult(true); } - public Task CanGenerateTwoFactorTokenAsync(UserManager manager, TestUser user) + public Task CanGenerateTwoFactorTokenAsync(UserManager manager, PocoUser user) { return Task.FromResult(true); } } private class NotImplementedStore : - IUserPasswordStore, - IUserClaimStore, - IUserLoginStore, - IUserRoleStore, - IUserEmailStore, - IUserPhoneNumberStore, - IUserLockoutStore, - IUserTwoFactorStore + IUserPasswordStore, + IUserClaimStore, + IUserLoginStore, + IUserRoleStore, + IUserEmailStore, + IUserPhoneNumberStore, + IUserLockoutStore, + IUserTwoFactorStore { - public Task> GetClaimsAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetClaimsAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task AddClaimsAsync(TestUser user, IEnumerable claims, CancellationToken cancellationToken = default(CancellationToken)) + public Task AddClaimsAsync(PocoUser user, IEnumerable claims, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task ReplaceClaimAsync(TestUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default(CancellationToken)) + public Task ReplaceClaimAsync(PocoUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task RemoveClaimsAsync(TestUser user, IEnumerable claims, CancellationToken cancellationToken = default(CancellationToken)) + public Task RemoveClaimsAsync(PocoUser user, IEnumerable claims, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetEmailAsync(TestUser user, string email, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetEmailAsync(PocoUser user, string email, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetEmailAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetEmailAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetEmailConfirmedAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetEmailConfirmedAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetEmailConfirmedAsync(TestUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetEmailConfirmedAsync(PocoUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task FindByEmailAsync(string email, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByEmailAsync(string email, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetLockoutEndDateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetLockoutEndDateAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetLockoutEndDateAsync(TestUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetLockoutEndDateAsync(PocoUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task IncrementAccessFailedCountAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task IncrementAccessFailedCountAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task ResetAccessFailedCountAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task ResetAccessFailedCountAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetAccessFailedCountAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetAccessFailedCountAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetLockoutEnabledAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetLockoutEnabledAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetLockoutEnabledAsync(TestUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetLockoutEnabledAsync(PocoUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task AddLoginAsync(TestUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken)) + public Task AddLoginAsync(PocoUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task RemoveLoginAsync(TestUser user, string loginProvider, string providerKey, CancellationToken cancellationToken = default(CancellationToken)) + public Task RemoveLoginAsync(PocoUser user, string loginProvider, string providerKey, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task> GetLoginsAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetLoginsAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } @@ -1477,137 +1477,137 @@ namespace Microsoft.AspNetCore.Identity.Test throw new NotImplementedException(); } - public Task GetUserIdAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetUserIdAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetUserNameAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetUserNameAsync(TestUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetUserNameAsync(PocoUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetPasswordHashAsync(TestUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetPasswordHashAsync(PocoUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetPasswordHashAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetPasswordHashAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task HasPasswordAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task HasPasswordAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetPhoneNumberAsync(TestUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetPhoneNumberAsync(PocoUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetPhoneNumberAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetPhoneNumberAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetPhoneNumberConfirmedAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetPhoneNumberConfirmedAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetPhoneNumberConfirmedAsync(TestUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetPhoneNumberConfirmedAsync(PocoUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetTwoFactorEnabledAsync(TestUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetTwoFactorEnabledAsync(PocoUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetTwoFactorEnabledAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetTwoFactorEnabledAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task AddToRoleAsync(TestUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task AddToRoleAsync(PocoUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task RemoveFromRoleAsync(TestUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task RemoveFromRoleAsync(PocoUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task> GetRolesAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetRolesAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task IsInRoleAsync(TestUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task IsInRoleAsync(PocoUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task GetNormalizedUserNameAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetNormalizedUserNameAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetNormalizedUserNameAsync(TestUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetNormalizedUserNameAsync(PocoUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken = default(CancellationToken)) + public Task> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - Task IUserStore.CreateAsync(TestUser user, CancellationToken cancellationToken) + Task IUserStore.CreateAsync(PocoUser user, CancellationToken cancellationToken) { throw new NotImplementedException(); } - Task IUserStore.UpdateAsync(TestUser user, CancellationToken cancellationToken) + Task IUserStore.UpdateAsync(PocoUser user, CancellationToken cancellationToken) { throw new NotImplementedException(); } - Task IUserStore.DeleteAsync(TestUser user, CancellationToken cancellationToken) + Task IUserStore.DeleteAsync(PocoUser user, CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task GetNormalizedEmailAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetNormalizedEmailAsync(PocoUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetNormalizedEmailAsync(TestUser user, string normalizedEmail, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetNormalizedEmailAsync(PocoUser user, string normalizedEmail, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } @@ -1616,23 +1616,23 @@ namespace Microsoft.AspNetCore.Identity.Test [Fact] public async Task CanCustomizeUserValidatorErrors() { - var store = new Mock>(); + var store = new Mock>(); var describer = new TestErrorDescriber(); var config = new ConfigurationBuilder().Build(); var services = new ServiceCollection() .AddSingleton(config) .AddLogging() .AddSingleton(describer) - .AddSingleton>(store.Object) + .AddSingleton>(store.Object) .AddHttpContextAccessor(); - services.AddIdentity(); + services.AddIdentity(); - var manager = services.BuildServiceProvider().GetRequiredService>(); + var manager = services.BuildServiceProvider().GetRequiredService>(); manager.Options.User.RequireUniqueEmail = true; - var user = new TestUser() { UserName = "dupeEmail", Email = "dupe@email.com" }; - var user2 = new TestUser() { UserName = "dupeEmail2", Email = "dupe@email.com" }; + var user = new PocoUser() { UserName = "dupeEmail", Email = "dupe@email.com" }; + var user2 = new PocoUser() { UserName = "dupeEmail2", Email = "dupe@email.com" }; store.Setup(s => s.FindByEmailAsync("DUPE@EMAIL.COM", CancellationToken.None)) .Returns(Task.FromResult(user2)) .Verifiable(); diff --git a/test/Identity.Test/UserValidatorTest.cs b/test/Identity.Test/UserValidatorTest.cs index eadafb8049..576373f47a 100644 --- a/test/Identity.Test/UserValidatorTest.cs +++ b/test/Identity.Test/UserValidatorTest.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Identity.Test { // Setup var manager = MockHelpers.TestUserManager(new NoopUserStore()); - var validator = new UserValidator(); + var validator = new UserValidator(); // Act // Assert @@ -29,8 +29,8 @@ namespace Microsoft.AspNetCore.Identity.Test { // Setup var manager = MockHelpers.TestUserManager(new NoopUserStore()); - var validator = new UserValidator(); - var user = new TestUser {UserName = input}; + var validator = new UserValidator(); + var user = new PocoUser {UserName = input}; // Act var result = await validator.ValidateAsync(manager, user); @@ -51,8 +51,8 @@ namespace Microsoft.AspNetCore.Identity.Test { // Setup var manager = MockHelpers.TestUserManager(new NoopUserStore()); - var validator = new UserValidator(); - var user = new TestUser {UserName = userName}; + var validator = new UserValidator(); + var user = new PocoUser {UserName = userName}; // Act var result = await validator.ValidateAsync(manager, user); @@ -79,8 +79,8 @@ namespace Microsoft.AspNetCore.Identity.Test // Setup var manager = MockHelpers.TestUserManager(new NoopUserStore()); manager.Options.User.AllowedUserNameCharacters = null; - var validator = new UserValidator(); - var user = new TestUser {UserName = userName}; + var validator = new UserValidator(); + var user = new PocoUser {UserName = userName}; // Act var result = await validator.ValidateAsync(manager, user); diff --git a/test/InMemory.Test/ControllerTest.cs b/test/InMemory.Test/ControllerTest.cs index 08797043cd..3cb5c49f4e 100644 --- a/test/InMemory.Test/ControllerTest.cs +++ b/test/InMemory.Test/ControllerTest.cs @@ -35,20 +35,20 @@ namespace Microsoft.AspNetCore.Identity.InMemory.Test .AddLogging() .AddSingleton(contextAccessor.Object); - services.AddIdentity(); - services.AddSingleton, InMemoryStore>(); - services.AddSingleton, InMemoryStore>(); + services.AddIdentity(); + services.AddSingleton, InMemoryStore>(); + services.AddSingleton, InMemoryStore>(); var app = new ApplicationBuilder(services.BuildServiceProvider()); // Act - var user = new TestUser + var user = new PocoUser { UserName = "Yolo" }; const string password = "Yol0Sw@g!"; - var userManager = app.ApplicationServices.GetRequiredService>(); - var signInManager = app.ApplicationServices.GetRequiredService>(); + var userManager = app.ApplicationServices.GetRequiredService>(); + var signInManager = app.ApplicationServices.GetRequiredService>(); IdentityResultAssert.IsSuccess(await userManager.CreateAsync(user, password)); @@ -86,19 +86,19 @@ namespace Microsoft.AspNetCore.Identity.InMemory.Test .AddSingleton(new ConfigurationBuilder().Build()) .AddLogging() .AddSingleton(contextAccessor.Object); - services.AddIdentity(); - services.AddSingleton, InMemoryStore>(); - services.AddSingleton, InMemoryStore>(); + services.AddIdentity(); + services.AddSingleton, InMemoryStore>(); + services.AddSingleton, InMemoryStore>(); var app = new ApplicationBuilder(services.BuildServiceProvider()); // Act - var user = new TestUser + var user = new PocoUser { UserName = "Yolo" }; - var userManager = app.ApplicationServices.GetRequiredService>(); - var signInManager = app.ApplicationServices.GetRequiredService>(); + var userManager = app.ApplicationServices.GetRequiredService>(); + var signInManager = app.ApplicationServices.GetRequiredService>(); IdentityResultAssert.IsSuccess(await userManager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await userManager.AddLoginAsync(user, new UserLoginInfo(authScheme, externalId, "whatever"))); diff --git a/test/InMemory.Test/FunctionalTest.cs b/test/InMemory.Test/FunctionalTest.cs index 28b774cd52..7571a79209 100644 --- a/test/InMemory.Test/FunctionalTest.cs +++ b/test/InMemory.Test/FunctionalTest.cs @@ -273,8 +273,8 @@ namespace Microsoft.AspNetCore.Identity.InMemory { var req = context.Request; var res = context.Response; - var userManager = context.RequestServices.GetRequiredService>(); - var signInManager = context.RequestServices.GetRequiredService>(); + var userManager = context.RequestServices.GetRequiredService>(); + var signInManager = context.RequestServices.GetRequiredService>(); PathString remainder; if (req.Path == new PathString("/normal")) { @@ -282,12 +282,12 @@ namespace Microsoft.AspNetCore.Identity.InMemory } else if (req.Path == new PathString("/createMe")) { - var result = await userManager.CreateAsync(new TestUser("hao"), TestPassword); + var result = await userManager.CreateAsync(new PocoUser("hao"), TestPassword); res.StatusCode = result.Succeeded ? 200 : 500; } else if (req.Path == new PathString("/createSimple")) { - var result = await userManager.CreateAsync(new TestUser("simple"), "aaaaaa"); + var result = await userManager.CreateAsync(new PocoUser("simple"), "aaaaaa"); res.StatusCode = result.Succeeded ? 200 : 500; } else if (req.Path == new PathString("/signoutEverywhere")) @@ -340,9 +340,9 @@ namespace Microsoft.AspNetCore.Identity.InMemory }) .ConfigureServices(services => { - services.AddIdentity().AddDefaultTokenProviders(); - services.AddSingleton, InMemoryStore>(); - services.AddSingleton, InMemoryStore>(); + services.AddIdentity().AddDefaultTokenProviders(); + services.AddSingleton, InMemoryStore>(); + services.AddSingleton, InMemoryStore>(); configureServices?.Invoke(services); }); var server = new TestServer(builder); diff --git a/test/InMemory.Test/InMemoryStore.cs b/test/InMemory.Test/InMemoryStore.cs index dc62d7e9cd..f90dad91db 100644 --- a/test/InMemory.Test/InMemoryStore.cs +++ b/test/InMemory.Test/InMemoryStore.cs @@ -16,8 +16,8 @@ namespace Microsoft.AspNetCore.Identity.InMemory IUserRoleStore, IQueryableRoleStore, IRoleClaimStore - where TRole : TestRole - where TUser : TestUser + where TRole : PocoRole + where TUser : PocoUser { // RoleId == roleName for InMemory public Task AddToRoleAsync(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken)) @@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Identity.InMemory var roleEntity = _roles.Values.SingleOrDefault(r => r.NormalizedName == role); if (roleEntity != null) { - user.Roles.Add(new TestUserRole { RoleId = roleEntity.Id, UserId = user.Id }); + user.Roles.Add(new PocoUserRole { RoleId = roleEntity.Id, UserId = user.Id }); } return Task.FromResult(0); } @@ -139,7 +139,7 @@ namespace Microsoft.AspNetCore.Identity.InMemory public Task AddClaimAsync(TRole role, Claim claim, CancellationToken cancellationToken = default(CancellationToken)) { - role.Claims.Add(new TestRoleClaim { ClaimType = claim.Type, ClaimValue = claim.Value, RoleId = role.Id }); + role.Claims.Add(new PocoRoleClaim { ClaimType = claim.Type, ClaimValue = claim.Value, RoleId = role.Id }); return Task.FromResult(0); } diff --git a/test/InMemory.Test/InMemoryStoreTest.cs b/test/InMemory.Test/InMemoryStoreTest.cs index 18d897bef9..6bb7507d24 100644 --- a/test/InMemory.Test/InMemoryStoreTest.cs +++ b/test/InMemory.Test/InMemoryStoreTest.cs @@ -8,32 +8,32 @@ using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.Identity.InMemory.Test { - public class InMemoryStoreTest : IdentitySpecificationTestBase + public class InMemoryStoreTest : IdentitySpecificationTestBase { protected override object CreateTestContext() { - return new InMemoryStore(); + return new InMemoryStore(); } protected override void AddUserStore(IServiceCollection services, object context = null) { - services.AddSingleton>((InMemoryStore)context); + services.AddSingleton>((InMemoryStore)context); } protected override void AddRoleStore(IServiceCollection services, object context = null) { - services.AddSingleton>((InMemoryStore)context); + services.AddSingleton>((InMemoryStore)context); } - protected override void SetUserPasswordHash(TestUser user, string hashedPassword) + protected override void SetUserPasswordHash(PocoUser user, string hashedPassword) { user.PasswordHash = hashedPassword; } - protected override TestUser CreateTestUser(string namePrefix = "", string email = "", string phoneNumber = "", + protected override PocoUser CreateTestUser(string namePrefix = "", string email = "", string phoneNumber = "", bool lockoutEnabled = false, DateTimeOffset? lockoutEnd = default(DateTimeOffset?), bool useNamePrefixAsUserName = false) { - return new TestUser + return new PocoUser { UserName = useNamePrefixAsUserName ? namePrefix : string.Format("{0}{1}", namePrefix, Guid.NewGuid()), Email = email, @@ -43,18 +43,18 @@ namespace Microsoft.AspNetCore.Identity.InMemory.Test }; } - protected override TestRole CreateTestRole(string roleNamePrefix = "", bool useRoleNamePrefixAsRoleName = false) + protected override PocoRole CreateTestRole(string roleNamePrefix = "", bool useRoleNamePrefixAsRoleName = false) { var roleName = useRoleNamePrefixAsRoleName ? roleNamePrefix : string.Format("{0}{1}", roleNamePrefix, Guid.NewGuid()); - return new TestRole(roleName); + return new PocoRole(roleName); } - protected override Expression> UserNameEqualsPredicate(string userName) => u => u.UserName == userName; + protected override Expression> UserNameEqualsPredicate(string userName) => u => u.UserName == userName; - protected override Expression> RoleNameEqualsPredicate(string roleName) => r => r.Name == roleName; + protected override Expression> RoleNameEqualsPredicate(string roleName) => r => r.Name == roleName; - protected override Expression> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName); + protected override Expression> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName); - protected override Expression> RoleNameStartsWithPredicate(string roleName) => r => r.Name.StartsWith(roleName); + protected override Expression> RoleNameStartsWithPredicate(string roleName) => r => r.Name.StartsWith(roleName); } } \ No newline at end of file diff --git a/test/InMemory.Test/InMemoryUserStore.cs b/test/InMemory.Test/InMemoryUserStore.cs index de804bacf2..fbce7edba5 100644 --- a/test/InMemory.Test/InMemoryUserStore.cs +++ b/test/InMemory.Test/InMemoryUserStore.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Identity.InMemory IUserAuthenticationTokenStore, IUserAuthenticatorKeyStore, IUserTwoFactorRecoveryCodeStore - where TUser : TestUser + where TUser : PocoUser { private readonly Dictionary _logins = new Dictionary(); @@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Identity.InMemory { foreach (var claim in claims) { - user.Claims.Add(new TestUserClaim { ClaimType = claim.Type, ClaimValue = claim.Value, UserId = user.Id }); + user.Claims.Add(new PocoUserClaim { ClaimType = claim.Type, ClaimValue = claim.Value, UserId = user.Id }); } return Task.FromResult(0); } @@ -164,7 +164,7 @@ namespace Microsoft.AspNetCore.Identity.InMemory public virtual Task AddLoginAsync(TUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken)) { - user.Logins.Add(new TestUserLogin + user.Logins.Add(new PocoUserLogin { UserId = user.Id, ProviderKey = login.ProviderKey, @@ -364,7 +364,7 @@ namespace Microsoft.AspNetCore.Identity.InMemory } else { - user.Tokens.Add(new TestUserToken + user.Tokens.Add(new PocoUserToken { UserId = user.Id, LoginProvider = loginProvider, diff --git a/test/InMemory.Test/InMemoryUserStoreTest.cs b/test/InMemory.Test/InMemoryUserStoreTest.cs index d244a38a87..aa9c992523 100644 --- a/test/InMemory.Test/InMemoryUserStoreTest.cs +++ b/test/InMemory.Test/InMemoryUserStoreTest.cs @@ -8,27 +8,27 @@ using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.Identity.InMemory.Test { - public class InMemoryUserStoreTest : UserManagerSpecificationTestBase + public class InMemoryUserStoreTest : UserManagerSpecificationTestBase { protected override object CreateTestContext() { - return new InMemoryUserStore(); + return new InMemoryUserStore(); } protected override void AddUserStore(IServiceCollection services, object context = null) { - services.AddSingleton>((InMemoryUserStore)context); + services.AddSingleton>((InMemoryUserStore)context); } - protected override void SetUserPasswordHash(TestUser user, string hashedPassword) + protected override void SetUserPasswordHash(PocoUser user, string hashedPassword) { user.PasswordHash = hashedPassword; } - protected override TestUser CreateTestUser(string namePrefix = "", string email = "", string phoneNumber = "", + protected override PocoUser CreateTestUser(string namePrefix = "", string email = "", string phoneNumber = "", bool lockoutEnabled = false, DateTimeOffset? lockoutEnd = default(DateTimeOffset?), bool useNamePrefixAsUserName = false) { - return new TestUser + return new PocoUser { UserName = useNamePrefixAsUserName ? namePrefix : string.Format("{0}{1}", namePrefix, Guid.NewGuid()), Email = email, @@ -38,8 +38,8 @@ namespace Microsoft.AspNetCore.Identity.InMemory.Test }; } - protected override Expression> UserNameEqualsPredicate(string userName) => u => u.UserName == userName; + protected override Expression> UserNameEqualsPredicate(string userName) => u => u.UserName == userName; - protected override Expression> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName); + protected override Expression> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName); } } \ No newline at end of file diff --git a/test/Shared/TestRole.cs b/test/Shared/PocoRole.cs similarity index 81% rename from test/Shared/TestRole.cs rename to test/Shared/PocoRole.cs index ea1dbf0778..26d908a4b4 100644 --- a/test/Shared/TestRole.cs +++ b/test/Shared/PocoRole.cs @@ -9,12 +9,12 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// Represents a Role entity /// - public class TestRole : TestRole + public class PocoRole : PocoRole { /// /// Constructor /// - public TestRole() + public PocoRole() { Id = Guid.NewGuid().ToString(); } @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Identity.Test /// Constructor /// /// - public TestRole(string roleName) : this() + public PocoRole(string roleName) : this() { Name = roleName; } @@ -33,18 +33,18 @@ namespace Microsoft.AspNetCore.Identity.Test /// Represents a Role entity /// /// - public class TestRole where TKey : IEquatable + public class PocoRole where TKey : IEquatable { /// /// Constructor /// - public TestRole() { } + public PocoRole() { } /// /// Constructor /// /// - public TestRole(string roleName) : this() + public PocoRole(string roleName) : this() { Name = roleName; } @@ -57,7 +57,7 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// Navigation property for claims in the role /// - public virtual ICollection> Claims { get; private set; } = new List>(); + public virtual ICollection> Claims { get; private set; } = new List>(); /// /// Role name diff --git a/test/Shared/TestRoleClaim.cs b/test/Shared/PocoRoleClaim.cs similarity index 89% rename from test/Shared/TestRoleClaim.cs rename to test/Shared/PocoRoleClaim.cs index 3f7a3ce6f1..64daeb2ced 100644 --- a/test/Shared/TestRoleClaim.cs +++ b/test/Shared/PocoRoleClaim.cs @@ -8,13 +8,13 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// EntityType that represents one specific role claim /// - public class TestRoleClaim : TestRoleClaim { } + public class PocoRoleClaim : PocoRoleClaim { } /// /// EntityType that represents one specific role claim /// /// - public class TestRoleClaim where TKey : IEquatable + public class PocoRoleClaim where TKey : IEquatable { /// /// Primary key diff --git a/test/Shared/TestUser.cs b/test/Shared/PocoUser.cs similarity index 80% rename from test/Shared/TestUser.cs rename to test/Shared/PocoUser.cs index d08e747a28..5d6afe2369 100644 --- a/test/Shared/TestUser.cs +++ b/test/Shared/PocoUser.cs @@ -9,12 +9,12 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// Test user class /// - public class TestUser : TestUser + public class PocoUser : PocoUser { /// /// Ctor /// - public TestUser() + public PocoUser() { Id = Guid.NewGuid().ToString(); } @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Identity.Test /// Ctor /// /// - public TestUser(string userName) : this() + public PocoUser(string userName) : this() { UserName = userName; } @@ -33,18 +33,18 @@ namespace Microsoft.AspNetCore.Identity.Test /// Test user /// /// - public class TestUser where TKey : IEquatable + public class PocoUser where TKey : IEquatable { /// /// ctor /// - public TestUser() { } + public PocoUser() { } /// /// ctor /// /// - public TestUser(string userName) : this() + public PocoUser(string userName) : this() { UserName = userName; } @@ -52,11 +52,13 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// Id /// + [PersonalData] public virtual TKey Id { get; set; } /// /// Name /// + [PersonalData] public virtual string UserName { get; set; } /// @@ -67,6 +69,7 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// Email /// + [PersonalData] public virtual string Email { get; set; } /// @@ -77,6 +80,7 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// True if the email is confirmed, default is false /// + [PersonalData] public virtual bool EmailConfirmed { get; set; } /// @@ -97,16 +101,19 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// PhoneNumber for the user /// + [PersonalData] public virtual string PhoneNumber { get; set; } /// /// True if the phone number is confirmed, default is false /// + [PersonalData] public virtual bool PhoneNumberConfirmed { get; set; } /// /// Is two factor enabled for the user /// + [PersonalData] public virtual bool TwoFactorEnabled { get; set; } /// @@ -127,18 +134,18 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// Navigation property /// - public virtual ICollection> Roles { get; private set; } = new List>(); + public virtual ICollection> Roles { get; private set; } = new List>(); /// /// Navigation property /// - public virtual ICollection> Claims { get; private set; } = new List>(); + public virtual ICollection> Claims { get; private set; } = new List>(); /// /// Navigation property /// - public virtual ICollection> Logins { get; private set; } = new List>(); + public virtual ICollection> Logins { get; private set; } = new List>(); /// /// Navigation property /// - public virtual ICollection> Tokens { get; private set; } = new List>(); + public virtual ICollection> Tokens { get; private set; } = new List>(); } } diff --git a/test/Shared/TestUserClaim.cs b/test/Shared/PocoUserClaim.cs similarity index 89% rename from test/Shared/TestUserClaim.cs rename to test/Shared/PocoUserClaim.cs index cac773fbd6..29dd7f668f 100644 --- a/test/Shared/TestUserClaim.cs +++ b/test/Shared/PocoUserClaim.cs @@ -8,13 +8,13 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// EntityType that represents one specific user claim /// - public class TestUserClaim : TestUserClaim { } + public class PocoUserClaim : PocoUserClaim { } /// /// EntityType that represents one specific user claim /// /// - public class TestUserClaim where TKey : IEquatable + public class PocoUserClaim where TKey : IEquatable { /// /// Primary key diff --git a/test/Shared/TestUserLogin.cs b/test/Shared/PocoUserLogin.cs similarity index 90% rename from test/Shared/TestUserLogin.cs rename to test/Shared/PocoUserLogin.cs index 43d3b311d1..d516bd68aa 100644 --- a/test/Shared/TestUserLogin.cs +++ b/test/Shared/PocoUserLogin.cs @@ -8,13 +8,13 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// Entity type for a user's login (i.e. facebook, google) /// - public class TestUserLogin : TestUserLogin { } + public class PocoUserLogin : PocoUserLogin { } /// /// Entity type for a user's login (i.e. facebook, google) /// /// - public class TestUserLogin where TKey : IEquatable + public class PocoUserLogin where TKey : IEquatable { /// /// The login provider for the login (i.e. facebook, google) diff --git a/test/Shared/TestUserRole.cs b/test/Shared/PocoUserRole.cs similarity index 86% rename from test/Shared/TestUserRole.cs rename to test/Shared/PocoUserRole.cs index 906cff96f9..9d9bd7a722 100644 --- a/test/Shared/TestUserRole.cs +++ b/test/Shared/PocoUserRole.cs @@ -8,13 +8,13 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// EntityType that represents a user belonging to a role /// - public class TestUserRole : TestUserRole { } + public class PocoUserRole : PocoUserRole { } /// /// EntityType that represents a user belonging to a role /// /// - public class TestUserRole where TKey : IEquatable + public class PocoUserRole where TKey : IEquatable { /// /// UserId for the user that is in the role diff --git a/test/Shared/TestUserToken.cs b/test/Shared/PocoUserToken.cs similarity index 89% rename from test/Shared/TestUserToken.cs rename to test/Shared/PocoUserToken.cs index 2df5fa5320..6eeca60597 100644 --- a/test/Shared/TestUserToken.cs +++ b/test/Shared/PocoUserToken.cs @@ -8,13 +8,13 @@ namespace Microsoft.AspNetCore.Identity.Test /// /// Entity type for a user's token /// - public class TestUserToken : TestUserToken { } + public class PocoUserToken : PocoUserToken { } /// /// Entity type for a user's token /// /// - public class TestUserToken where TKey : IEquatable + public class PocoUserToken where TKey : IEquatable { /// /// The login provider for the login (i.e. facebook, google) diff --git a/test/WebSites/Identity.DefaultUI.WebSite/ApplicationUserStartup.cs b/test/WebSites/Identity.DefaultUI.WebSite/ApplicationUserStartup.cs new file mode 100644 index 0000000000..56604b332d --- /dev/null +++ b/test/WebSites/Identity.DefaultUI.WebSite/ApplicationUserStartup.cs @@ -0,0 +1,15 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Identity.DefaultUI.WebSite.Data; +using Microsoft.Extensions.Configuration; + +namespace Identity.DefaultUI.WebSite +{ + public class ApplicationUserStartup : StartupBase + { + public ApplicationUserStartup(IConfiguration configuration) : base(configuration) + { + } + } +} diff --git a/test/WebSites/Identity.DefaultUI.WebSite/Data/ApplicationDbContext.cs b/test/WebSites/Identity.DefaultUI.WebSite/Data/ApplicationDbContext.cs new file mode 100644 index 0000000000..6364ff0933 --- /dev/null +++ b/test/WebSites/Identity.DefaultUI.WebSite/Data/ApplicationDbContext.cs @@ -0,0 +1,15 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; + +namespace Identity.DefaultUI.WebSite.Data +{ + public class ApplicationDbContext : IdentityDbContext + { + public ApplicationDbContext(DbContextOptions options) : base(options) + { + } + } +} diff --git a/test/WebSites/Identity.DefaultUI.WebSite/Data/ApplicationUser.cs b/test/WebSites/Identity.DefaultUI.WebSite/Data/ApplicationUser.cs new file mode 100644 index 0000000000..7a3a06229f --- /dev/null +++ b/test/WebSites/Identity.DefaultUI.WebSite/Data/ApplicationUser.cs @@ -0,0 +1,11 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Identity; + +namespace Identity.DefaultUI.WebSite +{ + public class ApplicationUser : IdentityUser + { + } +} \ No newline at end of file diff --git a/test/WebSites/Identity.DefaultUI.WebSite/Identity.DefaultUI.WebSite.csproj b/test/WebSites/Identity.DefaultUI.WebSite/Identity.DefaultUI.WebSite.csproj index db6eb71f42..8dd90e0879 100644 --- a/test/WebSites/Identity.DefaultUI.WebSite/Identity.DefaultUI.WebSite.csproj +++ b/test/WebSites/Identity.DefaultUI.WebSite/Identity.DefaultUI.WebSite.csproj @@ -1,10 +1,15 @@ - + $(StandardTestWebsiteTfms) aspnet-Identity.DefaultUI.WebSite-80C658D8-CED7-467F-9B47-75DA3BC1A16D + + + + + diff --git a/test/WebSites/Identity.DefaultUI.WebSite/NoIdentityStartup.cs b/test/WebSites/Identity.DefaultUI.WebSite/NoIdentityStartup.cs new file mode 100644 index 0000000000..ea77545ca2 --- /dev/null +++ b/test/WebSites/Identity.DefaultUI.WebSite/NoIdentityStartup.cs @@ -0,0 +1,63 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Identity.DefaultUI.WebSite +{ + public class NoIdentityStartup + { + public NoIdentityStartup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.Configure(options => + { + // This lambda determines whether user consent for non-essential cookies is needed for a given request. + options.CheckConsentNeeded = context => true; + }); + + services.AddMvc() + .AddRazorPagesOptions(options => + { + options.Conventions.AuthorizeFolder("/Areas/Identity/Pages/Account/Manage"); + options.Conventions.AuthorizePage("/Areas/Identity/Pages/Account/Logout"); + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + app.UseDatabaseErrorPage(); + } + else + { + app.UseExceptionHandler("/Error"); + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseStaticFiles(); + app.UseCookiePolicy(); + + app.UseAuthentication(); + + app.UseMvc(); + } + } +} diff --git a/test/WebSites/Identity.DefaultUI.WebSite/Pages/Shared/_LoginPartial.cshtml b/test/WebSites/Identity.DefaultUI.WebSite/Pages/Shared/_LoginPartial.cshtml index 60525e4a89..cecdef982b 100644 --- a/test/WebSites/Identity.DefaultUI.WebSite/Pages/Shared/_LoginPartial.cshtml +++ b/test/WebSites/Identity.DefaultUI.WebSite/Pages/Shared/_LoginPartial.cshtml @@ -1,14 +1,11 @@ @using Microsoft.AspNetCore.Identity -@inject SignInManager SignInManager -@inject UserManager UserManager - -@if (SignInManager.IsSignedIn(User)) +@if (User.Identity.IsAuthenticated) {