Move Identity tests from SQL Server to SQLite for better reliability (#10300)

This commit is contained in:
Arthur Vickers 2019-05-23 16:32:48 -07:00 committed by Nate McMaster
parent 72433039c0
commit eef19949de
35 changed files with 291 additions and 819 deletions

View File

@ -2,6 +2,8 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Data.Common;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
@ -9,21 +11,36 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
public class InMemoryContext : public class InMemoryContext :
InMemoryContext<IdentityUser, IdentityRole, string> InMemoryContext<IdentityUser, IdentityRole, string>
{ {
public InMemoryContext(DbContextOptions options) : base(options) private InMemoryContext(DbConnection connection) : base(connection)
{ } { }
public new static InMemoryContext Create(DbConnection connection)
=> Initialize(new InMemoryContext(connection));
public static TContext Initialize<TContext>(TContext context) where TContext : DbContext
{
context.Database.EnsureCreated();
return context;
}
} }
public class InMemoryContext<TUser> : public class InMemoryContext<TUser> :
IdentityUserContext<TUser, string> IdentityUserContext<TUser, string>
where TUser : IdentityUser where TUser : IdentityUser
{ {
public InMemoryContext(DbContextOptions options) : base(options) private readonly DbConnection _connection;
{ }
private InMemoryContext(DbConnection connection)
{
_connection = connection;
}
public static InMemoryContext<TUser> Create(DbConnection connection)
=> InMemoryContext.Initialize(new InMemoryContext<TUser>(connection));
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{ => optionsBuilder.UseSqlite(_connection);
optionsBuilder.UseInMemoryDatabase("ScratchUsers");
}
} }
public class InMemoryContext<TUser, TRole, TKey> : IdentityDbContext<TUser, TRole, TKey> public class InMemoryContext<TUser, TRole, TKey> : IdentityDbContext<TUser, TRole, TKey>
@ -31,16 +48,22 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
where TRole : IdentityRole<TKey> where TRole : IdentityRole<TKey>
where TKey : IEquatable<TKey> where TKey : IEquatable<TKey>
{ {
public InMemoryContext(DbContextOptions options) : base(options) private readonly DbConnection _connection;
{ }
protected InMemoryContext(DbConnection connection)
{
_connection = connection;
}
public static InMemoryContext<TUser, TRole, TKey> Create(DbConnection connection)
=> InMemoryContext.Initialize(new InMemoryContext<TUser, TRole, TKey>(connection));
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{ => optionsBuilder.UseSqlite(_connection);
optionsBuilder.UseInMemoryDatabase("Scratch");
}
} }
public abstract class InMemoryContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken> : IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken> public abstract class InMemoryContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken> :
IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>
where TUser : IdentityUser<TKey> where TUser : IdentityUser<TKey>
where TRole : IdentityRole<TKey> where TRole : IdentityRole<TKey>
where TKey : IEquatable<TKey> where TKey : IEquatable<TKey>
@ -50,9 +73,9 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
where TRoleClaim : IdentityRoleClaim<TKey> where TRoleClaim : IdentityRoleClaim<TKey>
where TUserToken : IdentityUserToken<TKey> where TUserToken : IdentityUserToken<TKey>
{ {
public InMemoryContext(DbContextOptions options) : base(options) { } protected InMemoryContext(DbContextOptions options)
: base(options)
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
=> optionsBuilder.UseInMemoryDatabase("Scratch"); }
} }
} }

View File

@ -0,0 +1,26 @@
// 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 Microsoft.Data.Sqlite;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
{
public class InMemoryDatabaseFixture : IDisposable
{
private readonly SqliteConnection _connection = new SqliteConnection($"DataSource=:memory:");
public InMemoryDatabaseFixture()
{
_connection.Open();
}
public SqliteConnection Connection => _connection;
public void Dispose()
{
_connection.Close();
_connection.Dispose();
}
}
}

View File

@ -6,13 +6,23 @@ using System.Linq.Expressions;
using Microsoft.AspNetCore.Identity.Test; using Microsoft.AspNetCore.Identity.Test;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Xunit;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
{ {
public class InMemoryEFOnlyUsersTest : UserManagerSpecificationTestBase<IdentityUser, string> public class InMemoryEFOnlyUsersTest
: UserManagerSpecificationTestBase<IdentityUser, string>,
IClassFixture<InMemoryDatabaseFixture>
{ {
private readonly InMemoryDatabaseFixture _fixture;
public InMemoryEFOnlyUsersTest(InMemoryDatabaseFixture fixture)
{
_fixture = fixture;
}
protected override object CreateTestContext() protected override object CreateTestContext()
=> new InMemoryContext<IdentityUser>(new DbContextOptionsBuilder().Options); => InMemoryContext<IdentityUser>.Create(_fixture.Connection);
protected override void AddUserStore(IServiceCollection services, object context = null) protected override void AddUserStore(IServiceCollection services, object context = null)
=> services.AddSingleton<IUserStore<IdentityUser>>(new UserStore<IdentityUser, IdentityRole, DbContext, string, IdentityUserClaim<string>, IdentityUserRole<string>, IdentityUserLogin<string>, IdentityUserToken<string>, IdentityRoleClaim<string>>((InMemoryContext<IdentityUser>)context, new IdentityErrorDescriber())); => services.AddSingleton<IUserStore<IdentityUser>>(new UserStore<IdentityUser, IdentityRole, DbContext, string, IdentityUserClaim<string>, IdentityUserRole<string>, IdentityUserLogin<string>, IdentityUserToken<string>, IdentityRoleClaim<string>>((InMemoryContext<IdentityUser>)context, new IdentityErrorDescriber()));

View File

@ -4,18 +4,23 @@
using System; using System;
using System.Linq.Expressions; using System.Linq.Expressions;
using Microsoft.AspNetCore.Identity.Test; using Microsoft.AspNetCore.Identity.Test;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Xunit;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
{ {
public class InMemoryEFUserStoreTest : IdentitySpecificationTestBase<IdentityUser, IdentityRole, string> public class InMemoryEFUserStoreTest : IdentitySpecificationTestBase<IdentityUser, IdentityRole, string>, IClassFixture<InMemoryDatabaseFixture>
{ {
protected override object CreateTestContext() private readonly InMemoryDatabaseFixture _fixture;
public InMemoryEFUserStoreTest(InMemoryDatabaseFixture fixture)
{ {
return new InMemoryContext(new DbContextOptionsBuilder().Options); _fixture = fixture;
} }
protected override object CreateTestContext()
=> InMemoryContext.Create(_fixture.Connection);
protected override void AddUserStore(IServiceCollection services, object context = null) protected override void AddUserStore(IServiceCollection services, object context = null)
{ {
services.AddSingleton<IUserStore<IdentityUser>>(new UserStore<IdentityUser>((InMemoryContext)context)); services.AddSingleton<IUserStore<IdentityUser>>(new UserStore<IdentityUser>((InMemoryContext)context));

View File

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Common;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Security.Claims; using System.Security.Claims;
@ -16,20 +17,26 @@ using Xunit;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
{ {
public class InMemoryEFUserStoreTestWithGenerics : IdentitySpecificationTestBase<IdentityUserWithGenerics, MyIdentityRole, string>, IDisposable public class InMemoryEFUserStoreTestWithGenerics
: IdentitySpecificationTestBase<IdentityUserWithGenerics, MyIdentityRole, string>, IClassFixture<InMemoryDatabaseFixture>
{ {
private readonly InMemoryDatabaseFixture _fixture;
private readonly InMemoryContextWithGenerics _context; private readonly InMemoryContextWithGenerics _context;
private UserStoreWithGenerics _store; private UserStoreWithGenerics _store;
public InMemoryEFUserStoreTestWithGenerics() public InMemoryEFUserStoreTestWithGenerics(InMemoryDatabaseFixture fixture)
{ {
_fixture = fixture;
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddHttpContextAccessor(); services.AddHttpContextAccessor();
services.AddDbContext<InMemoryContextWithGenerics>( services.AddDbContext<InMemoryContextWithGenerics>(
options => options options => options
.UseInMemoryDatabase("Scratch") .UseSqlite(_fixture.Connection)
.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning))); .ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning)));
_context = services.BuildServiceProvider().GetRequiredService<InMemoryContextWithGenerics>(); _context = services.BuildServiceProvider().GetRequiredService<InMemoryContextWithGenerics>();
_context.Database.EnsureCreated();
} }
protected override object CreateTestContext() protected override object CreateTestContext()
@ -83,10 +90,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
[Fact] [Fact]
public async Task CanAddRemoveUserClaimWithIssuer() public async Task CanAddRemoveUserClaimWithIssuer()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -115,10 +118,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
[Fact] [Fact]
public async Task RemoveClaimWithIssuerOnlyAffectsUser() public async Task RemoveClaimWithIssuerOnlyAffectsUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
var user2 = CreateTestUser(); var user2 = CreateTestUser();
@ -148,10 +147,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
[Fact] [Fact]
public async Task CanReplaceUserClaimWithIssuer() public async Task CanReplaceUserClaimWithIssuer()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -168,10 +163,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
Assert.Equal(claim.Value, newClaim.Value); Assert.Equal(claim.Value, newClaim.Value);
Assert.Equal(claim.Issuer, newClaim.Issuer); Assert.Equal(claim.Issuer, newClaim.Issuer);
} }
public void Dispose()
{
}
} }
public class ClaimEqualityComparer : IEqualityComparer<Claim> public class ClaimEqualityComparer : IEqualityComparer<Claim>
@ -324,13 +315,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
public class InMemoryContextWithGenerics : InMemoryContext<IdentityUserWithGenerics, MyIdentityRole, string, IdentityUserClaimWithIssuer, IdentityUserRoleWithDate, IdentityUserLoginWithContext, IdentityRoleClaimWithIssuer, IdentityUserTokenWithStuff> public class InMemoryContextWithGenerics : InMemoryContext<IdentityUserWithGenerics, MyIdentityRole, string, IdentityUserClaimWithIssuer, IdentityUserRoleWithDate, IdentityUserLoginWithContext, IdentityRoleClaimWithIssuer, IdentityUserTokenWithStuff>
{ {
public InMemoryContextWithGenerics(DbContextOptions options) : base(options) public InMemoryContextWithGenerics(DbContextOptions<InMemoryContextWithGenerics> options) : base(options)
{ } { }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseInMemoryDatabase("Scratch");
}
} }
#endregion #endregion

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
@ -14,7 +14,7 @@
<Reference Include="Microsoft.AspNetCore.Identity.Specification.Tests" /> <Reference Include="Microsoft.AspNetCore.Identity.Specification.Tests" />
<Reference Include="Microsoft.AspNetCore.Hosting" /> <Reference Include="Microsoft.AspNetCore.Hosting" />
<Reference Include="Microsoft.AspNetCore.Http" /> <Reference Include="Microsoft.AspNetCore.Http" />
<Reference Include="Microsoft.EntityFrameworkCore.InMemory" /> <Reference Include="Microsoft.EntityFrameworkCore.Sqlite" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Data.Common;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.Test; using Microsoft.AspNetCore.Identity.Test;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -11,12 +12,19 @@ using Xunit;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
{ {
public class RoleStoreTest public class RoleStoreTest : IClassFixture<InMemoryDatabaseFixture>
{ {
private readonly InMemoryDatabaseFixture _fixture;
public RoleStoreTest(InMemoryDatabaseFixture fixture)
{
_fixture = fixture;
}
[Fact] [Fact]
public async Task CanCreateUsingAddRoleManager() public async Task CanCreateUsingAddRoleManager()
{ {
var manager = TestIdentityFactory.CreateRoleManager(); var manager = TestIdentityFactory.CreateRoleManager(_fixture.Connection);
Assert.NotNull(manager); Assert.NotNull(manager);
IdentityResultAssert.IsSuccess(await manager.CreateAsync(new IdentityRole("arole"))); IdentityResultAssert.IsSuccess(await manager.CreateAsync(new IdentityRole("arole")));
} }
@ -25,8 +33,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
public async Task CanCreateRoleWithSingletonManager() public async Task CanCreateRoleWithSingletonManager()
{ {
var services = TestIdentityFactory.CreateTestServices(); var services = TestIdentityFactory.CreateTestServices();
services.AddEntityFrameworkInMemoryDatabase(); services.AddEntityFrameworkSqlite();
services.AddSingleton(new InMemoryContext(new DbContextOptionsBuilder().Options)); services.AddSingleton(InMemoryContext.Create(_fixture.Connection));
services.AddTransient<IRoleStore<IdentityRole>, RoleStore<IdentityRole, InMemoryContext>>(); services.AddTransient<IRoleStore<IdentityRole>, RoleStore<IdentityRole, InMemoryContext>>();
services.AddSingleton<RoleManager<IdentityRole>>(); services.AddSingleton<RoleManager<IdentityRole>>();
var provider = services.BuildServiceProvider(); var provider = services.BuildServiceProvider();
@ -38,7 +46,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
[Fact] [Fact]
public async Task RoleStoreMethodsThrowWhenDisposedTest() public async Task RoleStoreMethodsThrowWhenDisposedTest()
{ {
var store = new RoleStore<IdentityRole>(new InMemoryContext(new DbContextOptionsBuilder().Options)); var store = new RoleStore<IdentityRole>(InMemoryContext.Create(_fixture.Connection));
store.Dispose(); store.Dispose();
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.FindByIdAsync(null)); await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.FindByIdAsync(null));
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.FindByNameAsync(null)); await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.FindByNameAsync(null));
@ -54,7 +62,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
public async Task RoleStorePublicNullCheckTest() public async Task RoleStorePublicNullCheckTest()
{ {
Assert.Throws<ArgumentNullException>("context", () => new RoleStore<IdentityRole>(null)); Assert.Throws<ArgumentNullException>("context", () => new RoleStore<IdentityRole>(null));
var store = new RoleStore<IdentityRole>(new InMemoryContext(new DbContextOptionsBuilder().Options)); var store = new RoleStore<IdentityRole>(InMemoryContext.Create(_fixture.Connection));
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.GetRoleIdAsync(null)); await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.GetRoleIdAsync(null));
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.GetRoleNameAsync(null)); await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.GetRoleNameAsync(null));
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.SetRoleNameAsync(null, null)); await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.SetRoleNameAsync(null, null));
@ -66,7 +74,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
[Fact] [Fact]
public async Task CanUpdateRoleName() public async Task CanUpdateRoleName()
{ {
var manager = TestIdentityFactory.CreateRoleManager(); var manager = TestIdentityFactory.CreateRoleManager(_fixture.Connection);
var role = new IdentityRole("UpdateRoleName"); var role = new IdentityRole("UpdateRoleName");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(role)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(role));
Assert.Null(await manager.FindByNameAsync("New")); Assert.Null(await manager.FindByNameAsync("New"));

View File

@ -1,25 +1,15 @@
// Copyright (c) .NET Foundation. All rights reserved. // 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Http; using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
{ {
public static class TestIdentityFactory public static class TestIdentityFactory
{ {
public static InMemoryContext CreateContext() private static InMemoryContext CreateContext(SqliteConnection connection)
{ => InMemoryContext.Create(connection);
var services = new ServiceCollection();
services.AddEntityFrameworkInMemoryDatabase();
var serviceProvider = services.BuildServiceProvider();
var db = new InMemoryContext(new DbContextOptionsBuilder().Options);
db.Database.EnsureCreated();
return db;
}
public static IServiceCollection CreateTestServices() public static IServiceCollection CreateTestServices()
{ {
@ -37,9 +27,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test
return services.BuildServiceProvider().GetRequiredService<RoleManager<IdentityRole>>(); return services.BuildServiceProvider().GetRequiredService<RoleManager<IdentityRole>>();
} }
public static RoleManager<IdentityRole> CreateRoleManager() public static RoleManager<IdentityRole> CreateRoleManager(SqliteConnection connection)
{ => CreateRoleManager(CreateContext(connection));
return CreateRoleManager(CreateContext());
}
} }
} }

View File

@ -35,9 +35,9 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
} }
public CustomDbContext<TKey> GetContext<TKey>() where TKey : IEquatable<TKey> private CustomDbContext<TKey> GetContext<TKey>() where TKey : IEquatable<TKey>
{ {
return DbUtil.Create<CustomDbContext<TKey>>(_fixture.ConnectionString); return DbUtil.Create<CustomDbContext<TKey>>(_fixture.Connection);
} }
public CustomDbContext<TKey> CreateContext<TKey>(bool delete = false) where TKey : IEquatable<TKey> public CustomDbContext<TKey> CreateContext<TKey>(bool delete = false) where TKey : IEquatable<TKey>
@ -168,4 +168,4 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
} }
} }
} }
} }

