aiogram/tests/mocked_bot.py

71 lines
2.2 KiB
Python
Raw Normal View History

2019-11-18 17:44:07 +02:00
from collections import deque
from typing import TYPE_CHECKING, AsyncGenerator, Deque, Optional, Type
2019-11-18 17:44:07 +02:00
from aiogram import Bot
from aiogram.api.client.session.base import BaseSession
from aiogram.api.methods import TelegramMethod
2019-11-18 17:52:35 +02:00
from aiogram.api.methods.base import Request, Response, T
from aiogram.api.types import UNSET
2019-11-18 17:44:07 +02:00
class MockedSession(BaseSession):
def __init__(self):
super(MockedSession, self).__init__()
2019-11-18 17:52:35 +02:00
self.responses: Deque[Response[T]] = deque()
self.requests: Deque[Request] = deque()
2019-11-18 17:44:07 +02:00
2019-11-18 17:52:35 +02:00
def add_result(self, response: Response[T]) -> Response[T]:
2019-11-18 17:44:07 +02:00
self.responses.append(response)
return response
def get_request(self) -> Request:
return self.requests.pop()
async def close(self):
pass
async def make_request(
2020-06-14 18:18:29 +03:00
self, bot: Bot, method: TelegramMethod[T], timeout: Optional[int] = UNSET
) -> T:
2020-06-14 18:18:29 +03:00
self.requests.append(method.build_request(bot))
2019-11-18 17:52:35 +02:00
response: Response[T] = self.responses.pop()
2019-11-18 17:44:07 +02:00
self.raise_for_status(response)
2019-11-18 17:52:35 +02:00
return response.result # type: ignore
2019-11-18 17:44:07 +02:00
async def stream_content(
self, url: str, timeout: int, chunk_size: int
) -> AsyncGenerator[bytes, None]: # pragma: no cover
yield b""
2019-11-18 17:44:07 +02:00
class MockedBot(Bot):
2019-11-18 17:52:35 +02:00
if TYPE_CHECKING:
session: MockedSession
def __init__(self, **kwargs):
super(MockedBot, self).__init__("42:TEST", session=MockedSession(), **kwargs)
2019-11-18 17:44:07 +02:00
def add_result_for(
self,
2019-11-18 17:52:35 +02:00
method: Type[TelegramMethod[T]],
2019-11-18 17:44:07 +02:00
ok: bool,
2019-11-19 00:05:19 +02:00
result: T = None,
2019-11-18 17:44:07 +02:00
description: Optional[str] = None,
error_code: Optional[int] = None,
migrate_to_chat_id: Optional[int] = None,
retry_after: Optional[int] = None,
) -> Response[T]:
2019-11-18 17:52:35 +02:00
response = Response[method.__returning__]( # type: ignore
2019-11-18 17:44:07 +02:00
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()