Update Identity tests for EF breaking changes

Specifically:
* Removal of Relational()
* Query changes

There is some kind of flakiness still impacting these tests. It may be a race condition in EF query generation, or it may be an issue with the test infrastructure

Also, one database error page test is currently disabled.
This commit is contained in:
Arthur Vickers 2019-05-30 13:20:29 -07:00
parent 18a230737a
commit 9ebabc1337
10 changed files with 126 additions and 101 deletions

View File

@ -250,6 +250,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed(); ThrowIfDisposed();
return Users.FirstOrDefaultAsync(u => u.NormalizedUserName == normalizedUserName, cancellationToken); return Users.FirstOrDefaultAsync(u => u.NormalizedUserName == normalizedUserName, cancellationToken);
} }
@ -311,7 +312,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore
throw new ArgumentNullException(nameof(user)); throw new ArgumentNullException(nameof(user));
} }
return await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).Select(c => c.ToClaim()).ToListAsync(cancellationToken); // TODO: Fix once EF query works Issue #10668
return (await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).ToListAsync(cancellationToken)).Select(c => c.ToClaim()).ToList();
} }
/// <summary> /// <summary>
@ -502,7 +504,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed(); ThrowIfDisposed();
return Users.SingleOrDefaultAsync(u => u.NormalizedEmail == normalizedEmail, cancellationToken); // TODO: Fix once EF query works Issue #10668
return Task.FromResult(Users.Where(u => u.NormalizedEmail == normalizedEmail).ToList().SingleOrDefault());
} }
/// <summary> /// <summary>

View File

@ -251,6 +251,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed(); ThrowIfDisposed();
return Users.FirstOrDefaultAsync(u => u.NormalizedUserName == normalizedUserName, cancellationToken); return Users.FirstOrDefaultAsync(u => u.NormalizedUserName == normalizedUserName, cancellationToken);
} }
@ -444,7 +445,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore
throw new ArgumentNullException(nameof(user)); throw new ArgumentNullException(nameof(user));
} }
return await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).Select(c => c.ToClaim()).ToListAsync(cancellationToken); // TODO: Fix once EF query works Issue #10668
return (await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).ToListAsync(cancellationToken)).Select(c => c.ToClaim()).ToList();
} }
/// <summary> /// <summary>
@ -635,7 +637,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed(); ThrowIfDisposed();
return Users.SingleOrDefaultAsync(u => u.NormalizedEmail == normalizedEmail, cancellationToken); // TODO: Fix once EF query works Issue #10668
return Task.FromResult(Users.Where(u => u.NormalizedEmail == normalizedEmail).ToList().SingleOrDefault());
} }
/// <summary> /// <summary>

View File

@ -2,11 +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 System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.Test; using Microsoft.AspNetCore.Identity.Test;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Xunit; using Xunit;

View File

