using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.Core.Abstractions; using ZB.MOM.WW.OtOpcUa.Driver.Galaxy.Health; namespace ZB.MOM.WW.OtOpcUa.Driver.Galaxy.Tests.Health; /// /// Tests for 's push path. The forwarder is a /// thin shim over ; the only invariants worth pinning /// are that SetTransport routes correctly under the configured client name and that /// repeated identical pushes don't produce duplicate change events (the aggregator's /// dedup carries that — this test asserts the forwarder doesn't re-introduce them). /// public sealed class HostConnectivityForwarderTests { [Fact] public void SetTransport_Running_PushesUnderClientName() { var agg = new HostStatusAggregator(); var captured = new List(); agg.OnHostStatusChanged += (_, e) => captured.Add(e); var fwd = new HostConnectivityForwarder("OtOpcUa-A", agg); fwd.SetTransport(HostState.Running); captured.Count.ShouldBe(1); captured[0].HostName.ShouldBe("OtOpcUa-A"); captured[0].NewState.ShouldBe(HostState.Running); agg.Snapshot()[0].HostName.ShouldBe("OtOpcUa-A"); } [Fact] public void SetTransport_StateTransition_FiresChange() { var agg = new HostStatusAggregator(); var fwd = new HostConnectivityForwarder("OtOpcUa-A", agg); fwd.SetTransport(HostState.Running); var captured = new List(); agg.OnHostStatusChanged += (_, e) => captured.Add(e); fwd.SetTransport(HostState.Stopped); captured.Count.ShouldBe(1); captured[0].OldState.ShouldBe(HostState.Running); captured[0].NewState.ShouldBe(HostState.Stopped); } [Fact] public void SetTransport_RepeatedSameState_DoesNotFire() { var agg = new HostStatusAggregator(); var fwd = new HostConnectivityForwarder("OtOpcUa-A", agg); fwd.SetTransport(HostState.Running); var captured = new List(); agg.OnHostStatusChanged += (_, e) => captured.Add(e); fwd.SetTransport(HostState.Running); fwd.SetTransport(HostState.Running); fwd.SetTransport(HostState.Running); captured.ShouldBeEmpty(); } [Fact] public void Constructor_RejectsEmptyClientName() { var agg = new HostStatusAggregator(); Should.Throw(() => new HostConnectivityForwarder("", agg)); Should.Throw(() => new HostConnectivityForwarder(" ", agg)); } [Fact] public void SetTransport_AfterDispose_Throws() { var agg = new HostStatusAggregator(); var fwd = new HostConnectivityForwarder("OtOpcUa-A", agg); fwd.Dispose(); Should.Throw(() => fwd.SetTransport(HostState.Running)); } }