mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-09 09:22:03 +00:00
Partially add tests for telegram event observer
This commit is contained in:
parent
55f6c29ba6
commit
8204b6af52
3 changed files with 72 additions and 9 deletions
|
|
@ -70,18 +70,18 @@ class TelegramEventObserver(EventObserver):
|
||||||
self.filters: List[Type[BaseFilter]] = []
|
self.filters: List[Type[BaseFilter]] = []
|
||||||
|
|
||||||
def bind_filter(self, bound_filter: Type[BaseFilter]) -> None:
|
def bind_filter(self, bound_filter: Type[BaseFilter]) -> None:
|
||||||
if not isinstance(bound_filter, BaseFilter):
|
if not issubclass(bound_filter, BaseFilter):
|
||||||
pass
|
raise TypeError(
|
||||||
|
"bound_filter() argument 'bound_filter' must be subclass of BaseFilter"
|
||||||
|
)
|
||||||
self.filters.append(bound_filter)
|
self.filters.append(bound_filter)
|
||||||
|
|
||||||
def _resolve_filters_chain(self):
|
def _resolve_filters_chain(self):
|
||||||
registry: List[FilterType] = []
|
registry: List[FilterType] = []
|
||||||
routers: List[Router] = []
|
|
||||||
|
|
||||||
router = self.router
|
router = self.router
|
||||||
while router and router not in routers:
|
while router:
|
||||||
observer = router.observers[self.event_name]
|
observer = router.observers[self.event_name]
|
||||||
routers.append(router)
|
|
||||||
router = router.parent_router
|
router = router.parent_router
|
||||||
|
|
||||||
for filter_ in observer.filters:
|
for filter_ in observer.filters:
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ class BaseFilter(ABC, BaseModel):
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def __call__(
|
async def __call__(
|
||||||
self, *args: Any, **kwargs: Any
|
self, *args: Any, **kwargs: Any
|
||||||
) -> Callable[[Any], Awaitable[Union[bool, Dict[str, Any]]]]:
|
) -> Union[bool, Dict[str, Any]]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def __await__(self):
|
def __await__(self):
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
import functools
|
import functools
|
||||||
from typing import Any, NoReturn
|
from typing import Any, Awaitable, Callable, Dict, NoReturn, Union
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from aiogram.dispatcher.event.handler import HandlerObject
|
from aiogram.dispatcher.event.handler import HandlerObject
|
||||||
from aiogram.dispatcher.event.observer import EventObserver, SkipHandler
|
from aiogram.dispatcher.event.observer import EventObserver, SkipHandler, TelegramEventObserver
|
||||||
|
from aiogram.dispatcher.filters.base import BaseFilter
|
||||||
|
from aiogram.dispatcher.router import Router
|
||||||
|
|
||||||
|
|
||||||
async def my_handler(event: Any, index: int = 0) -> Any:
|
async def my_handler(event: Any, index: int = 0) -> Any:
|
||||||
|
|
@ -106,3 +107,65 @@ class TestEventObserver:
|
||||||
|
|
||||||
results = [result async for result in observer.trigger(42)]
|
results = [result async for result in observer.trigger(42)]
|
||||||
assert results == [((42,), {"b": 2})]
|
assert results == [((42,), {"b": 2})]
|
||||||
|
|
||||||
|
|
||||||
|
class TestTelegramEventObserver:
|
||||||
|
def test_bind_filter(self):
|
||||||
|
event_observer = TelegramEventObserver(Router(), "test")
|
||||||
|
with pytest.raises(TypeError):
|
||||||
|
event_observer.bind_filter(object) # type: ignore
|
||||||
|
|
||||||
|
class MyFilter(BaseFilter):
|
||||||
|
async def __call__(
|
||||||
|
self, *args: Any, **kwargs: Any
|
||||||
|
) -> Callable[[Any], Awaitable[Union[bool, Dict[str, Any]]]]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
event_observer.bind_filter(MyFilter)
|
||||||
|
assert event_observer.filters
|
||||||
|
assert event_observer.filters[0] == MyFilter
|
||||||
|
|
||||||
|
def test_resolve_filters_chain(self):
|
||||||
|
router1 = Router()
|
||||||
|
router2 = Router()
|
||||||
|
router3 = Router()
|
||||||
|
router1.include_router(router2)
|
||||||
|
router2.include_router(router3)
|
||||||
|
|
||||||
|
class MyFilter1(BaseFilter):
|
||||||
|
test: str
|
||||||
|
|
||||||
|
async def __call__(self, *args: Any, **kwargs: Any) -> Union[bool, Dict[str, Any]]:
|
||||||
|
return True
|
||||||
|
|
||||||
|
class MyFilter2(MyFilter1):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class MyFilter3(MyFilter1):
|
||||||
|
pass
|
||||||
|
|
||||||
|
router1.message_handler.bind_filter(MyFilter1)
|
||||||
|
router1.message_handler.bind_filter(MyFilter2)
|
||||||
|
router2.message_handler.bind_filter(MyFilter2)
|
||||||
|
router3.message_handler.bind_filter(MyFilter3)
|
||||||
|
|
||||||
|
filters_chain1 = list(router1.message_handler._resolve_filters_chain())
|
||||||
|
filters_chain2 = list(router2.message_handler._resolve_filters_chain())
|
||||||
|
filters_chain3 = list(router3.message_handler._resolve_filters_chain())
|
||||||
|
|
||||||
|
assert filters_chain1 == [MyFilter1, MyFilter2]
|
||||||
|
assert filters_chain2 == [MyFilter2, MyFilter1]
|
||||||
|
assert filters_chain3 == [MyFilter3, MyFilter2, MyFilter1]
|
||||||
|
|
||||||
|
def test_resolve_filters(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_register(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_register_decorator(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_trigger(self):
|
||||||
|
pass
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue