// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; using Microsoft.AspNet.Identity.Test; using Microsoft.Data.Entity; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.OptionsModel; using System; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Xunit; namespace Microsoft.AspNet.Identity.SqlServer.Test { public abstract class SqlStoreTestBase : UserManagerTestBase where TUser : IdentityUser, new() where TRole : IdentityRole, new() where TKey : IEquatable { public abstract string ConnectionString { get; } public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext(IServiceProvider services, IOptionsAccessor options) : base(services, options.Options) { } } [TestPriority(-1000)] [Fact] public void DropDatabaseStart() { DropDb(); } [TestPriority(10000)] [Fact] public void DropDatabaseDone() { DropDb(); } public void DropDb() { var services = new ServiceCollection(); services.AddEntityFramework().AddSqlServer(); services.Add(OptionsServices.GetDefaultServices()); services.SetupOptions(options => options.UseSqlServer(ConnectionString)); var serviceProvider = services.BuildServiceProvider(); var db = new ApplicationDbContext(serviceProvider, serviceProvider.GetService>()); db.Database.EnsureDeleted(); } public ApplicationDbContext CreateContext(bool delete = false) { var services = new ServiceCollection(); services.AddEntityFramework().AddSqlServer(); services.Add(OptionsServices.GetDefaultServices()); services.SetupOptions(options => options.UseSqlServer(ConnectionString)); var serviceProvider = services.BuildServiceProvider(); var db = new ApplicationDbContext(serviceProvider, serviceProvider.GetService>()); if (delete) { db.Database.EnsureDeleted(); } db.Database.EnsureCreated(); return db; } protected override object CreateTestContext() { return CreateContext(); } protected override UserManager CreateManager(object context = null) { if (context == null) { context = CreateTestContext(); } return MockHelpers.CreateManager(() => new UserStore((ApplicationDbContext)context)); } protected override RoleManager CreateRoleManager(object context = null) { if (context == null) { context = CreateTestContext(); } var services = new ServiceCollection(); services.AddIdentity().AddRoleStore(() => new RoleStore((ApplicationDbContext)context)); return services.BuildServiceProvider().GetService>(); } public void EnsureDatabase() { CreateContext(); } [Fact] public async Task EnsureStartupUsageWorks() { EnsureDatabase(); var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); builder.UseServices(services => { services.AddEntityFramework().AddSqlServer(); services.AddIdentitySqlServer(); services.SetupOptions(options => options.UseSqlServer(ConnectionString)); }); var userStore = builder.ApplicationServices.GetService>(); var userManager = builder.ApplicationServices.GetService>(); Assert.NotNull(userStore); Assert.NotNull(userManager); const string password = "1qaz@WSX"; var user = CreateTestUser(); user.UserName = "admin1111"; IdentityResultAssert.IsSuccess(await userManager.CreateAsync(user, password)); IdentityResultAssert.IsSuccess(await userManager.DeleteAsync(user)); } [Fact] public async Task EnsureStartupOptionsChangeWorks() { EnsureDatabase(); var builder = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()); builder.UseServices(services => { services.AddEntityFramework().AddSqlServer(); services.AddIdentitySqlServer().SetupOptions(options => { options.Password.RequiredLength = 1; options.Password.RequireLowercase = false; options.Password.RequireNonLetterOrDigit = false; options.Password.RequireUppercase = false; options.Password.RequireDigit = false; options.User.AllowOnlyAlphanumericNames = false; }); services.SetupOptions(options => options.UseSqlServer(ConnectionString)); }); var userStore = builder.ApplicationServices.GetService>(); var userManager = builder.ApplicationServices.GetService>(); Assert.NotNull(userStore); Assert.NotNull(userManager); const string userName = "admin"; const string password = "a"; var user = CreateTestUser(userName); IdentityResultAssert.IsSuccess(await userManager.CreateAsync(user, password)); IdentityResultAssert.IsSuccess(await userManager.DeleteAsync(user)); } [Fact] public void CanCreateUserUsingEF() { using (var db = CreateContext()) { var user = CreateTestUser(); db.Users.Add(user); db.SaveChanges(); Assert.True(db.Users.Any(u => u.UserName == user.UserName)); Assert.NotNull(db.Users.FirstOrDefault(u => u.UserName == user.UserName)); } } [Fact] public async Task CanCreateUsingManager() { var manager = CreateManager(); var user = CreateTestUser(); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.DeleteAsync(user)); } [Fact] public async Task EnsureRoleClaimNavigationProperty() { var context = CreateContext(); var roleManager = CreateRoleManager(context); var r = CreateRole(); IdentityResultAssert.IsSuccess(await roleManager.CreateAsync(r)); var c = new Claim("a", "b"); IdentityResultAssert.IsSuccess(await roleManager.AddClaimAsync(r, c)); Assert.NotNull(r.Claims.Single(cl => cl.ClaimValue == c.Value && cl.ClaimType == c.Type)); } } }