From 1dfafd9400c158576f9ede8f3012356746cb5ae0 Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 12 Nov 2020 18:31:41 +0800 Subject: feat: Add user permission service. TODO: Add unit tests. --- .../Timeline.Tests/Services/DatabaseBasedTest.cs | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs (limited to 'BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs') diff --git a/BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs b/BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs new file mode 100644 index 00000000..838787e9 --- /dev/null +++ b/BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Timeline.Entities; +using Timeline.Tests.Helpers; +using Xunit; + +namespace Timeline.Tests.Services +{ + public abstract class DatabaseBasedTest : IAsyncLifetime + { + protected TestDatabase TestDatabase { get; } = new TestDatabase(); + protected DatabaseContext Database { get; private set; } + + public async Task InitializeAsync() + { + await TestDatabase.InitializeAsync(); + Database = TestDatabase.CreateContext(); + await OnDatabaseCreatedAsync(); + OnDatabaseCreated(); + } + + public async Task DisposeAsync() + { + BeforeDatabaseDestroy(); + await BeforeDatabaseDestroyAsync(); + await Database.DisposeAsync(); + await TestDatabase.DisposeAsync(); + } + + + protected virtual void OnDatabaseCreated() { } + protected virtual void BeforeDatabaseDestroy() { } + + + protected virtual Task OnDatabaseCreatedAsync() + { + return Task.CompletedTask; + } + + protected virtual Task BeforeDatabaseDestroyAsync() + { + return Task.CompletedTask; + } + } +} -- cgit v1.2.3 From 2c6b812382e04956793d90ba4148dd4aa7da3b70 Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 12 Nov 2020 20:03:31 +0800 Subject: test: Write tests for user permission service. --- .../Timeline.Tests/Services/DatabaseBasedTest.cs | 12 ++- .../Services/UserPermissionServiceTest.cs | 118 +++++++++++++++++++++ .../Timeline.Tests/Services/UserPermissionTest.cs | 28 ----- BackEnd/Timeline/Services/UserPermissionService.cs | 15 ++- 4 files changed, 132 insertions(+), 41 deletions(-) create mode 100644 BackEnd/Timeline.Tests/Services/UserPermissionServiceTest.cs delete mode 100644 BackEnd/Timeline.Tests/Services/UserPermissionTest.cs (limited to 'BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs') diff --git a/BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs b/BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs index 838787e9..7c97158c 100644 --- a/BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs +++ b/BackEnd/Timeline.Tests/Services/DatabaseBasedTest.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; using Timeline.Entities; using Timeline.Tests.Helpers; using Xunit; @@ -10,9 +7,14 @@ namespace Timeline.Tests.Services { public abstract class DatabaseBasedTest : IAsyncLifetime { - protected TestDatabase TestDatabase { get; } = new TestDatabase(); + protected TestDatabase TestDatabase { get; } protected DatabaseContext Database { get; private set; } + protected DatabaseBasedTest(bool databaseCreateUsers = true) + { + TestDatabase = new TestDatabase(databaseCreateUsers); + } + public async Task InitializeAsync() { await TestDatabase.InitializeAsync(); diff --git a/BackEnd/Timeline.Tests/Services/UserPermissionServiceTest.cs b/BackEnd/Timeline.Tests/Services/UserPermissionServiceTest.cs new file mode 100644 index 00000000..cea11b34 --- /dev/null +++ b/BackEnd/Timeline.Tests/Services/UserPermissionServiceTest.cs @@ -0,0 +1,118 @@ +using FluentAssertions; +using System; +using System.Threading.Tasks; +using Timeline.Services; +using Timeline.Services.Exceptions; +using Xunit; + +namespace Timeline.Tests.Services +{ + public class UserPermissionServiceTest : DatabaseBasedTest + { + private UserPermissionService _service; + + public UserPermissionServiceTest() + { + + } + + protected override void OnDatabaseCreated() + { + _service = new UserPermissionService(Database); + } + + [Fact] + public async Task GetPermissionsOfRootUserShouldReturnAll() + { + var permission = await _service.GetPermissionsOfUserAsync(1); + permission.Should().BeEquivalentTo(Enum.GetValues()); + } + + [Fact] + public async Task GetPermissionsOfNonRootUserShouldReturnNone() + { + var permission = await _service.GetPermissionsOfUserAsync(2); + permission.Should().BeEmpty(); + } + + [Fact] + public async Task GetPermissionsOfInexistentUserShouldThrow() + { + await _service.Awaiting(s => s.GetPermissionsOfUserAsync(10)).Should().ThrowAsync(); + } + + [Fact] + public async Task GetPermissionsOfInexistentUserShouldNotThrowIfNotCheck() + { + await _service.Awaiting(s => s.GetPermissionsOfUserAsync(10, false)).Should().NotThrowAsync(); + } + + [Fact] + public async Task ModifyPermissionOnRootUserShouldHaveNoEffect() + { + await _service.AddPermissionToUserAsync(1, UserPermission.AllTimelineManagement); + { + var permission = await _service.GetPermissionsOfUserAsync(1); + permission.Should().BeEquivalentTo(Enum.GetValues()); + } + await _service.RemovePermissionFromUserAsync(1, UserPermission.AllTimelineManagement); + { + var permission = await _service.GetPermissionsOfUserAsync(1); + permission.Should().BeEquivalentTo(Enum.GetValues()); + } + } + + [Fact] + public async Task ModifyPermissionOnNonRootUserShouldWork() + { + await _service.AddPermissionToUserAsync(2, UserPermission.AllTimelineManagement); + { + var permission = await _service.GetPermissionsOfUserAsync(2); + permission.Should().BeEquivalentTo(UserPermission.AllTimelineManagement); + } + await _service.AddPermissionToUserAsync(2, UserPermission.HighlightTimelineManangement); + { + var permission = await _service.GetPermissionsOfUserAsync(2); + permission.Should().BeEquivalentTo(UserPermission.AllTimelineManagement, UserPermission.HighlightTimelineManangement); + } + + // Add duplicate permission should work. + await _service.AddPermissionToUserAsync(2, UserPermission.HighlightTimelineManangement); + { + var permission = await _service.GetPermissionsOfUserAsync(2); + permission.Should().BeEquivalentTo(UserPermission.AllTimelineManagement, UserPermission.HighlightTimelineManangement); + } + + await _service.RemovePermissionFromUserAsync(2, UserPermission.HighlightTimelineManangement); + { + var permission = await _service.GetPermissionsOfUserAsync(2); + permission.Should().BeEquivalentTo(UserPermission.AllTimelineManagement); + } + + // Remove non-owned permission should work. + await _service.RemovePermissionFromUserAsync(2, UserPermission.HighlightTimelineManangement); + { + var permission = await _service.GetPermissionsOfUserAsync(2); + permission.Should().BeEquivalentTo(UserPermission.AllTimelineManagement); + } + } + + [Fact] + public async Task AddPermissionToInexistentUserShouldThrown() + { + await _service.Awaiting(s => s.AddPermissionToUserAsync(10, UserPermission.HighlightTimelineManangement)).Should().ThrowAsync(); + } + + [Fact] + public async Task RemovePermissionFromInexistentUserShouldThrown() + { + await _service.Awaiting(s => s.RemovePermissionFromUserAsync(10, UserPermission.HighlightTimelineManangement)).Should().ThrowAsync(); + } + + [Fact] + public async Task RemovePermissionFromInexistentUserShouldNotThrownIfNotCheck() + { + await _service.Awaiting(s => s.RemovePermissionFromUserAsync(10, UserPermission.HighlightTimelineManangement, false)).Should().NotThrowAsync(); + } + } +} diff --git a/BackEnd/Timeline.Tests/Services/UserPermissionTest.cs b/BackEnd/Timeline.Tests/Services/UserPermissionTest.cs deleted file mode 100644 index 4bcbc633..00000000 --- a/BackEnd/Timeline.Tests/Services/UserPermissionTest.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Timeline.Entities; -using Timeline.Services; -using Timeline.Tests.Helpers; -using Xunit; - -namespace Timeline.Tests.Services -{ - public class UserPermissionTest : DatabaseBasedTest - { - private UserPermissionService _service; - - public UserPermissionTest() - { - - } - - protected override void OnDatabaseCreated() - { - _service = new UserPermissionService(Database); - } - - - } -} diff --git a/BackEnd/Timeline/Services/UserPermissionService.cs b/BackEnd/Timeline/Services/UserPermissionService.cs index 466ee252..deedf0a6 100644 --- a/BackEnd/Timeline/Services/UserPermissionService.cs +++ b/BackEnd/Timeline/Services/UserPermissionService.cs @@ -126,9 +126,8 @@ namespace Timeline.Services /// /// The id of the user. /// The new permission. - /// Whether check the user's existence. - /// Thrown when is true and user does not exist. - Task AddPermissionToUserAsync(long userId, UserPermission permission, bool checkUserExistence = true); + /// Thrown when user does not exist. + Task AddPermissionToUserAsync(long userId, UserPermission permission); /// /// Remove a permission from user. @@ -175,15 +174,15 @@ namespace Timeline.Services return UserPermissions.FromStringList(permissionNameList); } - public async Task AddPermissionToUserAsync(long userId, UserPermission permission, bool checkUserExistence) + public async Task AddPermissionToUserAsync(long userId, UserPermission permission) { if (userId == 1) // The init administrator account. return; - await CheckUserExistence(userId, checkUserExistence); + await CheckUserExistence(userId, true); var alreadyHas = await _database.UserPermission - .AnyAsync(e => e.UserId == userId && e.Permission.Equals(permission.ToString(), StringComparison.InvariantCultureIgnoreCase)); + .AnyAsync(e => e.UserId == userId && e.Permission == permission.ToString()); if (alreadyHas) return; @@ -192,7 +191,7 @@ namespace Timeline.Services await _database.SaveChangesAsync(); } - public async Task RemovePermissionFromUserAsync(long userId, UserPermission permission, bool checkUserExistence) + public async Task RemovePermissionFromUserAsync(long userId, UserPermission permission, bool checkUserExistence = true) { if (userId == 1) // The init administrator account. return; @@ -200,7 +199,7 @@ namespace Timeline.Services await CheckUserExistence(userId, checkUserExistence); var entity = await _database.UserPermission - .Where(e => e.UserId == userId && e.Permission.Equals(permission.ToString(), StringComparison.InvariantCultureIgnoreCase)) + .Where(e => e.UserId == userId && e.Permission == permission.ToString()) .SingleOrDefaultAsync(); if (entity == null) return; -- cgit v1.2.3