using FluentAssertions; using Moq; using Telegram.Bot.Types; using Telegrator.Handlers; using Xunit; namespace Telegrator.Tests.Handlers { /// /// Тесты для обработчиков обновлений. /// /// ПАРАДИГМЫ ТЕСТИРОВАНИЯ: /// 1. Mocking - создание моков для изоляции зависимостей /// 2. Dependency Injection - тестирование через интерфейсы /// 3. Test Doubles - использование заглушек вместо реальных объектов /// 4. Behavior Verification - проверка поведения, а не только результата /// 5. Exception Testing - тестирование исключений /// public class HandlerTests { /*s /// /// Тест для базового обработчика обновлений. /// /// ПРИНЦИП: Тестируем абстрактный класс через конкретную реализацию /// [Fact] public async Task UpdateHandlerBase_ShouldExecuteAndMarkLifetimeAsEnded() { // Arrange var mockContainer = new Mock>(); var testHandler = new TestUpdateHandler(); // Act await testHandler.Execute(mockContainer.Object); // Assert testHandler.WasExecuted.Should().BeTrue(); testHandler.LifetimeToken.IsEnded.Should().BeTrue(); } */ /// /// Тест для проверки токена жизненного цикла. /// /// ПРИНЦИП: Тестируем состояние объектов /// [Fact] public void HandlerLifetimeToken_ShouldTrackLifetimeCorrectly() { // Arrange var handler = new TestUpdateHandler(); // Act & Assert handler.LifetimeToken.IsEnded.Should().BeFalse(); // Act handler.LifetimeToken.LifetimeEnded(); // Assert handler.LifetimeToken.IsEnded.Should().BeTrue(); } /// /// Тест для проверки отмены операции. /// /// ПРИНЦИП: Тестируем асинхронные операции и отмену /// [Fact] public async Task UpdateHandlerBase_ShouldHandleCancellation() { // Arrange var mockContainer = new Mock>(); var testHandler = new TestUpdateHandler(); var cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource.Cancel(); // Отменяем сразу // Act & Assert await testHandler.Invoking(h => h.Execute(mockContainer.Object, cancellationTokenSource.Token)) .Should().ThrowAsync(); } } }