using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.AdminUI.Uns; namespace ZB.MOM.WW.OtOpcUa.AdminUI.Tests.Uns; /// /// Verifies the load-for-edit projections on that prefill the /// Area/Line edit modals and carry the concurrency token back for last-write-wins saves. /// [Trait("Category", "Unit")] public sealed class UnsTreeServiceLoadEditTests { private static (UnsTreeService Service, string DbName) Seeded() { var dbName = $"uns-loadedit-{Guid.NewGuid():N}"; UnsTreeTestDb.SeedNamed(dbName); return (new UnsTreeService(UnsTreeTestDb.Factory(dbName)), dbName); } /// Loading a seeded area maps its fields, owning cluster, and a non-empty RowVersion. [Fact] public async Task LoadArea_returns_dto() { var (service, _) = Seeded(); var dto = await service.LoadAreaAsync("AREA-1"); dto.ShouldNotBeNull(); dto.UnsAreaId.ShouldBe("AREA-1"); dto.Name.ShouldBe("assembly"); dto.ClusterId.ShouldBe(UnsTreeTestDb.PopulatedClusterId); dto.RowVersion.ShouldNotBeNull(); } /// Loading a missing area returns null. [Fact] public async Task LoadArea_missing_returns_null() { var (service, _) = Seeded(); (await service.LoadAreaAsync("NOPE")).ShouldBeNull(); } /// Loading a seeded line maps its fields, parent area, and a non-empty RowVersion. [Fact] public async Task LoadLine_returns_dto() { var (service, _) = Seeded(); var dto = await service.LoadLineAsync("LINE-1"); dto.ShouldNotBeNull(); dto.UnsLineId.ShouldBe("LINE-1"); dto.UnsAreaId.ShouldBe("AREA-1"); dto.Name.ShouldBe("line-a"); dto.RowVersion.ShouldNotBeNull(); } /// Loading a missing line returns null. [Fact] public async Task LoadLine_missing_returns_null() { var (service, _) = Seeded(); (await service.LoadLineAsync("NOPE")).ShouldBeNull(); } }