public async Task HandleUpdate_MessageReceivedNotTextType_Should_DoNothing()
    {
        // Arrange
        var telegramBotMock       = new Mock <ITelegramBotClient>();
        var chatConfigServiceMock = new Mock <IChatConfigurationService>();
        var serviceScopeFactory   = new Mock <IServiceScopeFactory>();
        var serviceScope          = new Mock <IServiceScope>();
        var serviceProvider       = new Mock <IServiceProvider>();

        var update = new Update
        {
            Message = new Message
            {
                Audio = new Audio(),
                Chat  = new Chat {
                    Id = 1
                }
            }
        };

        serviceScopeFactory.Setup(x => x.CreateScope()).Returns(serviceScope.Object);
        serviceScope.Setup(x => x.ServiceProvider).Returns(serviceProvider.Object);
        serviceProvider.Setup(x => x.GetService(typeof(IChatConfigurationService))).Returns(chatConfigServiceMock.Object);

        var handler = new TelegramUpdateHandler(serviceScopeFactory.Object, null, null);

        // Act
        await handler.HandleUpdateAsync(telegramBotMock.Object, update, default);

        // Assert
        chatConfigServiceMock.Verify(x => x.GetConfigurationByChatId(update.Message.Chat.Id), Times.Never);
    }
    public async Task HandleUpdate_NonSupportedUpdateTypeReceived_Should_DoNothing()
    {
        // Arrange
        var telegramBotMock = new Mock <ITelegramBotClient>();
        var loggerMock      = new Mock <ILogger <TelegramUpdateHandler> >();

        var update = new Update
        {
            ChatMember = new ChatMemberUpdated()
        };

        var handler = new TelegramUpdateHandler(null, null, loggerMock.Object);

        // Act
        await handler.HandleUpdateAsync(telegramBotMock.Object, update, default);

        // Assert

        // Verify LogInformation was called
        loggerMock.Verify(x => x.Log(
                              LogLevel.Information,
                              It.IsAny <EventId>(),
                              It.IsAny <It.IsAnyType>(),
                              It.IsAny <Exception>(),
                              (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));
    }
    public async Task HandleUpdate_MessageReceived_Should_GetCorrections()
    {
        // Arrange
        var telegramBotMock       = new Mock <ITelegramBotClient>();
        var chatConfigServiceMock = new Mock <IChatConfigurationService>();
        var serviceScopeFactory   = new Mock <IServiceScopeFactory>();
        var serviceScope          = new Mock <IServiceScope>();
        var serviceProvider       = new Mock <IServiceProvider>();
        var loggerMock            = new Mock <ILogger <TelegramUpdateHandler> >();
        var grammarService        = new Mock <IGrammarService>();

        var update = new Update
        {
            Message = new Message
            {
                Text = "My Text",
                Chat = new Chat {
                    Id = 1
                }
            }
        };

        chatConfigServiceMock.Setup(x => x.GetConfigurationByChatId(update.Message.Chat.Id))
        .ReturnsAsync(new ChatConfiguration());

        grammarService.Setup(x => x.GetCorrections("My Text"))
        .ReturnsAsync(new GrammarCheckResult(null));

        serviceScopeFactory.Setup(x => x.CreateScope()).Returns(serviceScope.Object);
        serviceScope.Setup(x => x.ServiceProvider).Returns(serviceProvider.Object);
        serviceProvider.Setup(x => x.GetService(typeof(IChatConfigurationService))).Returns(chatConfigServiceMock.Object);
        serviceProvider.Setup(x => x.GetService(typeof(IEnumerable <IGrammarService>))).Returns(new[] { grammarService.Object });

        var handler = new TelegramUpdateHandler(serviceScopeFactory.Object, null, loggerMock.Object);

        // Act
        await handler.HandleUpdateAsync(telegramBotMock.Object, update, default);

        // Assert
        chatConfigServiceMock.Verify(x => x.GetConfigurationByChatId(update.Message.Chat.Id));
        grammarService.Verify(x => x.GetCorrections("My Text"));
    }