using Data.SeaHavenIndustries; using Data.SeaHavenIndustries.Enums; using FluentAssertions; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using SeaHaven.DataServices.Implementation; using Xunit; namespace Api.SeaHavenIndustries.Tests; public sealed class TeamPermissionOverrideDataServiceTests { [Fact] public async Task GetUserAsync_ReturnsIdentityRoleAndStoredOverrides() { await using var context = NewContext(); SeedUserWithRole(context, "u1", "Dispatcher"); context.UserPermissionOverrides.Add(new UserPermissionOverride { UserId = "u1", PermissionKey = "deleteSites", State = UserPermissionState.Deny }); await context.SaveChangesAsync(); var result = await new TeamPermissionOverrideDataService(context) .GetUserAsync("u1", CancellationToken.None); result.Should().NotBeNull(); result!.RoleName.Should().Be("Dispatcher"); result.Overrides["deleteSites"].Should().Be(UserPermissionState.Deny); } [Fact] public async Task SetOverrideAsync_UpsertsOneCompositeKey() { await using var context = NewContext(); SeedUserWithRole(context, "u1", "Scheduler"); await context.SaveChangesAsync(); var service = new TeamPermissionOverrideDataService(context); await service.SetOverrideAsync("u1", "deleteSites", UserPermissionState.Allow, CancellationToken.None); await service.SetOverrideAsync("u1", "deleteSites", UserPermissionState.Deny, CancellationToken.None); var rows = await context.UserPermissionOverrides.ToListAsync(); rows.Should().ContainSingle(); rows[0].State.Should().Be(UserPermissionState.Deny); } private static ApplicationDbContext NewContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; return new ApplicationDbContext(options); } private static void SeedUserWithRole(ApplicationDbContext context, string userId, string roleName) { context.Users.Add(new ApplicationUser { Id = userId, UserName = userId, NormalizedUserName = userId.ToUpperInvariant(), Email = userId + "@example.com", NormalizedEmail = (userId + "@example.com").ToUpperInvariant() }); context.Roles.Add(new IdentityRole { Id = "role-1", Name = roleName, NormalizedName = roleName.ToUpperInvariant() }); context.UserRoles.Add(new IdentityUserRole { UserId = userId, RoleId = "role-1" }); } }