using ManagerService.Controllers; using ManagerService.Data; using ManagerService.Services; using static ManagerService.Services.ApiKeyDatabaseService; using ManagerService.Tests.Infrastructure; using Microsoft.AspNetCore.Mvc; using System.Linq; using System.Threading.Tasks; using Xunit; namespace ManagerService.Tests.Controllers { public class ApiKeyControllerTests { private static ApiKeyController BuildController(MyInfoMateDbContext db, string instanceId = "inst-test") { var service = new ApiKeyDatabaseService(db); var controller = new ApiKeyController(service); FakeUser.SetUser(controller, FakeUser.Create("Manager.instanceadmin", instanceId)); return controller; } [Fact] public async Task GetApiKeys_ReturnsKeysForInstance() { using var db = DbContextFactory.Create(); db.ApiKeys.AddRange( new ApiKey { Id = "k1", InstanceId = "inst-test", Name = "Key1", KeyHash = "h1", IsActive = true, AppType = ApiKeyAppType.VisitApp }, new ApiKey { Id = "k2", InstanceId = "other-inst", Name = "Key2", KeyHash = "h2", IsActive = true, AppType = ApiKeyAppType.VisitApp } ); db.SaveChanges(); var result = await BuildController(db).GetApiKeys(); var ok = Assert.IsType(result); var keys = Assert.IsAssignableFrom>(ok.Value); Assert.Single(keys); } [Fact] public async Task CreateApiKey_ValidRequest_ReturnsPlainKey() { using var db = DbContextFactory.Create(); var result = await BuildController(db).CreateApiKey(new CreateApiKeyRequest { Name = "My Key", AppType = ApiKeyAppType.VisitApp }); var ok = Assert.IsType(result); Assert.NotNull(ok.Value); // La clé plain text doit commencer par "ak_" var keyProp = ok.Value!.GetType().GetProperty("key"); Assert.NotNull(keyProp); var plainKey = keyProp!.GetValue(ok.Value) as string; Assert.StartsWith("ak_", plainKey); // La clé est stockée hachée, pas en clair Assert.Equal(1, db.ApiKeys.Count()); Assert.Null(db.ApiKeys.First().Key); } [Fact] public async Task RevokeApiKey_ExistingKey_Returns204() { using var db = DbContextFactory.Create(); db.ApiKeys.Add(new ApiKey { Id = "k1", InstanceId = "inst-test", Name = "Key1", KeyHash = "h1", IsActive = true, AppType = ApiKeyAppType.VisitApp }); db.SaveChanges(); var result = await BuildController(db).RevokeApiKey("k1"); Assert.IsType(result); Assert.Equal(0, db.ApiKeys.Count(k => k.IsActive)); } [Fact] public async Task RevokeApiKey_UnknownKey_Returns404() { using var db = DbContextFactory.Create(); var result = await BuildController(db).RevokeApiKey("unknown"); Assert.IsType(result); } } }