using System; using Shouldly; using Xunit; using ZB.MOM.WW.LmxOpcUa.Host.Domain; using ZB.MOM.WW.LmxOpcUa.Host.Metrics; using ZB.MOM.WW.LmxOpcUa.Host.Status; namespace ZB.MOM.WW.LmxOpcUa.Tests.Status { /// /// Verifies how the dashboard health service classifies bridge health from connection state and metrics. /// public class HealthCheckServiceTests { private readonly HealthCheckService _sut = new(); /// /// Confirms that a disconnected runtime is reported as unhealthy. /// [Fact] public void NotConnected_ReturnsUnhealthy() { var result = _sut.CheckHealth(ConnectionState.Disconnected, null); result.Status.ShouldBe("Unhealthy"); result.Color.ShouldBe("red"); result.Message.ShouldContain("not connected"); } /// /// Confirms that a connected runtime with no metrics history is still considered healthy. /// [Fact] public void Connected_NoMetrics_ReturnsHealthy() { var result = _sut.CheckHealth(ConnectionState.Connected, null); result.Status.ShouldBe("Healthy"); result.Color.ShouldBe("green"); } /// /// Confirms that good success-rate metrics keep the service in a healthy state. /// [Fact] public void Connected_GoodMetrics_ReturnsHealthy() { using var metrics = new PerformanceMetrics(); for (int i = 0; i < 200; i++) metrics.RecordOperation("Read", TimeSpan.FromMilliseconds(10), true); var result = _sut.CheckHealth(ConnectionState.Connected, metrics); result.Status.ShouldBe("Healthy"); } /// /// Confirms that poor operation success rates degrade the reported health state. /// [Fact] public void Connected_LowSuccessRate_ReturnsDegraded() { using var metrics = new PerformanceMetrics(); for (int i = 0; i < 40; i++) metrics.RecordOperation("Read", TimeSpan.FromMilliseconds(10), true); for (int i = 0; i < 80; i++) metrics.RecordOperation("Read", TimeSpan.FromMilliseconds(10), false); var result = _sut.CheckHealth(ConnectionState.Connected, metrics); result.Status.ShouldBe("Degraded"); result.Color.ShouldBe("yellow"); } /// /// Confirms that the boolean health helper reports true when the runtime is connected. /// [Fact] public void IsHealthy_Connected_ReturnsTrue() { _sut.IsHealthy(ConnectionState.Connected, null).ShouldBe(true); } /// /// Confirms that the boolean health helper reports false when the runtime is disconnected. /// [Fact] public void IsHealthy_Disconnected_ReturnsFalse() { _sut.IsHealthy(ConnectionState.Disconnected, null).ShouldBe(false); } /// /// Confirms that the error connection state is treated as unhealthy. /// [Fact] public void Error_ReturnsUnhealthy() { var result = _sut.CheckHealth(ConnectionState.Error, null); result.Status.ShouldBe("Unhealthy"); } /// /// Confirms that the reconnecting state is treated as unhealthy while recovery is in progress. /// [Fact] public void Reconnecting_ReturnsUnhealthy() { var result = _sut.CheckHealth(ConnectionState.Reconnecting, null); result.Status.ShouldBe("Unhealthy"); } } }