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 { public class HealthCheckServiceTests { private readonly HealthCheckService _sut = new(); [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"); } [Fact] public void Connected_NoMetrics_ReturnsHealthy() { var result = _sut.CheckHealth(ConnectionState.Connected, null); result.Status.ShouldBe("Healthy"); result.Color.ShouldBe("green"); } [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"); } [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"); } [Fact] public void IsHealthy_Connected_ReturnsTrue() { _sut.IsHealthy(ConnectionState.Connected, null).ShouldBe(true); } [Fact] public void IsHealthy_Disconnected_ReturnsFalse() { _sut.IsHealthy(ConnectionState.Disconnected, null).ShouldBe(false); } [Fact] public void Error_ReturnsUnhealthy() { var result = _sut.CheckHealth(ConnectionState.Error, null); result.Status.ShouldBe("Unhealthy"); } [Fact] public void Reconnecting_ReturnsUnhealthy() { var result = _sut.CheckHealth(ConnectionState.Reconnecting, null); result.Status.ShouldBe("Unhealthy"); } } }