diff --git a/CHANGES/736.bugfix b/CHANGES/736.bugfix new file mode 100644 index 00000000..4dbd2bd2 --- /dev/null +++ b/CHANGES/736.bugfix @@ -0,0 +1 @@ +Fixed: bound filter resolving does not require children routers diff --git a/aiogram/dispatcher/event/telegram.py b/aiogram/dispatcher/event/telegram.py index 5535bb3e..a08d7cb1 100644 --- a/aiogram/dispatcher/event/telegram.py +++ b/aiogram/dispatcher/event/telegram.py @@ -88,7 +88,7 @@ class TelegramEventObserver: """ registry: List[Type[BaseFilter]] = [] - for router in reversed(tuple(self.router.chain)): + for router in reversed(tuple(self.router.chain_head)): observer = router.observers[self.event_name] for filter_ in observer.filters: diff --git a/aiogram/dispatcher/router.py b/aiogram/dispatcher/router.py index ae83c1c7..d8526ddd 100644 --- a/aiogram/dispatcher/router.py +++ b/aiogram/dispatcher/router.py @@ -160,13 +160,6 @@ class Router: for router in self.sub_routers: yield from router.chain_tail - @property - def chain(self) -> Generator[Router, None, None]: - yield from self.chain_head - tail = self.chain_tail - next(tail) # Skip self - yield from tail - @property def parent_router(self) -> Optional[Router]: return self._parent_router diff --git a/tests/test_dispatcher/test_event/test_telegram.py b/tests/test_dispatcher/test_event/test_telegram.py index df9e128d..a30eb3a9 100644 --- a/tests/test_dispatcher/test_event/test_telegram.py +++ b/tests/test_dispatcher/test_event/test_telegram.py @@ -99,6 +99,8 @@ class TestTelegramEventObserver: assert MyFilter2 in filters_chain3 assert MyFilter3 in filters_chain3 + assert MyFilter3 not in filters_chain1 + async def test_resolve_filters_data_from_parent_router(self): class FilterSet(BaseFilter): set_filter: bool diff --git a/tests/test_dispatcher/test_router.py b/tests/test_dispatcher/test_router.py index 980e5f34..56821f46 100644 --- a/tests/test_dispatcher/test_router.py +++ b/tests/test_dispatcher/test_router.py @@ -134,3 +134,33 @@ class TestRouter: r2.message.register(handler) assert await r1.propagate_event(update_type="message", event=None) is UNHANDLED + + async def test_router_chain_tail(self): + r1 = Router(name="Router 1") + r2_1 = Router(name="Router 2-1") + r2_2 = Router(name="Router 2-2") + r3 = Router(name="Router 3") + + r1.include_router(r2_1) + r1.include_router(r2_2) + r2_1.include_router(r3) + + assert tuple(r1.chain_tail) == (r1, r2_1, r3, r2_2) + assert tuple(r2_1.chain_tail) == (r2_1, r3) + assert tuple(r2_2.chain_tail) == (r2_2,) + assert tuple(r3.chain_tail) == (r3,) + + async def test_router_chain_head(self): + r1 = Router(name="Router 1") + r2_1 = Router(name="Router 2-1") + r2_2 = Router(name="Router 2-2") + r3 = Router(name="Router 3") + + r1.include_router(r2_1) + r1.include_router(r2_2) + r2_1.include_router(r3) + + assert tuple(r1.chain_head) == (r1,) + assert tuple(r2_1.chain_head) == (r2_1, r1) + assert tuple(r2_2.chain_head) == (r2_2, r1) + assert tuple(r3.chain_head) == (r3, r2_1, r1)