From 5e3356fa621929c82386eca4cd7760bbacce91c0 Mon Sep 17 00:00:00 2001 From: Alex Root Junior Date: Thu, 29 Jul 2021 00:05:15 +0300 Subject: [PATCH] Added possibility to use empty callback data factory filter --- aiogram/dispatcher/filters/callback_data.py | 10 +++++----- tests/conftest.py | 4 ++++ .../test_dispatcher/test_filters/test_callback_data.py | 4 ++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/aiogram/dispatcher/filters/callback_data.py b/aiogram/dispatcher/filters/callback_data.py index 68f5b773..19f7869f 100644 --- a/aiogram/dispatcher/filters/callback_data.py +++ b/aiogram/dispatcher/filters/callback_data.py @@ -3,7 +3,7 @@ from __future__ import annotations from decimal import Decimal from enum import Enum from fractions import Fraction -from typing import TYPE_CHECKING, Any, Dict, Optional, Type, TypeVar, Union +from typing import TYPE_CHECKING, Any, Dict, Optional, Type, TypeVar, Union, Literal from uuid import UUID from magic_filter import MagicFilter @@ -86,7 +86,7 @@ class CallbackData(BaseModel): return cls(**payload) @classmethod - def filter(cls, rule: MagicFilter) -> CallbackQueryFilter: + def filter(cls, rule: Optional[MagicFilter] = None) -> CallbackQueryFilter: return CallbackQueryFilter(callback_data=cls, rule=rule) class Config: @@ -95,9 +95,9 @@ class CallbackData(BaseModel): class CallbackQueryFilter(BaseFilter): callback_data: Type[CallbackData] - rule: MagicFilter + rule: Optional[MagicFilter] = None - async def __call__(self, query: CallbackQuery) -> Union[bool, Dict[str, Any]]: + async def __call__(self, query: CallbackQuery) -> Union[Literal[False], Dict[str, Any]]: if not isinstance(query, CallbackQuery) or not query.data: return False try: @@ -105,7 +105,7 @@ class CallbackQueryFilter(BaseFilter): except (TypeError, ValueError): return False - if self.rule.resolve(callback_data): + if self.rule is None or self.rule.resolve(callback_data): return {"callback_data": callback_data} return False diff --git a/tests/conftest.py b/tests/conftest.py index 7586f389..f2d0cebc 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -42,6 +42,10 @@ async def redis_storage(redis_server): if not redis_server: pytest.skip("Redis is not available here") storage = RedisStorage.from_url(redis_server) + try: + await storage.redis.info() + except ConnectionError as e: + pytest.skip(str(e)) try: yield storage finally: diff --git a/tests/test_dispatcher/test_filters/test_callback_data.py b/tests/test_dispatcher/test_filters/test_callback_data.py index f71ca706..20d10be3 100644 --- a/tests/test_dispatcher/test_filters/test_callback_data.py +++ b/tests/test_dispatcher/test_filters/test_callback_data.py @@ -156,7 +156,11 @@ class TestCallbackDataFilter: ["test", F.foo == "test", False], ["test:spam:42", F.foo == "test", False], ["test:test:42", F.foo == "test", {"callback_data": MyCallback(foo="test", bar=42)}], + ["test:test:42", None, {"callback_data": MyCallback(foo="test", bar=42)}], + ["test:test:777", None, {"callback_data": MyCallback(foo="test", bar=777)}], + ["spam:test:777", None, False], ["test:test:", F.foo == "test", False], + ["test:test:", None, False], ], ) @pytest.mark.asyncio