diff --git a/modules/permission-management/Volo.Abp.PermissionManagement.sln b/modules/permission-management/Volo.Abp.PermissionManagement.sln
index e0fdd1e0ec..5812918a3c 100644
--- a/modules/permission-management/Volo.Abp.PermissionManagement.sln
+++ b/modules/permission-management/Volo.Abp.PermissionManagement.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.27428.1
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.28729.10
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B559B878-38F7-49CC-BC06-43A32D68C1A7}"
EndProject
@@ -29,9 +29,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManageme
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.MongoDB.Tests", "test\Volo.Abp.PermissionManagement.MongoDB.Tests\Volo.Abp.PermissionManagement.MongoDB.Tests.csproj", "{AFA65E08-1F17-4BBE-96A6-80F3CFE22A75}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.HttpApi", "src\Volo.Abp.PermissionManagement.HttpApi\Volo.Abp.PermissionManagement.HttpApi.csproj", "{9E0B517E-F02E-436F-9695-7CF12795D34C}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.HttpApi", "src\Volo.Abp.PermissionManagement.HttpApi\Volo.Abp.PermissionManagement.HttpApi.csproj", "{9E0B517E-F02E-436F-9695-7CF12795D34C}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.HttpApi.Client", "src\Volo.Abp.PermissionManagement.HttpApi.Client\Volo.Abp.PermissionManagement.HttpApi.Client.csproj", "{1CD80519-9431-48DB-B0EA-291A73FF9F49}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.HttpApi.Client", "src\Volo.Abp.PermissionManagement.HttpApi.Client\Volo.Abp.PermissionManagement.HttpApi.Client.csproj", "{1CD80519-9431-48DB-B0EA-291A73FF9F49}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.Application.Tests", "test\Volo.Abp.PermissionManagement.Application.Tests\Volo.Abp.PermissionManagement.Application.Tests.csproj", "{A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -91,6 +93,10 @@ Global
{1CD80519-9431-48DB-B0EA-291A73FF9F49}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CD80519-9431-48DB-B0EA-291A73FF9F49}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1CD80519-9431-48DB-B0EA-291A73FF9F49}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -109,6 +115,7 @@ Global
{AFA65E08-1F17-4BBE-96A6-80F3CFE22A75} = {63DA4A89-5908-4F37-B7E6-525AEEF20C77}
{9E0B517E-F02E-436F-9695-7CF12795D34C} = {B559B878-38F7-49CC-BC06-43A32D68C1A7}
{1CD80519-9431-48DB-B0EA-291A73FF9F49} = {B559B878-38F7-49CC-BC06-43A32D68C1A7}
+ {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1} = {63DA4A89-5908-4F37-B7E6-525AEEF20C77}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8FC7DF78-5E2D-489F-9D43-147D2ABAA112}
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj
new file mode 100644
index 0000000000..7e817abf24
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj
@@ -0,0 +1,18 @@
+
+
+
+ netcoreapp2.2
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs
new file mode 100644
index 0000000000..7102b8f851
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Microsoft.Extensions.DependencyInjection;
+using NSubstitute;
+using Volo.Abp.Users;
+
+namespace Volo.Abp.PermissionManagement
+{
+ public class AbpPermissionManagementApplicationTestBase : PermissionManagementTestBase
+ {
+ protected Guid? CurrentUserId { get; set; }
+
+ protected AbpPermissionManagementApplicationTestBase()
+ {
+ CurrentUserId = Guid.NewGuid();
+ }
+ protected override void AfterAddApplication(IServiceCollection services)
+ {
+ var currentUser = Substitute.For();
+ //currentUser.Id.Returns(ci => CurrentUserId);
+ currentUser.IsAuthenticated.Returns(true);
+
+ services.AddSingleton(currentUser);
+ }
+ }
+}
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestModule.cs
new file mode 100644
index 0000000000..2bbfb07acd
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestModule.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.Authorization.Permissions;
+using Volo.Abp.Modularity;
+
+namespace Volo.Abp.PermissionManagement
+{
+ [DependsOn(
+ typeof(AbpPermissionManagementApplicationModule),
+ typeof(AbpPermissionManagementTestModule)
+ )]
+ public class AbpPermissionManagementApplicationTestModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.AddAlwaysAllowAuthorization();
+
+ context.Services.Configure(options =>
+ {
+ options.ProviderPolicies[UserPermissionValueProvider.ProviderName] = UserPermissionValueProvider.ProviderName;
+ options.ProviderPolicies["Test"] = "Test";
+ options.ManagementProviders.Add();
+ });
+ }
+ }
+}
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs
new file mode 100644
index 0000000000..8b36b02877
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs
@@ -0,0 +1,96 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Shouldly;
+using Volo.Abp.Authorization.Permissions;
+using Xunit;
+
+namespace Volo.Abp.PermissionManagement.Application.Tests.Volo.Abp.PermissionManagement
+{
+ public class PermissionAppService_Tests : AbpPermissionManagementApplicationTestBase
+ {
+ private readonly IPermissionAppService _permissionAppService;
+ private readonly IPermissionGrantRepository _permissionGrantRepository;
+
+ public PermissionAppService_Tests()
+ {
+ _permissionAppService = GetRequiredService();
+ _permissionGrantRepository = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task GetAsync()
+ {
+ var permissionListResultDto = await _permissionAppService.GetAsync(UserPermissionValueProvider.ProviderName,
+ PermissionTestDataBuilder.User1Id.ToString());
+
+ permissionListResultDto.ShouldNotBeNull();
+ permissionListResultDto.EntityDisplayName.ShouldBe(PermissionTestDataBuilder.User1Id.ToString());
+ permissionListResultDto.Groups.Count.ShouldBe(1);
+ permissionListResultDto.Groups.ShouldContain(x => x.Name == "TestGroup");
+
+ permissionListResultDto.Groups.First().Permissions.Count.ShouldBe(4);
+ permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission1");
+ permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission2");
+ permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission2.ChildPermission1");
+ permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission3");
+
+ }
+
+ [Fact]
+ public async Task UpdateAsync()
+ {
+ (await _permissionGrantRepository.FindAsync("MyPermission1", "Test",
+ "Test")).ShouldBeNull();
+
+ await _permissionAppService.UpdateAsync("Test",
+ "Test", new UpdatePermissionsDto()
+ {
+ Permissions = new UpdatePermissionDto[]
+ {
+ new UpdatePermissionDto()
+ {
+ IsGranted = true,
+ Name = "MyPermission1"
+ }
+ }
+ });
+
+ (await _permissionGrantRepository.FindAsync("MyPermission1", "Test",
+ "Test")).ShouldNotBeNull();
+ }
+
+ [Fact]
+ public async Task Update_Revoke_Test()
+ {
+ _permissionGrantRepository.Insert(
+ new PermissionGrant(
+ Guid.NewGuid(),
+ "MyPermission1",
+ "Test",
+ "Test"
+ )
+ );
+ (await _permissionGrantRepository.FindAsync("MyPermission1", "Test",
+ "Test")).ShouldNotBeNull();
+
+ await _permissionAppService.UpdateAsync("Test",
+ "Test", new UpdatePermissionsDto()
+ {
+ Permissions = new UpdatePermissionDto[]
+ {
+ new UpdatePermissionDto()
+ {
+ IsGranted = false,
+ Name = "MyPermission1"
+ }
+ }
+ });
+
+ (await _permissionGrantRepository.FindAsync("MyPermission1", "Test",
+ "Test")).ShouldBeNull();
+ }
+ }
+}
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs
index 4423cf114b..ec343d9615 100644
--- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs
@@ -12,6 +12,14 @@ namespace Volo.Abp.PermissionManagement
)]
public class AbpPermissionManagementTestBaseModule : AbpModule
{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.Configure(options =>
+ {
+ options.ManagementProviders.Add();
+ });
+ }
+
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
SeedTestData(context);
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionManagementProvider.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionManagementProvider.cs
new file mode 100644
index 0000000000..f66ed2995d
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionManagementProvider.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Volo.Abp.Guids;
+using Volo.Abp.MultiTenancy;
+
+namespace Volo.Abp.PermissionManagement
+{
+ public class TestPermissionManagementProvider : PermissionManagementProvider
+ {
+ public override string Name => "Test";
+
+ public TestPermissionManagementProvider(
+ IPermissionGrantRepository permissionGrantRepository,
+ IGuidGenerator guidGenerator,
+ ICurrentTenant currentTenant)
+ : base(
+ permissionGrantRepository,
+ guidGenerator,
+ currentTenant)
+ {
+
+ }
+ }
+}
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Basic_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs
similarity index 100%
rename from modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Basic_Tests.cs
rename to modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionDataSeeder_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionDataSeeder_Tests.cs
new file mode 100644
index 0000000000..6868421a8a
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionDataSeeder_Tests.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Shouldly;
+using Xunit;
+
+namespace Volo.Abp.PermissionManagement
+{
+ public class PermissionDataSeeder_Tests : PermissionTestBase
+ {
+ private readonly IPermissionDataSeeder _permissionDataSeeder;
+ private readonly IPermissionGrantRepository _grantpermissionGrantRepository;
+
+ public PermissionDataSeeder_Tests()
+ {
+ _permissionDataSeeder = GetRequiredService();
+ _grantpermissionGrantRepository = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task SeedAsync()
+ {
+ (await _grantpermissionGrantRepository.FindAsync("MyPermission1", "Test", "Test")).ShouldBeNull();
+ (await _grantpermissionGrantRepository.FindAsync("MyPermission2", "Test", "Test")).ShouldBeNull();
+
+ await _permissionDataSeeder.SeedAsync("Test", "Test", new List()
+ {
+ "MyPermission1",
+ "MyPermission2"
+ });
+
+ (await _grantpermissionGrantRepository.FindAsync("MyPermission1", "Test", "Test")).ShouldNotBeNull();
+ (await _grantpermissionGrantRepository.FindAsync("MyPermission2", "Test", "Test")).ShouldNotBeNull();
+
+ }
+ }
+}
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator_Tests.cs
new file mode 100644
index 0000000000..9d4248bb5a
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator_Tests.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Shouldly;
+using Volo.Abp.Authorization.Permissions;
+using Volo.Abp.Caching;
+using Volo.Abp.MultiTenancy;
+using Xunit;
+
+namespace Volo.Abp.PermissionManagement
+{
+ public class PermissionGrantCacheItemInvalidator_Tests : PermissionTestBase
+ {
+ private readonly IDistributedCache _cache;
+ private readonly IPermissionStore _permissionStore;
+ private readonly IPermissionGrantRepository _permissionGrantRepository;
+
+ public PermissionGrantCacheItemInvalidator_Tests()
+ {
+ _cache = GetRequiredService>();
+ _permissionStore = GetRequiredService();
+ _permissionGrantRepository = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task PermissionStore_IsGrantedAsync_Should_Cache_PermissionGrant()
+ {
+ (await _cache.GetAsync(PermissionGrantCacheItem.CalculateCacheKey("MyPermission1",
+ UserPermissionValueProvider.ProviderName,
+ PermissionTestDataBuilder.User1Id.ToString()))).ShouldBeNull();
+
+
+ await _permissionStore.IsGrantedAsync("MyPermission1",
+ UserPermissionValueProvider.ProviderName,
+ PermissionTestDataBuilder.User1Id.ToString());
+
+
+ (await _cache.GetAsync(PermissionGrantCacheItem.CalculateCacheKey("MyPermission1",
+ UserPermissionValueProvider.ProviderName,
+ PermissionTestDataBuilder.User1Id.ToString()))).ShouldNotBeNull();
+ }
+
+ [Fact]
+ public async Task Cache_Should_Invalidator_WhenPermissionGrantChanged()
+ {
+ // IsGrantedAsync will cache PermissionGrant
+ await _permissionStore.IsGrantedAsync("MyPermission1",
+ UserPermissionValueProvider.ProviderName,
+ PermissionTestDataBuilder.User1Id.ToString());
+
+ var permissionGrant = await _permissionGrantRepository.FindAsync("MyPermission1",
+ UserPermissionValueProvider.ProviderName,
+ PermissionTestDataBuilder.User1Id.ToString());
+ permissionGrant.ShouldNotBeNull();
+ await _permissionGrantRepository.DeleteAsync(permissionGrant);
+
+ (await _cache.GetAsync(PermissionGrantCacheItem.CalculateCacheKey("MyPermission1",
+ UserPermissionValueProvider.ProviderName,
+ PermissionTestDataBuilder.User1Id.ToString()))).ShouldBeNull();
+ }
+ }
+}
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManagementProvider_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManagementProvider_Tests.cs
new file mode 100644
index 0000000000..d1e249c29a
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManagementProvider_Tests.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Threading.Tasks;
+using Shouldly;
+using Volo.Abp.Authorization.Permissions;
+using Xunit;
+
+namespace Volo.Abp.PermissionManagement
+{
+ public class PermissionManagementProvider_Tests : PermissionTestBase
+ {
+ private readonly IPermissionManagementProvider _permissionManagementProvider;
+ private readonly IPermissionGrantRepository _permissionGrantRepository;
+
+
+ public PermissionManagementProvider_Tests()
+ {
+ _permissionManagementProvider = GetRequiredService();
+ _permissionGrantRepository = GetRequiredService();
+ }
+
+
+ [Fact]
+ public async Task CheckAsync()
+ {
+ _permissionGrantRepository.Insert(
+ new PermissionGrant(
+ Guid.NewGuid(),
+ "MyPermission1",
+ "Test",
+ "Test"
+ )
+ );
+
+ var permissionValueProviderGrantInfo = await _permissionManagementProvider.CheckAsync("MyPermission1",
+ "Test",
+ "Test");
+
+ permissionValueProviderGrantInfo.IsGranted.ShouldBeTrue();
+ permissionValueProviderGrantInfo.ProviderKey.ShouldBe("Test");
+ }
+
+ [Fact]
+ public async Task Check_Should_Return_NonGranted_When_ProviderName_NotEquals_Name()
+ {
+ var permissionValueProviderGrantInfo = await _permissionManagementProvider.CheckAsync("MyPermission1",
+ "TestNotExist",
+ "Test");
+
+ permissionValueProviderGrantInfo.IsGranted.ShouldBeFalse();
+ permissionValueProviderGrantInfo.ProviderKey.ShouldBeNull();
+ }
+
+
+ [Fact]
+ public async Task SetAsync()
+ {
+ _permissionGrantRepository.Insert(
+ new PermissionGrant(
+ Guid.NewGuid(),
+ "MyPermission1",
+ "Test",
+ "Test"
+ )
+ );
+ (await _permissionGrantRepository.FindAsync("MyPermission1",
+ "Test",
+ "Test")).ShouldNotBeNull();
+
+ await _permissionManagementProvider.SetAsync("MyPermission1",
+ "Test",
+ false);
+
+ (await _permissionGrantRepository.FindAsync("MyPermission1",
+ "Test",
+ "Test")).ShouldBeNull();
+ }
+
+ }
+}
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs
new file mode 100644
index 0000000000..b5fe647c89
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Shouldly;
+using Volo.Abp.Authorization.Permissions;
+using Xunit;
+
+namespace Volo.Abp.PermissionManagement
+{
+ public class PermissionManager_Tests : PermissionTestBase
+ {
+ private readonly IPermissionManager _permissionManager;
+ private readonly IPermissionGrantRepository _permissionGrantRepository;
+
+ public PermissionManager_Tests()
+ {
+ _permissionManager = GetRequiredService();
+ _permissionGrantRepository = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task GetAsync()
+ {
+ await _permissionGrantRepository.InsertAsync(new PermissionGrant(
+ Guid.NewGuid(),
+ "MyPermission1",
+ "Test",
+ "Test")
+ );
+
+ var grantedProviders = await _permissionManager.GetAsync("MyPermission1",
+ "Test",
+ "Test");
+
+ grantedProviders.ShouldNotBeNull();
+ grantedProviders.IsGranted.ShouldBeTrue();
+ grantedProviders.Name.ShouldBe("MyPermission1");
+ grantedProviders.Providers.ShouldContain(x => x.Key == "Test");
+ }
+
+ [Fact]
+ public async Task Get_Should_Exception_When_Permission_Undefined()
+ {
+ await Assert.ThrowsAsync(async () => await _permissionManager.GetAsync(
+ "MyPermission1NotExist",
+ "Test",
+ "Test"));
+ }
+
+ [Fact]
+ public async Task GetAllAsync()
+ {
+ await _permissionGrantRepository.InsertAsync(new PermissionGrant(
+ Guid.NewGuid(),
+ "MyPermission1",
+ "Test",
+ "Test")
+ );
+
+ await _permissionGrantRepository.InsertAsync(new PermissionGrant(
+ Guid.NewGuid(),
+ "MyPermission2",
+ "Test",
+ "Test")
+ );
+
+ var permissionWithGrantedProviders = await _permissionManager.GetAllAsync(
+ "Test",
+ "Test");
+
+ permissionWithGrantedProviders.ShouldNotBeNull();
+ permissionWithGrantedProviders.ShouldContain(x =>
+ x.IsGranted && x.Name == "MyPermission1" && x.Providers.Any(p => p.Key == "Test"));
+ permissionWithGrantedProviders.ShouldContain(x =>
+ x.IsGranted && x.Name == "MyPermission2" && x.Providers.Any(p => p.Key == "Test"));
+ }
+
+ [Fact]
+ public async Task SetAsync()
+ {
+ (await _permissionGrantRepository.FindAsync("MyPermission2",
+ "Test",
+ "Test")).ShouldBeNull();
+
+ await _permissionManager.SetAsync(
+ "MyPermission2",
+ "Test",
+ "Test", true);
+
+ (await _permissionGrantRepository.FindAsync("MyPermission2",
+ "Test",
+ "Test")).ShouldNotBeNull();
+ }
+
+ [Fact]
+ public async Task Set_Should_Exception_When_Permission_Undefined()
+ {
+ await Assert.ThrowsAsync(async () => await _permissionManager.SetAsync(
+ "MyPermission1NotExist",
+ "Test",
+ "Test",
+ true));
+ }
+
+ }
+}
diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionStore_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionStore_Tests.cs
new file mode 100644
index 0000000000..965899ede9
--- /dev/null
+++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionStore_Tests.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Shouldly;
+using Volo.Abp.Authorization.Permissions;
+using Xunit;
+
+namespace Volo.Abp.PermissionManagement
+{
+ public class PermissionStore_Tests : PermissionTestBase
+ {
+ private readonly IPermissionStore _permissionStore;
+
+ public PermissionStore_Tests()
+ {
+ _permissionStore = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task IsGrantedAsync()
+ {
+ (await _permissionStore.IsGrantedAsync("MyPermission1",
+ UserPermissionValueProvider.ProviderName,
+ PermissionTestDataBuilder.User1Id.ToString())).ShouldBeTrue();
+
+
+ (await _permissionStore.IsGrantedAsync("MyPermission1NotExist",
+ UserPermissionValueProvider.ProviderName,
+ PermissionTestDataBuilder.User1Id.ToString())).ShouldBeFalse();
+
+ }
+ }
+}