Add API methods testing prototype

This commit is contained in:
jrootjunior 2019-11-18 17:44:07 +02:00
parent b4a94d8441
commit ef956f7ec2
4 changed files with 101 additions and 1 deletions

View file

@ -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__()

View file

@ -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

59
tests/mocked_bot.py Normal file
View file

@ -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()

View file

@ -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