using System; using System.Collections.Generic; using System.Threading.Tasks; using Shouldly; using Xunit; using ZB.MOM.WW.LmxOpcUa.Host; using ZB.MOM.WW.LmxOpcUa.Host.Configuration; using ZB.MOM.WW.LmxOpcUa.Host.Domain; using ZB.MOM.WW.LmxOpcUa.Tests.Helpers; namespace ZB.MOM.WW.LmxOpcUa.Tests.EndToEnd { /// /// THE ULTIMATE SMOKE TEST: Full service with fakes, verifying the complete data flow. /// (1) Address space built, (2) MXAccess data change → callback, (3) read → correct tag ref, /// (4) write → correct tag+value, (5) dashboard has real data. /// public class FullDataFlowTest { /// /// Confirms that the fake-backed bridge can start, build the address space, and expose coherent status data end to end. /// [Fact] public void FullDataFlow_EndToEnd() { var config = new AppConfiguration { OpcUa = new OpcUaConfiguration { Port = 14842, GalaxyName = "TestGalaxy", EndpointPath = "/LmxOpcUa" }, MxAccess = new MxAccessConfiguration { ClientName = "Test", ReadTimeoutSeconds = 2, WriteTimeoutSeconds = 2 }, GalaxyRepository = new GalaxyRepositoryConfiguration { ChangeDetectionIntervalSeconds = 60 }, Dashboard = new DashboardConfiguration { Enabled = false } }; var proxy = new FakeMxProxy(); var repo = new FakeGalaxyRepository { Hierarchy = new List { new GalaxyObjectInfo { GobjectId = 1, TagName = "DEV", BrowseName = "DEV", ParentGobjectId = 0, IsArea = true }, new GalaxyObjectInfo { GobjectId = 2, TagName = "TestMachine_001", BrowseName = "TestMachine_001", ParentGobjectId = 1, IsArea = false }, new GalaxyObjectInfo { GobjectId = 3, TagName = "DelmiaReceiver_001", ContainedName = "DelmiaReceiver", BrowseName = "DelmiaReceiver", ParentGobjectId = 2, IsArea = false } }, Attributes = new List { new GalaxyAttributeInfo { GobjectId = 2, TagName = "TestMachine_001", AttributeName = "MachineID", FullTagReference = "TestMachine_001.MachineID", MxDataType = 5, IsArray = false }, new GalaxyAttributeInfo { GobjectId = 3, TagName = "DelmiaReceiver_001", AttributeName = "DownloadPath", FullTagReference = "DelmiaReceiver_001.DownloadPath", MxDataType = 5, IsArray = false }, new GalaxyAttributeInfo { GobjectId = 3, TagName = "DelmiaReceiver_001", AttributeName = "JobStepNumber", FullTagReference = "DelmiaReceiver_001.JobStepNumber", MxDataType = 2, IsArray = false } } }; var service = new OpcUaService(config, proxy, repo); service.Start(); try { // (1) OPC UA server host created service.ServerHost.ShouldNotBeNull(); // (2) MXAccess connected and proxy registered proxy.IsRegistered.ShouldBe(true); service.MxClient.ShouldNotBeNull(); service.MxClient!.State.ShouldBe(ConnectionState.Connected); // (3) Address space model can be built from the same data var model = Host.OpcUa.AddressSpaceBuilder.Build(repo.Hierarchy, repo.Attributes); model.NodeIdToTagReference.ContainsKey("TestMachine_001.MachineID").ShouldBe(true); model.NodeIdToTagReference.ContainsKey("DelmiaReceiver_001.DownloadPath").ShouldBe(true); model.NodeIdToTagReference.ContainsKey("DelmiaReceiver_001.JobStepNumber").ShouldBe(true); model.VariableCount.ShouldBe(3); model.ObjectCount.ShouldBe(2); // TestMachine + DelmiaReceiver (DEV is area) // (4) Tag reference resolves correctly for read/write var tagRef = model.NodeIdToTagReference["DelmiaReceiver_001.DownloadPath"]; tagRef.ShouldBe("DelmiaReceiver_001.DownloadPath"); // (5) Galaxy stats have real data service.GalaxyStatsInstance.ShouldNotBeNull(); service.GalaxyStatsInstance!.GalaxyName.ShouldBe("TestGalaxy"); service.GalaxyStatsInstance.DbConnected.ShouldBe(true); service.GalaxyStatsInstance.ObjectCount.ShouldBe(3); service.GalaxyStatsInstance.AttributeCount.ShouldBe(3); // (5b) Status report has real data service.StatusReportInstance.ShouldNotBeNull(); var html = service.StatusReportInstance!.GenerateHtml(); html.ShouldContain("TestGalaxy"); html.ShouldContain("Connected"); var json = service.StatusReportInstance.GenerateJson(); json.ShouldContain("TestGalaxy"); service.StatusReportInstance.IsHealthy().ShouldBe(true); // Verify change detection is wired service.ChangeDetectionInstance.ShouldNotBeNull(); // Verify metrics created service.Metrics.ShouldNotBeNull(); } finally { service.Stop(); } } } }