From 6323a82db90b7ca87df3151c468a6ac42d145583 Mon Sep 17 00:00:00 2001 From: showkath10 <90783892+showkath10@users.noreply.github.com> Date: Thu, 2 Dec 2021 07:34:10 +0000 Subject: [PATCH 1/9] HEEDLS-594 Centre administrators - deactivate admin account --- .../Administrator/AdministratorController.cs | 22 ++++++++++++++----- .../Administrator/AllAdminsViewModel.cs | 8 +++++-- .../CentreAdministratorsViewModel.cs | 6 +++-- .../Administrator/SearchableAdminViewModel.cs | 9 +++++--- .../Administrator/_SearchableAdminCard.cshtml | 2 +- 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs index c566d468e1..79d6d6dc87 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs @@ -1,7 +1,5 @@ namespace DigitalLearningSolutions.Web.Controllers.TrackingSystem.Centre.Administrator { - using System.Collections.Generic; - using System.Linq; using DigitalLearningSolutions.Data.DataServices; using DigitalLearningSolutions.Data.DataServices.UserDataService; using DigitalLearningSolutions.Data.Enums; @@ -11,12 +9,13 @@ using DigitalLearningSolutions.Web.Helpers; using DigitalLearningSolutions.Web.Models.Enums; using DigitalLearningSolutions.Web.ServiceFilter; - using DigitalLearningSolutions.Web.Models.Enums; using DigitalLearningSolutions.Web.ViewModels.Common; using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Administrator; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.FeatureManagement.Mvc; + using System.Collections.Generic; + using System.Linq; [FeatureGate(FeatureFlags.RefactoredTrackingSystem)] [Authorize(Policy = CustomPolicies.UserCentreManager)] @@ -62,6 +61,9 @@ public IActionResult Index( var centreId = User.GetCentreId(); var adminUsersAtCentre = userDataService.GetAdminUsersByCentreId(centreId); var categories = GetCourseCategories(centreId); + var hasSuperAdminAccess = User.HasSuperAdminPermissions(); + var currentAdminUserId = User.GetAdminId(); + var model = new CentreAdministratorsViewModel( centreId, @@ -69,7 +71,9 @@ public IActionResult Index( categories, searchString, filterBy, - page + page, + hasSuperAdminAccess, + currentAdminUserId.GetValueOrDefault() ); Response.UpdateOrDeleteFilterCookie(AdminFilterCookieName, filterBy); @@ -81,9 +85,17 @@ public IActionResult Index( public IActionResult AllAdmins() { var centreId = User.GetCentreId(); + var hasSuperAdminAccess = User.HasSuperAdminPermissions(); + var currentAdminUserId = User.GetAdminId(); + var adminUsersAtCentre = userDataService.GetAdminUsersByCentreId(centreId); var categories = GetCourseCategories(centreId); - var model = new AllAdminsViewModel(adminUsersAtCentre, categories); + var model = new AllAdminsViewModel( + adminUsersAtCentre, + categories, + hasSuperAdminAccess, + currentAdminUserId.GetValueOrDefault() + ); return View("AllAdmins", model); } diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/AllAdminsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/AllAdminsViewModel.cs index b514bde7ae..ac07e78bfd 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/AllAdminsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/AllAdminsViewModel.cs @@ -10,9 +10,13 @@ public class AllAdminsViewModel : BaseJavaScriptFilterableViewModel { public readonly IEnumerable Admins; - public AllAdminsViewModel(IEnumerable adminUsers, IEnumerable categories) + public AllAdminsViewModel(IEnumerable adminUsers, + IEnumerable categories, + bool hasSuperAdminAccess, + int currentAdminUserId) + { - Admins = adminUsers.Select(au => new SearchableAdminViewModel(au)); + Admins = adminUsers.Select(au => new SearchableAdminViewModel(au, hasSuperAdminAccess, currentAdminUserId)); Filters = new[] { diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs index b137cf25f1..fd64a5cd99 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs @@ -14,7 +14,9 @@ public CentreAdministratorsViewModel( IEnumerable categories, string? searchString, string? filterBy, - int page + int page, + bool hasSuperAdminAccess, + int currentAdminUserId ) : base(searchString, page, true, filterBy: filterBy, searchLabel: "Search administrators") { CentreId = centreId; @@ -28,7 +30,7 @@ int page MatchingSearchResults = filteredItems.Count; SetTotalPages(); var paginatedItems = GetItemsOnCurrentPage(filteredItems); - Admins = paginatedItems.Select(adminUser => new SearchableAdminViewModel(adminUser)); + Admins = paginatedItems.Select(adminUser => new SearchableAdminViewModel(adminUser, hasSuperAdminAccess, currentAdminUserId)); Filters = new[] { diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs index 967d29b332..26ddcff3ec 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs @@ -6,14 +6,15 @@ public class SearchableAdminViewModel : BaseFilterableViewModel { - public SearchableAdminViewModel(AdminUser adminUser) + public SearchableAdminViewModel(AdminUser adminUser, bool hasSuperAdminAccess, int currentAdminUserId) { Id = adminUser.Id; Name = adminUser.SearchableName; CategoryName = adminUser.CategoryName ?? "All"; EmailAddress = adminUser.EmailAddress; IsLocked = adminUser.IsLocked; - IsCentreManager = adminUser.IsCentreManager; + HasSuperAdminAccess = hasSuperAdminAccess; + CurrentAdminUserId = currentAdminUserId; Tags = FilterableTagHelper.GetCurrentTagsForAdminUser(adminUser); } @@ -30,7 +31,9 @@ public SearchableAdminViewModel(AdminUser adminUser) public string? EmailAddress { get; set; } public bool IsLocked { get; set; } + + public bool HasSuperAdminAccess { get; set; } - public bool IsCentreManager { get; set; } + public int CurrentAdminUserId { get; set; } } } diff --git a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/_SearchableAdminCard.cshtml b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/_SearchableAdminCard.cshtml index 3863557e95..749edae688 100644 --- a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/_SearchableAdminCard.cshtml +++ b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/_SearchableAdminCard.cshtml @@ -53,7 +53,7 @@ Manage roles } - @if (!Model.IsCentreManager) { + @if (Model.HasSuperAdminAccess && Model.CurrentAdminUserId != Model.Id) { Date: Thu, 2 Dec 2021 07:42:18 +0000 Subject: [PATCH 2/9] Updated test cases with new changes --- .../ViewComponents/CurrentFiltersViewComponentTests.cs | 2 ++ .../CentreAdministratorsViewModelTests.cs | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs b/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs index 06c2b7aa64..4aff79316f 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs @@ -42,6 +42,8 @@ public void CurrentFiltersViewComponent_selects_expected_filters_to_display() categories, searchString, "CategoryName|CategoryName|Word╡Role|IsCentreAdmin|true", + 1, + false, 1 ); var expectedAppliedFilters = new List diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs index ef135715c0..02f59043d8 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs @@ -40,6 +40,8 @@ public void Centre_administrators_should_default_to_returning_the_first_ten_admi new List(), null, null, + 1, + false, 1 ); @@ -56,7 +58,9 @@ public void Centre_administrators_should_correctly_return_the_second_page_of_adm new List(), null, null, - 2 + 2, + false, + 1 ); model.Admins.Count().Should().Be(5); @@ -95,7 +99,9 @@ public void Centre_Administrators_filters_should_be_set() new List(), null, null, - 2 + 2, + false, + 1 ); // Then From c7c1a3ddce395d41538f77d505e271f954d0559f Mon Sep 17 00:00:00 2001 From: showkath10 <90783892+showkath10@users.noreply.github.com> Date: Thu, 2 Dec 2021 13:27:26 +0000 Subject: [PATCH 3/9] Simplified show deactivate button check as suggested in MR review --- .../Centre/Administrator/SearchableAdminViewModel.cs | 8 +++----- .../Centre/Administrator/_SearchableAdminCard.cshtml | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs index 26ddcff3ec..9699e82948 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs @@ -13,8 +13,8 @@ public SearchableAdminViewModel(AdminUser adminUser, bool hasSuperAdminAccess, i CategoryName = adminUser.CategoryName ?? "All"; EmailAddress = adminUser.EmailAddress; IsLocked = adminUser.IsLocked; - HasSuperAdminAccess = hasSuperAdminAccess; - CurrentAdminUserId = currentAdminUserId; + CanShowDeactivateAdminButton = hasSuperAdminAccess + && currentAdminUserId != adminUser.Id; Tags = FilterableTagHelper.GetCurrentTagsForAdminUser(adminUser); } @@ -31,9 +31,7 @@ public SearchableAdminViewModel(AdminUser adminUser, bool hasSuperAdminAccess, i public string? EmailAddress { get; set; } public bool IsLocked { get; set; } - - public bool HasSuperAdminAccess { get; set; } - public int CurrentAdminUserId { get; set; } + public bool CanShowDeactivateAdminButton { get; set; } } } diff --git a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/_SearchableAdminCard.cshtml b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/_SearchableAdminCard.cshtml index 749edae688..caced343d8 100644 --- a/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/_SearchableAdminCard.cshtml +++ b/DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/Administrator/_SearchableAdminCard.cshtml @@ -53,7 +53,7 @@ Manage roles } - @if (Model.HasSuperAdminAccess && Model.CurrentAdminUserId != Model.Id) { + @if (Model.CanShowDeactivateAdminButton) { Date: Wed, 8 Dec 2021 08:20:47 +0000 Subject: [PATCH 4/9] Added new test cases as requested --- .../SearchableAdminViewModelTests.cs | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs new file mode 100644 index 0000000000..76b6c08aec --- /dev/null +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs @@ -0,0 +1,61 @@ +namespace DigitalLearningSolutions.Web.Tests.ViewModels.TrackingSystem.Centre.Administrator +{ + using DigitalLearningSolutions.Data.Tests.TestHelpers; + using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Administrator; + using FluentAssertions; + using NUnit.Framework; + + public class SearchableAdminViewModelTests + { + [Test] + public void SearchableAdmin_show_deactivate_admin_button_for_super_admin() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(2, firstName: "a", lastName: "Surname"); + + // When + var model = new SearchableAdminViewModel( + adminUser, + true, + 1 + ); + + // Then + model.CanShowDeactivateAdminButton.Should().BeTrue(); + } + + [Test] + public void SearchableAdmin_do_not_show_deactivate_admin_button_if_user_do_not_have_super_admin_access() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(firstName: "a", lastName: "Surname"); + + // When + var model = new SearchableAdminViewModel( + adminUser, + false, + 1 + ); + + // Then + model.CanShowDeactivateAdminButton.Should().BeFalse(); + } + + [Test] + public void SearchableAdmin_do_not_show_deactivate_admin_button_for_logged_in_admin_user_card() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(1, firstName: "a", lastName: "Surname"); + + // When + var model = new SearchableAdminViewModel( + adminUser, + false, + 1 + ); + + // Then + model.CanShowDeactivateAdminButton.Should().BeFalse(); + } + } +} From 0933c8fc1cac43fb44d90fd8b822bed283b627f6 Mon Sep 17 00:00:00 2001 From: showkath10 <90783892+showkath10@users.noreply.github.com> Date: Tue, 14 Dec 2021 09:45:12 +0000 Subject: [PATCH 5/9] Code changes made this will now work for the new scenrio given in the ticket --- .../CurrentFiltersViewComponentTests.cs | 4 +- .../CentreAdministratorsViewModelTests.cs | 9 +-- .../SearchableAdminViewModelTests.cs | 60 +++++++++++++++---- .../Administrator/AdministratorController.cs | 14 ++--- .../Administrator/AllAdminsViewModel.cs | 5 +- .../CentreAdministratorsViewModel.cs | 7 +-- .../Administrator/SearchableAdminViewModel.cs | 15 ++++- 7 files changed, 76 insertions(+), 38 deletions(-) diff --git a/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs b/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs index 4aff79316f..9093070fc9 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewComponents/CurrentFiltersViewComponentTests.cs @@ -2,6 +2,7 @@ { using System.Collections.Generic; using DigitalLearningSolutions.Data.Models.User; + using DigitalLearningSolutions.Data.Tests.TestHelpers; using DigitalLearningSolutions.Web.Helpers.FilterOptions; using DigitalLearningSolutions.Web.ViewComponents; using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; @@ -43,8 +44,7 @@ public void CurrentFiltersViewComponent_selects_expected_filters_to_display() searchString, "CategoryName|CategoryName|Word╡Role|IsCentreAdmin|true", 1, - false, - 1 + UserTestHelper.GetDefaultAdminUser() ); var expectedAppliedFilters = new List { diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs index 02f59043d8..850f4abceb 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModelTests.cs @@ -41,8 +41,7 @@ public void Centre_administrators_should_default_to_returning_the_first_ten_admi null, null, 1, - false, - 1 + UserTestHelper.GetDefaultAdminUser() ); model.Admins.Count().Should().Be(10); @@ -59,8 +58,7 @@ public void Centre_administrators_should_correctly_return_the_second_page_of_adm null, null, 2, - false, - 1 + UserTestHelper.GetDefaultAdminUser() ); model.Admins.Count().Should().Be(5); @@ -100,8 +98,7 @@ public void Centre_Administrators_filters_should_be_set() null, null, 2, - false, - 1 + UserTestHelper.GetDefaultAdminUser() ); // Then diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs index 76b6c08aec..0fd4897ab6 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs @@ -7,34 +7,51 @@ public class SearchableAdminViewModelTests { + [Test] - public void SearchableAdmin_show_deactivate_admin_button_for_super_admin() + public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_their_own_account() { // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(2, firstName: "a", lastName: "Surname"); + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); // When var model = new SearchableAdminViewModel( adminUser, - true, - 1 + loggedInAdminUser ); // Then - model.CanShowDeactivateAdminButton.Should().BeTrue(); + model.CanShowDeactivateAdminButton.Should().BeFalse(); + } + + public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_other_centre_manager() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); + + // When + var model = new SearchableAdminViewModel( + adminUser, + loggedInAdminUser + ); + + // Then + model.CanShowDeactivateAdminButton.Should().BeFalse(); } [Test] - public void SearchableAdmin_do_not_show_deactivate_admin_button_if_user_do_not_have_super_admin_access() + public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_super_admin_account() { // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(firstName: "a", lastName: "Surname"); + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); // When var model = new SearchableAdminViewModel( adminUser, - false, - 1 + loggedInAdminUser ); // Then @@ -42,20 +59,37 @@ public void SearchableAdmin_do_not_show_deactivate_admin_button_if_user_do_not_h } [Test] - public void SearchableAdmin_do_not_show_deactivate_admin_button_for_logged_in_admin_user_card() + public void SearchableAdmin_super_admin_should_not_be_able_to_deactivate_their_own_account() { // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(1, firstName: "a", lastName: "Surname"); + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); // When var model = new SearchableAdminViewModel( adminUser, - false, - 1 + loggedInAdminUser ); // Then model.CanShowDeactivateAdminButton.Should().BeFalse(); } + + [Test] + public void SearchableAdmin_super_admin_should_be_able_to_deactivate_other_super_admin() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isUserAdmin: true); + + // When + var model = new SearchableAdminViewModel( + adminUser, + loggedInAdminUser + ); + + // Then + model.CanShowDeactivateAdminButton.Should().BeTrue(); + } } } diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs index 79d6d6dc87..0f7a62e991 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs @@ -62,7 +62,8 @@ public IActionResult Index( var adminUsersAtCentre = userDataService.GetAdminUsersByCentreId(centreId); var categories = GetCourseCategories(centreId); var hasSuperAdminAccess = User.HasSuperAdminPermissions(); - var currentAdminUserId = User.GetAdminId(); + var loggedInUserId = User.GetAdminId(); + var loggedInAdminUser = userDataService.GetAdminUserById(loggedInUserId!.GetValueOrDefault()); var model = new CentreAdministratorsViewModel( @@ -72,8 +73,7 @@ public IActionResult Index( searchString, filterBy, page, - hasSuperAdminAccess, - currentAdminUserId.GetValueOrDefault() + loggedInAdminUser! ); Response.UpdateOrDeleteFilterCookie(AdminFilterCookieName, filterBy); @@ -85,16 +85,16 @@ public IActionResult Index( public IActionResult AllAdmins() { var centreId = User.GetCentreId(); - var hasSuperAdminAccess = User.HasSuperAdminPermissions(); - var currentAdminUserId = User.GetAdminId(); + var loggedInUserId = User.GetAdminId(); + var loggedInAdminUser = userDataService.GetAdminUserById(loggedInUserId!.GetValueOrDefault()); + var adminUsersAtCentre = userDataService.GetAdminUsersByCentreId(centreId); var categories = GetCourseCategories(centreId); var model = new AllAdminsViewModel( adminUsersAtCentre, categories, - hasSuperAdminAccess, - currentAdminUserId.GetValueOrDefault() + loggedInAdminUser! ); return View("AllAdmins", model); } diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/AllAdminsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/AllAdminsViewModel.cs index ac07e78bfd..2bbf03e0db 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/AllAdminsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/AllAdminsViewModel.cs @@ -12,11 +12,10 @@ public class AllAdminsViewModel : BaseJavaScriptFilterableViewModel public AllAdminsViewModel(IEnumerable adminUsers, IEnumerable categories, - bool hasSuperAdminAccess, - int currentAdminUserId) + AdminUser loggedInAdminUser) { - Admins = adminUsers.Select(au => new SearchableAdminViewModel(au, hasSuperAdminAccess, currentAdminUserId)); + Admins = adminUsers.Select(au => new SearchableAdminViewModel(au, loggedInAdminUser)); Filters = new[] { diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs index fd64a5cd99..650620587c 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/CentreAdministratorsViewModel.cs @@ -14,9 +14,8 @@ public CentreAdministratorsViewModel( IEnumerable categories, string? searchString, string? filterBy, - int page, - bool hasSuperAdminAccess, - int currentAdminUserId + int page, + AdminUser loggedInAdminUser ) : base(searchString, page, true, filterBy: filterBy, searchLabel: "Search administrators") { CentreId = centreId; @@ -30,7 +29,7 @@ int currentAdminUserId MatchingSearchResults = filteredItems.Count; SetTotalPages(); var paginatedItems = GetItemsOnCurrentPage(filteredItems); - Admins = paginatedItems.Select(adminUser => new SearchableAdminViewModel(adminUser, hasSuperAdminAccess, currentAdminUserId)); + Admins = paginatedItems.Select(adminUser => new SearchableAdminViewModel(adminUser, loggedInAdminUser)); Filters = new[] { diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs index 9699e82948..e44e3311fa 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs @@ -6,15 +6,24 @@ public class SearchableAdminViewModel : BaseFilterableViewModel { - public SearchableAdminViewModel(AdminUser adminUser, bool hasSuperAdminAccess, int currentAdminUserId) + public SearchableAdminViewModel(AdminUser adminUser, AdminUser loggedInAdminUser) { Id = adminUser.Id; Name = adminUser.SearchableName; CategoryName = adminUser.CategoryName ?? "All"; EmailAddress = adminUser.EmailAddress; IsLocked = adminUser.IsLocked; - CanShowDeactivateAdminButton = hasSuperAdminAccess - && currentAdminUserId != adminUser.Id; + + if (loggedInAdminUser.IsUserAdmin) + { + CanShowDeactivateAdminButton = adminUser.Id != loggedInAdminUser.Id; + }else if (loggedInAdminUser.IsCentreManager) + { + CanShowDeactivateAdminButton = !adminUser.IsUserAdmin + && !adminUser.IsCentreManager + && adminUser.Id != loggedInAdminUser.Id; + } + Tags = FilterableTagHelper.GetCurrentTagsForAdminUser(adminUser); } From 49fd106f0eab974afdca71a658722d24bc325e11 Mon Sep 17 00:00:00 2001 From: showkath10 <90783892+showkath10@users.noreply.github.com> Date: Tue, 14 Dec 2021 12:10:26 +0000 Subject: [PATCH 6/9] Ran code cleanup --- .../Centre/Administrator/SearchableAdminViewModel.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs index e44e3311fa..79d68e2061 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs @@ -17,13 +17,14 @@ public SearchableAdminViewModel(AdminUser adminUser, AdminUser loggedInAdminUser if (loggedInAdminUser.IsUserAdmin) { CanShowDeactivateAdminButton = adminUser.Id != loggedInAdminUser.Id; - }else if (loggedInAdminUser.IsCentreManager) + } + else if (loggedInAdminUser.IsCentreManager) { CanShowDeactivateAdminButton = !adminUser.IsUserAdmin && !adminUser.IsCentreManager && adminUser.Id != loggedInAdminUser.Id; } - + Tags = FilterableTagHelper.GetCurrentTagsForAdminUser(adminUser); } From 799b8be843b175a8df435bed06b88381896e5433 Mon Sep 17 00:00:00 2001 From: showkath10 <90783892+showkath10@users.noreply.github.com> Date: Fri, 17 Dec 2021 18:41:10 +0000 Subject: [PATCH 7/9] Tech review - updates --- .../SearchableAdminViewModelTests.cs | 28 +++++++++++++++---- .../Administrator/AdministratorController.cs | 1 - .../Administrator/SearchableAdminViewModel.cs | 6 +++- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs index 0fd4897ab6..fc8834df94 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs @@ -12,8 +12,8 @@ public class SearchableAdminViewModelTests public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_their_own_account() { // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); // When var model = new SearchableAdminViewModel( @@ -29,7 +29,7 @@ public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_othe { // Given var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isCentreAdmin: true); // When var model = new SearchableAdminViewModel( @@ -45,8 +45,9 @@ public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_othe public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_super_admin_account() { // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isCentreManager: true, isUserAdmin: false); + // When var model = new SearchableAdminViewModel( @@ -91,5 +92,22 @@ public void SearchableAdmin_super_admin_should_be_able_to_deactivate_other_super // Then model.CanShowDeactivateAdminButton.Should().BeTrue(); } + + [Test] + public void SearchableAdmin_super_admin_should_be_able_to_deactivate_centre_manager() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isUserAdmin: true); + + // When + var model = new SearchableAdminViewModel( + adminUser, + loggedInAdminUser + ); + + // Then + model.CanShowDeactivateAdminButton.Should().BeTrue(); + } } } diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs index 0f7a62e991..57493464ad 100644 --- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs +++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs @@ -61,7 +61,6 @@ public IActionResult Index( var centreId = User.GetCentreId(); var adminUsersAtCentre = userDataService.GetAdminUsersByCentreId(centreId); var categories = GetCourseCategories(centreId); - var hasSuperAdminAccess = User.HasSuperAdminPermissions(); var loggedInUserId = User.GetAdminId(); var loggedInAdminUser = userDataService.GetAdminUserById(loggedInUserId!.GetValueOrDefault()); diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs index 79d68e2061..4418df5d23 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs @@ -24,6 +24,10 @@ public SearchableAdminViewModel(AdminUser adminUser, AdminUser loggedInAdminUser && !adminUser.IsCentreManager && adminUser.Id != loggedInAdminUser.Id; } + else + { + CanShowDeactivateAdminButton = true; + } Tags = FilterableTagHelper.GetCurrentTagsForAdminUser(adminUser); } @@ -42,6 +46,6 @@ public SearchableAdminViewModel(AdminUser adminUser, AdminUser loggedInAdminUser public bool IsLocked { get; set; } - public bool CanShowDeactivateAdminButton { get; set; } + public bool CanShowDeactivateAdminButton { get; } } } From b567fcd522d6c3645433dcbeac8d2118183077c0 Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Fri, 7 Jan 2022 11:51:26 +0000 Subject: [PATCH 8/9] HEEDLS-594 Tech lead review markups --- .../SearchableAdminViewModelTests.cs | 4 +-- .../Administrator/SearchableAdminViewModel.cs | 34 +++++++++++-------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs index fc8834df94..f0b035c77a 100644 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs +++ b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs @@ -28,8 +28,8 @@ public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_thei public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_other_centre_manager() { // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreAdmin: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isCentreAdmin: true); + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isCentreManager: true); // When var model = new SearchableAdminViewModel( diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs index 4418df5d23..b859d314df 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs @@ -6,6 +6,8 @@ public class SearchableAdminViewModel : BaseFilterableViewModel { + public readonly bool CanShowDeactivateAdminButton; + public SearchableAdminViewModel(AdminUser adminUser, AdminUser loggedInAdminUser) { Id = adminUser.Id; @@ -14,20 +16,7 @@ public SearchableAdminViewModel(AdminUser adminUser, AdminUser loggedInAdminUser EmailAddress = adminUser.EmailAddress; IsLocked = adminUser.IsLocked; - if (loggedInAdminUser.IsUserAdmin) - { - CanShowDeactivateAdminButton = adminUser.Id != loggedInAdminUser.Id; - } - else if (loggedInAdminUser.IsCentreManager) - { - CanShowDeactivateAdminButton = !adminUser.IsUserAdmin - && !adminUser.IsCentreManager - && adminUser.Id != loggedInAdminUser.Id; - } - else - { - CanShowDeactivateAdminButton = true; - } + CanShowDeactivateAdminButton = LoggedInAdminCanDeactivateUser(adminUser, loggedInAdminUser); Tags = FilterableTagHelper.GetCurrentTagsForAdminUser(adminUser); } @@ -46,6 +35,21 @@ public SearchableAdminViewModel(AdminUser adminUser, AdminUser loggedInAdminUser public bool IsLocked { get; set; } - public bool CanShowDeactivateAdminButton { get; } + private static bool LoggedInAdminCanDeactivateUser(AdminUser adminUser, AdminUser loggedInAdminUser) + { + if (loggedInAdminUser.IsUserAdmin) + { + return adminUser.Id != loggedInAdminUser.Id; + } + + if (loggedInAdminUser.IsCentreManager) + { + return !adminUser.IsUserAdmin + && !adminUser.IsCentreManager + && adminUser.Id != loggedInAdminUser.Id; + } + + return true; + } } } From 78a8210da8edb664a8bcda5f1aaf2bea80cfac86 Mon Sep 17 00:00:00 2001 From: Alex Jackson Date: Thu, 10 Feb 2022 16:10:59 +0000 Subject: [PATCH 9/9] HEEDLS-594 Refactor Deactivate permissions logic into helper --- .../Helpers/UserPermissionsHelperTests.cs | 96 ++++++++++++++ .../Helpers/UserPermissionsHelper.cs | 24 ++++ .../SearchableAdminViewModelTests.cs | 119 ------------------ .../Administrator/SearchableAdminViewModel.cs | 21 +--- 4 files changed, 122 insertions(+), 138 deletions(-) create mode 100644 DigitalLearningSolutions.Data.Tests/Helpers/UserPermissionsHelperTests.cs create mode 100644 DigitalLearningSolutions.Data/Helpers/UserPermissionsHelper.cs delete mode 100644 DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs diff --git a/DigitalLearningSolutions.Data.Tests/Helpers/UserPermissionsHelperTests.cs b/DigitalLearningSolutions.Data.Tests/Helpers/UserPermissionsHelperTests.cs new file mode 100644 index 0000000000..9134071bb4 --- /dev/null +++ b/DigitalLearningSolutions.Data.Tests/Helpers/UserPermissionsHelperTests.cs @@ -0,0 +1,96 @@ +namespace DigitalLearningSolutions.Data.Tests.Helpers +{ + using DigitalLearningSolutions.Data.Helpers; + using DigitalLearningSolutions.Data.Tests.TestHelpers; + using FluentAssertions; + using NUnit.Framework; + + public class UserPermissionsHelperTests + { + + [Test] + public void LoggedInAdminCanDeactivateUser_centre_manager_should_not_be_able_to_deactivate_their_own_account() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); + + // When + var result = UserPermissionsHelper.LoggedInAdminCanDeactivateUser(adminUser, loggedInAdminUser); + + // Then + result.Should().BeFalse(); + } + + [Test] + public void LoggedInAdminCanDeactivateUser_centre_manager_should_not_be_able_to_deactivate_other_centre_manager() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true, isUserAdmin: false); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isCentreManager: true, isUserAdmin: false); + + // When + var result = UserPermissionsHelper.LoggedInAdminCanDeactivateUser(adminUser, loggedInAdminUser); + + // Then + result.Should().BeFalse(); + } + + [Test] + public void LoggedInAdminCanDeactivateUser_centre_manager_should_not_be_able_to_deactivate_super_admin_account() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isCentreManager: true, isUserAdmin: false); + + + // When + var result = UserPermissionsHelper.LoggedInAdminCanDeactivateUser(adminUser, loggedInAdminUser); + + // Then + result.Should().BeFalse(); + } + + [Test] + public void LoggedInAdminCanDeactivateUser_super_admin_should_not_be_able_to_deactivate_their_own_account() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); + + // When + var result = UserPermissionsHelper.LoggedInAdminCanDeactivateUser(adminUser, loggedInAdminUser); + + // Then + result.Should().BeFalse(); + } + + [Test] + public void LoggedInAdminCanDeactivateUser_super_admin_should_be_able_to_deactivate_other_super_admin() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isUserAdmin: true); + + // When + var result = UserPermissionsHelper.LoggedInAdminCanDeactivateUser(adminUser, loggedInAdminUser); + + // Then + result.Should().BeTrue(); + } + + [Test] + public void LoggedInAdminCanDeactivateUser_super_admin_should_be_able_to_deactivate_centre_manager() + { + // Given + var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); + var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isUserAdmin: true); + + // When + var result = UserPermissionsHelper.LoggedInAdminCanDeactivateUser(adminUser, loggedInAdminUser); + + // Then + result.Should().BeTrue(); + } + } +} diff --git a/DigitalLearningSolutions.Data/Helpers/UserPermissionsHelper.cs b/DigitalLearningSolutions.Data/Helpers/UserPermissionsHelper.cs new file mode 100644 index 0000000000..3550a1f5e0 --- /dev/null +++ b/DigitalLearningSolutions.Data/Helpers/UserPermissionsHelper.cs @@ -0,0 +1,24 @@ +namespace DigitalLearningSolutions.Data.Helpers +{ + using DigitalLearningSolutions.Data.Models.User; + + public static class UserPermissionsHelper + { + public static bool LoggedInAdminCanDeactivateUser(AdminUser adminUser, AdminUser loggedInAdminUser) + { + if (loggedInAdminUser.IsUserAdmin) + { + return adminUser.Id != loggedInAdminUser.Id; + } + + if (loggedInAdminUser.IsCentreManager) + { + return !adminUser.IsUserAdmin + && !adminUser.IsCentreManager + && adminUser.Id != loggedInAdminUser.Id; + } + + return false; + } + } +} diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs deleted file mode 100644 index a0c2875735..0000000000 --- a/DigitalLearningSolutions.Web.Tests/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModelTests.cs +++ /dev/null @@ -1,119 +0,0 @@ -namespace DigitalLearningSolutions.Web.Tests.ViewModels.TrackingSystem.Centre.Administrator -{ - using DigitalLearningSolutions.Data.Tests.TestHelpers; - using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Administrator; - using FluentAssertions; - using NUnit.Framework; - - public class SearchableAdminViewModelTests - { - - [Test] - public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_their_own_account() - { - // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); - - // When - var model = new SearchableAdminViewModel( - adminUser, - loggedInAdminUser, - 1 - ); - - // Then - model.CanShowDeactivateAdminButton.Should().BeFalse(); - } - - public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_other_centre_manager() - { - // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isCentreManager: true); - - // When - var model = new SearchableAdminViewModel( - adminUser, - loggedInAdminUser, - 1 - ); - - // Then - model.CanShowDeactivateAdminButton.Should().BeFalse(); - } - - [Test] - public void SearchableAdmin_centre_manager_should_not_be_able_to_deactivate_super_admin_account() - { - // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isCentreManager: true, isUserAdmin: false); - - - // When - var model = new SearchableAdminViewModel( - adminUser, - loggedInAdminUser, - 1 - ); - - // Then - model.CanShowDeactivateAdminButton.Should().BeFalse(); - } - - [Test] - public void SearchableAdmin_super_admin_should_not_be_able_to_deactivate_their_own_account() - { - // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); - - // When - var model = new SearchableAdminViewModel( - adminUser, - loggedInAdminUser, - 1 - ); - - // Then - model.CanShowDeactivateAdminButton.Should().BeFalse(); - } - - [Test] - public void SearchableAdmin_super_admin_should_be_able_to_deactivate_other_super_admin() - { - // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isUserAdmin: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isUserAdmin: true); - - // When - var model = new SearchableAdminViewModel( - adminUser, - loggedInAdminUser, - 1 - ); - - // Then - model.CanShowDeactivateAdminButton.Should().BeTrue(); - } - - [Test] - public void SearchableAdmin_super_admin_should_be_able_to_deactivate_centre_manager() - { - // Given - var adminUser = UserTestHelper.GetDefaultAdminUser(id: 1, isCentreManager: true); - var loggedInAdminUser = UserTestHelper.GetDefaultAdminUser(id: 2, isUserAdmin: true); - - // When - var model = new SearchableAdminViewModel( - adminUser, - loggedInAdminUser, - 1 - ); - - // Then - model.CanShowDeactivateAdminButton.Should().BeTrue(); - } - } -} diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs index 5bbd493942..2ab792b3f6 100644 --- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs +++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/Centre/Administrator/SearchableAdminViewModel.cs @@ -1,5 +1,6 @@ namespace DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Centre.Administrator { + using DigitalLearningSolutions.Data.Helpers; using DigitalLearningSolutions.Data.Models.User; using DigitalLearningSolutions.Web.Helpers; using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage; @@ -16,7 +17,7 @@ public SearchableAdminViewModel(AdminUser adminUser, AdminUser loggedInAdminUser EmailAddress = adminUser.EmailAddress; IsLocked = adminUser.IsLocked; - CanShowDeactivateAdminButton = LoggedInAdminCanDeactivateUser(adminUser, loggedInAdminUser); + CanShowDeactivateAdminButton = UserPermissionsHelper.LoggedInAdminCanDeactivateUser(adminUser, loggedInAdminUser); Tags = FilterableTagHelper.GetCurrentTagsForAdminUser(adminUser); Page = page; @@ -36,24 +37,6 @@ public SearchableAdminViewModel(AdminUser adminUser, AdminUser loggedInAdminUser public bool IsLocked { get; set; } - public bool IsCentreManager { get; set; } - public int? Page { get; set; } - private static bool LoggedInAdminCanDeactivateUser(AdminUser adminUser, AdminUser loggedInAdminUser) - { - if (loggedInAdminUser.IsUserAdmin) - { - return adminUser.Id != loggedInAdminUser.Id; - } - - if (loggedInAdminUser.IsCentreManager) - { - return !adminUser.IsUserAdmin - && !adminUser.IsCentreManager - && adminUser.Id != loggedInAdminUser.Id; - } - - return true; - } } }