@ -6,19 +6,12 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
{ {
public class CustomPocoTest : IClassFixture<ScratchDatabaseFixture> public class CustomPocoTest
{ {
private readonly ScratchDatabaseFixture _fixture;
public CustomPocoTest(ScratchDatabaseFixture fixture)
{
_fixture = fixture;
}
public class User<TKey> where TKey : IEquatable<TKey> public class User<TKey> where TKey : IEquatable<TKey>
{ {
@ -35,30 +28,17 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
} }
private CustomDbContext<TKey> GetContext<TKey>() where TKey : IEquatable<TKey>
{
return DbUtil.Create<CustomDbContext<TKey>>(_fixture.Connection);
}
public CustomDbContext<TKey> CreateContext<TKey>(bool delete = false) where TKey : IEquatable<TKey>
{
var db = GetContext<TKey>();
if (delete)
{
db.Database.EnsureDeleted();
}
db.Database.EnsureCreated();
return db;
}
[ConditionalFact] [ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)] [FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanUpdateNameGuid() public async Task CanUpdateNameGuid()
{ {
using (var db = CreateContext<Guid>(true)) using (var db = new CustomDbContext<Guid>(
new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
{ {
db.Database.EnsureCreated();
var oldName = Guid.NewGuid().ToString(); var oldName = Guid.NewGuid().ToString();
var user = new User<Guid> { UserName = oldName, Id = Guid.NewGuid() }; var user = new User<Guid> { UserName = oldName, Id = Guid.NewGuid() };
db.Users.Add(user); db.Users.Add(user);
@ -68,6 +48,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
await db.SaveChangesAsync(); await db.SaveChangesAsync();
Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName)); Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName));
Assert.Equal(user, db.Users.Single(u => u.UserName == newName)); Assert.Equal(user, db.Users.Single(u => u.UserName == newName));
db.Database.EnsureDeleted();
} }
} }
@ -77,8 +59,11 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanUpdateNameString() public async Task CanUpdateNameString()
{ {
using (var db = CreateContext<string>(true)) using (var db = new CustomDbContext<string>(
new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
{ {
db.Database.EnsureCreated();
var oldName = Guid.NewGuid().ToString(); var oldName = Guid.NewGuid().ToString();
var user = new User<string> { UserName = oldName, Id = Guid.NewGuid().ToString() }; var user = new User<string> { UserName = oldName, Id = Guid.NewGuid().ToString() };
db.Users.Add(user); db.Users.Add(user);
@ -88,6 +73,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
await db.SaveChangesAsync(); await db.SaveChangesAsync();
Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName)); Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName));
Assert.Equal(user, db.Users.Single(u => u.UserName == newName)); Assert.Equal(user, db.Users.Single(u => u.UserName == newName));
db.Database.EnsureDeleted();
} }
} }
@ -97,8 +84,11 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanCreateUserInt() public async Task CanCreateUserInt()
{ {
using (var db = CreateContext<int>(true)) using (var db = new CustomDbContext<int>(
new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
{ {
db.Database.EnsureCreated();
var user = new User<int>(); var user = new User<int>();
db.Users.Add(user); db.Users.Add(user);
await db.SaveChangesAsync(); await db.SaveChangesAsync();
@ -106,6 +96,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
await db.SaveChangesAsync(); await db.SaveChangesAsync();
var fetch = db.Users.First(u => u.UserName == "Boo"); var fetch = db.Users.First(u => u.UserName == "Boo");
Assert.Equal(user, fetch); Assert.Equal(user, fetch);
db.Database.EnsureDeleted();
} }
} }
@ -115,8 +107,11 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanCreateUserIntViaSet() public async Task CanCreateUserIntViaSet()
{ {
using (var db = CreateContext<int>(true)) using (var db = new CustomDbContext<int>(
new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
{ {
db.Database.EnsureCreated();
var user = new User<int>(); var user = new User<int>();
var users = db.Set<User<int>>(); var users = db.Set<User<int>>();
users.Add(user); users.Add(user);
@ -125,6 +120,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
await db.SaveChangesAsync(); await db.SaveChangesAsync();
var fetch = users.First(u => u.UserName == "Boo"); var fetch = users.First(u => u.UserName == "Boo");
Assert.Equal(user, fetch); Assert.Equal(user, fetch);
db.Database.EnsureDeleted();
} }
} }
@ -134,8 +131,11 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanUpdateNameInt() public async Task CanUpdateNameInt()
{ {
using (var db = CreateContext<int>(true)) using (var db = new CustomDbContext<int>(
new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
{ {
db.Database.EnsureCreated();
var oldName = Guid.NewGuid().ToString(); var oldName = Guid.NewGuid().ToString();
var user = new User<int> { UserName = oldName }; var user = new User<int> { UserName = oldName };
db.Users.Add(user); db.Users.Add(user);
@ -145,6 +145,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
await db.SaveChangesAsync(); await db.SaveChangesAsync();
Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName)); Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName));
Assert.Equal(user, db.Users.Single(u => u.UserName == newName)); Assert.Equal(user, db.Users.Single(u => u.UserName == newName));
db.Database.EnsureDeleted();
} }
} }
@ -154,8 +156,11 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanUpdateNameIntWithSet() public async Task CanUpdateNameIntWithSet()
{ {
using (var db = CreateContext<int>(true)) using (var db = new CustomDbContext<int>(
new DbContextOptionsBuilder().UseSqlite($"DataSource=D{Guid.NewGuid()}.db").Options))
{ {
db.Database.EnsureCreated();
var oldName = Guid.NewGuid().ToString(); var oldName = Guid.NewGuid().ToString();
var user = new User<int> { UserName = oldName }; var user = new User<int> { UserName = oldName };
db.Set<User<int>>().Add(user); db.Set<User<int>>().Add(user);
@ -165,6 +170,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
await db.SaveChangesAsync(); await db.SaveChangesAsync();
Assert.Null(db.Set<User<int>>().SingleOrDefault(u => u.UserName == oldName)); Assert.Null(db.Set<User<int>>().SingleOrDefault(u => u.UserName == oldName));
Assert.Equal(user, db.Set<User<int>>().Single(u => u.UserName == newName)); Assert.Equal(user, db.Set<User<int>>().Single(u => u.UserName == newName));
db.Database.EnsureDeleted();
} }
} }
} }

