From 84785fa2414c01c0283a36b0ff329ed17247dd17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 11 Feb 2018 21:06:53 +0300 Subject: [PATCH] Added tests for permission system. --- .../Abp/Permissions/PermissionDefinition.cs | 5 +- src/Volo.Abp.Session/Volo.Abp.Session.csproj | 1 + .../UserSettingManagerExtensions.cs | 41 ++++++++++ .../Volo/Abp/Session/AbpSessionModule.cs | 7 ++ .../Session/UserPermissionValueProvider.cs | 45 +++++++++++ src/Volo.Abp/Volo/Abp/AbpCommonModule.cs | 2 + .../AbpPermissionTestDataBuilder.cs | 15 +++- .../PermissionManager_Basic_Tests.cs | 12 ++- .../PermissionManager_User_Tests.cs | 75 +++++++++++++++++++ .../TestPermissionDefinitionProvider.cs | 3 +- .../Abp/Settings/AbpSettingTestDataBuilder.cs | 4 +- .../Abp/Settings/SettingManager_User_Tests.cs | 2 +- 12 files changed, 201 insertions(+), 11 deletions(-) create mode 100644 src/Volo.Abp.Session/Volo/Abp/Permissions/UserSettingManagerExtensions.cs create mode 100644 src/Volo.Abp.Session/Volo/Abp/Session/UserPermissionValueProvider.cs create mode 100644 test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs index 8f145b4987..807269f72e 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs @@ -22,7 +22,10 @@ public PermissionDefinition CreateChild(string name) { - return new PermissionDefinition(name) {Parent = this}; + return new PermissionDefinition(name) + { + Parent = this + }; } } } \ No newline at end of file diff --git a/src/Volo.Abp.Session/Volo.Abp.Session.csproj b/src/Volo.Abp.Session/Volo.Abp.Session.csproj index 6aef78ea80..6ecc09159c 100644 --- a/src/Volo.Abp.Session/Volo.Abp.Session.csproj +++ b/src/Volo.Abp.Session/Volo.Abp.Session.csproj @@ -15,6 +15,7 @@ + diff --git a/src/Volo.Abp.Session/Volo/Abp/Permissions/UserSettingManagerExtensions.cs b/src/Volo.Abp.Session/Volo/Abp/Permissions/UserSettingManagerExtensions.cs new file mode 100644 index 0000000000..441d109c31 --- /dev/null +++ b/src/Volo.Abp.Session/Volo/Abp/Permissions/UserSettingManagerExtensions.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Session; + +namespace Volo.Abp.Permissions +{ + public static class UserPermissionManagerExtensions + { + public static Task IsGrantedForUserAsync(this IPermissionManager permissionManager, [NotNull] string name, Guid userId, bool fallback = true) + { + return permissionManager.IsGrantedAsync(name, UserPermissionValueProvider.ProviderName, userId.ToString(), fallback); + } + + public static Task IsGrantedForCurrentUserAsync(this IPermissionManager permissionManager, [NotNull] string name, bool fallback = true) + { + return permissionManager.IsGrantedAsync(name, UserPermissionValueProvider.ProviderName, null, fallback); + } + + public static Task> GetAllForUserAsync(this IPermissionManager permissionManager, Guid userId, bool fallback = true) + { + return permissionManager.GetAllAsync(UserPermissionValueProvider.ProviderName, userId.ToString(), fallback); + } + + public static Task> GetAllForCurrentUserAsync(this IPermissionManager permissionManager, bool fallback = true) + { + return permissionManager.GetAllAsync(UserPermissionValueProvider.ProviderName, null, fallback); + } + + public static Task SetForUserAsync(this IPermissionManager permissionManager, Guid userId, [NotNull] string name, bool? isGranted, bool forceToSet = false) + { + return permissionManager.SetAsync(name, isGranted, UserPermissionValueProvider.ProviderName, userId.ToString(), forceToSet); + } + + public static Task SetForCurrentUserAsync(this IPermissionManager permissionManager, [NotNull] string name, bool? isGranted, bool forceToSet = false) + { + return permissionManager.SetAsync(name, isGranted, UserPermissionValueProvider.ProviderName, null, forceToSet); + } + } +} diff --git a/src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs b/src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs index 33cc5e2a88..08fbad5d03 100644 --- a/src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs +++ b/src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity; +using Volo.Abp.Permissions; using Volo.Abp.Security; using Volo.Abp.Settings; @@ -7,6 +8,7 @@ namespace Volo.Abp.Session { [DependsOn(typeof(AbpSecurityModule))] [DependsOn(typeof(AbpSettingsModule))] + [DependsOn(typeof(AbpPermissionsModule))] public class AbpSessionModule : AbpModule { public override void ConfigureServices(IServiceCollection services) @@ -16,6 +18,11 @@ namespace Volo.Abp.Session options.ValueProviders.Add(); }); + services.Configure(options => + { + options.ValueProviders.Add(); + }); + services.AddAssemblyOf(); } } diff --git a/src/Volo.Abp.Session/Volo/Abp/Session/UserPermissionValueProvider.cs b/src/Volo.Abp.Session/Volo/Abp/Session/UserPermissionValueProvider.cs new file mode 100644 index 0000000000..25c8fa8bf0 --- /dev/null +++ b/src/Volo.Abp.Session/Volo/Abp/Session/UserPermissionValueProvider.cs @@ -0,0 +1,45 @@ +using System.Threading.Tasks; +using Volo.Abp.Permissions; + +namespace Volo.Abp.Session +{ + public class UserPermissionValueProvider : PermissionValueProvider + { + public const string ProviderName = "User"; + + public override string Name => ProviderName; + + protected ICurrentUser CurrentUser { get; } + + public UserPermissionValueProvider(IPermissionStore permissionStore, ICurrentUser currentUser) + : base(permissionStore) + { + CurrentUser = currentUser; + } + + public override async Task IsGrantedAsync(PermissionDefinition permission, string providerKey) + { + if (providerKey == null) + { + if (CurrentUser.Id == null) + { + return null; + } + + providerKey = CurrentUser.Id.ToString(); + } + + return await PermissionStore.IsGrantedAsync(permission.Name, Name, providerKey); + } + + public override Task SetAsync(PermissionDefinition permission, bool isGranted, string providerKey) + { + return PermissionStore.SetAsync(permission.Name, isGranted, Name, providerKey); + } + + public override Task ClearAsync(PermissionDefinition permission, string providerKey) + { + return PermissionStore.DeleteAsync(permission.Name, Name, providerKey); + } + } +} diff --git a/src/Volo.Abp/Volo/Abp/AbpCommonModule.cs b/src/Volo.Abp/Volo/Abp/AbpCommonModule.cs index 12ea477ed8..64e3e10922 100644 --- a/src/Volo.Abp/Volo/Abp/AbpCommonModule.cs +++ b/src/Volo.Abp/Volo/Abp/AbpCommonModule.cs @@ -7,6 +7,7 @@ using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; using Volo.Abp.ObjectMapping; +using Volo.Abp.Permissions; using Volo.Abp.Security; using Volo.Abp.Session; using Volo.Abp.Settings; @@ -22,6 +23,7 @@ namespace Volo.Abp [DependsOn(typeof(AbpSecurityModule))] [DependsOn(typeof(AbpSessionModule))] [DependsOn(typeof(AbpSettingsModule))] + [DependsOn(typeof(AbpPermissionsModule))] [DependsOn(typeof(AbpDataModule))] [DependsOn(typeof(AbpJsonModule))] [DependsOn(typeof(AbpVirtualFileSystemModule))] diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/AbpPermissionTestDataBuilder.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/AbpPermissionTestDataBuilder.cs index 4556b19a12..6eba78d9b7 100644 --- a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/AbpPermissionTestDataBuilder.cs +++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/AbpPermissionTestDataBuilder.cs @@ -1,13 +1,14 @@ using System; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; +using Volo.Abp.Session; namespace Volo.Abp.Permissions { public class AbpPermissionTestDataBuilder : ITransientDependency { - public static Guid User1Id = Guid.NewGuid(); - public static Guid User2Id = Guid.NewGuid(); + public static Guid User1Id { get; } = Guid.NewGuid(); + public static Guid User2Id { get; } = Guid.NewGuid(); private readonly IPermissionGrantRepository _permissionGrantRepository; private readonly IGuidGenerator _guidGenerator; @@ -20,7 +21,15 @@ namespace Volo.Abp.Permissions public void Build() { - + _permissionGrantRepository.Insert( + new PermissionGrant( + _guidGenerator.Create(), + "MyPermission1", + true, + UserPermissionValueProvider.ProviderName, + User1Id.ToString() + ) + ); } } } \ No newline at end of file diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs index 619d7dee2f..3095ddf911 100644 --- a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs +++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs @@ -14,9 +14,17 @@ namespace Volo.Abp.Permissions } [Fact] - public async Task Test1() + public async Task Should_Throw_Exception_If_Permission_Is_Not_Defined() { - _permissionManager.ShouldNotBeNull(); + await Assert.ThrowsAsync(async () => + await _permissionManager.IsGrantedAsync("UndefinedPermissionName") + ); + } + + [Fact] + public async Task Should_Return_False_As_Default_For_Any_Permission() + { + (await _permissionManager.IsGrantedAsync("MyPermission1")).ShouldBeFalse(); } } } diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs new file mode 100644 index 0000000000..1174b65f36 --- /dev/null +++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs @@ -0,0 +1,75 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; +using Shouldly; +using Volo.Abp.Session; +using Xunit; + +namespace Volo.Abp.Permissions +{ + public class PermissionManager_User_Tests : AbpPermissionTestBase + { + private readonly IPermissionManager _permissionManager; + + private Guid? _currentUserId; + + public PermissionManager_User_Tests() + { + _permissionManager = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + var currentUser = Substitute.For(); + currentUser.Id.Returns(ci => _currentUserId); + services.AddSingleton(currentUser); + } + + [Fact] + public async Task Should_Return_True_For_Granted_User() + { + (await _permissionManager.IsGrantedForUserAsync( + "MyPermission1", + AbpPermissionTestDataBuilder.User1Id + )).ShouldBeTrue(); + } + + [Fact] + public async Task Should_Return_True_For_Granted_Current_User() + { + _currentUserId = AbpPermissionTestDataBuilder.User1Id; + + (await _permissionManager.IsGrantedForCurrentUserAsync( + "MyPermission1" + )).ShouldBeTrue(); + } + + [Fact] + public async Task Should_Return_False_For_Non_Granted_User() + { + (await _permissionManager.IsGrantedForUserAsync( + "MyPermission1", + AbpPermissionTestDataBuilder.User2Id + )).ShouldBeFalse(); + } + + [Fact] + public async Task Should_Return_False_For_Non_Granted_Current_User() + { + _currentUserId = AbpPermissionTestDataBuilder.User2Id; + + (await _permissionManager.IsGrantedForCurrentUserAsync( + "MyPermission1" + )).ShouldBeFalse(); + } + + [Fact] + public async Task Should_Return_False_For_Current_User_If_Anonymous() + { + (await _permissionManager.IsGrantedForCurrentUserAsync( + "MyPermission1" + )).ShouldBeFalse(); + } + } +} diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs index de773c8f90..a8108aa344 100644 --- a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs +++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs @@ -5,9 +5,8 @@ public override void Define(IPermissionDefinitionContext context) { var myPermission1 = new PermissionDefinition("MyPermission1"); - var myPermission2 = new PermissionDefinition("MyPermission2"); - context.Add(myPermission1, myPermission2); + context.Add(myPermission1); } } } \ No newline at end of file diff --git a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingTestDataBuilder.cs b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingTestDataBuilder.cs index b97b322bc8..b7c2c95ce1 100644 --- a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingTestDataBuilder.cs +++ b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingTestDataBuilder.cs @@ -7,8 +7,8 @@ namespace Volo.Abp.Settings { public class AbpSettingTestDataBuilder : ITransientDependency { - public static Guid User1Id = Guid.NewGuid(); - public static Guid User2Id = Guid.NewGuid(); + public static Guid User1Id { get; } = Guid.NewGuid(); + public static Guid User2Id { get; } = Guid.NewGuid(); private readonly ISettingRepository _settingRepository; private readonly IGuidGenerator _guidGenerator; diff --git a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs index 47080a973a..7601c82d97 100644 --- a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs +++ b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs @@ -11,7 +11,7 @@ namespace Volo.Abp.Settings { public class SettingManager_User_Tests: AbpSettingsTestBase { - private Guid _currentUserId; + private Guid? _currentUserId; private readonly ISettingManager _settingManager;