using ChatBot.Models.Configuration; using ChatBot.Services.HealthChecks; using ChatBot.Services.Interfaces; using ChatBot.Tests.TestUtilities; using FluentAssertions; using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Moq; namespace ChatBot.Tests.Services.HealthChecks; public class OllamaHealthCheckTests : UnitTestBase { private readonly Mock> _loggerMock; private readonly Mock _ollamaClientMock; private readonly OllamaHealthCheck _healthCheck; public OllamaHealthCheckTests() { _loggerMock = TestDataBuilder.Mocks.CreateLoggerMock(); _ollamaClientMock = TestDataBuilder.Mocks.CreateOllamaClientMock(); _healthCheck = new OllamaHealthCheck(_ollamaClientMock.Object, _loggerMock.Object); } [Fact] public async Task CheckHealthAsync_ShouldReturnHealthy_WhenOllamaResponds() { // Arrange _ollamaClientMock .Setup(x => x.ListLocalModelsAsync()) .ReturnsAsync( new List { new OllamaSharp.Models.Model { Name = "llama3.2" }, } ); // Act var context = new HealthCheckContext(); var result = await _healthCheck.CheckHealthAsync(context); // Assert result.Status.Should().Be(HealthStatus.Healthy); } [Fact] public async Task CheckHealthAsync_ShouldReturnUnhealthy_WhenOllamaThrowsException() { // Arrange _ollamaClientMock .Setup(x => x.ListLocalModelsAsync()) .ThrowsAsync(new Exception("Ollama unavailable")); // Act var context = new HealthCheckContext(); var result = await _healthCheck.CheckHealthAsync(context); // Assert result.Status.Should().Be(HealthStatus.Unhealthy); } [Fact] public async Task CheckHealthAsync_ShouldReturnUnhealthy_WhenOllamaReturnsEmptyResponse() { // Arrange _ollamaClientMock .Setup(x => x.ListLocalModelsAsync()) .ReturnsAsync(new List()); // Act var context = new HealthCheckContext(); var result = await _healthCheck.CheckHealthAsync(context); // Assert result.Status.Should().Be(HealthStatus.Unhealthy); } [Fact] public async Task CheckHealthAsync_ShouldReturnUnhealthy_WhenOllamaReturnsNullMessage() { // Arrange _ollamaClientMock .Setup(x => x.ListLocalModelsAsync()) .ReturnsAsync((IEnumerable)null!); // Act var context = new HealthCheckContext(); var result = await _healthCheck.CheckHealthAsync(context); // Assert result.Status.Should().Be(HealthStatus.Unhealthy); } }