using System; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using LCU.API.Internal.DocumentIngestor.Security; using Microsoft.AspNetCore.Authorization; using NUnit.Framework; namespace LCU.API.Internal.DocumentIngestorTests.Security; public class GroupMembershipRequirementHandlerTest { private readonly IAuthorizationHandler _handler = new GroupMembershipRequirementHandler(); private readonly GroupMembershipRequirement _requirement = new ( Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString() ); [Test] public async Task HandleRequirementAsync_NoRolesOrGroups_RequirementNotSucceeded() { var principal = new ClaimsPrincipal(); var context = new AuthorizationHandlerContext(new[] { _requirement }, principal, null); await _handler.HandleAsync(context); Assert.IsFalse(context.HasSucceeded); } [Test] public async Task HandleRequirementAsync_RolesAndGroupsDoesNotIncludeAnyRequirementGroups_RequirementNotSucceeded() { var roles = new[] { new Claim("roles", Guid.NewGuid().ToString()), new Claim("roles", Guid.NewGuid().ToString()), new Claim("roles", Guid.NewGuid().ToString()), }; var groups = new[] { new Claim("groups", Guid.NewGuid().ToString()), new Claim("groups", Guid.NewGuid().ToString()), new Claim("groups", Guid.NewGuid().ToString()), }; var principal = new ClaimsPrincipal(new ClaimsIdentity(roles.Concat(groups))); var context = new AuthorizationHandlerContext(new[] { _requirement }, principal, null); await _handler.HandleAsync(context); Assert.IsFalse(context.HasSucceeded); } [Test] public async Task HandleRequirementAsync_OneRoleIncludedInRequirementGroups_RequirementSucceeded() { var includedRole = _requirement.Groups.Skip(DateTime.Now.Millisecond % _requirement.Groups.Count).First(); var roles = new[] { new Claim("roles", Guid.NewGuid().ToString()), new Claim("roles", includedRole), new Claim("roles", Guid.NewGuid().ToString()), }; var groups = new[] { new Claim("groups", Guid.NewGuid().ToString()), new Claim("groups", Guid.NewGuid().ToString()), new Claim("groups", Guid.NewGuid().ToString()), }; var principal = new ClaimsPrincipal(new ClaimsIdentity(roles.Concat(groups))); var context = new AuthorizationHandlerContext(new[] { _requirement }, principal, null); await _handler.HandleAsync(context); Assert.IsTrue(context.HasSucceeded); } [Test] public async Task HandleRequirementAsync_OneGroupIncludedInRequirementGroups_RequirementSucceeded() { var includedRole = _requirement.Groups.Skip(DateTime.Now.Millisecond % _requirement.Groups.Count).First(); var roles = new[] { new Claim("roles", Guid.NewGuid().ToString()), new Claim("roles", includedRole), new Claim("roles", Guid.NewGuid().ToString()) }; var groups = new[] { new Claim("groups", Guid.NewGuid().ToString()), new Claim("groups", includedRole), new Claim("groups", Guid.NewGuid().ToString()) }; var principal = new ClaimsPrincipal(new ClaimsIdentity(roles.Concat(groups))); var context = new AuthorizationHandlerContext(new[] { _requirement }, principal, null); await _handler.HandleAsync(context); Assert.IsTrue(context.HasSucceeded); } }