View File

@ -1,76 +1,71 @@
// Copyright (c) .NET Foundation. All rights reserved. // 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System.Data.Common;
using System.Data.SqlClient;
using System.Linq; using System.Linq;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
{ {
public static class DbUtil public static class DbUtil
{ {
public static IServiceCollection ConfigureDbServices<TContext>(string connectionString, IServiceCollection services = null) where TContext : DbContext public static IServiceCollection ConfigureDbServices<TContext>(
DbConnection connection,
IServiceCollection services = null) where TContext : DbContext
{ {
if (services == null) if (services == null)
{ {
services = new ServiceCollection(); services = new ServiceCollection();
} }
services.AddHttpContextAccessor(); services.AddHttpContextAccessor();
services.AddDbContext<TContext>(options => services.AddDbContext<TContext>(options =>
{ {
options options
.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning)) .ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning))
.UseSqlServer(connectionString); .UseSqlite(connection);
}); });
return services; return services;
} }
public static TContext Create<TContext>(string connectionString, IServiceCollection services = null) where TContext : DbContext public static TContext Create<TContext>(DbConnection connection, IServiceCollection services = null) where TContext : DbContext
{ {
var serviceProvider = ConfigureDbServices<TContext>(connectionString, services).BuildServiceProvider(); var serviceProvider = ConfigureDbServices<TContext>(connection, services).BuildServiceProvider();
return serviceProvider.GetRequiredService<TContext>(); return serviceProvider.GetRequiredService<TContext>();
} }
public static bool VerifyMaxLength(SqlConnection conn, string table, int maxLength, params string[] columns) public static bool VerifyMaxLength(DbContext context, string table, int maxLength, params string[] columns)
{ {
var count = 0; var count = 0;
using (
var command = foreach (var property in context.Model.GetEntityTypes().Single(e => e.Relational().TableName == table).GetProperties())
new SqlCommand("SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@Table", conn))
{ {
command.Parameters.Add(new SqlParameter("Table", table)); if (!columns.Contains(property.Relational().ColumnName))
using (var reader = command.ExecuteReader())
{ {
while (reader.Read()) continue;
{
if (!columns.Contains(reader.GetString(0)))
{
continue;
}
if (reader.GetInt32(1) != maxLength)
{
return false;
}
count++;
}
return count == columns.Length;
} }
if (property.GetMaxLength() != maxLength)
{
return false;
}
count++;
} }
return count == columns.Length;
} }
public static bool VerifyColumns(SqlConnection conn, string table, params string[] columns) public static bool VerifyColumns(SqliteConnection conn, string table, params string[] columns)
{ {
var count = 0; var count = 0;
using ( using (var command = new SqliteCommand("SELECT \"name\" FROM pragma_table_info(@table)", conn))
var command =
new SqlCommand("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@Table", conn))
{ {
command.Parameters.Add(new SqlParameter("Table", table)); command.Parameters.Add(new SqliteParameter("table", table));
using (var reader = command.ExecuteReader()) using (var reader = command.ExecuteReader())
{ {
while (reader.Read()) while (reader.Read())
@ -86,16 +81,15 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
} }
} }
public static void VerifyIndex(SqlConnection conn, string table, string index, bool isUnique = false) public static void VerifyIndex(SqliteConnection conn, string table, string index, bool isUnique = false)
{ {
using ( using (var command =
var command = new SqliteCommand(
new SqlCommand( "SELECT COUNT(*) FROM pragma_index_list(@table) WHERE \"name\" = @index AND \"unique\" = @unique", conn))
"SELECT COUNT(*) FROM sys.indexes where NAME=@Index AND object_id = OBJECT_ID(@Table) AND is_unique = @Unique", conn))
{ {
command.Parameters.Add(new SqlParameter("Index", index)); command.Parameters.Add(new SqliteParameter("index", index));
command.Parameters.Add(new SqlParameter("Table", table)); command.Parameters.Add(new SqliteParameter("table", table));
command.Parameters.Add(new SqlParameter("Unique", isUnique)); command.Parameters.Add(new SqliteParameter("unique", isUnique));
using (var reader = command.ExecuteReader()) using (var reader = command.ExecuteReader())
{ {
Assert.True(reader.Read()); Assert.True(reader.Read());
@ -103,6 +97,5 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
} }
} }
} }
} }
} }

View File

@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
services services
.AddSingleton<IConfiguration>(new ConfigurationBuilder().Build()) .AddSingleton<IConfiguration>(new ConfigurationBuilder().Build())
.AddDbContext<IdentityDbContext>(o => .AddDbContext<IdentityDbContext>(o =>
o.UseSqlServer(fixture.ConnectionString) o.UseSqlite(fixture.Connection)
.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning))) .ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning)))
.AddIdentity<IdentityUser, IdentityRole>() .AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<IdentityDbContext>(); .AddEntityFrameworkStores<IdentityDbContext>();

View File

