mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-06 07:50:32 +00:00
Add API methods testing prototype
This commit is contained in:
parent
b4a94d8441
commit
ef956f7ec2
4 changed files with 101 additions and 1 deletions
|
|
@ -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__()
|
||||
|
|
|
|||
|
|
@ -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
59
tests/mocked_bot.py
Normal 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()
|
||||
30
tests/test_api/test_methods/test_get_me.py
Normal file
30
tests/test_api/test_methods/test_get_me.py
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue