public ApiCallManagerTests()
        {
            var telegramMock = new Mock <TelegramController>(null, null, null, null, null, null, null, null);

            telegramMock.Setup(m => m.SendMessage(It.IsAny <long>(), It.IsAny <string>())).Returns(Task.CompletedTask);
            telegramMock.Setup(m => m.ReBindAuth(It.IsAny <long>())).Returns(Task.CompletedTask);
            TelegramController telegramHandler = telegramMock.Object;

            services = new ServiceCollection();
            services.AddLogging();
            services.AddScoped <GraphApi, OutlookApi>();
            services.AddScoped <GraphApi, OneDriveApi>();
            services.AddScoped <GraphApi, PermissionsApi>();
            services.AddScoped <GraphApi, CalendarApi>();
            services.AddScoped <GraphApi, PersonalContactsApi>();
            services.AddScoped <ApiController>();
            services.AddScoped <ApiCallManager>();
            services.AddScoped <DefaultGraphApi>();
            services.AddScoped(services => telegramHandler);
            services.AddScoped(services => Utils.CreateMemoryDbContext());

            Dictionary <string, string> config = new Dictionary <string, string>
            {
                { "API:NumberOfMethodCall", "2" },
                { "API:NumberOfServiceCall", "1" }
            };

            var configuration = new ConfigurationBuilder()
                                .AddInMemoryCollection(config)
                                .Build();

            services.AddScoped <IConfiguration>(service => configuration);
        }