@ -4,6 +4,7 @@
using System.Data.SqlClient; using System.Data.SqlClient;
using Microsoft.AspNetCore.Builder.Internal; using Microsoft.AspNetCore.Builder.Internal;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
@ -24,7 +25,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
services services
.AddSingleton<IConfiguration>(new ConfigurationBuilder().Build()) .AddSingleton<IConfiguration>(new ConfigurationBuilder().Build())
.AddDbContext<IdentityDbContext>(o => .AddDbContext<IdentityDbContext>(o =>
o.UseSqlServer(fixture.ConnectionString) o.UseSqlite(fixture.Connection)
.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning))) .ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning)))
.AddIdentity<IdentityUser, IdentityRole>(o => o.Stores.MaxLengthForKeys = 128) .AddIdentity<IdentityUser, IdentityRole>(o => o.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<IdentityDbContext>(); .AddEntityFrameworkStores<IdentityDbContext>();
@ -55,7 +56,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
{ {
var sqlConn = dbContext.Database.GetDbConnection(); var sqlConn = dbContext.Database.GetDbConnection();
using (var db = new SqlConnection(sqlConn.ConnectionString)) using (var db = new SqliteConnection(sqlConn.ConnectionString))
{ {
db.Open(); db.Open();
Assert.True(DbUtil.VerifyColumns(db, "AspNetUsers", "Id", "UserName", "Email", "PasswordHash", "SecurityStamp", Assert.True(DbUtil.VerifyColumns(db, "AspNetUsers", "Id", "UserName", "Email", "PasswordHash", "SecurityStamp",
@ -67,10 +68,10 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
Assert.True(DbUtil.VerifyColumns(db, "AspNetUserLogins", "UserId", "ProviderKey", "LoginProvider", "ProviderDisplayName")); Assert.True(DbUtil.VerifyColumns(db, "AspNetUserLogins", "UserId", "ProviderKey", "LoginProvider", "ProviderDisplayName"));
Assert.True(DbUtil.VerifyColumns(db, "AspNetUserTokens", "UserId", "LoginProvider", "Name", "Value")); Assert.True(DbUtil.VerifyColumns(db, "AspNetUserTokens", "UserId", "LoginProvider", "Name", "Value"));
Assert.True(DbUtil.VerifyMaxLength(db, "AspNetUsers", 256, "UserName", "Email", "NormalizedUserName", "NormalizedEmail")); Assert.True(DbUtil.VerifyMaxLength(dbContext, "AspNetUsers", 256, "UserName", "Email", "NormalizedUserName", "NormalizedEmail"));
Assert.True(DbUtil.VerifyMaxLength(db, "AspNetRoles", 256, "Name", "NormalizedName")); Assert.True(DbUtil.VerifyMaxLength(dbContext, "AspNetRoles", 256, "Name", "NormalizedName"));
Assert.True(DbUtil.VerifyMaxLength(db, "AspNetUserLogins", 128, "LoginProvider", "ProviderKey")); Assert.True(DbUtil.VerifyMaxLength(dbContext, "AspNetUserLogins", 128, "LoginProvider", "ProviderKey"));
Assert.True(DbUtil.VerifyMaxLength(db, "AspNetUserTokens", 128, "LoginProvider", "Name")); Assert.True(DbUtil.VerifyMaxLength(dbContext, "AspNetUserTokens", 128, "LoginProvider", "Name"));
DbUtil.VerifyIndex(db, "AspNetRoles", "RoleNameIndex", isUnique: true); DbUtil.VerifyIndex(db, "AspNetRoles", "RoleNameIndex", isUnique: true);
DbUtil.VerifyIndex(db, "AspNetUsers", "UserNameIndex", isUnique: true); DbUtil.VerifyIndex(db, "AspNetUsers", "UserNameIndex", isUnique: true);

View File

@ -1,8 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
<TestDependsOnMssql>true</TestDependsOnMssql>
<!-- These tests are broken in Azure Pipelines right now due to deadlocks in EFCore on machines with few CPU cores. --> <!-- These tests are broken in Azure Pipelines right now due to deadlocks in EFCore on machines with few CPU cores. -->
<SkipTests Condition=" '$(BUILD_REASON)' == 'PullRequest' ">true</SkipTests> <SkipTests Condition=" '$(BUILD_REASON)' == 'PullRequest' ">true</SkipTests>
@ -20,8 +19,7 @@
<Reference Include="Microsoft.AspNetCore.Hosting" /> <Reference Include="Microsoft.AspNetCore.Hosting" />
<Reference Include="Microsoft.AspNetCore.Http" /> <Reference Include="Microsoft.AspNetCore.Http" />
<Reference Include="Microsoft.AspNetCore.TestHost" /> <Reference Include="Microsoft.AspNetCore.TestHost" />
<Reference Include="Microsoft.EntityFrameworkCore.InMemory" /> <Reference Include="Microsoft.EntityFrameworkCore.Sqlite" />
<Reference Include="Microsoft.EntityFrameworkCore.SqlServer" />
<Reference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" /> <Reference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" />
<Reference Include="Microsoft.Extensions.Configuration.FileExtensions" /> <Reference Include="Microsoft.Extensions.Configuration.FileExtensions" />
<Reference Include="Microsoft.Extensions.Configuration.Json" /> <Reference Include="Microsoft.Extensions.Configuration.Json" />

View File

@ -10,6 +10,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.Test; using Microsoft.AspNetCore.Identity.Test;
using Microsoft.AspNetCore.Testing; using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Xunit; using Xunit;
@ -27,11 +28,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
_fixture = fixture; _fixture = fixture;
} }
protected override bool ShouldSkipDbTests()
{
return TestPlatformHelper.IsMono || !TestPlatformHelper.IsWindows;
}
public class TestUserDbContext : IdentityUserContext<TUser, TKey> public class TestUserDbContext : IdentityUserContext<TUser, TKey>
{ {
public TestUserDbContext(DbContextOptions options) : base(options) { } public TestUserDbContext(DbContextOptions options) : base(options) { }
@ -54,9 +50,9 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
protected override Expression<Func<TUser, bool>> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName); protected override Expression<Func<TUser, bool>> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName);
public TestUserDbContext CreateContext() private TestUserDbContext CreateContext()
{ {
var db = DbUtil.Create<TestUserDbContext>(_fixture.ConnectionString); var db = DbUtil.Create<TestUserDbContext>(_fixture.Connection);
db.Database.EnsureCreated(); db.Database.EnsureCreated();
return db; return db;
} }
@ -89,7 +85,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
{ {
var sqlConn = dbContext.Database.GetDbConnection(); var sqlConn = dbContext.Database.GetDbConnection();
using (var db = new SqlConnection(sqlConn.ConnectionString)) using (var db = new SqliteConnection(sqlConn.ConnectionString))
{ {
db.Open(); db.Open();
Assert.True(DbUtil.VerifyColumns(db, "AspNetUsers", "Id", "UserName", "Email", "PasswordHash", "SecurityStamp", Assert.True(DbUtil.VerifyColumns(db, "AspNetUsers", "Id", "UserName", "Email", "PasswordHash", "SecurityStamp",
@ -104,7 +100,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
DbUtil.VerifyIndex(db, "AspNetUsers", "UserNameIndex", isUnique: true); DbUtil.VerifyIndex(db, "AspNetUsers", "UserNameIndex", isUnique: true);
DbUtil.VerifyIndex(db, "AspNetUsers", "EmailIndex"); DbUtil.VerifyIndex(db, "AspNetUsers", "EmailIndex");
DbUtil.VerifyMaxLength(db, "AspNetUsers", 256, "UserName", "Email", "NormalizeUserName", "NormalizeEmail"); DbUtil.VerifyMaxLength(dbContext, "AspNetUsers", 256, "UserName", "Email", "NormalizeUserName", "NormalizeEmail");
db.Close(); db.Close();
} }
@ -249,4 +245,4 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
Assert.Equal(2, (await manager.GetRolesAsync(userByEmail)).Count); Assert.Equal(2, (await manager.GetRolesAsync(userByEmail)).Count);
} }
} }
} }

View File

@ -10,6 +10,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.Test; using Microsoft.AspNetCore.Identity.Test;
using Microsoft.AspNetCore.Testing; using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -58,11 +59,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
SetupAddIdentity(services); SetupAddIdentity(services);
} }
protected override bool ShouldSkipDbTests()
{
return TestPlatformHelper.IsMono || !TestPlatformHelper.IsWindows;
}
public class TestDbContext : IdentityDbContext<TUser, TRole, TKey> { public class TestDbContext : IdentityDbContext<TUser, TRole, TKey> {
public TestDbContext(DbContextOptions options) : base(options) { } public TestDbContext(DbContextOptions options) : base(options) { }
} }
@ -94,11 +90,11 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
protected override Expression<Func<TUser, bool>> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName); protected override Expression<Func<TUser, bool>> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName);
public virtual TestDbContext CreateContext() protected virtual TestDbContext CreateContext()
{ {
var services = new ServiceCollection(); var services = new ServiceCollection();
SetupAddIdentity(services); SetupAddIdentity(services);
var db = DbUtil.Create<TestDbContext>(_fixture.ConnectionString, services); var db = DbUtil.Create<TestDbContext>(_fixture.Connection, services);
db.Database.EnsureCreated(); db.Database.EnsureCreated();
return db; return db;
} }
@ -136,7 +132,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
{ {
var sqlConn = dbContext.Database.GetDbConnection(); var sqlConn = dbContext.Database.GetDbConnection();
using (var db = new SqlConnection(sqlConn.ConnectionString)) using (var db = new SqliteConnection(sqlConn.ConnectionString))
{ {
db.Open(); db.Open();
Assert.True(DbUtil.VerifyColumns(db, "AspNetUsers", "Id", "UserName", "Email", "PasswordHash", "SecurityStamp", Assert.True(DbUtil.VerifyColumns(db, "AspNetUsers", "Id", "UserName", "Email", "PasswordHash", "SecurityStamp",
@ -148,8 +144,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
Assert.True(DbUtil.VerifyColumns(db, "AspNetUserLogins", "UserId", "ProviderKey", "LoginProvider", "ProviderDisplayName")); Assert.True(DbUtil.VerifyColumns(db, "AspNetUserLogins", "UserId", "ProviderKey", "LoginProvider", "ProviderDisplayName"));
Assert.True(DbUtil.VerifyColumns(db, "AspNetUserTokens", "UserId", "LoginProvider", "Name", "Value")); Assert.True(DbUtil.VerifyColumns(db, "AspNetUserTokens", "UserId", "LoginProvider", "Name", "Value"));
Assert.True(DbUtil.VerifyMaxLength(db, "AspNetUsers", 256, "UserName", "Email", "NormalizedUserName", "NormalizedEmail")); Assert.True(DbUtil.VerifyMaxLength(dbContext, "AspNetUsers", 256, "UserName", "Email", "NormalizedUserName", "NormalizedEmail"));
Assert.True(DbUtil.VerifyMaxLength(db, "AspNetRoles", 256, "Name", "NormalizedName")); Assert.True(DbUtil.VerifyMaxLength(dbContext, "AspNetRoles", 256, "Name", "NormalizedName"));
DbUtil.VerifyIndex(db, "AspNetRoles", "RoleNameIndex", isUnique: true); DbUtil.VerifyIndex(db, "AspNetRoles", "RoleNameIndex", isUnique: true);
DbUtil.VerifyIndex(db, "AspNetUsers", "UserNameIndex", isUnique: true); DbUtil.VerifyIndex(db, "AspNetUsers", "UserNameIndex", isUnique: true);

View File

@ -69,7 +69,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
services services
.AddSingleton<IConfiguration>(new ConfigurationBuilder().Build()) .AddSingleton<IConfiguration>(new ConfigurationBuilder().Build())
.AddDbContext<CustomContext>(o => .AddDbContext<CustomContext>(o =>
o.UseSqlServer(fixture.ConnectionString) o.UseSqlite(fixture.Connection)
.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning))) .ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning)))
.AddIdentityCore<IdentityUser>(o => { }) .AddIdentityCore<IdentityUser>(o => { })
.AddEntityFrameworkStores<CustomContext>(); .AddEntityFrameworkStores<CustomContext>();

View File

@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
services services
.AddSingleton<IConfiguration>(new ConfigurationBuilder().Build()) .AddSingleton<IConfiguration>(new ConfigurationBuilder().Build())
.AddDbContext<TestUserDbContext>( .AddDbContext<TestUserDbContext>(
o => o.UseSqlServer(fixture.ConnectionString) o => o.UseSqlite(fixture.Connection)
.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning))) .ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning)))
.AddIdentityCore<IdentityUser>(o => { }) .AddIdentityCore<IdentityUser>(o => { })
.AddEntityFrameworkStores<TestUserDbContext>(); .AddEntityFrameworkStores<TestUserDbContext>();

View File

@ -75,10 +75,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[Fact] [Fact]
public async Task CanRotateKeysAndStillFind() public async Task CanRotateKeysAndStillFind()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var name = Guid.NewGuid().ToString(); var name = Guid.NewGuid().ToString();
var user = CreateTestUser(name); var user = CreateTestUser(name);
@ -176,11 +172,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[InlineData(false)] [InlineData(false)]
public async Task CustomPersonalDataPropertiesAreProtected(bool protect) public async Task CustomPersonalDataPropertiesAreProtected(bool protect)
{ {
if (ShouldSkipDbTests())
{
return;
}
using (var scratch = new ScratchDatabaseFixture()) using (var scratch = new ScratchDatabaseFixture())
{ {
var services = new ServiceCollection().AddLogging(); var services = new ServiceCollection().AddLogging();
@ -191,7 +182,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
.AddEntityFrameworkStores<IdentityDbContext<CustomUser>>() .AddEntityFrameworkStores<IdentityDbContext<CustomUser>>()
.AddPersonalDataProtection<InkProtector, DefaultKeyRing>(); .AddPersonalDataProtection<InkProtector, DefaultKeyRing>();
var dbOptions = new DbContextOptionsBuilder().UseSqlServer(scratch.ConnectionString) var dbOptions = new DbContextOptionsBuilder().UseSqlite(scratch.Connection)
.UseApplicationServiceProvider(services.BuildServiceProvider()) .UseApplicationServiceProvider(services.BuildServiceProvider())
.Options; .Options;
var dbContext = new IdentityDbContext<CustomUser>(dbOptions); var dbContext = new IdentityDbContext<CustomUser>(dbOptions);
@ -260,11 +251,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[Fact] [Fact]
public void ProtectedPersonalDataThrowsOnNonString() public void ProtectedPersonalDataThrowsOnNonString()
{ {
if (ShouldSkipDbTests())
{
return;
}
using (var scratch = new ScratchDatabaseFixture()) using (var scratch = new ScratchDatabaseFixture())
{ {
var services = new ServiceCollection().AddLogging(); var services = new ServiceCollection().AddLogging();
@ -274,7 +260,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}) })
.AddEntityFrameworkStores<IdentityDbContext<CustomUser>>() .AddEntityFrameworkStores<IdentityDbContext<CustomUser>>()
.AddPersonalDataProtection<InkProtector, DefaultKeyRing>(); .AddPersonalDataProtection<InkProtector, DefaultKeyRing>();
var dbOptions = new DbContextOptionsBuilder().UseSqlServer(scratch.ConnectionString) var dbOptions = new DbContextOptionsBuilder().UseSqlite(scratch.Connection)
.UseApplicationServiceProvider(services.BuildServiceProvider()) .UseApplicationServiceProvider(services.BuildServiceProvider())
.Options; .Options;
var dbContext = new IdentityDbContext<InvalidUser>(dbOptions); var dbContext = new IdentityDbContext<InvalidUser>(dbOptions);

View File

@ -23,9 +23,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
_fixture = fixture; _fixture = fixture;
} }
protected override bool ShouldSkipDbTests()
=> TestPlatformHelper.IsMono || !TestPlatformHelper.IsWindows;
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{ {
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
@ -48,9 +45,9 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
} }
} }
public IdentityDbContext CreateContext(bool delete = false) private IdentityDbContext CreateContext(bool delete = false)
{ {
var db = DbUtil.Create<IdentityDbContext>(_fixture.ConnectionString); var db = DbUtil.Create<IdentityDbContext>(_fixture.Connection);
if (delete) if (delete)
{ {
db.Database.EnsureDeleted(); db.Database.EnsureDeleted();
@ -64,13 +61,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
return CreateContext(); return CreateContext();
} }
public ApplicationDbContext CreateAppContext()
{
var db = DbUtil.Create<ApplicationDbContext>(_fixture.ConnectionString);
db.Database.EnsureCreated();
return db;
}
protected override void AddUserStore(IServiceCollection services, object context = null) protected override void AddUserStore(IServiceCollection services, object context = null)
{ {
services.AddSingleton<IUserStore<IdentityUser>>(new UserStore<IdentityUser, IdentityRole, IdentityDbContext>((IdentityDbContext)context)); services.AddSingleton<IUserStore<IdentityUser>>(new UserStore<IdentityUser, IdentityRole, IdentityDbContext>((IdentityDbContext)context));

View File

@ -8,7 +8,6 @@ using System.Linq.Expressions;
using System.Security.Claims; using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.Test; using Microsoft.AspNetCore.Identity.Test;
using Microsoft.AspNetCore.Testing;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Xunit; using Xunit;
@ -24,9 +23,9 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
_fixture = fixture; _fixture = fixture;
} }
public ContextWithGenerics CreateContext() private ContextWithGenerics CreateContext()
{ {
var db = DbUtil.Create<ContextWithGenerics>(_fixture.ConnectionString); var db = DbUtil.Create<ContextWithGenerics>(_fixture.Connection);
db.Database.EnsureCreated(); db.Database.EnsureCreated();
return db; return db;
} }
@ -36,11 +35,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
return CreateContext(); return CreateContext();
} }
protected override bool ShouldSkipDbTests()
{
return TestPlatformHelper.IsMono || !TestPlatformHelper.IsWindows;
}
protected override void AddUserStore(IServiceCollection services, object context = null) protected override void AddUserStore(IServiceCollection services, object context = null)
{ {
services.AddSingleton<IUserStore<IdentityUserWithGenerics>>(new UserStoreWithGenerics((ContextWithGenerics)context, "TestContext")); services.AddSingleton<IUserStore<IdentityUserWithGenerics>>(new UserStoreWithGenerics((ContextWithGenerics)context, "TestContext"));
@ -104,10 +98,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[Fact] [Fact]
public async Task CanAddRemoveUserClaimWithIssuer() public async Task CanAddRemoveUserClaimWithIssuer()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -136,10 +126,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[Fact] [Fact]
public async Task RemoveClaimWithIssuerOnlyAffectsUser() public async Task RemoveClaimWithIssuerOnlyAffectsUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
var user2 = CreateTestUser(); var user2 = CreateTestUser();
@ -169,10 +155,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[Fact] [Fact]
public async Task CanReplaceUserClaimWithIssuer() public async Task CanReplaceUserClaimWithIssuer()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -348,4 +330,4 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
} }
#endregion #endregion
} }

View File

@ -2,28 +2,40 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test.Utilities; using System.Data.Common;
using Microsoft.EntityFrameworkCore.Internal; using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
{ {
public class ScratchDatabaseFixture : IDisposable public class ScratchDatabaseFixture : IDisposable
{ {
private readonly Lazy<SqlServerTestStore> _testStore; private readonly SqliteConnection _connection;
public ScratchDatabaseFixture() public ScratchDatabaseFixture()
{ {
_testStore = new Lazy<SqlServerTestStore>(() => SqlServerTestStore.CreateScratch()); _connection = new SqliteConnection($"DataSource=D{Guid.NewGuid()}.db");
using (var context = CreateEmptyContext())
{
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
}
} }
public string ConnectionString => _testStore.Value.Connection.ConnectionString; private DbContext CreateEmptyContext()
=> new DbContext(new DbContextOptionsBuilder().UseSqlite(_connection).Options);
public DbConnection Connection => _connection;
public void Dispose() public void Dispose()
{ {
if (_testStore.IsValueCreated) using (var context = CreateEmptyContext())
{ {
_testStore.Value.Dispose(); context.Database.EnsureDeleted();
} }
_connection.Dispose();
} }
} }
} }

View File

@ -1,165 +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;
using System.Data.Common;
using System.Data.SqlClient;
using System.IO;
using System.Threading;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test.Utilities
{
public class SqlServerTestStore : IDisposable
{
public const int CommandTimeout = 90;
public static string CreateConnectionString(string name)
{
var connStrBuilder = new SqlConnectionStringBuilder(TestEnvironment.Config["Test:SqlServer:DefaultConnectionString"])
{
InitialCatalog = name
};
return connStrBuilder.ConnectionString;
}
public static SqlServerTestStore CreateScratch(bool createDatabase = true)
=> new SqlServerTestStore(GetScratchDbName()).CreateTransient(createDatabase);
private SqlConnection _connection;
private readonly string _name;
private bool _deleteDatabase;
private SqlServerTestStore(string name)
{
_name = name;
}
private static string GetScratchDbName()
{
string name;
do
{
name = "Scratch_" + Guid.NewGuid();
} while (DatabaseExists(name)
|| DatabaseFilesExist(name));
return name;
}
private static void WaitForExists(SqlConnection connection)
{
var retryCount = 0;
while (true)
{
try
{
connection.Open();
connection.Close();
return;
}
catch (SqlException e)
{
if (++retryCount >= 30
|| (e.Number != 233 && e.Number != -2 && e.Number != 4060))
{
throw;
}
SqlConnection.ClearPool(connection);
Thread.Sleep(100);
}
}
}
private SqlServerTestStore CreateTransient(bool createDatabase)
{
_connection = new SqlConnection(CreateConnectionString(_name));
if (createDatabase)
{
using (var master = new SqlConnection(CreateConnectionString("master")))
{
master.Open();
using (var command = master.CreateCommand())
{
command.CommandTimeout = CommandTimeout;
command.CommandText = $"{Environment.NewLine}CREATE DATABASE [{_name}]";
command.ExecuteNonQuery();
WaitForExists(_connection);
}
}
_connection.Open();
}
_deleteDatabase = true;
return this;
}
private static bool DatabaseExists(string name)
{
using (var master = new SqlConnection(CreateConnectionString("master")))
{
master.Open();
using (var command = master.CreateCommand())
{
command.CommandTimeout = CommandTimeout;
command.CommandText = $@"SELECT COUNT(*) FROM sys.databases WHERE name = N'{name}'";
return (int) command.ExecuteScalar() > 0;
}
}
}
private static bool DatabaseFilesExist(string name)
{
var userFolder = Environment.GetEnvironmentVariable("USERPROFILE") ??
Environment.GetEnvironmentVariable("HOME");
return userFolder != null
&& (File.Exists(Path.Combine(userFolder, name + ".mdf"))
|| File.Exists(Path.Combine(userFolder, name + "_log.ldf")));
}
private void DeleteDatabase(string name)
{
using (var master = new SqlConnection(CreateConnectionString("master")))
{
master.Open();
using (var command = master.CreateCommand())
{
command.CommandTimeout = CommandTimeout;
// Query will take a few seconds if (and only if) there are active connections
// SET SINGLE_USER will close any open connections that would prevent the drop
command.CommandText
= string.Format(@"IF EXISTS (SELECT * FROM sys.databases WHERE name = N'{0}')
BEGIN
ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [{0}];
END", name);
command.ExecuteNonQuery();
}
}
}
public DbConnection Connection => _connection;
public void Dispose()
{
_connection.Dispose();
if (_deleteDatabase)
{
DeleteDatabase(_name);
}
}
}
}

View File

@ -7,7 +7,6 @@ using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Security.Claims; using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Xunit; using Xunit;
@ -129,10 +128,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanCreateRoleTest() public async Task CanCreateRoleTest()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
var roleName = "create" + Guid.NewGuid().ToString(); var roleName = "create" + Guid.NewGuid().ToString();
var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true); var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true);
@ -169,10 +164,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task BadValidatorBlocksCreateRole() public async Task BadValidatorBlocksCreateRole()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
manager.RoleValidators.Clear(); manager.RoleValidators.Clear();
manager.RoleValidators.Add(new AlwaysBadValidator()); manager.RoleValidators.Add(new AlwaysBadValidator());
@ -189,10 +180,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanChainRoleValidators() public async Task CanChainRoleValidators()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
manager.RoleValidators.Clear(); manager.RoleValidators.Clear();
manager.RoleValidators.Add(new AlwaysBadValidator()); manager.RoleValidators.Add(new AlwaysBadValidator());
@ -211,10 +198,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task BadValidatorBlocksRoleUpdate() public async Task BadValidatorBlocksRoleUpdate()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
var role = CreateTestRole("poorguy"); var role = CreateTestRole("poorguy");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(role)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(role));
@ -232,10 +215,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanDeleteRole() public async Task CanDeleteRole()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
var roleName = "delete" + Guid.NewGuid().ToString(); var roleName = "delete" + Guid.NewGuid().ToString();
var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true); var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true);
@ -253,10 +232,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanAddRemoveRoleClaim() public async Task CanAddRemoveRoleClaim()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
var role = CreateTestRole("ClaimsAddRemove"); var role = CreateTestRole("ClaimsAddRemove");
var roleSafe = CreateTestRole("ClaimsAdd"); var roleSafe = CreateTestRole("ClaimsAdd");
@ -296,10 +271,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanRoleFindById() public async Task CanRoleFindById()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
var role = CreateTestRole("FindByIdAsync"); var role = CreateTestRole("FindByIdAsync");
Assert.Null(await manager.FindByIdAsync(await manager.GetRoleIdAsync(role))); Assert.Null(await manager.FindByIdAsync(await manager.GetRoleIdAsync(role)));
@ -314,10 +285,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanRoleFindByName() public async Task CanRoleFindByName()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
var roleName = "FindByNameAsync" + Guid.NewGuid().ToString(); var roleName = "FindByNameAsync" + Guid.NewGuid().ToString();
var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true); var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true);
@ -334,10 +301,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanUpdateRoleName() public async Task CanUpdateRoleName()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
var roleName = "update" + Guid.NewGuid().ToString(); var roleName = "update" + Guid.NewGuid().ToString();
var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true); var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true);
@ -357,10 +320,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanQueryableRoles() public async Task CanQueryableRoles()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
if (manager.SupportsQueryableRoles) if (manager.SupportsQueryableRoles)
{ {
@ -384,10 +343,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CreateRoleFailsIfExists() public async Task CreateRoleFailsIfExists()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateRoleManager(); var manager = CreateRoleManager();
var roleName = "dupeRole" + Guid.NewGuid().ToString(); var roleName = "dupeRole" + Guid.NewGuid().ToString();
var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true); var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true);
@ -405,10 +360,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanAddUsersToRole() public async Task CanAddUsersToRole()
{ {
if (ShouldSkipDbTests())
{
return;
}
var context = CreateTestContext(); var context = CreateTestContext();
var manager = CreateManager(context); var manager = CreateManager(context);
var roleManager = CreateRoleManager(context); var roleManager = CreateRoleManager(context);
@ -434,11 +385,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanGetRolesForUser() public async Task CanGetRolesForUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var context = CreateTestContext(); var context = CreateTestContext();
var userManager = CreateManager(context); var userManager = CreateManager(context);
var roleManager = CreateRoleManager(context); var roleManager = CreateRoleManager(context);
@ -477,10 +423,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task RemoveUserFromRoleWithMultipleRoles() public async Task RemoveUserFromRoleWithMultipleRoles()
{ {
if (ShouldSkipDbTests())
{
return;
}
var context = CreateTestContext(); var context = CreateTestContext();
var userManager = CreateManager(context); var userManager = CreateManager(context);
var roleManager = CreateRoleManager(context); var roleManager = CreateRoleManager(context);
@ -504,10 +446,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanRemoveUsersFromRole() public async Task CanRemoveUsersFromRole()
{ {
if (ShouldSkipDbTests())
{
return;
}
var context = CreateTestContext(); var context = CreateTestContext();
var userManager = CreateManager(context); var userManager = CreateManager(context);
var roleManager = CreateRoleManager(context); var roleManager = CreateRoleManager(context);
@ -538,10 +476,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task RemoveUserNotInRoleFails() public async Task RemoveUserNotInRoleFails()
{ {
if (ShouldSkipDbTests())
{
return;
}
var context = CreateTestContext(); var context = CreateTestContext();
var userMgr = CreateManager(context); var userMgr = CreateManager(context);
var roleMgr = CreateRoleManager(context); var roleMgr = CreateRoleManager(context);
@ -562,10 +496,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task AddUserToRoleFailsIfAlreadyInRole() public async Task AddUserToRoleFailsIfAlreadyInRole()
{ {
if (ShouldSkipDbTests())
{
return;
}
var context = CreateTestContext(); var context = CreateTestContext();
var userMgr = CreateManager(context); var userMgr = CreateManager(context);
var roleMgr = CreateRoleManager(context); var roleMgr = CreateRoleManager(context);
@ -587,10 +517,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task AddUserToRolesIgnoresDuplicates() public async Task AddUserToRolesIgnoresDuplicates()
{ {
if (ShouldSkipDbTests())
{
return;
}
var context = CreateTestContext(); var context = CreateTestContext();
var userMgr = CreateManager(context); var userMgr = CreateManager(context);
var roleMgr = CreateRoleManager(context); var roleMgr = CreateRoleManager(context);
@ -611,10 +537,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanFindRoleByNameWithManager() public async Task CanFindRoleByNameWithManager()
{ {
if (ShouldSkipDbTests())
{
return;
}
var roleMgr = CreateRoleManager(); var roleMgr = CreateRoleManager();
var roleName = "findRoleByNameTest" + Guid.NewGuid().ToString(); var roleName = "findRoleByNameTest" + Guid.NewGuid().ToString();
var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true); var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true);
@ -629,10 +551,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanFindRoleWithManager() public async Task CanFindRoleWithManager()
{ {
if (ShouldSkipDbTests())
{
return;
}
var roleMgr = CreateRoleManager(); var roleMgr = CreateRoleManager();
var roleName = "findRoleTest" + Guid.NewGuid().ToString(); var roleName = "findRoleTest" + Guid.NewGuid().ToString();
var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true); var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true);
@ -647,10 +565,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanGetUsersInRole() public async Task CanGetUsersInRole()
{ {
if (ShouldSkipDbTests())
{
return;
}
var context = CreateTestContext(); var context = CreateTestContext();
var manager = CreateManager(context); var manager = CreateManager(context);
var roleManager = CreateRoleManager(context); var roleManager = CreateRoleManager(context);

View File

@ -7,7 +7,6 @@ using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Security.Claims; using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Testing; using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -72,12 +71,6 @@ namespace Microsoft.AspNetCore.Identity.Test
return builder; return builder;
} }
/// <summary>
/// If true, tests that require a database will be skipped.
/// </summary>
/// <returns></returns>
protected virtual bool ShouldSkipDbTests() => false;
/// <summary> /// <summary>
/// Creates the user manager used for tests. /// Creates the user manager used for tests.
/// </summary> /// </summary>
@ -184,10 +177,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task PasswordValidatorWithNoErrorsCanBlockAddPassword() public async Task PasswordValidatorWithNoErrorsCanBlockAddPassword()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -203,10 +192,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CreateUserWillSetCreateDateOnlyIfSupported() public async Task CreateUserWillSetCreateDateOnlyIfSupported()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -220,10 +205,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanDeleteUser() public async Task CanDeleteUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -239,10 +220,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanUpdateUserName() public async Task CanUpdateUserName()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var name = Guid.NewGuid().ToString(); var name = Guid.NewGuid().ToString();
var user = CreateTestUser(name); var user = CreateTestUser(name);
@ -262,10 +239,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CheckSetUserNameValidatesUser() public async Task CheckSetUserNameValidatesUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var username = "UpdateAsync" + Guid.NewGuid().ToString(); var username = "UpdateAsync" + Guid.NewGuid().ToString();
var newUsername = "New" + Guid.NewGuid().ToString(); var newUsername = "New" + Guid.NewGuid().ToString();
@ -294,10 +267,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task SetUserNameUpdatesSecurityStamp() public async Task SetUserNameUpdatesSecurityStamp()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var username = "UpdateAsync" + Guid.NewGuid().ToString(); var username = "UpdateAsync" + Guid.NewGuid().ToString();
var newUsername = "New" + Guid.NewGuid().ToString(); var newUsername = "New" + Guid.NewGuid().ToString();
@ -316,10 +285,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ResetAuthenticatorKeyUpdatesSecurityStamp() public async Task ResetAuthenticatorKeyUpdatesSecurityStamp()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var username = "Create" + Guid.NewGuid().ToString(); var username = "Create" + Guid.NewGuid().ToString();
var user = CreateTestUser(username, useNamePrefixAsUserName: true); var user = CreateTestUser(username, useNamePrefixAsUserName: true);
@ -336,10 +301,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CheckSetEmailValidatesUser() public async Task CheckSetEmailValidatesUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.Options.User.RequireUniqueEmail = true; manager.Options.User.RequireUniqueEmail = true;
manager.UserValidators.Add(new UserValidator<TUser>()); manager.UserValidators.Add(new UserValidator<TUser>());
@ -363,10 +324,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanUpdatePasswordUsingHasher() public async Task CanUpdatePasswordUsingHasher()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser("UpdatePassword"); var user = CreateTestUser("UpdatePassword");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password")); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password"));
@ -387,10 +344,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanFindById() public async Task CanFindById()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -404,10 +357,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task UserValidatorCanBlockCreate() public async Task UserValidatorCanBlockCreate()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
manager.UserValidators.Clear(); manager.UserValidators.Clear();
@ -423,10 +372,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task UserValidatorCanBlockUpdate() public async Task UserValidatorCanBlockUpdate()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -443,10 +388,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanChainUserValidators() public async Task CanChainUserValidators()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.UserValidators.Clear(); manager.UserValidators.Clear();
var user = CreateTestUser(); var user = CreateTestUser();
@ -467,10 +408,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[InlineData(null)] [InlineData(null)]
public async Task UserValidatorBlocksShortEmailsWhenRequiresUniqueEmail(string email) public async Task UserValidatorBlocksShortEmailsWhenRequiresUniqueEmail(string email)
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
manager.Options.User.RequireUniqueEmail = true; manager.Options.User.RequireUniqueEmail = true;
@ -486,10 +423,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[InlineData("bogus")] [InlineData("bogus")]
public async Task UserValidatorBlocksInvalidEmailsWhenRequiresUniqueEmail(string email) public async Task UserValidatorBlocksInvalidEmailsWhenRequiresUniqueEmail(string email)
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser("UpdateBlocked", email); var user = CreateTestUser("UpdateBlocked", email);
manager.Options.User.RequireUniqueEmail = true; manager.Options.User.RequireUniqueEmail = true;
@ -503,10 +436,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task PasswordValidatorCanBlockAddPassword() public async Task PasswordValidatorCanBlockAddPassword()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -524,10 +453,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanChainPasswordValidators() public async Task CanChainPasswordValidators()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.PasswordValidators.Clear(); manager.PasswordValidators.Clear();
manager.PasswordValidators.Add(new EmptyBadValidator()); manager.PasswordValidators.Add(new EmptyBadValidator());
@ -546,10 +471,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task PasswordValidatorWithNoErrorsCanBlockChangePassword() public async Task PasswordValidatorWithNoErrorsCanBlockChangePassword()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password")); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password"));
@ -565,10 +486,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task PasswordValidatorWithNoErrorsCanBlockCreateUser() public async Task PasswordValidatorWithNoErrorsCanBlockCreateUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
manager.PasswordValidators.Clear(); manager.PasswordValidators.Clear();
@ -583,10 +500,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task PasswordValidatorWithNoErrorsCanBlockResetPasswordWithStaticTokenProvider() public async Task PasswordValidatorWithNoErrorsCanBlockResetPasswordWithStaticTokenProvider()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.RegisterTokenProvider("Static", new StaticTokenProvider()); manager.RegisterTokenProvider("Static", new StaticTokenProvider());
manager.Options.Tokens.PasswordResetTokenProvider = "Static"; manager.Options.Tokens.PasswordResetTokenProvider = "Static";
@ -611,10 +524,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task PasswordValidatorCanBlockChangePassword() public async Task PasswordValidatorCanBlockChangePassword()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password")); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password"));
@ -632,10 +541,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task PasswordValidatorCanBlockCreateUser() public async Task PasswordValidatorCanBlockCreateUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
manager.PasswordValidators.Clear(); manager.PasswordValidators.Clear();
@ -651,10 +556,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanCreateUserNoPassword() public async Task CanCreateUserNoPassword()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var username = "CreateUserTest" + Guid.NewGuid(); var username = "CreateUserTest" + Guid.NewGuid();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(CreateTestUser(username, useNamePrefixAsUserName: true))); IdentityResultAssert.IsSuccess(await manager.CreateAsync(CreateTestUser(username, useNamePrefixAsUserName: true)));
@ -674,10 +575,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanCreateUserAddLogin() public async Task CanCreateUserAddLogin()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
const string provider = "ZzAuth"; const string provider = "ZzAuth";
const string display = "display"; const string display = "display";
@ -700,10 +597,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanCreateUserLoginAndAddPassword() public async Task CanCreateUserLoginAndAddPassword()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -727,10 +620,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task AddPasswordFailsIfAlreadyHave() public async Task AddPasswordFailsIfAlreadyHave()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "Password")); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "Password"));
@ -747,10 +636,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanCreateUserAddRemoveLogin() public async Task CanCreateUserAddRemoveLogin()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
var result = await manager.CreateAsync(user); var result = await manager.CreateAsync(user);
@ -782,10 +667,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanRemovePassword() public async Task CanRemovePassword()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser("CanRemovePassword"); var user = CreateTestUser("CanRemovePassword");
const string password = "password"; const string password = "password";
@ -806,10 +687,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanChangePassword() public async Task CanChangePassword()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
const string password = "password"; const string password = "password";
@ -830,10 +707,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanAddRemoveUserClaim() public async Task CanAddRemoveUserClaim()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -863,10 +736,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task RemoveClaimOnlyAffectsUser() public async Task RemoveClaimOnlyAffectsUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
var user2 = CreateTestUser(); var user2 = CreateTestUser();
@ -900,10 +769,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanReplaceUserClaim() public async Task CanReplaceUserClaim()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -927,10 +792,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ReplaceUserClaimOnlyAffectsUser() public async Task ReplaceUserClaimOnlyAffectsUser()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
var user2 = CreateTestUser(); var user2 = CreateTestUser();
@ -964,10 +825,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ChangePasswordFallsIfPasswordWrong() public async Task ChangePasswordFallsIfPasswordWrong()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password")); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password"));
@ -983,10 +840,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task AddDupeUserNameFails() public async Task AddDupeUserNameFails()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var username = "AddDupeUserNameFails" + Guid.NewGuid(); var username = "AddDupeUserNameFails" + Guid.NewGuid();
var user = CreateTestUser(username, useNamePrefixAsUserName: true); var user = CreateTestUser(username, useNamePrefixAsUserName: true);
@ -1002,10 +855,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task AddDupeEmailAllowedByDefault() public async Task AddDupeEmailAllowedByDefault()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(email: "yup@yup.com"); var user = CreateTestUser(email: "yup@yup.com");
var user2 = CreateTestUser(email: "yup@yup.com"); var user2 = CreateTestUser(email: "yup@yup.com");
@ -1021,10 +870,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task AddDupeEmailFailsWhenUniqueEmailRequired() public async Task AddDupeEmailFailsWhenUniqueEmailRequired()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.Options.User.RequireUniqueEmail = true; manager.Options.User.RequireUniqueEmail = true;
var user = CreateTestUser(email: "FooUser@yup.com"); var user = CreateTestUser(email: "FooUser@yup.com");
@ -1040,10 +885,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task UpdateSecurityStampActuallyChanges() public async Task UpdateSecurityStampActuallyChanges()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1059,10 +900,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task AddDupeLoginFails() public async Task AddDupeLoginFails()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
var login = new UserLoginInfo("Provider", "key", "display"); var login = new UserLoginInfo("Provider", "key", "display");
@ -1082,10 +919,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanFindByEmail() public async Task CanFindByEmail()
{ {
if (ShouldSkipDbTests())
{
return;
}
var email = "foouser@test.com"; var email = "foouser@test.com";
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(email: email); var user = CreateTestUser(email: email);
@ -1101,11 +934,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async virtual Task CanFindUsersViaUserQuerable() public async virtual Task CanFindUsersViaUserQuerable()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
if (mgr.SupportsQueryableUsers) if (mgr.SupportsQueryableUsers)
{ {
@ -1126,10 +954,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ConfirmEmailFalseByDefaultTest() public async Task ConfirmEmailFalseByDefaultTest()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1166,10 +990,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanResetPasswordWithStaticTokenProvider() public async Task CanResetPasswordWithStaticTokenProvider()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.RegisterTokenProvider("Static", new StaticTokenProvider()); manager.RegisterTokenProvider("Static", new StaticTokenProvider());
manager.Options.Tokens.PasswordResetTokenProvider = "Static"; manager.Options.Tokens.PasswordResetTokenProvider = "Static";
@ -1195,10 +1015,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task PasswordValidatorCanBlockResetPasswordWithStaticTokenProvider() public async Task PasswordValidatorCanBlockResetPasswordWithStaticTokenProvider()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.RegisterTokenProvider("Static", new StaticTokenProvider()); manager.RegisterTokenProvider("Static", new StaticTokenProvider());
manager.Options.Tokens.PasswordResetTokenProvider = "Static"; manager.Options.Tokens.PasswordResetTokenProvider = "Static";
@ -1225,10 +1041,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ResetPasswordWithStaticTokenProviderFailsWithWrongToken() public async Task ResetPasswordWithStaticTokenProviderFailsWithWrongToken()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.RegisterTokenProvider("Static", new StaticTokenProvider()); manager.RegisterTokenProvider("Static", new StaticTokenProvider());
manager.Options.Tokens.PasswordResetTokenProvider = "Static"; manager.Options.Tokens.PasswordResetTokenProvider = "Static";
@ -1251,10 +1063,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanGenerateAndVerifyUserTokenWithStaticTokenProvider() public async Task CanGenerateAndVerifyUserTokenWithStaticTokenProvider()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.RegisterTokenProvider("Static", new StaticTokenProvider()); manager.RegisterTokenProvider("Static", new StaticTokenProvider());
var user = CreateTestUser(); var user = CreateTestUser();
@ -1283,10 +1091,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanConfirmEmailWithStaticToken() public async Task CanConfirmEmailWithStaticToken()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.RegisterTokenProvider("Static", new StaticTokenProvider()); manager.RegisterTokenProvider("Static", new StaticTokenProvider());
manager.Options.Tokens.EmailConfirmationTokenProvider = "Static"; manager.Options.Tokens.EmailConfirmationTokenProvider = "Static";
@ -1309,10 +1113,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ConfirmEmailWithStaticTokenFailsWithWrongToken() public async Task ConfirmEmailWithStaticTokenFailsWithWrongToken()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.RegisterTokenProvider("Static", new StaticTokenProvider()); manager.RegisterTokenProvider("Static", new StaticTokenProvider());
manager.Options.Tokens.EmailConfirmationTokenProvider = "Static"; manager.Options.Tokens.EmailConfirmationTokenProvider = "Static";
@ -1331,10 +1131,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ConfirmTokenFailsAfterPasswordChange() public async Task ConfirmTokenFailsAfterPasswordChange()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(namePrefix: "Test"); var user = CreateTestUser(namePrefix: "Test");
Assert.False(await manager.IsEmailConfirmedAsync(user)); Assert.False(await manager.IsEmailConfirmedAsync(user));
@ -1356,10 +1152,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task SingleFailureLockout() public async Task SingleFailureLockout()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
mgr.Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromHours(1); mgr.Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.Options.Lockout.MaxFailedAccessAttempts = 0; mgr.Options.Lockout.MaxFailedAccessAttempts = 0;
@ -1382,10 +1174,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task TwoFailureLockout() public async Task TwoFailureLockout()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
mgr.Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromHours(1); mgr.Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.Options.Lockout.MaxFailedAccessAttempts = 2; mgr.Options.Lockout.MaxFailedAccessAttempts = 2;
@ -1411,10 +1199,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ResetAccessCountPreventsLockout() public async Task ResetAccessCountPreventsLockout()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
mgr.Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromHours(1); mgr.Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.Options.Lockout.MaxFailedAccessAttempts = 2; mgr.Options.Lockout.MaxFailedAccessAttempts = 2;
@ -1443,10 +1227,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanEnableLockoutManuallyAndLockout() public async Task CanEnableLockoutManuallyAndLockout()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
mgr.Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromHours(1); mgr.Options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromHours(1);
mgr.Options.Lockout.AllowedForNewUsers = false; mgr.Options.Lockout.AllowedForNewUsers = false;
@ -1475,10 +1255,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task UserNotLockedOutWithNullDateTimeAndIsSetToNullDate() public async Task UserNotLockedOutWithNullDateTimeAndIsSetToNullDate()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user)); IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
@ -1495,10 +1271,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task LockoutFailsIfNotEnabled() public async Task LockoutFailsIfNotEnabled()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
mgr.Options.Lockout.AllowedForNewUsers = false; mgr.Options.Lockout.AllowedForNewUsers = false;
var user = CreateTestUser(); var user = CreateTestUser();
@ -1517,10 +1289,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task LockoutEndToUtcNowMinus1SecInUserShouldNotBeLockedOut() public async Task LockoutEndToUtcNowMinus1SecInUserShouldNotBeLockedOut()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
var user = CreateTestUser(lockoutEnd: DateTimeOffset.UtcNow.AddSeconds(-1)); var user = CreateTestUser(lockoutEnd: DateTimeOffset.UtcNow.AddSeconds(-1));
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user)); IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
@ -1535,10 +1303,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task LockoutEndToUtcNowSubOneSecondWithManagerShouldNotBeLockedOut() public async Task LockoutEndToUtcNowSubOneSecondWithManagerShouldNotBeLockedOut()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user)); IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
@ -1554,10 +1318,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task LockoutEndToUtcNowPlus5ShouldBeLockedOut() public async Task LockoutEndToUtcNowPlus5ShouldBeLockedOut()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
var lockoutEnd = DateTimeOffset.UtcNow.AddMinutes(5); var lockoutEnd = DateTimeOffset.UtcNow.AddMinutes(5);
var user = CreateTestUser(lockoutEnd: lockoutEnd); var user = CreateTestUser(lockoutEnd: lockoutEnd);
@ -1573,10 +1333,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task UserLockedOutWithDateTimeLocalKindNowPlus30() public async Task UserLockedOutWithDateTimeLocalKindNowPlus30()
{ {
if (ShouldSkipDbTests())
{
return;
}
var mgr = CreateManager(); var mgr = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user)); IdentityResultAssert.IsSuccess(await mgr.CreateAsync(user));
@ -1595,10 +1351,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task SetPhoneNumberTest() public async Task SetPhoneNumberTest()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(phoneNumber: "123-456-7890"); var user = CreateTestUser(phoneNumber: "123-456-7890");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1616,10 +1368,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanChangePhoneNumber() public async Task CanChangePhoneNumber()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(phoneNumber: "123-456-7890"); var user = CreateTestUser(phoneNumber: "123-456-7890");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1639,10 +1387,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ChangePhoneNumberTokenIsInt() public async Task ChangePhoneNumberTokenIsInt()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(phoneNumber: "123-456-7890"); var user = CreateTestUser(phoneNumber: "123-456-7890");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1657,10 +1401,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ChangePhoneNumberFailsWithWrongToken() public async Task ChangePhoneNumberFailsWithWrongToken()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(phoneNumber: "123-456-7890"); var user = CreateTestUser(phoneNumber: "123-456-7890");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1693,10 +1433,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ChangePhoneNumberWithCustomProvider() public async Task ChangePhoneNumberWithCustomProvider()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
manager.RegisterTokenProvider("Yes", new YesPhoneNumberProvider()); manager.RegisterTokenProvider("Yes", new YesPhoneNumberProvider());
manager.Options.Tokens.ChangePhoneNumberTokenProvider = "Yes"; manager.Options.Tokens.ChangePhoneNumberTokenProvider = "Yes";
@ -1717,10 +1453,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ChangePhoneNumberFailsWithWrongPhoneNumber() public async Task ChangePhoneNumberFailsWithWrongPhoneNumber()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(phoneNumber: "123-456-7890"); var user = CreateTestUser(phoneNumber: "123-456-7890");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1741,10 +1473,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanVerifyPhoneNumber() public async Task CanVerifyPhoneNumber()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1770,10 +1498,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanChangeEmail() public async Task CanChangeEmail()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser("foouser"); var user = CreateTestUser("foouser");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1796,10 +1520,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanChangeEmailOnlyIfEmailSame() public async Task CanChangeEmailOnlyIfEmailSame()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser("foouser"); var user = CreateTestUser("foouser");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1824,10 +1544,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanChangeEmailWithDifferentTokenProvider() public async Task CanChangeEmailWithDifferentTokenProvider()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(context: null, services: null, var manager = CreateManager(context: null, services: null,
configureServices: s => s.Configure<IdentityOptions>( configureServices: s => s.Configure<IdentityOptions>(
o => o.Tokens.ProviderMap["NewProvider2"] = new TokenProviderDescriptor(typeof(EmailTokenProvider<TUser>)))); o => o.Tokens.ProviderMap["NewProvider2"] = new TokenProviderDescriptor(typeof(EmailTokenProvider<TUser>))));
@ -1853,10 +1569,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ChangeEmailTokensFailsAfterEmailChanged() public async Task ChangeEmailTokensFailsAfterEmailChanged()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser("foouser"); var user = CreateTestUser("foouser");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1880,10 +1592,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ChangeEmailFailsWithWrongToken() public async Task ChangeEmailFailsWithWrongToken()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser("foouser"); var user = CreateTestUser("foouser");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1907,10 +1615,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task ChangeEmailFailsWithEmail() public async Task ChangeEmailFailsWithEmail()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser("foouser"); var user = CreateTestUser("foouser");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1936,10 +1640,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/1766", FlakyOn.All)] [Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/1766", FlakyOn.All)]
public async Task EmailFactorFailsAfterSecurityStampChangeTest() public async Task EmailFactorFailsAfterSecurityStampChangeTest()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
string factorId = "Email"; //default string factorId = "Email"; //default
var user = CreateTestUser("foouser"); var user = CreateTestUser("foouser");
@ -1970,10 +1670,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task EnableTwoFactorChangesSecurityStamp() public async Task EnableTwoFactorChangesSecurityStamp()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -1991,10 +1687,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task GenerateTwoFactorWithUnknownFactorProviderWillThrow() public async Task GenerateTwoFactorWithUnknownFactorProviderWillThrow()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -2020,10 +1712,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task GetValidTwoFactorTestEmptyWithNoProviders() public async Task GetValidTwoFactorTestEmptyWithNoProviders()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -2039,10 +1727,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanGetSetUpdateAndRemoveUserToken() public async Task CanGetSetUpdateAndRemoveUserToken()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -2067,10 +1751,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanRedeemRecoveryCodeOnlyOnce() public async Task CanRedeemRecoveryCodeOnlyOnce()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -2099,10 +1779,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task RecoveryCodesInvalidAfterReplace() public async Task RecoveryCodesInvalidAfterReplace()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -2131,10 +1807,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanGetValidTwoFactor() public async Task CanGetValidTwoFactor()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(); var user = CreateTestUser();
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -2175,10 +1847,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task PhoneFactorFailsAfterSecurityStampChangeTest() public async Task PhoneFactorFailsAfterSecurityStampChangeTest()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var factorId = "Phone"; // default var factorId = "Phone"; // default
var user = CreateTestUser(phoneNumber: "4251234567"); var user = CreateTestUser(phoneNumber: "4251234567");
@ -2199,10 +1867,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task VerifyTokenFromWrongTokenProviderFails() public async Task VerifyTokenFromWrongTokenProviderFails()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(phoneNumber: "4251234567"); var user = CreateTestUser(phoneNumber: "4251234567");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -2219,10 +1883,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task VerifyWithWrongSmsTokenFails() public async Task VerifyWithWrongSmsTokenFails()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
var user = CreateTestUser(phoneNumber: "4251234567"); var user = CreateTestUser(phoneNumber: "4251234567");
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
@ -2237,10 +1897,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task NullableDateTimeOperationTest() public async Task NullableDateTimeOperationTest()
{ {
if (ShouldSkipDbTests())
{
return;
}
var userMgr = CreateManager(); var userMgr = CreateManager();
var user = CreateTestUser(lockoutEnabled: true); var user = CreateTestUser(lockoutEnabled: true);
IdentityResultAssert.IsSuccess(await userMgr.CreateAsync(user)); IdentityResultAssert.IsSuccess(await userMgr.CreateAsync(user));
@ -2263,10 +1919,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact] [Fact]
public async Task CanGetUsersWithClaims() public async Task CanGetUsersWithClaims()
{ {
if (ShouldSkipDbTests())
{
return;
}
var manager = CreateManager(); var manager = CreateManager();
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)

View File

@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
where TStartup : class where TStartup : class
where TContext : DbContext where TContext : DbContext
{ {
public AuthorizationTests(ServerFactory<TStartup, TContext> serverFactory) protected AuthorizationTests(ServerFactory<TStartup, TContext> serverFactory)
{ {
ServerFactory = serverFactory; ServerFactory = serverFactory;
} }

View File

@ -2,12 +2,12 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Data.Common;
using System.Security.Claims; using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Identity.DefaultUI.WebSite; using Identity.DefaultUI.WebSite;
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc.Authorization; using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -18,10 +18,10 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
{ {
public static class FunctionalTestsServiceCollectionExtensions public static class FunctionalTestsServiceCollectionExtensions
{ {
public static IServiceCollection SetupTestDatabase<TContext>(this IServiceCollection services, string databaseName) where TContext : DbContext => public static IServiceCollection SetupTestDatabase<TContext>(this IServiceCollection services, DbConnection connection) where TContext : DbContext =>
services.AddDbContext<TContext>(options => services.AddDbContext<TContext>(options =>
options.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning)) options.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning))
.UseInMemoryDatabase(databaseName, memoryOptions => { })); .UseSqlite(connection));
public static IServiceCollection SetupTestThirdPartyLogin(this IServiceCollection services) => public static IServiceCollection SetupTestThirdPartyLogin(this IServiceCollection services) =>
services.AddAuthentication() services.AddAuthentication()

View File

@ -3,19 +3,24 @@
using System; using System;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Identity.FunctionalTests namespace Microsoft.AspNetCore.Identity.FunctionalTests
{ {
public class ServerFactory<TStartup,TContext>: WebApplicationFactory<TStartup> public class ServerFactory<TStartup,TContext>: WebApplicationFactory<TStartup>
where TStartup : class where TStartup : class
where TContext : DbContext where TContext : DbContext
{ {
private readonly SqliteConnection _connection
= new SqliteConnection($"DataSource=:memory:");
public ServerFactory() public ServerFactory()
{ {
_connection.Open();
ClientOptions.AllowAutoRedirect = false; ClientOptions.AllowAutoRedirect = false;
ClientOptions.BaseAddress = new Uri("https://localhost"); ClientOptions.BaseAddress = new Uri("https://localhost");
} }
@ -24,11 +29,30 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
{ {
base.ConfigureWebHost(builder); base.ConfigureWebHost(builder);
builder.UseStartup<TStartup>(); builder.UseStartup<TStartup>();
builder.ConfigureServices(sc => sc.SetupTestDatabase<TContext>(Guid.NewGuid().ToString())
builder.ConfigureServices(sc =>
{
sc.SetupTestDatabase<TContext>(_connection)
.AddMvc() .AddMvc()
// Mark the cookie as essential for right now, as Identity uses it on // Mark the cookie as essential for right now, as Identity uses it on
// several places to pass important data in post-redirect-get flows. // several places to pass important data in post-redirect-get flows.
.AddCookieTempDataProvider(o => o.Cookie.IsEssential = true)); .AddCookieTempDataProvider(o => o.Cookie.IsEssential = true);
});
}
public override void EnsureDatabaseCreated()
{
using (var scope = Services.CreateScope())
{
scope.ServiceProvider.GetService<TContext>().Database.EnsureCreated();
}
}
protected override void Dispose(bool disposing)
{
_connection.Dispose();
base.Dispose(disposing);
} }
} }
} }

View File

@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
where TStartup : class where TStartup : class
where TContext : DbContext where TContext : DbContext
{ {
public LoginTests(ServerFactory<TStartup, TContext> serverFactory) protected LoginTests(ServerFactory<TStartup, TContext> serverFactory)
{ {
ServerFactory = serverFactory; ServerFactory = serverFactory;
} }
@ -289,6 +289,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
var server = ServerFactory.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)); var server = ServerFactory.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices));
ServerFactory.EnsureDatabaseCreated();
var client = server.CreateClient(); var client = server.CreateClient();
var newClient = server.CreateClient(); var newClient = server.CreateClient();
@ -311,6 +313,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
var server = ServerFactory.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)); var server = ServerFactory.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices));
ServerFactory.EnsureDatabaseCreated();
var client = server.CreateClient(); var client = server.CreateClient();
var resetPasswordClient = server.CreateClient(); var resetPasswordClient = server.CreateClient();
var newClient = server.CreateClient(); var newClient = server.CreateClient();

