From ef956f7ec282c902c9fe4d5520340c75adf79e1a Mon Sep 17 00:00:00 2001 From: jrootjunior Date: Mon, 18 Nov 2019 17:44:07 +0200 Subject: [PATCH] Add API methods testing prototype --- aiogram/api/methods/base.py | 2 +- tests/conftest.py | 11 ++++ tests/mocked_bot.py | 59 ++++++++++++++++++++++ tests/test_api/test_methods/test_get_me.py | 30 +++++++++++ 4 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 tests/mocked_bot.py create mode 100644 tests/test_api/test_methods/test_get_me.py diff --git a/aiogram/api/methods/base.py b/aiogram/api/methods/base.py index 42010565..28186724 100644 --- a/aiogram/api/methods/base.py +++ b/aiogram/api/methods/base.py @@ -69,5 +69,5 @@ class TelegramMethod(abc.ABC, BaseModel, Generic[T]): def __await__(self): from aiogram.api.client.bot import Bot - bot = Bot.get_current() + bot = Bot.get_current(no_error=False) return self.emit(bot).__await__() diff --git a/tests/conftest.py b/tests/conftest.py index e69de29b..cb02148f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -0,0 +1,11 @@ +import pytest + +from aiogram import Bot +from tests.mocked_bot import MockedBot + + +@pytest.fixture() +def bot(): + bot = MockedBot() + Bot.set_current(bot) + yield bot diff --git a/tests/mocked_bot.py b/tests/mocked_bot.py new file mode 100644 index 00000000..a120b1f7 --- /dev/null +++ b/tests/mocked_bot.py @@ -0,0 +1,59 @@ +from collections import deque +from typing import Optional + +from aiogram import Bot +from aiogram.api.client.session.base import BaseSession +from aiogram.api.methods import TelegramMethod +from aiogram.api.methods.base import T, Request, Response + + +class MockedSession(BaseSession): + def __init__(self): + super(MockedSession, self).__init__() + self.responses = deque() + self.requests = deque() + + def add_result(self, response: Response) -> Response: + self.responses.append(response) + return response + + def get_request(self) -> Request: + return self.requests.pop() + + async def close(self): + pass + + async def make_request(self, token: str, method: TelegramMethod[T]) -> T: + self.requests.append(method.build_request()) + response: Response = self.responses.pop() + self.raise_for_status(response) + return response.result + + +class MockedBot(Bot): + def __init__(self): + super(MockedBot, self).__init__("TOKEN", session=MockedSession()) + + def add_result_for( + self, + method, + ok: bool, + result: Optional[T] = None, + description: Optional[str] = None, + error_code: Optional[int] = None, + migrate_to_chat_id: Optional[int] = None, + retry_after: Optional[int] = None, + ) -> Response[T]: + response = Response[method.__returning__]( + ok=ok, + result=result, + description=description, + error_code=error_code, + migrate_to_chat_id=migrate_to_chat_id, + retry_after=retry_after, + ) + self.session.add_result(response) + return response + + def get_request(self) -> Request: + return self.session.get_request() diff --git a/tests/test_api/test_methods/test_get_me.py b/tests/test_api/test_methods/test_get_me.py new file mode 100644 index 00000000..70856a03 --- /dev/null +++ b/tests/test_api/test_methods/test_get_me.py @@ -0,0 +1,30 @@ +import pytest + +from aiogram.api.methods import GetMe, Request +from aiogram.api.types import User +from tests.mocked_bot import MockedBot + + +class TestGetMe: + @pytest.mark.asyncio + async def test_method(self, bot: MockedBot): + prepare_result = bot.add_result_for( + GetMe, ok=True, result=User(id=42, is_bot=False, first_name="User") + ) + + response: User = await GetMe() + request: Request = bot.get_request() + assert request.method == "getMe" + assert request.data == {} + assert response == prepare_result.result + + @pytest.mark.asyncio + async def test_bot_method(self, bot: MockedBot): + prepare_result = bot.add_result_for( + GetMe, ok=True, result=User(id=42, is_bot=False, first_name="User") + ) + response: User = await bot.get_me() + request: Request = bot.get_request() + assert request.method == "getMe" + assert request.data == {} + assert response == prepare_result.result