View File

@ -44,9 +44,11 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
{ {
var count = 0; var count = 0;
foreach (var property in context.Model.GetEntityTypes().Single(e => e.Relational().TableName == table).GetProperties()) // TODO: Use new API once EF is updated. Issue #10671
foreach (var property in context.Model.GetEntityTypes().Single(e => (string)e.FindAnnotation("Relational:TableName")?.Value == table).GetProperties())
{ {
if (!columns.Contains(property.Relational().ColumnName)) // TODO: Use new API once EF is updated. Issue #10671
if (!columns.Contains((string)property.FindAnnotation("Relational:ColumnName")?.Value ?? property.Name))
{ {
continue; continue;
} }

View File

@ -36,9 +36,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
_builder = new ApplicationBuilder(provider); _builder = new ApplicationBuilder(provider);
using(var scoped = provider.GetRequiredService<IServiceScopeFactory>().CreateScope()) using(var scoped = provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
using (var db = scoped.ServiceProvider.GetRequiredService<IdentityDbContext>())
{ {
db.Database.EnsureCreated(); scoped.ServiceProvider.GetRequiredService<IdentityDbContext>().Database.EnsureCreated();
} }
} }

View File

@ -45,13 +45,9 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
} }
} }
private IdentityDbContext CreateContext(bool delete = false) private IdentityDbContext CreateContext()
{ {
var db = DbUtil.Create<IdentityDbContext>(_fixture.Connection); var db = DbUtil.Create<IdentityDbContext>(_fixture.Connection);
if (delete)
{
db.Database.EnsureDeleted();
}
db.Database.EnsureCreated(); db.Database.EnsureCreated();
return db; return db;
} }
@ -234,14 +230,17 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task ConcurrentUpdatesWillFail() public async Task ConcurrentUpdatesWillFail()
{ {
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
var user = CreateTestUser(); var user = CreateTestUser();
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
{ {
db.Database.EnsureCreated();
var manager = CreateManager(db); var manager = CreateManager(db);
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
} }
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
using (var db2 = CreateContext()) using (var db2 = new IdentityDbContext(options))
{ {
var manager1 = CreateManager(db); var manager1 = CreateManager(db);
var manager2 = CreateManager(db2); var manager2 = CreateManager(db2);
@ -254,23 +253,28 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
user2.UserName = Guid.NewGuid().ToString(); user2.UserName = Guid.NewGuid().ToString();
IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(user1)); IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(user1));
IdentityResultAssert.IsFailure(await manager2.UpdateAsync(user2), new IdentityErrorDescriber().ConcurrencyFailure()); IdentityResultAssert.IsFailure(await manager2.UpdateAsync(user2), new IdentityErrorDescriber().ConcurrencyFailure());
db.Database.EnsureDeleted();
} }
} }
[ConditionalFact] [ConditionalFact(Skip = "TODO: Fix for new EF. Issue #10670")]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)] [FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task ConcurrentUpdatesWillFailWithDetachedUser() public async Task ConcurrentUpdatesWillFailWithDetachedUser()
{ {
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
var user = CreateTestUser(); var user = CreateTestUser();
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
{ {
db.Database.EnsureCreated();
var manager = CreateManager(db); var manager = CreateManager(db);
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
} }
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
using (var db2 = CreateContext()) using (var db2 = new IdentityDbContext(options))
{ {
var manager1 = CreateManager(db); var manager1 = CreateManager(db);
var manager2 = CreateManager(db2); var manager2 = CreateManager(db2);
@ -281,6 +285,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
user2.UserName = Guid.NewGuid().ToString(); user2.UserName = Guid.NewGuid().ToString();
IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(user)); IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(user));
IdentityResultAssert.IsFailure(await manager2.UpdateAsync(user2), new IdentityErrorDescriber().ConcurrencyFailure()); IdentityResultAssert.IsFailure(await manager2.UpdateAsync(user2), new IdentityErrorDescriber().ConcurrencyFailure());
db.Database.EnsureDeleted();
} }
} }
@ -290,14 +296,17 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task DeleteAModifiedUserWillFail() public async Task DeleteAModifiedUserWillFail()
{ {
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
var user = CreateTestUser(); var user = CreateTestUser();
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
{ {
db.Database.EnsureCreated();
var manager = CreateManager(db); var manager = CreateManager(db);
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
} }
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
using (var db2 = CreateContext()) using (var db2 = new IdentityDbContext(options))
{ {
var manager1 = CreateManager(db); var manager1 = CreateManager(db);
var manager2 = CreateManager(db2); var manager2 = CreateManager(db2);
@ -309,6 +318,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
user1.UserName = Guid.NewGuid().ToString(); user1.UserName = Guid.NewGuid().ToString();
IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(user1)); IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(user1));
IdentityResultAssert.IsFailure(await manager2.DeleteAsync(user2), new IdentityErrorDescriber().ConcurrencyFailure()); IdentityResultAssert.IsFailure(await manager2.DeleteAsync(user2), new IdentityErrorDescriber().ConcurrencyFailure());
db.Database.EnsureDeleted();
} }
} }
@ -318,14 +329,17 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task ConcurrentRoleUpdatesWillFail() public async Task ConcurrentRoleUpdatesWillFail()
{ {
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
var role = new IdentityRole(Guid.NewGuid().ToString()); var role = new IdentityRole(Guid.NewGuid().ToString());
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
{ {
db.Database.EnsureCreated();
var manager = CreateRoleManager(db); var manager = CreateRoleManager(db);
IdentityResultAssert.IsSuccess(await manager.CreateAsync(role)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(role));
} }
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
using (var db2 = CreateContext()) using (var db2 = new IdentityDbContext(options))
{ {
var manager1 = CreateRoleManager(db); var manager1 = CreateRoleManager(db);
var manager2 = CreateRoleManager(db2); var manager2 = CreateRoleManager(db2);
@ -338,6 +352,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
role2.Name = Guid.NewGuid().ToString(); role2.Name = Guid.NewGuid().ToString();
IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(role1)); IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(role1));
IdentityResultAssert.IsFailure(await manager2.UpdateAsync(role2), new IdentityErrorDescriber().ConcurrencyFailure()); IdentityResultAssert.IsFailure(await manager2.UpdateAsync(role2), new IdentityErrorDescriber().ConcurrencyFailure());
db.Database.EnsureDeleted();
} }
} }
@ -347,14 +363,17 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task ConcurrentRoleUpdatesWillFailWithDetachedRole() public async Task ConcurrentRoleUpdatesWillFailWithDetachedRole()
{ {
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
var role = new IdentityRole(Guid.NewGuid().ToString()); var role = new IdentityRole(Guid.NewGuid().ToString());
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
{ {
db.Database.EnsureCreated();
var manager = CreateRoleManager(db); var manager = CreateRoleManager(db);
IdentityResultAssert.IsSuccess(await manager.CreateAsync(role)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(role));
} }
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
using (var db2 = CreateContext()) using (var db2 = new IdentityDbContext(options))
{ {
var manager1 = CreateRoleManager(db); var manager1 = CreateRoleManager(db);
var manager2 = CreateRoleManager(db2); var manager2 = CreateRoleManager(db2);
@ -366,6 +385,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
role2.Name = Guid.NewGuid().ToString(); role2.Name = Guid.NewGuid().ToString();
IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(role)); IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(role));
IdentityResultAssert.IsFailure(await manager2.UpdateAsync(role2), new IdentityErrorDescriber().ConcurrencyFailure()); IdentityResultAssert.IsFailure(await manager2.UpdateAsync(role2), new IdentityErrorDescriber().ConcurrencyFailure());
db.Database.EnsureDeleted();
} }
} }
@ -375,14 +396,17 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task DeleteAModifiedRoleWillFail() public async Task DeleteAModifiedRoleWillFail()
{ {
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
var role = new IdentityRole(Guid.NewGuid().ToString()); var role = new IdentityRole(Guid.NewGuid().ToString());
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
{ {
db.Database.EnsureCreated();
var manager = CreateRoleManager(db); var manager = CreateRoleManager(db);
IdentityResultAssert.IsSuccess(await manager.CreateAsync(role)); IdentityResultAssert.IsSuccess(await manager.CreateAsync(role));
} }
using (var db = CreateContext()) using (var db = new IdentityDbContext(options))
using (var db2 = CreateContext()) using (var db2 = new IdentityDbContext(options))
{ {
var manager1 = CreateRoleManager(db); var manager1 = CreateRoleManager(db);
var manager2 = CreateRoleManager(db2); var manager2 = CreateRoleManager(db2);
@ -394,6 +418,8 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
role1.Name = Guid.NewGuid().ToString(); role1.Name = Guid.NewGuid().ToString();
IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(role1)); IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(role1));
IdentityResultAssert.IsFailure(await manager2.DeleteAsync(role2), new IdentityErrorDescriber().ConcurrencyFailure()); IdentityResultAssert.IsFailure(await manager2.DeleteAsync(role2), new IdentityErrorDescriber().ConcurrencyFailure());
db.Database.EnsureDeleted();
} }
} }