View File

@ -289,6 +289,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
.WithWebHostBuilder(whb => whb.ConfigureTestServices(ConfigureTestServices)) .WithWebHostBuilder(whb => whb.ConfigureTestServices(ConfigureTestServices))
.CreateClient(); .CreateClient();
ServerFactory.EnsureDatabaseCreated();
var userName = $"{Guid.NewGuid()}@example.com"; var userName = $"{Guid.NewGuid()}@example.com";
var guid = Guid.NewGuid(); var guid = Guid.NewGuid();
var email = userName; var email = userName;

View File

@ -20,7 +20,7 @@
<Reference Include="Microsoft.AspNetCore.Mvc.Testing" /> <Reference Include="Microsoft.AspNetCore.Mvc.Testing" />
<Reference Include="Microsoft.Extensions.Logging.Testing" /> <Reference Include="Microsoft.Extensions.Logging.Testing" />
<Reference Include="Microsoft.EntityFrameworkCore.InMemory" /> <Reference Include="Microsoft.EntityFrameworkCore.Sqlite" />
<Reference Include="AngleSharp" /> <Reference Include="AngleSharp" />
</ItemGroup> </ItemGroup>

View File

@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
where TStartup : class where TStartup : class
where TContext : DbContext where TContext : DbContext
{ {
public RegistrationTests(ServerFactory<TStartup, TContext> serverFactory) protected RegistrationTests(ServerFactory<TStartup, TContext> serverFactory)
{ {
ServerFactory = serverFactory; ServerFactory = serverFactory;
} }
@ -31,6 +31,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)) .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices))
.CreateClient(); .CreateClient();
ServerFactory.EnsureDatabaseCreated();
var userName = $"{Guid.NewGuid()}@example.com"; var userName = $"{Guid.NewGuid()}@example.com";
var password = $"!Test.Password1$"; var password = $"!Test.Password1$";
@ -49,6 +51,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
var client = server.CreateClient(); var client = server.CreateClient();
var client2 = server.CreateClient(); var client2 = server.CreateClient();
ServerFactory.EnsureDatabaseCreated();
var userName = $"{Guid.NewGuid()}@example.com"; var userName = $"{Guid.NewGuid()}@example.com";
var password = $"!Test.Password1$"; var password = $"!Test.Password1$";
@ -81,6 +85,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
var client = server.CreateClient(); var client = server.CreateClient();
var client2 = server.CreateClient(); var client2 = server.CreateClient();
ServerFactory.EnsureDatabaseCreated();
var userName = $"{Guid.NewGuid()}@example.com"; var userName = $"{Guid.NewGuid()}@example.com";
var password = $"!Test.Password1$"; var password = $"!Test.Password1$";
@ -102,6 +108,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)) .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices))
.CreateClient(); .CreateClient();
ServerFactory.EnsureDatabaseCreated();
var userName = $"{Guid.NewGuid()}@example.com"; var userName = $"{Guid.NewGuid()}@example.com";
var password = $"!Test.Password1$"; var password = $"!Test.Password1$";
@ -121,6 +129,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)) .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices))
.CreateClient(); .CreateClient();
ServerFactory.EnsureDatabaseCreated();
var guid = Guid.NewGuid(); var guid = Guid.NewGuid();
var userName = $"{guid}"; var userName = $"{guid}";
var email = $"{guid}@example.com"; var email = $"{guid}@example.com";
@ -141,6 +151,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)) .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices))
.CreateClient(); .CreateClient();
ServerFactory.EnsureDatabaseCreated();
var guid = Guid.NewGuid(); var guid = Guid.NewGuid();
var userName = $"{guid}"; var userName = $"{guid}";
var email = $"{guid}@example.com"; var email = $"{guid}@example.com";
@ -162,6 +174,8 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
.WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices)) .WithWebHostBuilder(whb => whb.ConfigureServices(ConfigureTestServices))
.CreateClient(); .CreateClient();
ServerFactory.EnsureDatabaseCreated();
var guid = Guid.NewGuid(); var guid = Guid.NewGuid();
var userName = $"{guid}"; var userName = $"{guid}";
var email = $"{guid}@example.com"; var email = $"{guid}@example.com";

