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));
}
}