예제 #2
0
        public async void HandleQuery(CallbackQuery query)
        {
            try
            {
                var controller = new TelegramController();
                controller.Start();

                var account = controller.FromQuery(query);

                if (account == null)
                {
                    await Bot.AnswerCallbackQueryAsync(query.Id, "Your account doesn't exist.");

                    return;
                }

                account.Controller = account.Controller ?? controller;
                var command = GetQuery(query, account);

                Console.WriteLine($"Command: {command}");

                await SendTextMessageAsync(command.Execute(query, account));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
예제 #3
0
        public async Task Handle_Message_With_Command_Ok()
        {
            // Arrange
            var    botTokenFake      = "fakeToken";
            string mockCommandResult = "result";

            var fakeEntityType = "bot_command";
            var fakeLength     = 1;
            var fakeOffset     = 1;


            var fakeEntity = GetMessageEntityFake(fakeEntityType, fakeLength, fakeOffset);

            MessageEntity[] fakeEntities = { fakeEntity };

            var fakeUpdateId = 1;
            var fakeUpdate   = GetUpdateFake(fakeUpdateId, fakeEntities);

            _telegramServiceMock.Setup(x => x.GenerateResponseTextAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>()))
            .Returns(Task.FromResult(mockCommandResult));

            _telegramServiceMock.Setup(x => x.SendMessageToBotAsync(It.IsAny <string>(), It.IsAny <SendMessage>(), It.IsAny <CancellationToken>()));

            // Act
            var telegramController = new TelegramController(
                _telegramServiceMock.Object
                );

            var actionResult = await telegramController.HandleMessageAsync(botTokenFake, fakeUpdate) as OkResult;

            // Assert
            Assert.NotNull(actionResult);
        }
예제 #4
0
        public void GetPassword_CorrectMessegeAndCacheMiss_CallSendTextMessage()
        {
            var botStub = new Mock <ITelegramBotClient>();

            var hubProxyStub = new Mock <IHubProxy>();

            var hubProxyFactoryStub = new Mock <IHubProxyFactory>();

            hubProxyFactoryStub
            .Setup(f => f.Create(
                       It.IsAny <string>(),
                       It.IsAny <string>(),
                       It.IsAny <string>(),
                       It.IsAny <Action <string> >()))
            .Returns(hubProxyStub.Object);

            var cacheStub = new Mock <ICache <long, IHubProxy> >();

            var controller = new TelegramController(botStub.Object, hubProxyFactoryStub.Object, "urlStub", "hubNameStub", cacheStub.Object);

            var chatId  = 1;
            var message = "Correct message";
            var update  = CreateUpdate(chatId, message);

            controller.GetPassword(update);

            hubProxyFactoryStub
            .Verify(f => f.Create(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Action <string> >()), Times.Once);

            cacheStub
            .Verify(mock => mock.Add(It.IsAny <long>(), It.IsAny <IHubProxy>()), Times.Once);

            hubProxyStub
            .Verify(mock => mock.Invoke("Generate", "{\"Key\":\"Correct\",\"Value\":\"message\"}"), Times.Once);
        }
예제 #5
0
        public BotUtilsTests()
        {
            var telegramMock = new Mock <TelegramController>(null, null, null, null, null, null, null, null);

            telegramMock.Setup(m => m.SendMessage(It.IsAny <long>(), It.IsAny <string>())).Returns(Task.CompletedTask);
            TelegramController telegramHandler = telegramMock.Object;

            services = new ServiceCollection();
            services.AddScoped(services => telegramHandler);
            services.AddScoped(services => Utils.CreateMemoryDbContext());
        }
예제 #6
0
        public void GetPassword_IncorrectMessegeAndCacheHit_CallSendTextMessageWithErrorText()
        {
            var botStub = new Mock <ITelegramBotClient>();

            var hubProxyStub = new Mock <IHubProxy>();

            var hubProxyFactoryStub = new Mock <IHubProxyFactory>();

            hubProxyFactoryStub
            .Setup(f => f.Create(
                       It.IsAny <string>(),
                       It.IsAny <string>(),
                       It.IsAny <string>(),
                       It.IsAny <Action <string> >()))
            .Returns(hubProxyStub.Object);

            var cacheStub = new Mock <ICache <long, IHubProxy> >();

            IHubProxy outProxy;

            cacheStub
            .Setup(mock => mock.TryGet(It.IsAny <long>(), out outProxy))
            .Callback(() => outProxy = hubProxyStub.Object)
            .Returns(true);


            var controller = new TelegramController(botStub.Object, hubProxyFactoryStub.Object, "urlStub", "hubNameStub", cacheStub.Object);

            var chatId  = 1;
            var message = "Incorrect";
            var update  = CreateUpdate(chatId, message);

            controller.GetPassword(update);

            hubProxyFactoryStub
            .Verify(f => f.Create(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Action <string> >()), Times.Never);

            cacheStub
            .Verify(mock => mock.Add(It.IsAny <long>(), It.IsAny <IHubProxy>()), Times.Never);

            botStub.Verify(mock => mock.SendTextMessageAsync(
                               chatId,
                               "_use_: \"*key* *example.com*\"",
                               false,
                               false,
                               0,
                               null,
                               Telegram.Bot.Types.Enums.ParseMode.Markdown,
                               default(System.Threading.CancellationToken)
                               ),
                           Times.Once);
        }
예제 #7
0
        public async Task Post_should_return_status_code_200()
        {
            var fakeService = new Mock <IHandleTelegramUpdate>();
            var controller  = new TelegramController(fakeService.Object);

            var result = await controller.Post(new TelegramUpdate());

            result.Should().BeAssignableTo <StatusCodeResult>();

            var statusCodeResult = result as StatusCodeResult;

            statusCodeResult.StatusCode.Should().Be((int)HttpStatusCode.OK);
        }
예제 #8
0
        public async Task Post_should_call_service()
        {
            var fakeService = new Mock <IHandleTelegramUpdate>();
            var fakeUpdate  = new TelegramUpdate {
                Id = 42
            };

            var controller = new TelegramController(fakeService.Object);

            await controller.Post(new TelegramUpdate { Id = 42 });

            fakeService.Verify(x => x.HandleAsync(It.Is <TelegramUpdate>(u => u.Id == fakeUpdate.Id)), Times.Once);
        }
예제 #9
0
        /// <summary>
        /// 檢查是否有新版本,並通知管理員
        /// </summary>
        /// <param name="serviceProvider"></param>
        /// <returns></returns>
        public static async Task CheckAppVersionAsync(IServiceProvider serviceProvider)
        {
            bool needUpdate = await CheckNeedUpdateAsync(serviceProvider);

            if (needUpdate)
            {
                BotDbContext db       = serviceProvider.GetService(typeof(BotDbContext)) as BotDbContext;
                List <long>  usersIds = await db.TelegramUsers.AsQueryable().Where(user => user.IsAdmin).Select(user => user.Id).ToListAsync();

                TelegramController telegramHandler  = serviceProvider.GetService(typeof(TelegramController)) as TelegramController;
                IEnumerable <Task> sendMessageTasks = usersIds.Select(userId => telegramHandler.SendMessage(userId, "Bot 有新版本需要更新 \n https://github.com/NTUT-SELab/MicrosoftGraphBot"));
                await Task.WhenAll(sendMessageTasks);
            }
        }
예제 #10
0
        public void GetPassword_CorrectMessegeAndCacheHit_CallSendTextMessage()
        {
            var botStub = new Mock <ITelegramBotClient>();

            var hubProxyStub = new Mock <IHubProxy>();

            var hubProxyFactoryStub = new Mock <IHubProxyFactory>();

            hubProxyFactoryStub
            .Setup(f => f.Create(
                       It.IsAny <string>(),
                       It.IsAny <string>(),
                       It.IsAny <string>(),
                       It.IsAny <Action <string> >()))
            .Returns(hubProxyStub.Object);

            var cacheStub = new Mock <ICache <long, IHubProxy> >();

            IHubProxy outProxy;

            cacheStub
            .Setup(mock => mock.TryGet(It.IsAny <long>(), out outProxy))
            .Callback(() => outProxy = hubProxyStub.Object)
            .Returns(true);

            var controller = new TelegramController(botStub.Object, hubProxyFactoryStub.Object, "urlStub", "hubNameStub", cacheStub.Object);

            var chatId  = 1;
            var message = "Correct message";
            var update  = CreateUpdate(chatId, message);

            //hack, cause cant settings mock out param in nested function
            //exeption here means that the proxy.Invoke called
            Assert.Throws(typeof(NullReferenceException), () => controller.GetPassword(update));

            hubProxyFactoryStub
            .Verify(f => f.Create(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Action <string> >()), Times.Never);

            cacheStub
            .Verify(mock => mock.Add(It.IsAny <long>(), It.IsAny <IHubProxy>()), Times.Never);

            //Assert.Throw upper used insted of this call
            //hubProxyStub
            //	.Verify(mock => mock.Invoke("Generate", "{\"Key\":\"Correct\",\"Value\":\"message\"}"), Times.Once);
        }
예제 #11
0
        /// <summary>
        /// 推播呼叫 Api 的結果給使用者
        /// </summary>
        /// <param name="serviceProvider"></param>
        /// <returns></returns>
        public static async Task PushApiResultAsync(IServiceProvider serviceProvider)
        {
            BotDbContext      db         = serviceProvider.GetService(typeof(BotDbContext)) as BotDbContext;
            IList <ApiResult> apiResults = await db.ApiResults.Include(result => result.TelegramUser).ToListAsync();

            if (apiResults.Any())
            {
                IEnumerable <long> usersIds = apiResults.Select(item => item.TelegramUserId).Distinct();

                TelegramController telegramHandler  = serviceProvider.GetService(typeof(TelegramController)) as TelegramController;
                IEnumerable <Task> sendMessageTasks = usersIds.Select(usersId => telegramHandler.SendMessage(usersId,
                                                                                                             string.Join('\n', apiResults.Where(item => item.TelegramUserId == usersId).OrderBy(item => item.Date).Select(item => $"時間: {item.Date}, 結果:\n{item.Result}"))));
                db.ApiResults.RemoveRange(apiResults);

                Task sendMessageTask = Task.WhenAll(sendMessageTasks);
                Task dbTask          = db.SaveChangesAsync();

                await sendMessageTask;
                await dbTask;
            }
        }
예제 #12
0
        public async void HandleMessage(Message message)
        {
            var     chatId = message.From.Id;
            Account account;

            if (TelegramController.Accounts.ContainsKey(chatId))
            {
                account = TelegramController.Accounts[chatId];
            }
            else
            {
                var contoller = new TelegramController();
                contoller.Start();
                account            = contoller.FromMessage(message);
                account.Controller = contoller;
            }

            var command = GetCommand(message, account);

            Console.WriteLine(
                $"Command: {command}, status: {account.Status.ToString()}");

            await SendTextMessageAsync(command.Execute(message, this, account));
        }
예제 #13
0
        public async Task Handle_Message_With_No_Commands_Ok()
        {
            // Arrange
            var    botTokenFake      = "fakeToken";
            string mockCommandResult = "result";

            var fakeUpdateId = 1;
            var fakeUpdate   = GetUpdateFake(fakeUpdateId);

            _telegramServiceMock.Setup(x => x.GenerateResponseTextAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>()))
            .Returns(Task.FromResult(mockCommandResult));

            _telegramServiceMock.Setup(x => x.SendMessageToBotAsync(It.IsAny <string>(), It.IsAny <SendMessage>(), It.IsAny <CancellationToken>()));

            // Act
            var telegramController = new TelegramController(
                _telegramServiceMock.Object
                );

            var actionResult = await telegramController.HandleMessageAsync(botTokenFake, fakeUpdate) as AcceptedResult;

            // Assert
            Assert.NotNull(actionResult);
        }
예제 #14
0
 public NotificationManager(Client.Client client)
 {
     controller = new TelegramController();
     controller.Start();
     _client = client;
 }