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 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 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 CanConnectAsync(CancellationToken cancellationToken) { _ = cancellationToken; return Task.FromResult(_canConnect); } } }