using Manager.Services; using ManagerService.Controllers; using ManagerService.Data; using ManagerService.DTOs; using ManagerService.Services; using ManagerService.Tests.Infrastructure; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging.Abstractions; using System.Collections.Generic; using System.Linq; using Xunit; namespace ManagerService.Tests.Controllers { public class ResourceControllerTests { private static ResourceController BuildController(MyInfoMateDbContext db) { var cfg = FakeMongoConfig.Create(); var controller = new ResourceController( NullLogger.Instance, new ResourceDatabaseService(cfg), new SectionDatabaseService(cfg), new ConfigurationDatabaseService(cfg), db); FakeUser.SetUser(controller, FakeUser.Create("Manager.contenteditor", "inst-test")); return controller; } // ── GET ────────────────────────────────────────────────────────────── [Fact] public void Get_FiltersToInstance() { using var db = DbContextFactory.Create(); db.Resources.AddRange( new Resource { Id = "r1", InstanceId = "inst-test", Label = "A", Type = ResourceType.Image }, new Resource { Id = "r2", InstanceId = "other-inst", Label = "B", Type = ResourceType.Image } ); db.SaveChanges(); var result = BuildController(db).Get("inst-test", new List()); var ok = Assert.IsType(result); var resources = (ok.Value as System.Collections.IEnumerable)!.Cast().ToList(); Assert.Single(resources); } [Fact] public void Get_WithTypeFilter_FiltersType() { using var db = DbContextFactory.Create(); db.Resources.AddRange( new Resource { Id = "r1", InstanceId = "inst-test", Label = "A", Type = ResourceType.Image }, new Resource { Id = "r2", InstanceId = "inst-test", Label = "B", Type = ResourceType.Video } ); db.SaveChanges(); var result = BuildController(db).Get("inst-test", new List { ResourceType.Image }); var ok = Assert.IsType(result); var resources = (ok.Value as System.Collections.IEnumerable)!.Cast().ToList(); Assert.Single(resources); } // ── UPDATE ─────────────────────────────────────────────────────────── [Fact] public void Update_ExistingResource_UpdatesLabel() { using var db = DbContextFactory.Create(); db.Resources.Add(new Resource { Id = "r1", InstanceId = "inst-test", Label = "Old", Type = ResourceType.Image }); db.SaveChanges(); var result = BuildController(db).Update(new ResourceDTO { id = "r1", label = "New Label" }); Assert.IsType(result); Assert.Equal("New Label", db.Resources.First().Label); } [Fact] public void Update_UnknownResource_Returns404() { using var db = DbContextFactory.Create(); var result = BuildController(db).Update(new ResourceDTO { id = "unknown", label = "X" }); Assert.IsType(result); } // ── DELETE ─────────────────────────────────────────────────────────── [Fact] public void Delete_NullifiesConfigurationImageId() { using var db = DbContextFactory.Create(); db.Resources.Add(new Resource { Id = "r1", InstanceId = "inst-test", Label = "Img", Type = ResourceType.Image }); db.Configurations.Add(new Configuration { Id = "c1", InstanceId = "inst-test", Label = "C", ImageId = "r1", Title = new List() }); db.SaveChanges(); BuildController(db).Delete("r1"); Assert.Null(db.Configurations.First().ImageId); } [Fact] public void Delete_NullifiesSectionImageId() { using var db = DbContextFactory.Create(); db.Resources.Add(new Resource { Id = "r1", InstanceId = "inst-test", Label = "Img", Type = ResourceType.Image }); db.Configurations.Add(new Configuration { Id = "c1", InstanceId = "inst-test", Label = "C", Title = new List() }); db.Sections.Add(new Section { Id = "s1", InstanceId = "inst-test", Label = "S", ImageId = "r1", Type = SectionType.Article, ConfigurationId = "c1", Title = new List(), Description = new List() }); db.SaveChanges(); BuildController(db).Delete("r1"); Assert.Null(db.Sections.First().ImageId); } [Fact] public void Delete_UnknownResource_Returns404() { using var db = DbContextFactory.Create(); var result = BuildController(db).Delete("unknown"); Assert.IsType(result); } [Fact] public void Delete_ExistingResource_Returns202() { using var db = DbContextFactory.Create(); db.Resources.Add(new Resource { Id = "r1", InstanceId = "inst-test", Label = "A", Type = ResourceType.Image }); db.SaveChanges(); var result = BuildController(db).Delete("r1"); var obj = Assert.IsType(result); Assert.Equal(202, obj.StatusCode); Assert.Equal(0, db.Resources.Count()); } } }