using NSubstitute; using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Support.ListSelectableRoles; using PnvPanel.Application.Tests.TestSupport; using Xunit; namespace PnvPanel.Application.Tests.Support.ListSelectableRoles; public class ListSelectableRolesQueryHandlerTests { private readonly IRoleService _roleService = Substitute.For(); private readonly IIdentityService _identityService = Substitute.For(); private static CurrentUserProfile Profile(Guid userId, Guid roleId, string role) => new( userId, "user", roleId, role, IsActivated: true, IsBlocked: false, MaxConfigs: 3, MaxIpLimit: 1, SubscriptionToken: "token" ); [Fact] public async Task Handle_ExcludesAdminAndCurrentUserRole() { var userId = Guid.NewGuid(); var currentRoleId = Guid.NewGuid(); var extendedRoleId = Guid.NewGuid(); var adminRoleId = Guid.NewGuid(); _roleService .ListRolesAsync(Arg.Any()) .Returns( new List { new(adminRoleId, "admin", -1, -1, IsSystem: true), new(currentRoleId, "user", 3, 1, IsSystem: true), new(extendedRoleId, "extended", 10, 5, IsSystem: false), } ); _identityService .GetProfileAsync(userId, Arg.Any()) .Returns(Profile(userId, currentRoleId, "user")); var currentUser = FakeCurrentUser.Authenticated(userId, "alice"); var handler = new ListSelectableRolesQueryHandler( _roleService, _identityService, currentUser ); var result = await handler.Handle(new ListSelectableRolesQuery(), CancellationToken.None); Assert.True(result.IsSuccess); Assert.Equal(["extended"], result.Value.Select(r => r.Name)); } [Fact] public async Task Handle_WhenProfileMissing_StillExcludesAdmin() { var userId = Guid.NewGuid(); var userRoleId = Guid.NewGuid(); var adminRoleId = Guid.NewGuid(); _roleService .ListRolesAsync(Arg.Any()) .Returns( new List { new(adminRoleId, "admin", -1, -1, IsSystem: true), new(userRoleId, "user", 3, 1, IsSystem: true), } ); _identityService .GetProfileAsync(userId, Arg.Any()) .Returns((CurrentUserProfile?)null); var currentUser = FakeCurrentUser.Authenticated(userId, "alice"); var handler = new ListSelectableRolesQueryHandler( _roleService, _identityService, currentUser ); var result = await handler.Handle(new ListSelectableRolesQuery(), CancellationToken.None); Assert.True(result.IsSuccess); Assert.Equal(["user"], result.Value.Select(r => r.Name)); } }