diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs b/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs index 950189dfb5..c3a4ee18f0 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.Test/UserStoreTest.cs @@ -301,6 +301,30 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test } } + [Fact] + public async Task ConcurrentUpdatesWillFailWithDetachedUser() + { + var user = CreateTestUser(); + using (var db = CreateContext()) + { + var manager = CreateManager(db); + IdentityResultAssert.IsSuccess(await manager.CreateAsync(user)); + } + using (var db = CreateContext()) + using (var db2 = CreateContext()) + { + var manager1 = CreateManager(db); + var manager2 = CreateManager(db2); + var user2 = await manager2.FindByIdAsync(user.Id); + Assert.NotNull(user2); + Assert.NotSame(user, user2); + user.UserName = Guid.NewGuid().ToString(); + user2.UserName = Guid.NewGuid().ToString(); + IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(user)); + IdentityResultAssert.IsFailure(await manager2.UpdateAsync(user2), IdentityErrorDescriber.Default.ConcurrencyFailure()); + } + } + [Fact] public async Task DeleteAModifiedUserWillFail() { @@ -352,6 +376,31 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test } } + [Fact] + public async Task ConcurrentRoleUpdatesWillFailWithDetachedRole() + { + var role = new IdentityRole(Guid.NewGuid().ToString()); + using (var db = CreateContext()) + { + var manager = CreateRoleManager(db); + IdentityResultAssert.IsSuccess(await manager.CreateAsync(role)); + } + using (var db = CreateContext()) + using (var db2 = CreateContext()) + { + var manager1 = CreateRoleManager(db); + var manager2 = CreateRoleManager(db2); + var role2 = await manager2.FindByIdAsync(role.Id); + Assert.NotNull(role); + Assert.NotNull(role2); + Assert.NotSame(role, role2); + role.Name = Guid.NewGuid().ToString(); + role2.Name = Guid.NewGuid().ToString(); + IdentityResultAssert.IsSuccess(await manager1.UpdateAsync(role)); + IdentityResultAssert.IsFailure(await manager2.UpdateAsync(role2), IdentityErrorDescriber.Default.ConcurrencyFailure()); + } + } + [Fact] public async Task DeleteAModifiedRoleWillFail() {