85b362e8cd
- add the standalone HrynCo.Common solution and projects - include the shared common library source and tests - add package metadata and a repo gitignore
100 lines
3.3 KiB
C#
100 lines
3.3 KiB
C#
namespace HrynCo.Common.Tests;
|
|
|
|
using HrynCo.Common.HealthChecks;
|
|
using HrynCo.Common.HealthChecks.Defaults;
|
|
using HrynCo.Common.HealthChecks.Interfaces;
|
|
using FluentAssertions;
|
|
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
|
using Xunit;
|
|
|
|
public sealed class HealthChecksTests
|
|
{
|
|
[Fact]
|
|
public async Task CompositeHealthCheck_ShouldUseConfigurationCheckWhenConfiguredForConfigOnly()
|
|
{
|
|
var configCheck = new FakeConfigurationCheck();
|
|
var serviceCheck = new FakeServiceHealthCheck();
|
|
var healthCheck = new CompositeHealthCheck(configCheck, serviceCheck, configOnly: true);
|
|
|
|
HealthCheckResult result = await healthCheck.CheckHealthAsync(new HealthCheckContext(), default);
|
|
|
|
result.Status.Should().Be(HealthStatus.Healthy);
|
|
configCheck.Called.Should().BeTrue();
|
|
serviceCheck.Called.Should().BeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task CompositeHealthCheck_ShouldUseServiceCheckWhenNotConfigOnly()
|
|
{
|
|
var configCheck = new FakeConfigurationCheck();
|
|
var serviceCheck = new FakeServiceHealthCheck();
|
|
var healthCheck = new CompositeHealthCheck(configCheck, serviceCheck, configOnly: false);
|
|
|
|
HealthCheckResult result = await healthCheck.CheckHealthAsync(new HealthCheckContext(), default);
|
|
|
|
result.Status.Should().Be(HealthStatus.Healthy);
|
|
configCheck.Called.Should().BeFalse();
|
|
serviceCheck.Called.Should().BeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DbServiceHealthCheck_ShouldReturnHealthyWhenConnectionSucceeds()
|
|
{
|
|
var check = new DbServiceHealthCheck(new FakeDatabaseConnectionChecker(true));
|
|
|
|
HealthCheckResult result = await check.CheckHealthAsync(default);
|
|
|
|
result.Status.Should().Be(HealthStatus.Healthy);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DbServiceHealthCheck_ShouldReturnUnhealthyWhenConnectionFails()
|
|
{
|
|
var check = new DbServiceHealthCheck(new FakeDatabaseConnectionChecker(false));
|
|
|
|
HealthCheckResult result = await check.CheckHealthAsync(default);
|
|
|
|
result.Status.Should().Be(HealthStatus.Unhealthy);
|
|
}
|
|
|
|
private sealed class FakeConfigurationCheck : IConfigurationCheck
|
|
{
|
|
public bool Called { get; private set; }
|
|
|
|
public Task<HealthCheckResult> CheckConfigurationAsync(CancellationToken cancellationToken)
|
|
{
|
|
_ = cancellationToken;
|
|
Called = true;
|
|
return Task.FromResult(HealthCheckResult.Healthy("config"));
|
|
}
|
|
}
|
|
|
|
private sealed class FakeServiceHealthCheck : IServiceHealthCheck
|
|
{
|
|
public bool Called { get; private set; }
|
|
|
|
public Task<HealthCheckResult> CheckHealthAsync(CancellationToken cancellationToken)
|
|
{
|
|
_ = cancellationToken;
|
|
Called = true;
|
|
return Task.FromResult(HealthCheckResult.Healthy("service"));
|
|
}
|
|
}
|
|
|
|
private sealed class FakeDatabaseConnectionChecker : IDatabaseConnectionChecker
|
|
{
|
|
private readonly bool _canConnect;
|
|
|
|
public FakeDatabaseConnectionChecker(bool canConnect)
|
|
{
|
|
_canConnect = canConnect;
|
|
}
|
|
|
|
public Task<bool> CanConnectAsync(CancellationToken cancellationToken)
|
|
{
|
|
_ = cancellationToken;
|
|
return Task.FromResult(_canConnect);
|
|
}
|
|
}
|
|
}
|