View File

@ -3,8 +3,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
@ -17,9 +15,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost; using Microsoft.AspNetCore.TestHost;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Xunit; using Xunit;
@ -160,8 +156,9 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests
{ {
db.SaveChanges(); db.SaveChanges();
} }
catch (SqlException) catch (Exception e)
{ {
Assert.Equal("SqlException", e.GetType().Name);
} }
} }
} }
@ -351,17 +348,16 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests
}); });
var server = new TestServer(builder); var server = new TestServer(builder);
var ex = await Assert.ThrowsAsync<SqlException>(async () => try
{ {
try await server.CreateClient().GetAsync("http://localhost/");
{ }
await server.CreateClient().GetAsync("http://localhost/"); catch (Exception exception)
} {
catch (InvalidOperationException exception) when (exception.InnerException != null) Assert.True(
{ exception.GetType().Name == "SqlException"
throw exception.InnerException; || exception.InnerException?.GetType().Name == "SqlException");
} }
});
Assert.Contains(logProvider.Logger.Messages.ToList(), m => Assert.Contains(logProvider.Logger.Messages.ToList(), m =>
m.StartsWith(StringsHelpers.GetResourceString("FormatDatabaseErrorPageMiddleware_ContextNotRegistered", typeof(BloggingContext)))); m.StartsWith(StringsHelpers.GetResourceString("FormatDatabaseErrorPageMiddleware_ContextNotRegistered", typeof(BloggingContext))));
@ -406,17 +402,16 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests
var server = SetupTestServer<BloggingContextWithSnapshotThatThrows, ExceptionInLogicMiddleware>(database, logProvider); var server = SetupTestServer<BloggingContextWithSnapshotThatThrows, ExceptionInLogicMiddleware>(database, logProvider);
var ex = await Assert.ThrowsAsync<SqlException>(async () => try
{ {
try await server.CreateClient().GetAsync("http://localhost/");
{ }
await server.CreateClient().GetAsync("http://localhost/"); catch (Exception exception)
} {
catch (InvalidOperationException exception) when (exception.InnerException != null) Assert.True(
{ exception.GetType().Name == "SqlException"
throw exception.InnerException; || exception.InnerException?.GetType().Name == "SqlException");
} }
});
Assert.Contains(logProvider.Logger.Messages.ToList(), m => Assert.Contains(logProvider.Logger.Messages.ToList(), m =>
m.StartsWith(StringsHelpers.GetResourceString("FormatDatabaseErrorPageMiddleware_Exception"))); m.StartsWith(StringsHelpers.GetResourceString("FormatDatabaseErrorPageMiddleware_Exception")));

