using Manager.Services; using ManagerService.Controllers; using ManagerService.Data; using ManagerService.DTOs; using ManagerService.Tests.Infrastructure; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging.Abstractions; using System.Linq; using Xunit; namespace ManagerService.Tests.Controllers { public class DeviceControllerTests { private static DeviceController BuildController(MyInfoMateDbContext db) { var cfg = FakeMongoConfig.Create(); var controller = new DeviceController( NullLogger.Instance, new DeviceDatabaseService(cfg), new ConfigurationDatabaseService(cfg), db); FakeUser.SetUser(controller, FakeUser.Create("Manager.instanceadmin", "inst-test")); return controller; } private static void SeedPrerequisites(MyInfoMateDbContext db) { db.Configurations.Add(new Configuration { Id = "conf-1", InstanceId = "inst-test", Label = "Conf", Title = new System.Collections.Generic.List() }); db.ApplicationInstances.Add(new ApplicationInstance { Id = "ai-1", InstanceId = "inst-test", AppType = AppType.Tablet }); db.SaveChanges(); } // ── CREATE ─────────────────────────────────────────────────────────── [Fact] public void Create_NewIdentifier_CreatesDevice() { using var db = DbContextFactory.Create(); SeedPrerequisites(db); var result = BuildController(db).Create(new DeviceDetailDTO { identifier = "device-abc", instanceId = "inst-test", configurationId = "conf-1", name = "Tablet 1" }); Assert.IsType(result); Assert.Equal(1, db.Devices.Count()); Assert.Equal("Tablet 1", db.Devices.First().Name); } [Fact] public void Create_ExistingIdentifier_UpdatesDeviceNoDuplicate() { using var db = DbContextFactory.Create(); SeedPrerequisites(db); db.Devices.Add(new Device { Id = "d1", Identifier = "device-abc", InstanceId = "inst-test", ConfigurationId = "conf-1" }); db.SaveChanges(); var result = BuildController(db).Create(new DeviceDetailDTO { identifier = "device-abc", instanceId = "inst-test", configurationId = "conf-1", name = "Updated Name" }); Assert.IsType(result); Assert.Equal(1, db.Devices.Count()); // pas de doublon Assert.Equal("Updated Name", db.Devices.First().Name); } [Fact] public void Create_NewDevice_AutoCreatesAppConfigurationLink() { using var db = DbContextFactory.Create(); SeedPrerequisites(db); BuildController(db).Create(new DeviceDetailDTO { identifier = "device-abc", instanceId = "inst-test", configurationId = "conf-1", name = "Tablet 1" }); Assert.Equal(1, db.AppConfigurationLinks.Count()); } // ── UPDATE ─────────────────────────────────────────────────────────── [Fact] public void Update_ExistingDevice_UpdatesName() { using var db = DbContextFactory.Create(); db.Configurations.Add(new Configuration { Id = "conf-1", InstanceId = "inst-test", Label = "Conf", Title = new System.Collections.Generic.List() }); db.Devices.Add(new Device { Id = "d1", Identifier = "dev-1", InstanceId = "inst-test", Name = "Old Name", ConfigurationId = "conf-1" }); db.SaveChanges(); var result = BuildController(db).Update(new DeviceDetailDTO { id = "d1", name = "New Name", instanceId = "inst-test", identifier = "dev-1" }); Assert.IsType(result); Assert.Equal("New Name", db.Devices.First().Name); } // ── DELETE ─────────────────────────────────────────────────────────── [Fact] public void Delete_ExistingDevice_Returns202() { using var db = DbContextFactory.Create(); db.Configurations.Add(new Configuration { Id = "conf-1", InstanceId = "inst-test", Label = "Conf", Title = new System.Collections.Generic.List() }); db.Devices.Add(new Device { Id = "d1", Identifier = "dev-1", InstanceId = "inst-test", ConfigurationId = "conf-1" }); db.SaveChanges(); var result = BuildController(db).Delete("d1"); var obj = Assert.IsType(result); Assert.Equal(202, obj.StatusCode); Assert.Equal(0, db.Devices.Count()); } [Fact] public void Delete_UnknownId_Returns404() { using var db = DbContextFactory.Create(); var result = BuildController(db).Delete("unknown"); Assert.IsType(result); } } }