elsa-core/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaRuntimeHealthCheckTests.cs
2026-05-21 00:47:34 +02:00

58 lines
2.2 KiB
C#

using Elsa.Workflows.Runtime.HealthChecks;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Logging.Abstractions;
using NSubstitute;
namespace Elsa.Workflows.Runtime.UnitTests.HealthChecks;
public class ElsaRuntimeHealthCheckTests
{
private readonly IWorkflowRuntime _workflowRuntime = Substitute.For<IWorkflowRuntime>();
private readonly IQuiescenceSignal _quiescenceSignal = Substitute.For<IQuiescenceSignal>();
private readonly ElsaRuntimeHealthCheck _sut;
public ElsaRuntimeHealthCheckTests()
{
_workflowRuntime.CreateClientAsync(Arg.Any<CancellationToken>()).Returns(new ValueTask<IWorkflowClient>(Substitute.For<IWorkflowClient>()));
_quiescenceSignal.CurrentState.Returns(QuiescenceState.Initial("test"));
_quiescenceSignal.ActiveExecutionCycleCount.Returns(0);
_sut = new ElsaRuntimeHealthCheck(_workflowRuntime, _quiescenceSignal, NullLogger<ElsaRuntimeHealthCheck>.Instance);
}
[Fact]
public async Task ReturnsHealthyWhenRuntimeAcceptsNewWork()
{
var result = await _sut.CheckHealthAsync(new HealthCheckContext());
Assert.Equal(HealthStatus.Healthy, result.Status);
Assert.Equal("runtime", result.Data["category"]);
Assert.True((bool)result.Data["acceptingNewWork"]);
}
[Fact]
public async Task ReturnsDegradedWhenRuntimeIsPaused()
{
_quiescenceSignal.CurrentState.Returns(QuiescenceState.Initial("test") with
{
Reason = QuiescenceReason.AdministrativePause
});
var result = await _sut.CheckHealthAsync(new HealthCheckContext());
Assert.Equal(HealthStatus.Degraded, result.Status);
Assert.Equal("AdministrativePause", result.Data["reason"]);
Assert.False((bool)result.Data["acceptingNewWork"]);
}
[Fact]
public async Task ReturnsUnhealthyWhenRuntimeClientCannotBeCreated()
{
_workflowRuntime.CreateClientAsync(Arg.Any<CancellationToken>()).Returns<ValueTask<IWorkflowClient>>(_ => throw new InvalidOperationException("boom"));
var result = await _sut.CheckHealthAsync(new HealthCheckContext());
Assert.Equal(HealthStatus.Unhealthy, result.Status);
Assert.Equal("runtime", result.Data["category"]);
}
}