Files
lmxopcua/tests/ZB.MOM.WW.LmxOpcUa.Tests/EndToEnd/FullDataFlowTest.cs
2026-03-25 11:45:12 -04:00

107 lines
5.3 KiB
C#

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
{
/// <summary>
/// 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.
/// </summary>
public class FullDataFlowTest
{
/// <summary>
/// Confirms that the fake-backed bridge can start, build the address space, and expose coherent status data end to end.
/// </summary>
[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<GalaxyObjectInfo>
{
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<GalaxyAttributeInfo>
{
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();
}
}
}
}