From 669aaea3f3d9e55f8edb33679910a49bdebfd9fc Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 10 Nov 2017 12:51:14 -0800 Subject: [PATCH] Fix additional code path and add a test --- ...dentityEntityFrameworkBuilderExtensions.cs | 2 +- .../UserOnlyCustomContextTest.cs | 106 ++++++++++++++++++ .../UserOnlyTest.cs | 2 +- 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test/UserOnlyCustomContextTest.cs diff --git a/src/Microsoft.AspNetCore.Identity.EntityFrameworkCore/IdentityEntityFrameworkBuilderExtensions.cs b/src/Microsoft.AspNetCore.Identity.EntityFrameworkCore/IdentityEntityFrameworkBuilderExtensions.cs index e2939c35c5..61474cf85b 100644 --- a/src/Microsoft.AspNetCore.Identity.EntityFrameworkCore/IdentityEntityFrameworkBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.Identity.EntityFrameworkCore/IdentityEntityFrameworkBuilderExtensions.cs @@ -79,7 +79,7 @@ namespace Microsoft.Extensions.DependencyInjection if (identityContext == null) { // If its a custom DbContext, we can only add the default POCOs - userStoreType = typeof(UserStore<,,,>).MakeGenericType(userType, roleType, contextType, keyType); + userStoreType = typeof(UserOnlyStore<,,>).MakeGenericType(userType, contextType, keyType); } else { diff --git a/test/Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test/UserOnlyCustomContextTest.cs b/test/Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test/UserOnlyCustomContextTest.cs new file mode 100644 index 0000000000..0b20d17ff4 --- /dev/null +++ b/test/Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test/UserOnlyCustomContextTest.cs @@ -0,0 +1,106 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Identity.Test; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test +{ + public class UserOnlyCustomContextTest : IClassFixture + { + private readonly ApplicationBuilder _builder; + private const string DatabaseName = nameof(UserOnlyCustomContextTest); + + public class CustomContext : DbContext + { + public CustomContext(DbContextOptions options) : base(options) { } + + protected override void OnModelCreating(ModelBuilder builder) + { + builder.Entity(b => + { + b.HasKey(u => u.Id); + b.HasIndex(u => u.NormalizedUserName).HasName("UserNameIndex").IsUnique(); + b.HasIndex(u => u.NormalizedEmail).HasName("EmailIndex"); + b.ToTable("AspNetUsers"); + b.Property(u => u.ConcurrencyStamp).IsConcurrencyToken(); + + b.Property(u => u.UserName).HasMaxLength(256); + b.Property(u => u.NormalizedUserName).HasMaxLength(256); + b.Property(u => u.Email).HasMaxLength(256); + b.Property(u => u.NormalizedEmail).HasMaxLength(256); + + b.HasMany>().WithOne().HasForeignKey(uc => uc.UserId).IsRequired(); + b.HasMany>().WithOne().HasForeignKey(ul => ul.UserId).IsRequired(); + b.HasMany>().WithOne().HasForeignKey(ut => ut.UserId).IsRequired(); + }); + + builder.Entity>(b => + { + b.HasKey(uc => uc.Id); + b.ToTable("AspNetUserClaims"); + }); + + builder.Entity>(b => + { + b.HasKey(l => new { l.LoginProvider, l.ProviderKey }); + b.ToTable("AspNetUserLogins"); + }); + + builder.Entity>(b => + { + b.HasKey(l => new { l.UserId, l.LoginProvider, l.Name }); + b.ToTable("AspNetUserTokens"); + }); + } + } + + public UserOnlyCustomContextTest(ScratchDatabaseFixture fixture) + { + var services = new ServiceCollection(); + + services + .AddSingleton(new ConfigurationBuilder().Build()) + .AddDbContext(o => o.UseSqlServer(fixture.ConnectionString)) + .AddIdentityCore(o => { }) + .AddEntityFrameworkStores(); + + services.AddLogging(); + + var provider = services.BuildServiceProvider(); + _builder = new ApplicationBuilder(provider); + + using (var scoped = provider.GetRequiredService().CreateScope()) + using (var db = scoped.ServiceProvider.GetRequiredService()) + { + db.Database.EnsureCreated(); + } + } + + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono)] + [OSSkipCondition(OperatingSystems.Linux)] + [OSSkipCondition(OperatingSystems.MacOSX)] + public async Task EnsureStartupUsageWorks() + { + var userStore = _builder.ApplicationServices.GetRequiredService>(); + var userManager = _builder.ApplicationServices.GetRequiredService>(); + + Assert.NotNull(userStore); + Assert.NotNull(userManager); + + const string userName = "admin"; + const string password = "1qaz@WSX"; + var user = new IdentityUser { UserName = userName }; + IdentityResultAssert.IsSuccess(await userManager.CreateAsync(user, password)); + IdentityResultAssert.IsSuccess(await userManager.DeleteAsync(user)); + } + + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test/UserOnlyTest.cs b/test/Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test/UserOnlyTest.cs index 24599d89e5..4f957016c7 100644 --- a/test/Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test/UserOnlyTest.cs +++ b/test/Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test/UserOnlyTest.cs @@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test var provider = services.BuildServiceProvider(); _builder = new ApplicationBuilder(provider); - using(var scoped = provider.GetRequiredService().CreateScope()) + using (var scoped = provider.GetRequiredService().CreateScope()) using (var db = scoped.ServiceProvider.GetRequiredService()) { db.Database.EnsureCreated();