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; using Telegram.Bot.Types; namespace ChatBot.Tests.Services.HealthChecks; public class TelegramBotHealthCheckTests : UnitTestBase { private readonly Mock> _loggerMock; private readonly Mock _telegramBotClientWrapperMock; private readonly TelegramBotHealthCheck _healthCheck; public TelegramBotHealthCheckTests() { _loggerMock = TestDataBuilder.Mocks.CreateLoggerMock(); _telegramBotClientWrapperMock = new Mock(); _healthCheck = new TelegramBotHealthCheck( _telegramBotClientWrapperMock.Object, _loggerMock.Object ); } [Fact] public async Task CheckHealthAsync_ShouldReturnHealthy_WhenTelegramResponds() { // Arrange var botInfo = TestDataBuilder.Mocks.CreateTelegramBot(); _telegramBotClientWrapperMock .Setup(x => x.GetMeAsync(It.IsAny())) .ReturnsAsync(botInfo); // Act var context = new HealthCheckContext(); var result = await _healthCheck.CheckHealthAsync(context); // Assert result.Status.Should().Be(HealthStatus.Healthy); } [Fact] public async Task CheckHealthAsync_ShouldReturnUnhealthy_WhenTelegramThrowsException() { // Arrange _telegramBotClientWrapperMock .Setup(x => x.GetMeAsync(It.IsAny())) .ThrowsAsync(new Exception("Telegram 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_WhenTelegramReturnsNull() { // Arrange _telegramBotClientWrapperMock .Setup(x => x.GetMeAsync(It.IsAny())) .ReturnsAsync((User)null!); // Act var context = new HealthCheckContext(); var result = await _healthCheck.CheckHealthAsync(context); // Assert result.Status.Should().Be(HealthStatus.Unhealthy); } [Fact] public async Task CheckHealthAsync_ShouldReturnUnhealthy_WhenTelegramReturnsInvalidBot() { // Arrange var invalidBot = new User { Id = 0, // Invalid bot ID Username = null, }; _telegramBotClientWrapperMock .Setup(x => x.GetMeAsync(It.IsAny())) .ReturnsAsync(invalidBot); // Act var context = new HealthCheckContext(); var result = await _healthCheck.CheckHealthAsync(context); // Assert result.Status.Should().Be(HealthStatus.Unhealthy); } }