View File

@ -4,11 +4,13 @@
using System; using System;
using System.Linq.Expressions; using System.Linq.Expressions;
using Microsoft.AspNetCore.Identity.Test; using Microsoft.AspNetCore.Identity.Test;
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Xunit;
namespace Microsoft.AspNetCore.Identity.InMemory.Test namespace Microsoft.AspNetCore.Identity.InMemory.Test
{ {
public class InMemoryUserStoreTest : UserManagerSpecificationTestBase<PocoUser, string> public class InMemoryUserStoreTest : UserManagerSpecificationTestBase<PocoUser, string>, IClassFixture<InMemoryUserStoreTest.Fixture>
{ {
protected override object CreateTestContext() protected override object CreateTestContext()
{ {
@ -41,5 +43,22 @@ namespace Microsoft.AspNetCore.Identity.InMemory.Test
protected override Expression<Func<PocoUser, bool>> UserNameEqualsPredicate(string userName) => u => u.UserName == userName; protected override Expression<Func<PocoUser, bool>> UserNameEqualsPredicate(string userName) => u => u.UserName == userName;
protected override Expression<Func<PocoUser, bool>> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName); protected override Expression<Func<PocoUser, bool>> UserNameStartsWithPredicate(string userName) => u => u.UserName.StartsWith(userName);
public class Fixture : IDisposable
{
private readonly SqliteConnection _connection
= new SqliteConnection($"DataSource=:memory:");
public Fixture()
{
_connection.Open();
}
public void Dispose()
{
_connection.Close();
_connection.Dispose();
}
}
} }
} }

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
@ -14,6 +14,7 @@
<Reference Include="Microsoft.AspNetCore.Identity.Specification.Tests" /> <Reference Include="Microsoft.AspNetCore.Identity.Specification.Tests" />
<Reference Include="Microsoft.AspNetCore.Identity" /> <Reference Include="Microsoft.AspNetCore.Identity" />
<Reference Include="Microsoft.AspNetCore.TestHost" /> <Reference Include="Microsoft.AspNetCore.TestHost" />
<Reference Include="Microsoft.EntityFrameworkCore.Sqlite" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -39,6 +39,7 @@ namespace Microsoft.AspNetCore.Mvc.Testing
protected virtual Microsoft.AspNetCore.Hosting.IWebHostBuilder CreateWebHostBuilder() { throw null; } protected virtual Microsoft.AspNetCore.Hosting.IWebHostBuilder CreateWebHostBuilder() { throw null; }
public void Dispose() { } public void Dispose() { }
protected virtual void Dispose(bool disposing) { } protected virtual void Dispose(bool disposing) { }
public virtual void EnsureDatabaseCreated() { }
~WebApplicationFactory() { } ~WebApplicationFactory() { }
protected virtual System.Collections.Generic.IEnumerable<System.Reflection.Assembly> GetTestAssemblies() { throw null; } protected virtual System.Collections.Generic.IEnumerable<System.Reflection.Assembly> GetTestAssemblies() { throw null; }
public Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory<TEntryPoint> WithWebHostBuilder(System.Action<Microsoft.AspNetCore.Hosting.IWebHostBuilder> configuration) { throw null; } public Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory<TEntryPoint> WithWebHostBuilder(System.Action<Microsoft.AspNetCore.Hosting.IWebHostBuilder> configuration) { throw null; }

View File

@ -162,6 +162,12 @@ namespace Microsoft.AspNetCore.Mvc.Testing
SetContentRoot(builder); SetContentRoot(builder);
_configuration(builder); _configuration(builder);
_server = CreateServer(builder); _server = CreateServer(builder);
EnsureDatabaseCreated();
}
public virtual void EnsureDatabaseCreated()
{
} }
private void SetContentRoot(IWebHostBuilder builder) private void SetContentRoot(IWebHostBuilder builder)