using ManagerService.Controllers; using ManagerService.Data; using ManagerService.DTOs; using ManagerService.Tests.Infrastructure; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging.Abstractions; using Xunit; namespace ManagerService.Tests.Controllers { public class SubscriptionPlanControllerTests { private SubscriptionPlanController BuildController(MyInfoMateDbContext db) => new SubscriptionPlanController(NullLogger.Instance, db); // ── GET ────────────────────────────────────────────────────────────── [Fact] public void Get_ReturnsAllPlans() { using var db = DbContextFactory.Create(); db.SubscriptionPlans.AddRange( new SubscriptionPlan { Id = "p1", Name = "Starter" }, new SubscriptionPlan { Id = "p2", Name = "Standard" } ); db.SaveChanges(); var result = BuildController(db).Get(); var ok = Assert.IsType(result); var plans = Assert.IsAssignableFrom>(ok.Value); Assert.Equal(2, plans.Count()); } [Fact] public void GetById_ExistingId_ReturnsDto() { using var db = DbContextFactory.Create(); db.SubscriptionPlans.Add(new SubscriptionPlan { Id = "p1", Name = "Starter", StorageQuotaBytes = 1024, AiRequestsPerMonth = 50 }); db.SaveChanges(); var result = BuildController(db).GetById("p1"); var ok = Assert.IsType(result); var dto = Assert.IsType(ok.Value); Assert.Equal("Starter", dto.name); Assert.Equal(1024, dto.storageQuotaBytes); Assert.Equal(50, dto.aiRequestsPerMonth); } [Fact] public void GetById_UnknownId_Returns404() { using var db = DbContextFactory.Create(); var result = BuildController(db).GetById("unknown"); Assert.IsType(result); } // ── CREATE ─────────────────────────────────────────────────────────── [Fact] public void Create_ValidDto_PersistsAndReturnsDto() { using var db = DbContextFactory.Create(); var dto = new SubscriptionPlanDTO { name = "Premium", storageQuotaBytes = 5000, aiRequestsPerMonth = 100 }; var result = BuildController(db).Create(dto); var ok = Assert.IsType(result); var returned = Assert.IsType(ok.Value); Assert.Equal("Premium", returned.name); Assert.NotNull(returned.id); Assert.Equal(1, db.SubscriptionPlans.Count()); } [Fact] public void Create_NullDto_Returns400() { using var db = DbContextFactory.Create(); var result = BuildController(db).Create(null!); Assert.IsType(result); } // ── UPDATE ─────────────────────────────────────────────────────────── [Fact] public void Update_ExistingPlan_UpdatesName() { using var db = DbContextFactory.Create(); db.SubscriptionPlans.Add(new SubscriptionPlan { Id = "p1", Name = "Old" }); db.SaveChanges(); var result = BuildController(db).Update(new SubscriptionPlanDTO { id = "p1", name = "New", storageQuotaBytes = 0, aiRequestsPerMonth = 0 }); Assert.IsType(result); Assert.Equal("New", db.SubscriptionPlans.First().Name); } [Fact] public void Update_UnknownId_Returns404() { using var db = DbContextFactory.Create(); var result = BuildController(db).Update(new SubscriptionPlanDTO { id = "unknown", name = "X" }); Assert.IsType(result); } [Fact] public void Update_NullDto_Returns400() { using var db = DbContextFactory.Create(); var result = BuildController(db).Update(null!); Assert.IsType(result); } // ── DELETE ─────────────────────────────────────────────────────────── [Fact] public void Delete_UnusedPlan_Returns202() { using var db = DbContextFactory.Create(); db.SubscriptionPlans.Add(new SubscriptionPlan { Id = "p1", Name = "Starter" }); db.SaveChanges(); var result = BuildController(db).Delete("p1"); var statusResult = Assert.IsType(result); Assert.Equal(202, statusResult.StatusCode); Assert.Equal(0, db.SubscriptionPlans.Count()); } [Fact] public void Delete_PlanUsedByInstance_Returns409() { using var db = DbContextFactory.Create(); db.SubscriptionPlans.Add(new SubscriptionPlan { Id = "p1", Name = "Starter" }); db.Instances.Add(new Instance { Id = "inst1", Name = "Musée", SubscriptionPlanId = "p1", DateCreation = DateTime.UtcNow }); db.SaveChanges(); var result = BuildController(db).Delete("p1"); Assert.IsType(result); } [Fact] public void Delete_UnknownId_Returns404() { using var db = DbContextFactory.Create(); var result = BuildController(db).Delete("unknown"); Assert.IsType(result); } } }