diff --git a/aiogram/dispatcher/filters/builtin.py b/aiogram/dispatcher/filters/builtin.py index cb1c4815..268ef102 100644 --- a/aiogram/dispatcher/filters/builtin.py +++ b/aiogram/dispatcher/filters/builtin.py @@ -591,7 +591,9 @@ class IDFilter(Filter): async def check(self, obj: Union[Message, CallbackQuery, InlineQuery]): if isinstance(obj, Message): - user_id = obj.from_user.id + user_id = None + if obj.from_user is not None: + user_id = obj.from_user.id chat_id = obj.chat.id elif isinstance(obj, CallbackQuery): user_id = obj.from_user.id diff --git a/tests/test_dispatcher/test_filters/test_builtin.py b/tests/test_dispatcher/test_filters/test_builtin.py index 4cfce465..4f05cb22 100644 --- a/tests/test_dispatcher/test_filters/test_builtin.py +++ b/tests/test_dispatcher/test_filters/test_builtin.py @@ -6,10 +6,10 @@ import pytest from aiogram.dispatcher.filters.builtin import ( Text, extract_chat_ids, - ChatIDArgumentType, ForwardedMessageFilter, + ChatIDArgumentType, ForwardedMessageFilter, IDFilter, ) from aiogram.types import Message -from tests.types.dataset import MESSAGE +from tests.types.dataset import MESSAGE, MESSAGE_FROM_CHANNEL class TestText: @@ -75,6 +75,8 @@ def test_extract_chat_ids(chat_id: ChatIDArgumentType, expected: Set[int]): class TestForwardedMessageFilter: + + @pytest.mark.asyncio async def test_filter_forwarded_messages(self): filter = ForwardedMessageFilter(is_forwarded=True) @@ -85,6 +87,7 @@ class TestForwardedMessageFilter: assert await filter.check(forwarded_message) assert not await filter.check(not_forwarded_message) + @pytest.mark.asyncio async def test_filter_not_forwarded_messages(self): filter = ForwardedMessageFilter(is_forwarded=False) @@ -94,3 +97,14 @@ class TestForwardedMessageFilter: assert await filter.check(not_forwarded_message) assert not await filter.check(forwarded_message) + + +class TestIDFilter: + + @pytest.mark.asyncio + async def test_chat_id_for_channels(self): + message_from_channel = Message(**MESSAGE_FROM_CHANNEL) + + filter = IDFilter(chat_id=message_from_channel.chat.id) + + assert await filter.check(message_from_channel) diff --git a/tests/types/dataset.py b/tests/types/dataset.py index 739e8e2c..a14ce316 100644 --- a/tests/types/dataset.py +++ b/tests/types/dataset.py @@ -409,6 +409,20 @@ MESSAGE_WITH_VOICE = { "voice": VOICE, } +CHANNEL = { + "type": "channel", + "username": "best_channel_ever", + "id": -1001065170817, +} + +MESSAGE_FROM_CHANNEL = { + "message_id": 123432, + "from": None, + "chat": CHANNEL, + "date": 1508768405, + "text": "Hi, world!", +} + PRE_CHECKOUT_QUERY = { "id": "262181558630368727", "from": USER,