Tweak AddToRole duplicate behavior
This commit is contained in:
parent
1c861c6f8a
commit
d60bcac9b4
|
|
@ -205,7 +205,6 @@ namespace Microsoft.AspNet.Identity
|
||||||
/// true if the backing user store supports user emails, otherwise false.
|
/// true if the backing user store supports user emails, otherwise false.
|
||||||
/// </value>
|
/// </value>
|
||||||
public virtual bool SupportsUserEmail
|
public virtual bool SupportsUserEmail
|
||||||
|
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
|
@ -1032,8 +1031,7 @@ namespace Microsoft.AspNet.Identity
|
||||||
throw new ArgumentNullException("user");
|
throw new ArgumentNullException("user");
|
||||||
}
|
}
|
||||||
|
|
||||||
var userRoles = await userRoleStore.GetRolesAsync(user, CancellationToken);
|
if (await userRoleStore.IsInRoleAsync(user, role, CancellationToken))
|
||||||
if (userRoles.Contains(role))
|
|
||||||
{
|
{
|
||||||
return await UserAlreadyInRoleError(user, role);
|
return await UserAlreadyInRoleError(user, role);
|
||||||
}
|
}
|
||||||
|
|
@ -1063,10 +1061,9 @@ namespace Microsoft.AspNet.Identity
|
||||||
throw new ArgumentNullException("roles");
|
throw new ArgumentNullException("roles");
|
||||||
}
|
}
|
||||||
|
|
||||||
var userRoles = await userRoleStore.GetRolesAsync(user, CancellationToken);
|
foreach (var role in roles.Distinct())
|
||||||
foreach (var role in roles)
|
|
||||||
{
|
{
|
||||||
if (userRoles.Contains(role))
|
if (await userRoleStore.IsInRoleAsync(user, role, CancellationToken))
|
||||||
{
|
{
|
||||||
return await UserAlreadyInRoleError(user, role);
|
return await UserAlreadyInRoleError(user, role);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -270,7 +270,7 @@ namespace Microsoft.AspNet.Identity.Test
|
||||||
// Setup
|
// Setup
|
||||||
var store = new Mock<IUserRoleStore<TestUser>>();
|
var store = new Mock<IUserRoleStore<TestUser>>();
|
||||||
var user = new TestUser { UserName = "Foo" };
|
var user = new TestUser { UserName = "Foo" };
|
||||||
var roles = new string[] { "A", "B", "C" };
|
var roles = new string[] { "A", "B", "C", "C" };
|
||||||
store.Setup(s => s.AddToRoleAsync(user, "A", CancellationToken.None))
|
store.Setup(s => s.AddToRoleAsync(user, "A", CancellationToken.None))
|
||||||
.Returns(Task.FromResult(0))
|
.Returns(Task.FromResult(0))
|
||||||
.Verifiable();
|
.Verifiable();
|
||||||
|
|
@ -280,8 +280,17 @@ namespace Microsoft.AspNet.Identity.Test
|
||||||
store.Setup(s => s.AddToRoleAsync(user, "C", CancellationToken.None))
|
store.Setup(s => s.AddToRoleAsync(user, "C", CancellationToken.None))
|
||||||
.Returns(Task.FromResult(0))
|
.Returns(Task.FromResult(0))
|
||||||
.Verifiable();
|
.Verifiable();
|
||||||
|
|
||||||
store.Setup(s => s.UpdateAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable();
|
store.Setup(s => s.UpdateAsync(user, CancellationToken.None)).ReturnsAsync(IdentityResult.Success).Verifiable();
|
||||||
store.Setup(s => s.GetRolesAsync(user, CancellationToken.None)).ReturnsAsync(new List<string>()).Verifiable();
|
store.Setup(s => s.IsInRoleAsync(user, "A", CancellationToken.None))
|
||||||
|
.Returns(Task.FromResult(false))
|
||||||
|
.Verifiable();
|
||||||
|
store.Setup(s => s.IsInRoleAsync(user, "B", CancellationToken.None))
|
||||||
|
.Returns(Task.FromResult(false))
|
||||||
|
.Verifiable();
|
||||||
|
store.Setup(s => s.IsInRoleAsync(user, "C", CancellationToken.None))
|
||||||
|
.Returns(Task.FromResult(false))
|
||||||
|
.Verifiable();
|
||||||
var userManager = MockHelpers.TestUserManager<TestUser>(store.Object);
|
var userManager = MockHelpers.TestUserManager<TestUser>(store.Object);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -290,6 +299,7 @@ namespace Microsoft.AspNet.Identity.Test
|
||||||
// Assert
|
// Assert
|
||||||
Assert.True(result.Succeeded);
|
Assert.True(result.Succeeded);
|
||||||
store.VerifyAll();
|
store.VerifyAll();
|
||||||
|
store.Verify(s => s.AddToRoleAsync(user, "C", CancellationToken.None), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -302,8 +312,10 @@ namespace Microsoft.AspNet.Identity.Test
|
||||||
store.Setup(s => s.AddToRoleAsync(user, "A", CancellationToken.None))
|
store.Setup(s => s.AddToRoleAsync(user, "A", CancellationToken.None))
|
||||||
.Returns(Task.FromResult(0))
|
.Returns(Task.FromResult(0))
|
||||||
.Verifiable();
|
.Verifiable();
|
||||||
store.Setup(s => s.GetRolesAsync(user, CancellationToken.None)).ReturnsAsync(new List<string> { "B" }).Verifiable();
|
store.Setup(s => s.IsInRoleAsync(user, "B", CancellationToken.None))
|
||||||
var userManager = MockHelpers.TestUserManager<TestUser>(store.Object);
|
.Returns(Task.FromResult(true))
|
||||||
|
.Verifiable();
|
||||||
|
var userManager = MockHelpers.TestUserManager(store.Object);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = await userManager.AddToRolesAsync(user, roles);
|
var result = await userManager.AddToRolesAsync(user, roles);
|
||||||
|
|
|
||||||
|
|
@ -1405,6 +1405,23 @@ namespace Microsoft.AspNet.Identity.Test
|
||||||
IdentityResultAssert.VerifyLogMessage(userMgr.Logger, $"User {await userMgr.GetUserIdAsync(user)} is already in role {roleName}.");
|
IdentityResultAssert.VerifyLogMessage(userMgr.Logger, $"User {await userMgr.GetUserIdAsync(user)} is already in role {roleName}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[ConditionalTheory]
|
||||||
|
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
|
||||||
|
public async Task AddUserToRolesIgnoresDuplicates()
|
||||||
|
{
|
||||||
|
var context = CreateTestContext();
|
||||||
|
var userMgr = CreateManager(context);
|
||||||
|
var roleMgr = CreateRoleManager(context);
|
||||||
|
var roleName = "addUserDupeTest" + Guid.NewGuid().ToString();
|
||||||
|
var role = CreateTestRole(roleName, useRoleNamePrefixAsRoleName: true);
|
||||||
|
var user = CreateTestUser();
|
||||||
|
IdentityResultAssert.IsSuccess(await userMgr.CreateAsync(user));
|
||||||
|
IdentityResultAssert.IsSuccess(await roleMgr.CreateAsync(role));
|
||||||
|
Assert.False(await userMgr.IsInRoleAsync(user, roleName));
|
||||||
|
IdentityResultAssert.IsSuccess(await userMgr.AddToRolesAsync(user, new[] { roleName, roleName }));
|
||||||
|
Assert.True(await userMgr.IsInRoleAsync(user, roleName));
|
||||||
|
}
|
||||||
|
|
||||||
[ConditionalTheory]
|
[ConditionalTheory]
|
||||||
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
|
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
|
||||||
public async Task CanFindRoleByNameWithManager()
|
public async Task CanFindRoleByNameWithManager()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue