Add prototype of class-based handlers

This commit is contained in:
Alex Root Junior 2019-12-03 00:03:15 +02:00
parent 2a731f7ce2
commit b82a1a6fb0
11 changed files with 178 additions and 8 deletions

View file

@ -3,8 +3,11 @@ from typing import Any, Dict, Union
import pytest
from aiogram.api.types import Update
from aiogram.dispatcher.event.handler import CallableMixin, FilterObject, HandlerObject
from aiogram.dispatcher.filters import Text
from aiogram.dispatcher.filters.base import BaseFilter
from aiogram.dispatcher.handler.base import BaseHandler
def callback1(foo: int, bar: int, baz: int):
@ -174,3 +177,25 @@ class TestHandlerObject:
)
result, data = await handler.check(42, foo=True)
assert not result
@pytest.mark.asyncio
async def test_class_based_handler(self):
class MyFilter(BaseFilter):
async def __call__(self, event):
return True
class MyHandler(BaseHandler):
event: Update
filters = [MyFilter()]
async def handle(self) -> Any:
return self.event.update_id
handler = HandlerObject(MyHandler, filters=[FilterObject(lambda event: True)])
assert handler.awaitable
assert handler.callback == MyHandler
assert len(handler.filters) == 2
assert handler.filters[1].callback == MyFilter()
result = await handler.call(Update(update_id=42))
assert result == 42

View file

@ -0,0 +1,47 @@
import asyncio
from typing import Any
import pytest
from aiogram import Bot
from aiogram.api.types import Update
from aiogram.dispatcher.handler.base import BaseHandler
class MyHandler(BaseHandler):
async def handle(self) -> Any:
await asyncio.sleep(0.1)
return 42
class TestBaseClassBasedHandler:
@pytest.mark.asyncio
async def test_base_handler(self):
event = Update(update_id=42)
handler = MyHandler(event=event, key=42)
assert handler.event == event
assert handler.data["key"] == 42
assert hasattr(handler, "bot")
assert not hasattr(handler, "filters")
assert await handler == 42
@pytest.mark.asyncio
async def test_bot_mixin_from_context(self):
event = Update(update_id=42)
handler = MyHandler(event=event, key=42)
bot = Bot("42:TEST")
assert handler.bot is None
Bot.set_current(bot)
assert handler.bot == bot
@pytest.mark.asyncio
async def test_bot_mixin_from_data(self):
event = Update(update_id=42)
bot = Bot("42:TEST")
handler = MyHandler(event=event, key=42, bot=bot)
assert "bot" in handler.data
assert handler.bot == bot

View file

@ -0,0 +1,28 @@
import datetime
from typing import Any
import pytest
from aiogram.api.types import Chat, Message, User
from aiogram.dispatcher.handler.message import MessageHandler
class MyHandler(MessageHandler):
async def handle(self) -> Any:
return self.event.text
class TestClassBasedMessageHandler:
@pytest.mark.asyncio
async def test_message_handler(self):
event = Message(
message_id=42,
date=datetime.datetime.now(),
text="test",
chat=Chat(id=42, type="private"),
from_user=User(id=42, is_bot=False, first_name="Test"),
)
handler = MyHandler(event=event)
assert handler.from_user == event.from_user
assert handler.chat == event.chat