View File

@ -2,7 +2,6 @@
// 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.SqlClient;
using System.Threading; using System.Threading;
using Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.FunctionalTests.Helpers; using Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.FunctionalTests.Helpers;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -24,13 +23,7 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests
private SqlServerTestStore(string name) private SqlServerTestStore(string name)
{ {
_connectionString = new SqlConnectionStringBuilder _connectionString = $@"Server=(localdb)\mssqllocaldb;Database={name};Timeout=600";
{
DataSource = @"(localdb)\MSSQLLocalDB",
InitialCatalog = name,
IntegratedSecurity = true,
ConnectTimeout = 600
}.ConnectionString;
} }
public string ConnectionString public string ConnectionString
@ -57,4 +50,4 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests
EnsureDeleted(); EnsureDeleted();
} }
} }
} }

View File

@ -1,4 +1,4 @@
// 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.Net; using System.Net;
@ -18,7 +18,7 @@ namespace Microsoft.AspNetCore.Diagnostics.FunctionalTests
public HttpClient Client { get; } public HttpClient Client { get; }
[ConditionalFact] [ConditionalFact(Skip = "TODO: EF query interception for opening connection. Issue #10672")]
[OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)] [OSSkipCondition(OperatingSystems.MacOSX)]
public async Task DatabaseErrorPage_ShowsError() public async Task DatabaseErrorPage_ShowsError()