using ChatBot.Models.Configuration;
using ChatBot.Services;
using ChatBot.Services.Interfaces;
using ChatBot.Services.Telegram.Commands;
using ChatBot.Tests.TestUtilities;
using FluentAssertions;
using Microsoft.Extensions.Options;
using Moq;
namespace ChatBot.Tests.Services.Telegram;
///
/// Additional edge case tests for StatusCommand to improve code coverage
///
public class StatusCommandEdgeCaseTests : UnitTestBase
{
private readonly Mock _ollamaClientMock;
private readonly StatusCommand _statusCommand;
public StatusCommandEdgeCaseTests()
{
_ollamaClientMock = TestDataBuilder.Mocks.CreateOllamaClientMock();
var ollamaSettings = TestDataBuilder.Configurations.CreateOllamaSettings();
var ollamaSettingsMock = TestDataBuilder.Mocks.CreateOptionsMock(ollamaSettings);
var chatServiceMock = new Mock(
TestDataBuilder.Mocks.CreateLoggerMock().Object,
TestDataBuilder.Mocks.CreateAIServiceMock().Object,
TestDataBuilder.Mocks.CreateSessionStorageMock().Object,
TestDataBuilder.Mocks.CreateOptionsMock(TestDataBuilder.Configurations.CreateAISettings()).Object,
TestDataBuilder.Mocks.CreateCompressionServiceMock().Object
);
var modelServiceMock = new Mock(
TestDataBuilder.Mocks.CreateLoggerMock().Object,
ollamaSettingsMock.Object
);
var aiSettingsMock = TestDataBuilder.Mocks.CreateOptionsMock(new AISettings());
_statusCommand = new StatusCommand(
chatServiceMock.Object,
modelServiceMock.Object,
aiSettingsMock.Object,
_ollamaClientMock.Object
);
}
[Fact]
public async Task ExecuteAsync_WhenOllamaThrowsHttpRequestException_ShouldHandleGracefully()
{
// Arrange
var context = new TelegramCommandContext
{
ChatId = 12345,
Username = "testuser",
MessageText = "/status",
ChatType = "private",
ChatTitle = "Test Chat"
};
_ollamaClientMock
.Setup(x => x.ListLocalModelsAsync())
.ThrowsAsync(new HttpRequestException("502 Bad Gateway"));
// Act
var result = await _statusCommand.ExecuteAsync(context);
// Assert
result.Should().NotBeNullOrEmpty();
result.Should().Contain("Статус системы");
// StatusCommand handles exceptions internally and returns formatted status
}
[Fact]
public async Task ExecuteAsync_WhenOllamaThrowsTaskCanceledException_ShouldHandleGracefully()
{
// Arrange
var context = new TelegramCommandContext
{
ChatId = 12345,
Username = "testuser",
MessageText = "/status",
ChatType = "private",
ChatTitle = "Test Chat"
};
_ollamaClientMock
.Setup(x => x.ListLocalModelsAsync())
.ThrowsAsync(new TaskCanceledException("Operation timed out"));
// Act
var result = await _statusCommand.ExecuteAsync(context);
// Assert
result.Should().NotBeNullOrEmpty();
result.Should().Contain("Статус системы");
// StatusCommand handles timeouts internally and returns formatted status
}
}