diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs
index e9646d38cf..bac63a0c11 100644
--- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs
+++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs
@@ -981,7 +981,7 @@ namespace Volo.Abp.Identity
/// The value of the token.
/// The used to propagate notifications that the operation should be canceled.
/// The that represents the asynchronous operation.
- public virtual async Task SetTokenAsync([NotNull] IdentityUser user, string loginProvider, string name, string value, CancellationToken cancellationToken)
+ public virtual async Task SetTokenAsync([NotNull] IdentityUser user, string loginProvider, string name, string value, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -1000,7 +1000,7 @@ namespace Volo.Abp.Identity
/// The name of the token.
/// The used to propagate notifications that the operation should be canceled.
/// The that represents the asynchronous operation.
- public async Task RemoveTokenAsync(IdentityUser user, string loginProvider, string name, CancellationToken cancellationToken)
+ public async Task RemoveTokenAsync(IdentityUser user, string loginProvider, string name, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -1019,7 +1019,7 @@ namespace Volo.Abp.Identity
/// The name of the token.
/// The used to propagate notifications that the operation should be canceled.
/// The that represents the asynchronous operation.
- public async Task GetTokenAsync(IdentityUser user, string loginProvider, string name, CancellationToken cancellationToken)
+ public async Task GetTokenAsync(IdentityUser user, string loginProvider, string name, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -1030,12 +1030,12 @@ namespace Volo.Abp.Identity
return user.FindToken(loginProvider, name)?.Value;
}
- public Task SetAuthenticatorKeyAsync(IdentityUser user, string key, CancellationToken cancellationToken)
+ public Task SetAuthenticatorKeyAsync(IdentityUser user, string key, CancellationToken cancellationToken = default)
{
return SetTokenAsync(user, InternalLoginProvider, AuthenticatorKeyTokenName, key, cancellationToken);
}
- public Task GetAuthenticatorKeyAsync(IdentityUser user, CancellationToken cancellationToken)
+ public Task GetAuthenticatorKeyAsync(IdentityUser user, CancellationToken cancellationToken = default)
{
return GetTokenAsync(user, InternalLoginProvider, AuthenticatorKeyTokenName, cancellationToken);
}
@@ -1046,7 +1046,7 @@ namespace Volo.Abp.Identity
/// The user who owns the recovery code.
/// The used to propagate notifications that the operation should be canceled.
/// The number of valid recovery codes for the user..
- public virtual async Task CountCodesAsync(IdentityUser user, CancellationToken cancellationToken)
+ public virtual async Task CountCodesAsync(IdentityUser user, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -1068,7 +1068,7 @@ namespace Volo.Abp.Identity
/// The new recovery codes for the user.
/// The used to propagate notifications that the operation should be canceled.
/// The new recovery codes for the user.
- public virtual Task ReplaceCodesAsync(IdentityUser user, IEnumerable recoveryCodes, CancellationToken cancellationToken)
+ public virtual Task ReplaceCodesAsync(IdentityUser user, IEnumerable recoveryCodes, CancellationToken cancellationToken = default)
{
var mergedCodes = string.Join(";", recoveryCodes);
return SetTokenAsync(user, InternalLoginProvider, RecoveryCodeTokenName, mergedCodes, cancellationToken);
@@ -1082,7 +1082,7 @@ namespace Volo.Abp.Identity
/// The recovery code to use.
/// The used to propagate notifications that the operation should be canceled.
/// True if the recovery code was found for the user.
- public virtual async Task RedeemCodeAsync(IdentityUser user, string code, CancellationToken cancellationToken)
+ public virtual async Task RedeemCodeAsync(IdentityUser user, string code, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserLookupAppService_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserLookupAppService_Tests.cs
new file mode 100644
index 0000000000..7358238294
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserLookupAppService_Tests.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Identity;
+using Shouldly;
+using Xunit;
+
+namespace Volo.Abp.Identity
+{
+ public class IdentityUserLookupAppService_Tests : AbpIdentityApplicationTestBase
+ {
+ private readonly IIdentityUserLookupAppService _identityUserLookupAppService;
+ private readonly IIdentityUserRepository _identityUserRepository;
+ private readonly ILookupNormalizer _lookupNormalizer;
+
+ public IdentityUserLookupAppService_Tests()
+ {
+ _identityUserLookupAppService = GetRequiredService();
+ _identityUserRepository = GetRequiredService();
+ _lookupNormalizer = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task FindByIdAsync()
+ {
+ var user = await _identityUserRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserLookupAppService.FindByIdAsync(user.Id)).UserName.ShouldBe(user.UserName);
+ }
+
+ [Fact]
+ public async Task FindById_NotExist_Should_Return_Null()
+ {
+ var user = await _identityUserLookupAppService.FindByIdAsync(Guid.NewGuid());
+ user.ShouldBeNull();
+ }
+
+ [Fact]
+ public async Task FindByUserNameAsync()
+ {
+ var user = await _identityUserRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserLookupAppService.FindByUserNameAsync(user.UserName)).UserName.ShouldBe(user.UserName);
+ }
+
+ [Fact]
+ public async Task FindByUserName_NotExist_Should_Return_Null()
+ {
+ var user = await _identityUserLookupAppService.FindByUserNameAsync(Guid.NewGuid().ToString());
+ user.ShouldBeNull();
+ }
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdenityClaimTypeManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdenityClaimTypeManager_Tests.cs
new file mode 100644
index 0000000000..c27967e704
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdenityClaimTypeManager_Tests.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Shouldly;
+using Xunit;
+
+namespace Volo.Abp.Identity
+{
+ public class IdenityClaimTypeManager_Tests : AbpIdentityDomainTestBase
+ {
+ private readonly IIdentityClaimTypeRepository _identityClaimTypeRepository;
+ private readonly IdenityClaimTypeManager _claimTypeManager;
+ private readonly IdentityTestData _testData;
+
+ public IdenityClaimTypeManager_Tests()
+ {
+ _identityClaimTypeRepository = GetRequiredService();
+ _claimTypeManager = GetRequiredService();
+ _testData = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task CreateAsync()
+ {
+ var claimType = await _claimTypeManager.CreateAsync(new IdentityClaimType(Guid.NewGuid(), "Phone", false,
+ false, null,
+ null, null, IdentityClaimValueType.String));
+
+ claimType.ShouldNotBeNull();
+ claimType.Name.ShouldBe("Phone");
+ }
+
+ [Fact]
+ public async Task Create_Name_Exist_Should_Exception()
+ {
+ await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.CreateAsync(
+ new IdentityClaimType(
+ Guid.NewGuid(), "Age")));
+ }
+
+ [Fact]
+ public async Task UpdateAsync()
+ {
+ var ageClaim = _identityClaimTypeRepository.Find(_testData.AgeClaimId);
+ ageClaim.ShouldNotBeNull();
+ ageClaim.Description = "this is age";
+
+ var updatedAgeClaimType = await _claimTypeManager.UpdateAsync(ageClaim);
+ updatedAgeClaimType.ShouldNotBeNull();
+ updatedAgeClaimType.Description.ShouldBe("this is age");
+ }
+
+
+ [Fact]
+ public async Task Update_Name_Exist_Should_Exception()
+ {
+ await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.UpdateAsync(
+ new IdentityClaimType(
+ Guid.NewGuid(), "Age")));
+ }
+
+
+ [Fact]
+ public async Task Static_IdentityClaimType_Cant_Not_Update()
+ {
+ var phoneClaim = new IdentityClaimType(Guid.NewGuid(), "Phone", true, true);
+ _identityClaimTypeRepository.Insert(phoneClaim);
+
+ await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.UpdateAsync(phoneClaim));
+ }
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleManager_Tests.cs
new file mode 100644
index 0000000000..9cdafa10bb
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleManager_Tests.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Identity;
+using Shouldly;
+using Volo.Abp.Uow;
+using Xunit;
+
+namespace Volo.Abp.Identity
+{
+ public class IdentityRoleManager_Tests : AbpIdentityDomainTestBase
+ {
+ private readonly IdentityRoleManager _identityRoleManager;
+ private readonly IIdentityRoleRepository _identityRoleRepository;
+ private readonly ILookupNormalizer _lookupNormalizer;
+ private readonly IdentityTestData _testData;
+
+ public IdentityRoleManager_Tests()
+ {
+ _identityRoleManager = GetRequiredService();
+ _identityRoleRepository = GetRequiredService();
+ _lookupNormalizer = GetRequiredService();
+ _testData = GetRequiredService();
+ }
+
+
+ [Fact]
+ public async Task GetByIdAsync()
+ {
+ var role = await _identityRoleManager.FindByIdAsync(_testData.RoleModeratorId.ToString());
+
+ role.ShouldNotBeNull();
+ role.Name.ShouldBe("moderator");
+ }
+
+ [Fact]
+ public async Task SetRoleNameAsync()
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ (await _identityRoleManager.SetRoleNameAsync(role, "teacher")).Succeeded.ShouldBeTrue();
+
+ role.Name.ShouldBe("teacher");
+ }
+
+ [Fact]
+ public async Task DeleteAsync()
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ await _identityRoleManager.DeleteAsync(role);
+
+ (await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"))).ShouldBeNull();
+ }
+
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleStore_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleStore_Tests.cs
new file mode 100644
index 0000000000..d2f674411b
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleStore_Tests.cs
@@ -0,0 +1,186 @@
+using System;
+using System.Collections.Generic;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Identity;
+using Shouldly;
+using Volo.Abp.Uow;
+using Xunit;
+
+namespace Volo.Abp.Identity
+{
+ public class IdentityRoleStore_Tests : AbpIdentityDomainTestBase
+ {
+ private readonly IdentityRoleStore _identityRoleStore;
+ private readonly ILookupNormalizer _lookupNormalizer;
+ private readonly IIdentityRoleRepository _identityRoleRepository;
+ private readonly IdentityTestData _testData;
+ private readonly IUnitOfWorkManager _unitOfWorkManager;
+
+ public IdentityRoleStore_Tests()
+ {
+ _identityRoleStore = GetRequiredService();
+ _lookupNormalizer = GetRequiredService();
+ _identityRoleRepository = GetRequiredService();
+ _testData = GetRequiredService();
+ _unitOfWorkManager = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task CreateAsync()
+ {
+ var roleId = Guid.NewGuid();
+ var role = new IdentityRole(roleId, "teacher");
+ (await _identityRoleStore.CreateAsync(role)).Succeeded.ShouldBeTrue();
+
+ var teacher = await _identityRoleStore.FindByIdAsync(roleId.ToString());
+
+ teacher.ShouldNotBeNull();
+ teacher.Name.ShouldBe("teacher");
+ }
+
+ [Fact]
+ public async Task UpdateAsync()
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ role.IsDefault = true;
+ await _identityRoleStore.UpdateAsync(role);
+
+ role.IsDefault.ShouldBeTrue();
+ }
+
+
+ [Fact]
+ public async Task DeleteAsync()
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ await _identityRoleStore.DeleteAsync(role);
+
+ (await _identityRoleStore.FindByIdAsync(_testData.RoleModeratorId.ToString())).ShouldBeNull();
+ }
+
+ [Fact]
+ public async Task GetRoleIdAsync()
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ (await _identityRoleStore.GetRoleIdAsync(role)).ShouldBe(_testData.RoleModeratorId.ToString());
+ }
+
+ [Fact]
+ public async Task GetRoleNameAsync()
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ (await _identityRoleStore.GetRoleNameAsync(role)).ShouldBe(role.Name);
+ }
+
+
+ [Fact]
+ public async Task SetRoleNameAsync()
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ await _identityRoleStore.SetRoleNameAsync(role, "teacher");
+
+ role.Name.ShouldBe("teacher");
+ }
+
+ [Fact]
+ public async Task FindByIdAsync()
+ {
+ var role = await _identityRoleStore.FindByIdAsync(_testData.RoleModeratorId.ToString());
+
+ role.ShouldNotBeNull();
+ role.Name.ShouldBe("moderator");
+ }
+
+ [Fact]
+ public async Task FindByNameAsync()
+ {
+ var role = await _identityRoleStore.FindByNameAsync(_lookupNormalizer.Normalize("moderator"));
+
+ role.ShouldNotBeNull();
+ role.Name.ShouldBe("moderator");
+ }
+
+ [Fact]
+ public async Task GetNormalizedRoleNameAsync()
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ (await _identityRoleStore.GetNormalizedRoleNameAsync(role)).ShouldBe(role.NormalizedName);
+ }
+
+ [Fact]
+ public async Task SetNormalizedRoleNameAsync()
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ await _identityRoleStore.SetNormalizedRoleNameAsync(role, _lookupNormalizer.Normalize("teacher"));
+
+ role.NormalizedName.ShouldBe(_lookupNormalizer.Normalize("teacher"));
+ }
+
+ [Fact]
+ public async Task GetClaimsAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ var claims = await _identityRoleStore.GetClaimsAsync(role);
+
+ claims.ShouldNotBeEmpty();
+ claims.ShouldContain(x => x.Type == "test-claim" && x.Value == "test-value");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task AddClaimAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ await _identityRoleStore.AddClaimAsync(role, new Claim("my-claim", "my-value"));
+
+ role.Claims.ShouldContain(x => x.ClaimType == "my-claim" && x.ClaimValue == "my-value");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task RemoveClaimAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"));
+ role.ShouldNotBeNull();
+
+ await _identityRoleStore.RemoveClaimAsync(role, new Claim("test-claim", "test-value"));
+
+ role.Claims.ShouldNotContain(x => x.ClaimType == "test-claim" && x.ClaimValue == "test-value");
+
+ await uow.CompleteAsync();
+ }
+ }
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs
new file mode 100644
index 0000000000..3755342375
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs
@@ -0,0 +1,87 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Identity;
+using Shouldly;
+using Volo.Abp.Uow;
+using Xunit;
+
+namespace Volo.Abp.Identity
+{
+ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
+ {
+ private readonly IdentityUserManager _identityUserManager;
+ private readonly IIdentityUserRepository _identityUserRepository;
+ private readonly IIdentityRoleRepository _identityRoleRepository;
+ private readonly ILookupNormalizer _lookupNormalizer;
+ private readonly IUnitOfWorkManager _unitOfWorkManager;
+ private readonly IdentityTestData _testData;
+
+ public IdentityUserManager_Tests()
+ {
+ _identityUserManager = GetRequiredService();
+ _identityUserRepository = GetRequiredService();
+ _identityRoleRepository = GetRequiredService();
+ _lookupNormalizer = GetRequiredService();
+ _testData = GetRequiredService();
+ _unitOfWorkManager = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task GetByIdAsync()
+ {
+ var user = await _identityUserManager.GetByIdAsync(_testData.UserJohnId);
+
+ user.ShouldNotBeNull();
+ user.UserName.ShouldBe("john.nash");
+ }
+
+ [Fact]
+ public async Task SetRolesAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _identityUserRepository.FindByNormalizedUserNameAsync(
+ _lookupNormalizer.Normalize("david"));
+ user.ShouldNotBeNull();
+
+ var identityResult = await _identityUserManager.SetRolesAsync(user, new List()
+ {
+ "moderator",
+ });
+
+ identityResult.Succeeded.ShouldBeTrue();
+ user.Roles.ShouldContain(x => x.RoleId == _testData.RoleModeratorId);
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task SetRoles_Should_Remove_Other_Roles()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var roleSupporter =
+ await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("supporter"));
+ roleSupporter.ShouldNotBeNull();
+
+ var user = await _identityUserRepository.FindByNormalizedUserNameAsync(
+ _lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ var identityResult = await _identityUserManager.SetRolesAsync(user, new List()
+ {
+ "admin",
+ });
+
+ identityResult.Succeeded.ShouldBeTrue();
+ user.Roles.ShouldNotContain(x => x.RoleId == _testData.RoleModeratorId);
+ user.Roles.ShouldNotContain(x => x.RoleId == roleSupporter.Id);
+
+ await uow.CompleteAsync();
+ }
+ }
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserStore_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserStore_Tests.cs
new file mode 100644
index 0000000000..0e4c1e8bc6
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserStore_Tests.cs
@@ -0,0 +1,777 @@
+using System;
+using System.Collections.Generic;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Identity;
+using Shouldly;
+using Volo.Abp.Guids;
+using Volo.Abp.Uow;
+using Xunit;
+
+namespace Volo.Abp.Identity
+{
+ public class IdentityUserStore_Tests : AbpIdentityDomainTestBase
+ {
+ private readonly IdentityUserStore _identityUserStore;
+ private readonly ILookupNormalizer _lookupNormalizer;
+ private readonly IIdentityUserRepository _userRepository;
+ private readonly IdentityTestData _testData;
+ private readonly IUnitOfWorkManager _unitOfWorkManager;
+
+ public IdentityUserStore_Tests()
+ {
+ _identityUserStore = GetRequiredService();
+ _lookupNormalizer = GetRequiredService();
+ _userRepository = GetRequiredService();
+ _testData = GetRequiredService();
+ _unitOfWorkManager = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task GetUserIdAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetUserIdAsync(user)).ShouldBe(user.Id.ToString());
+ }
+
+
+ [Fact]
+ public async Task GetUserNameAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetUserNameAsync(user)).ShouldBe(user.UserName);
+ }
+
+ [Fact]
+ public async Task SetUserNameAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.SetUserNameAsync(user, "bob.lee");
+ user.UserName.ShouldBe("bob.lee");
+ //user.NormalizedUserName.ShouldBe(_lookupNormalizer.Normalize("bob.lee"));
+ }
+
+
+ [Fact]
+ public async Task GetNormalizedUserNameAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetNormalizedUserNameAsync(user)).ShouldBe(user.NormalizedUserName);
+ }
+
+ [Fact]
+ public async Task SetNormalizedUserNameAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.SetNormalizedUserNameAsync(user, _lookupNormalizer.Normalize("bob.lee"));
+
+ user.NormalizedUserName.ShouldBe(_lookupNormalizer.Normalize("bob.lee"));
+ }
+
+ [Fact]
+ public async Task CreateAsync()
+ {
+ var userId = Guid.NewGuid();
+ var user = new IdentityUser(userId, "bob.lee", "bob.lee@abp.io");
+
+ await _identityUserStore.CreateAsync(user);
+
+ var bobLee = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("bob.lee"));
+ bobLee.ShouldNotBeNull();
+ bobLee.UserName.ShouldBe("bob.lee");
+ bobLee.Email.ShouldBe("bob.lee@abp.io");
+ }
+
+ [Fact]
+ public async Task UpdateAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ user.Name = "lee";
+ (await _identityUserStore.UpdateAsync(user)).Succeeded.ShouldBeTrue();
+
+ (await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"))).Name
+ .ShouldBe("lee");
+ }
+
+ [Fact]
+ public async Task Update_Concurrency()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.UpdateAsync(user)).Succeeded.ShouldBeTrue();
+
+ user.ConcurrencyStamp = Guid.NewGuid().ToString();
+ var identityResult = await _identityUserStore.UpdateAsync(user);
+
+ identityResult.Succeeded.ShouldBeFalse();
+ identityResult.Errors.ShouldContain(x =>
+ x.Code == nameof(IdentityErrorDescriber.ConcurrencyFailure));
+
+ // && x.Description == Resources.PasswordMismatch);
+ }
+
+
+ [Fact]
+ public async Task DeleteAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.DeleteAsync(user)).Succeeded.ShouldBeTrue();
+
+ (await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"))).ShouldBeNull();
+ }
+
+
+ [Fact]
+ public async Task FindByIdAsync()
+ {
+ var user = await _identityUserStore.FindByIdAsync(_testData.UserJohnId.ToString());
+
+ user.ShouldNotBeNull();
+ user.UserName.ShouldBe("john.nash");
+ }
+
+
+ [Fact]
+ public async Task FindByNameAsync()
+ {
+ var user = await _identityUserStore.FindByNameAsync(_lookupNormalizer.Normalize("john.nash"));
+
+ user.ShouldNotBeNull();
+ user.UserName.ShouldBe("john.nash");
+ }
+
+
+ [Fact]
+ public async Task SetPasswordHashAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ user.PasswordHash.ShouldBeNull();
+
+ await _identityUserStore.SetPasswordHashAsync(user, "P@ssw0rd");
+ user.PasswordHash.ShouldBe("P@ssw0rd");
+ }
+
+
+ [Fact]
+ public async Task GetPasswordHashAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ await _identityUserStore.SetPasswordHashAsync(user, "P@ssw0rd");
+
+ (await _identityUserStore.GetPasswordHashAsync(user)).ShouldBe("P@ssw0rd");
+ }
+
+
+ [Fact]
+ public async Task HasPasswordAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ (await _identityUserStore.HasPasswordAsync(user)).ShouldBeFalse();
+
+ await _identityUserStore.SetPasswordHashAsync(user, "P@ssw0rd");
+ (await _identityUserStore.HasPasswordAsync(user)).ShouldBeTrue();
+ }
+
+
+ [Fact]
+ public async Task AddToRoleAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("david"));
+ user.ShouldNotBeNull();
+ user.Roles.ShouldBeEmpty();
+
+ await _identityUserStore.AddToRoleAsync(user, _lookupNormalizer.Normalize("moderator"));
+
+ user.Roles.ShouldContain(x => x.RoleId == _testData.RoleModeratorId);
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task RemoveFromRoleAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ user.Roles.ShouldContain(x => x.RoleId == _testData.RoleModeratorId);
+
+ await _identityUserStore.RemoveFromRoleAsync(user, _lookupNormalizer.Normalize("moderator"));
+
+ user.Roles.ShouldNotContain(x => x.RoleId == _testData.RoleModeratorId);
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task GetRolesAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ var roleNames = await _identityUserStore.GetRolesAsync(user);
+ roleNames.ShouldNotBeEmpty();
+ roleNames.ShouldContain(x => x == "moderator");
+ roleNames.ShouldContain(x => x == "supporter");
+ }
+
+ [Fact]
+ public async Task IsInRoleAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.IsInRoleAsync(user, _lookupNormalizer.Normalize("moderator"))).ShouldBeTrue();
+ (await _identityUserStore.IsInRoleAsync(user, _lookupNormalizer.Normalize("moderatorNotExist"))).ShouldBeFalse();
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task GetClaimsAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ var claims = await _identityUserStore.GetClaimsAsync(user);
+ claims.ShouldNotBeEmpty();
+ claims.ShouldContain(x => x.Type == "TestClaimType" && x.Value == "42");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task AddClaimsAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.AddClaimsAsync(user, new List()
+ {
+ new Claim("MyClaimType", "MyClaimValue")
+ });
+
+ user.Claims.ShouldContain(x => x.ClaimType == "MyClaimType" && x.ClaimValue == "MyClaimValue");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task ReplaceClaimAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.ReplaceClaimAsync(user, new Claim("TestClaimType", "42"), new Claim("MyClaimType", "MyClaimValue"));
+
+ user.Claims.ShouldNotContain(x => x.ClaimType == "TestClaimType" && x.ClaimValue == "42");
+ user.Claims.ShouldContain(x => x.ClaimType == "MyClaimType" && x.ClaimValue == "MyClaimValue");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task RemoveClaimsAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.RemoveClaimsAsync(user, new List()
+ {
+ new Claim("TestClaimType", "42")
+ });
+
+ user.Claims.ShouldNotContain(x => x.ClaimType == "TestClaimType" && x.ClaimValue == "42");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task AddLoginAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ user.Logins.ShouldNotContain(x => x.LoginProvider == "facebook" && x.ProviderKey == "john");
+
+ await _identityUserStore.AddLoginAsync(user, new UserLoginInfo("facebook", "john", "John Nash"));
+
+ user.Logins.ShouldContain(x => x.LoginProvider == "facebook" && x.ProviderKey == "john");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task RemoveLoginAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ user.Logins.ShouldContain(x => x.LoginProvider == "github" && x.ProviderKey == "john");
+
+ await _identityUserStore.RemoveLoginAsync(user, "github", "john");
+
+ user.Logins.ShouldNotContain(x => x.LoginProvider == "github" && x.ProviderKey == "john");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task GetLoginsAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ var logins = await _identityUserStore.GetLoginsAsync(user);
+
+ logins.ShouldNotBeNull();
+ logins.ShouldContain(x => x.LoginProvider == "github" && x.ProviderKey == "john");
+ logins.ShouldContain(x => x.LoginProvider == "twitter" && x.ProviderKey == "johnx");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+
+ [Fact]
+ public async Task FindByLoginAsync()
+ {
+ var user = await _identityUserStore.FindByLoginAsync("github", "john");
+ user.ShouldNotBeNull();
+ user.UserName.ShouldBe("john.nash");
+ }
+
+
+ [Fact]
+ public async Task GetEmailConfirmedAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetEmailConfirmedAsync(user)).ShouldBe(user.EmailConfirmed);
+ }
+
+
+ [Fact]
+ public async Task SetEmailConfirmedAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ var emailConfirmed = user.EmailConfirmed;
+
+ await _identityUserStore.SetEmailConfirmedAsync(user, !emailConfirmed);
+
+ user.EmailConfirmed.ShouldBe(!emailConfirmed);
+ }
+
+ [Fact]
+ public async Task SetEmailAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.SetEmailAsync(user, "john.nash.kobe@abp.io");
+
+ user.Email.ShouldBe("john.nash.kobe@abp.io");
+ //user.NormalizedEmail.ShouldBe(_lookupNormalizer.Normalize("john.nash.kobe@abp.io"));
+ }
+
+ [Fact]
+ public async Task GetEmailAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetEmailAsync(user)).ShouldBe(user.Email);
+ }
+
+ [Fact]
+ public async Task GetNormalizedEmailAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetNormalizedEmailAsync(user)).ShouldBe(user.NormalizedEmail);
+ }
+
+ [Fact]
+ public async Task SetNormalizedEmailAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.SetNormalizedEmailAsync(user, _lookupNormalizer.Normalize("john.nash.kobe@abp.io"));
+
+ user.NormalizedEmail.ShouldBe(_lookupNormalizer.Normalize("john.nash.kobe@abp.io"));
+ }
+
+ [Fact]
+ public async Task FindByEmailAsync()
+ {
+ var user = await _identityUserStore.FindByEmailAsync(_lookupNormalizer.Normalize("john.nash@abp.io"));
+
+ user.ShouldNotBeNull();
+ user.Email.ShouldBe("john.nash@abp.io");
+ }
+
+ [Fact]
+ public async Task GetLockoutEndDateAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetLockoutEndDateAsync(user)).ShouldBe(user.LockoutEnd);
+ }
+
+ [Fact]
+ public async Task SetLockoutEndDateAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.SetLockoutEndDateAsync(user, DateTimeOffset.Parse("01/01/2019"));
+
+ user.LockoutEnd.ShouldBe(DateTimeOffset.Parse("01/01/2019"));
+ }
+
+
+ [Fact]
+ public async Task IncrementAccessFailedCountAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ var count = user.AccessFailedCount;
+
+ await _identityUserStore.IncrementAccessFailedCountAsync(user);
+
+ user.AccessFailedCount.ShouldBe(count + 1);
+ }
+
+ [Fact]
+ public async Task ResetAccessFailedCountAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.ResetAccessFailedCountAsync(user);
+
+ user.AccessFailedCount.ShouldBe(0);
+ }
+
+ [Fact]
+ public async Task GetAccessFailedCountAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetAccessFailedCountAsync(user)).ShouldBe(user.AccessFailedCount);
+ }
+
+ [Fact]
+ public async Task GetLockoutEnabledAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetLockoutEnabledAsync(user)).ShouldBe(user.LockoutEnabled);
+ }
+
+ [Fact]
+ public async Task SetLockoutEnabledAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ var lockoutEnabled = user.LockoutEnabled;
+
+ await _identityUserStore.SetLockoutEnabledAsync(user, !lockoutEnabled);
+
+ user.LockoutEnabled.ShouldBe(!lockoutEnabled);
+ }
+
+
+ [Fact]
+ public async Task SetPhoneNumberAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.SetPhoneNumberAsync(user, "13800138000");
+
+ user.PhoneNumber.ShouldBe("13800138000");
+ }
+
+
+ [Fact]
+ public async Task GetPhoneNumberAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetPhoneNumberAsync(user)).ShouldBe(user.PhoneNumber);
+ }
+
+ [Fact]
+ public async Task GetPhoneNumberConfirmedAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetPhoneNumberConfirmedAsync(user)).ShouldBe(user.PhoneNumberConfirmed);
+ }
+
+
+ [Fact]
+ public async Task SetPhoneNumberConfirmedAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ var phoneNumberConfirmed = user.PhoneNumberConfirmed;
+
+ await _identityUserStore.SetPhoneNumberConfirmedAsync(user, !phoneNumberConfirmed);
+
+ user.PhoneNumberConfirmed.ShouldBe(!phoneNumberConfirmed);
+ }
+
+
+ [Fact]
+ public async Task SetSecurityStampAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ var securityStamp = Guid.NewGuid().ToString();
+
+ await _identityUserStore.SetSecurityStampAsync(user, securityStamp);
+
+ user.SecurityStamp.ShouldBe(securityStamp);
+ }
+
+ [Fact]
+ public async Task GetSecurityStampAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetSecurityStampAsync(user)).ShouldBe(user.SecurityStamp);
+ }
+
+
+ [Fact]
+ public async Task SetTwoFactorEnabledAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ var twoFactorEnabled = user.TwoFactorEnabled;
+
+ await _identityUserStore.SetTwoFactorEnabledAsync(user, !twoFactorEnabled);
+
+ user.TwoFactorEnabled.ShouldBe(!twoFactorEnabled);
+ }
+
+
+ [Fact]
+ public async Task GetTwoFactorEnabledAsync()
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetTwoFactorEnabledAsync(user)).ShouldBe(user.TwoFactorEnabled);
+ }
+
+ [Fact]
+ public async Task GetUsersForClaimAsync()
+ {
+ var user = await _identityUserStore.GetUsersForClaimAsync(new Claim("TestClaimType", "42"));
+ user.ShouldNotBeNull();
+ user.ShouldNotBeEmpty();
+ user.ShouldContain(x => x.UserName == "john.nash");
+ }
+
+ [Fact]
+ public async Task GetUsersInRoleAsync()
+ {
+ var user = await _identityUserStore.GetUsersInRoleAsync(_lookupNormalizer.Normalize("moderator"));
+ user.ShouldNotBeNull();
+ user.ShouldContain(x => x.UserName == "john.nash");
+ }
+
+ [Fact]
+ public async Task SetTokenAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.SetTokenAsync(user, "test-provider", "test-name", "123123");
+
+ user.Tokens.ShouldNotBeEmpty();
+ user.Tokens.ShouldContain(x => x.LoginProvider == "test-provider" && x.Name == "test-name" && x.Value == "123123");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task RemoveTokenAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.RemoveTokenAsync(user, "test-provider", "test-name");
+
+ user.Tokens.ShouldNotContain(x => x.LoginProvider == "test-provider" && x.Name == "test-name" && x.Value == "123123");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task GetTokenAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ (await _identityUserStore.GetTokenAsync(user, "test-provider", "test-name")).ShouldBe("test-value");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task SetAuthenticatorKeyAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.SetAuthenticatorKeyAsync(user, "testKey");
+
+ user.Tokens.ShouldContain(x => x.LoginProvider == "[AspNetUserStore]" && x.Name == "AuthenticatorKey" && x.Value == "testKey");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task GetAuthenticatorKeyAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ await _identityUserStore.SetAuthenticatorKeyAsync(user, "testKey");
+
+ (await _identityUserStore.GetAuthenticatorKeyAsync(user)).ShouldBe("testKey");
+
+ await uow.CompleteAsync();
+ }
+
+ }
+
+ [Fact]
+ public async Task CountCodesAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ await _identityUserStore.SetTokenAsync(user, "[AspNetUserStore]", "RecoveryCodes", "testKey;testKey2");
+
+ (await _identityUserStore.CountCodesAsync(user)).ShouldBe(2);
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task ReplaceCodesAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+
+ await _identityUserStore.ReplaceCodesAsync(user, new List()
+ {
+ "testKey",
+ "testKey2"
+ });
+
+ user.Tokens.ShouldContain(x => x.LoginProvider == "[AspNetUserStore]" && x.Name == "RecoveryCodes" && x.Value == "testKey;testKey2");
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task RedeemCodeAsync()
+ {
+ using (var uow = _unitOfWorkManager.Begin())
+ {
+ var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"));
+ user.ShouldNotBeNull();
+ await _identityUserStore.SetTokenAsync(user, "[AspNetUserStore]", "RecoveryCodes", "testKey;testKey2");
+
+ (await _identityUserStore.RedeemCodeAsync(user, "testKey")).ShouldBeTrue();
+
+ await uow.CompleteAsync();
+ }
+ }
+ }
+}
diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/UserRoleFinder_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/UserRoleFinder_Tests.cs
new file mode 100644
index 0000000000..ef06949500
--- /dev/null
+++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/UserRoleFinder_Tests.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Shouldly;
+using Xunit;
+
+namespace Volo.Abp.Identity
+{
+ public class UserRoleFinder_Tests : AbpIdentityDomainTestBase
+ {
+ private readonly IUserRoleFinder _userRoleFinder;
+ private readonly IdentityTestData _testData;
+
+ public UserRoleFinder_Tests()
+ {
+ _userRoleFinder = GetRequiredService();
+ _testData = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task GetRolesAsync()
+ {
+ var roleNames = await _userRoleFinder.GetRolesAsync(_testData.UserJohnId);
+ roleNames.ShouldNotBeEmpty();
+ roleNames.ShouldContain(x => x == "moderator");
+ roleNames.ShouldContain(x => x == "supporter");
+ }
+ }
+}