コード例 #1
0
    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>()));
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    public async Task HandleError_ApiRequestException_Should_LogWarning(string exceptionMessage)
    {
        // Arrange
        var telegramBotMock   = new Mock <ITelegramBotClient>();
        var loggerMock        = new Mock <ILogger <TelegramUpdateHandler> >();
        var githubServiceMock = new Mock <IGithubService>();

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

        var exception = new ApiRequestException(exceptionMessage);

        // Act
        await handler.HandleErrorAsync(telegramBotMock.Object, exception, default);

        // Assert

        // Verify LogWarning was called
        loggerMock.Verify(x => x.Log(
                              LogLevel.Warning,
                              It.IsAny <EventId>(),
                              It.IsAny <It.IsAnyType>(),
                              It.IsAny <Exception>(),
                              (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));

        // Verify CreateBugIssue was never called
        githubServiceMock.Verify(x => x.CreateBugIssue(It.IsAny <string>(), It.IsAny <Exception>(), It.IsAny <GithubIssueLabels>()), Times.Never);
    }
コード例 #4
0
    public async Task HandleError_ExceptionCaptured_Should_LogErrorAndCreateBugIssue()
    {
        // Arrange
        var telegramBotMock   = new Mock <ITelegramBotClient>();
        var loggerMock        = new Mock <ILogger <TelegramUpdateHandler> >();
        var githubServiceMock = new Mock <IGithubService>();

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

        var exception = new Exception("Fatal test exception");

        // Act
        await handler.HandleErrorAsync(telegramBotMock.Object, exception, default);

        // Assert

        // Verify LogError was called
        loggerMock.Verify(x => x.Log(
                              LogLevel.Error,
                              It.IsAny <EventId>(),
                              It.IsAny <It.IsAnyType>(),
                              exception,
                              (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));

        // Verify CreateBugIssue was called
        githubServiceMock.Verify(x => x.CreateBugIssue("Application Exception: Fatal test exception", exception, GithubIssueLabels.Telegram));
    }
コード例 #5
0
        public async Task HandleAsync_calls_message_handler_when_update_type_is_Message()
        {
            var fakeLogger         = new Mock <ILogger <TelegramUpdateHandler> >();
            var fakeMessageHandler = new Mock <IHandleTelegramMessage>();
            var fakeOptions        = new Mock <IOptions <TelegramBotConfiguration> >();
            var fakeBotService     = new Mock <ITelegramBotService>();

            var handler = new TelegramUpdateHandler(
                fakeLogger.Object,
                fakeMessageHandler.Object,
                fakeBotService.Object,
                fakeOptions.Object);

            await handler.HandleAsync(TelegramUpdateFactory.CreateFakeTelegramUpdate(UpdateType.Message));

            fakeMessageHandler.Verify(x => x.HandleAsync(It.IsAny <TelegramMessage>()), Times.Once);
        }
コード例 #6
0
        public async Task HandleAsync_should_do_nothing_if_update_is_null()
        {
            var fakeLogger         = new Mock <ILogger <TelegramUpdateHandler> >();
            var fakeMessageHandler = new Mock <IHandleTelegramMessage>();
            var fakeOptions        = new Mock <IOptions <TelegramBotConfiguration> >();
            var fakeBotService     = new Mock <ITelegramBotService>();

            var handler = new TelegramUpdateHandler(
                fakeLogger.Object,
                fakeMessageHandler.Object,
                fakeBotService.Object,
                fakeOptions.Object);

            await handler.HandleAsync(null);

            fakeBotService.VerifyNoOtherCalls();
            fakeMessageHandler.VerifyNoOtherCalls();
        }
コード例 #7
0
    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"));
    }
コード例 #8
0
        public async Task HandleAsync_does_not_report_or_catch_exception_if_message_handler_fails()
        {
            var fakeLogger         = new Mock <ILogger <TelegramUpdateHandler> >();
            var fakeMessageHandler = new Mock <IHandleTelegramMessage>();
            var fakeOptions        = new Mock <IOptions <TelegramBotConfiguration> >();
            var fakeBotService     = new Mock <ITelegramBotService>();

            var exception = new Exception("whoops");

            fakeMessageHandler.Setup(x => x.HandleAsync(It.IsAny <TelegramMessage>()))
            .ThrowsAsync(exception);

            var fakeClient = new Mock <ITelegramBotClient>();

            fakeBotService.SetupGet(x => x.Client).Returns(fakeClient.Object);

            var fakeConfig = new TelegramBotConfiguration
            {
                EnableExceptionForwarding = false,
                ExceptionChatId           = 42
            };

            fakeOptions.SetupGet(x => x.Value).Returns(fakeConfig);

            var handler = new TelegramUpdateHandler(
                fakeLogger.Object,
                fakeMessageHandler.Object,
                fakeBotService.Object,
                fakeOptions.Object);


            Func <Task> action = async() => await handler.HandleAsync(TelegramUpdateFactory.CreateFakeTelegramUpdate(UpdateType.Message));

            await action.Should().ThrowAsync <Exception>();

            fakeClient.VerifyNoOtherCalls();
        }
コード例 #9
0
        public async Task HandleAsync_catches_and_reports_exception_when_message_handler_throws_and_exception_forwarding_is_enabled()
        {
            var fakeLogger         = new Mock <ILogger <TelegramUpdateHandler> >();
            var fakeMessageHandler = new Mock <IHandleTelegramMessage>();
            var fakeOptions        = new Mock <IOptions <TelegramBotConfiguration> >();
            var fakeBotService     = new Mock <ITelegramBotService>();

            var exception = new Exception("whoops");

            fakeMessageHandler.Setup(x => x.HandleAsync(It.IsAny <TelegramMessage>()))
            .ThrowsAsync(exception);

            var fakeClient = new Mock <ITelegramBotClient>();

            fakeBotService.SetupGet(x => x.Client).Returns(fakeClient.Object);

            var fakeConfig = new TelegramBotConfiguration
            {
                EnableExceptionForwarding = true,
                ExceptionChatId           = 42
            };

            fakeOptions.SetupGet(x => x.Value).Returns(fakeConfig);

            var handler = new TelegramUpdateHandler(
                fakeLogger.Object,
                fakeMessageHandler.Object,
                fakeBotService.Object,
                fakeOptions.Object);

            await handler.HandleAsync(TelegramUpdateFactory.CreateFakeTelegramUpdate(UpdateType.Message));

            var expectedMessage = $"```\n{exception}\n```";

            fakeClient.VerifySendTextMessageAsync(fakeConfig.ExceptionChatId, expectedMessage, Times.Once(), ParseMode.Markdown);
        }
コード例 #10
0
        public async Task <IActionResult> Post(Update update, [FromServices] TelegramUpdateHandler updateHandler)
        {
            var handled = await updateHandler.Handle(update);

            return(Ok(handled));
        }