From 0ebabf0f66543a65b45d23f35c90aaba309ba3e0 Mon Sep 17 00:00:00 2001 From: Alex Root Junior Date: Tue, 11 May 2021 22:48:40 +0300 Subject: [PATCH] Coverage --- aiogram/dispatcher/fsm/state.py | 8 +- .../dispatcher/middlewares/user_context.py | 4 + aiogram/types/message.py | 2 +- tests/test_api/test_types/test_message.py | 742 +++++++++--------- tests/test_dispatcher/test_dispatcher.py | 40 + .../test_event/test_handler.py | 9 + 6 files changed, 435 insertions(+), 370 deletions(-) diff --git a/aiogram/dispatcher/fsm/state.py b/aiogram/dispatcher/fsm/state.py index 4d03c042..d4ea1974 100644 --- a/aiogram/dispatcher/fsm/state.py +++ b/aiogram/dispatcher/fsm/state.py @@ -102,10 +102,6 @@ class StatesGroupMeta(type): result += group.__all_states__ return result - @property - def __states_names__(cls) -> Tuple[str, ...]: - return tuple(state.state for state in cls.__states__ if state.state) - @property def __all_states_names__(cls) -> Tuple[str, ...]: return tuple(state.state for state in cls.__all_states__ if state.state) @@ -115,8 +111,8 @@ class StatesGroupMeta(type): return item in cls.__all_states_names__ if isinstance(item, State): return item in cls.__all_states__ - if isinstance(item, StatesGroup): - return item in cls.__all_childs__ + # if isinstance(item, StatesGroup): + # return item in cls.__all_childs__ return False def __str__(self) -> str: diff --git a/aiogram/dispatcher/middlewares/user_context.py b/aiogram/dispatcher/middlewares/user_context.py index c7b0a459..c6e64878 100644 --- a/aiogram/dispatcher/middlewares/user_context.py +++ b/aiogram/dispatcher/middlewares/user_context.py @@ -63,4 +63,8 @@ class UserContextMiddleware(BaseMiddleware[Update]): return None, event.pre_checkout_query.from_user if event.poll_answer: return None, event.poll_answer.user + if event.my_chat_member: + return event.my_chat_member.chat, event.my_chat_member.from_user + if event.chat_member: + return event.chat_member.chat, event.chat_member.from_user return None, None diff --git a/aiogram/types/message.py b/aiogram/types/message.py index 2707da56..d476c099 100644 --- a/aiogram/types/message.py +++ b/aiogram/types/message.py @@ -1673,7 +1673,7 @@ class Message(TelegramObject): else: raise TypeError("This type of message can't be copied.") - async def copy_to( + def copy_to( self, chat_id: Union[int, str], caption: Optional[str] = None, diff --git a/tests/test_api/test_types/test_message.py b/tests/test_api/test_types/test_message.py index a6cf235e..15ea6087 100644 --- a/tests/test_api/test_types/test_message.py +++ b/tests/test_api/test_types/test_message.py @@ -1,5 +1,5 @@ import datetime -from typing import Any, Dict, Type, Union +from typing import Any, Dict, Type, Union, Optional import pytest @@ -21,6 +21,8 @@ from aiogram.methods import ( SendVideo, SendVideoNote, SendVoice, + CopyMessage, + TelegramMethod, ) from aiogram.types import ( Animation, @@ -44,374 +46,334 @@ from aiogram.types import ( Video, VideoNote, Voice, + MessageAutoDeleteTimerChanged, + VoiceChatStarted, + VoiceChatEnded, + VoiceChatParticipantsInvited, ) from aiogram.types.message import ContentType, Message +TEST_MESSAGE_TEXT = 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"), +) +TEST_MESSAGE_AUDIO = Message( + message_id=42, + date=datetime.datetime.now(), + audio=Audio(file_id="file id", file_unique_id="file id", duration=42), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_ANIMATION = Message( + message_id=42, + date=datetime.datetime.now(), + animation=Animation( + file_id="file id", file_unique_id="file id", width=42, height=42, duration=0, + ), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_DOCUMENT = Message( + message_id=42, + date=datetime.datetime.now(), + document=Document(file_id="file id", file_unique_id="file id"), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_GAME = Message( + message_id=42, + date=datetime.datetime.now(), + game=Game( + title="title", + description="description", + photo=[PhotoSize(file_id="file id", file_unique_id="file id", width=42, height=42)], + ), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_PHOTO = Message( + message_id=42, + date=datetime.datetime.now(), + photo=[PhotoSize(file_id="file id", file_unique_id="file id", width=42, height=42)], + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) + +TEST_MESSAGE_STICKER = Message( + message_id=42, + date=datetime.datetime.now(), + sticker=Sticker( + file_id="file id", file_unique_id="file id", width=42, height=42, is_animated=False, + ), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_VIDEO = Message( + message_id=42, + date=datetime.datetime.now(), + video=Video(file_id="file id", file_unique_id="file id", width=42, height=42, duration=0,), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_VIDEO_NOTE = Message( + message_id=42, + date=datetime.datetime.now(), + video_note=VideoNote(file_id="file id", file_unique_id="file id", length=0, duration=0), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_VOICE = Message( + message_id=42, + date=datetime.datetime.now(), + voice=Voice(file_id="file id", file_unique_id="file id", duration=0), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_CONTACT = Message( + message_id=42, + date=datetime.datetime.now(), + contact=Contact(phone_number="911", first_name="911"), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_VENUE = Message( + message_id=42, + date=datetime.datetime.now(), + venue=Venue( + location=Location(latitude=3.14, longitude=3.14), + title="Cupboard Under the Stairs", + address="Under the stairs, 4 Privet Drive, " + "Little Whinging, Surrey, England, Great Britain", + ), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_LOCATION = Message( + message_id=42, + date=datetime.datetime.now(), + location=Location(longitude=3.14, latitude=3.14), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_NEW_CHAT_MEMBERS = Message( + message_id=42, + date=datetime.datetime.now(), + new_chat_members=[User(id=42, is_bot=False, first_name="Test")], + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_LEFT_CHAT_MEMBER = Message( + message_id=42, + date=datetime.datetime.now(), + left_chat_member=User(id=42, is_bot=False, first_name="Test"), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_INVOICE = Message( + message_id=42, + date=datetime.datetime.now(), + invoice=Invoice( + title="test", + description="test", + start_parameter="brilliant", + currency="BTC", + total_amount=1, + ), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_SUCCESSFUL_PAYMENT = Message( + message_id=42, + date=datetime.datetime.now(), + successful_payment=SuccessfulPayment( + currency="BTC", + total_amount=42, + invoice_payload="payload", + telegram_payment_charge_id="charge", + provider_payment_charge_id="payment", + ), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_CONNECTED_WEBSITE = Message( + message_id=42, + date=datetime.datetime.now(), + connected_website="token", + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_MIGRATE_FROM_CHAT_ID = Message( + message_id=42, + date=datetime.datetime.now(), + migrate_from_chat_id=42, + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_MIGRATE_TO_CHAT_ID = Message( + message_id=42, + date=datetime.datetime.now(), + migrate_to_chat_id=42, + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_PINNED_MESSAGE = Message( + message_id=42, + date=datetime.datetime.now(), + pinned_message=Message( + message_id=42, + date=datetime.datetime.now(), + text="pinned", + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), + ), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_NEW_CHAT_TITLE = Message( + message_id=42, + date=datetime.datetime.now(), + new_chat_title="test", + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_NEW_CHAT_PHOTO = Message( + message_id=42, + date=datetime.datetime.now(), + new_chat_photo=[PhotoSize(file_id="file id", file_unique_id="file id", width=42, height=42)], + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_DELETE_CHAT_PHOTO = Message( + message_id=42, + date=datetime.datetime.now(), + delete_chat_photo=True, + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_GROUP_CHAT_CREATED = Message( + message_id=42, + date=datetime.datetime.now(), + group_chat_created=True, + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_PASSPORT_DATA = Message( + message_id=42, + date=datetime.datetime.now(), + passport_data=PassportData( + data=[], credentials=EncryptedCredentials(data="test", hash="test", secret="test"), + ), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_POLL = Message( + message_id=42, + date=datetime.datetime.now(), + poll=Poll( + id="QA", + question="Q", + options=[PollOption(text="A", voter_count=0), PollOption(text="B", voter_count=0),], + is_closed=False, + is_anonymous=False, + type="quiz", + allows_multiple_answers=False, + total_voter_count=0, + correct_option_id=1, + ), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_MESSAGE_AUTO_DELETE_TIMER_CHANGED = Message( + message_id=42, + date=datetime.datetime.now(), + chat=Chat(id=42, type="private"), + message_auto_delete_timer_changed=MessageAutoDeleteTimerChanged(message_auto_delete_time=42), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_VOICE_CHAT_STARTED = Message( + message_id=42, + date=datetime.datetime.now(), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), + voice_chat_started=VoiceChatStarted(), +) +TEST_MESSAGE_VOICE_CHAT_ENDED = Message( + message_id=42, + date=datetime.datetime.now(), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), + voice_chat_ended=VoiceChatEnded(duration=42), +) +TEST_MESSAGE_VOICE_CHAT_PARTICIPANTS_INVITED = Message( + message_id=42, + date=datetime.datetime.now(), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), + voice_chat_participants_invited=VoiceChatParticipantsInvited( + users=[User(id=69, is_bot=False, first_name="Test")] + ), +) +TEST_MESSAGE_DICE = Message( + message_id=42, + date=datetime.datetime.now(), + chat=Chat(id=42, type="private"), + dice=Dice(value=6, emoji="X"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) +TEST_MESSAGE_UNKNOWN = Message( + message_id=42, + date=datetime.datetime.now(), + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), +) + class TestMessage: @pytest.mark.parametrize( "message,content_type", [ + [TEST_MESSAGE_TEXT, ContentType.TEXT], + [TEST_MESSAGE_AUDIO, ContentType.AUDIO], + [TEST_MESSAGE_ANIMATION, ContentType.ANIMATION], + [TEST_MESSAGE_DOCUMENT, ContentType.DOCUMENT], + [TEST_MESSAGE_GAME, ContentType.GAME], + [TEST_MESSAGE_PHOTO, ContentType.PHOTO], + [TEST_MESSAGE_STICKER, ContentType.STICKER], + [TEST_MESSAGE_VIDEO, ContentType.VIDEO], + [TEST_MESSAGE_VIDEO_NOTE, ContentType.VIDEO_NOTE], + [TEST_MESSAGE_VOICE, ContentType.VOICE], + [TEST_MESSAGE_CONTACT, ContentType.CONTACT], + [TEST_MESSAGE_VENUE, ContentType.VENUE], + [TEST_MESSAGE_LOCATION, ContentType.LOCATION], + [TEST_MESSAGE_NEW_CHAT_MEMBERS, ContentType.NEW_CHAT_MEMBERS], + [TEST_MESSAGE_LEFT_CHAT_MEMBER, ContentType.LEFT_CHAT_MEMBER], + [TEST_MESSAGE_INVOICE, ContentType.INVOICE], + [TEST_MESSAGE_SUCCESSFUL_PAYMENT, ContentType.SUCCESSFUL_PAYMENT], + [TEST_MESSAGE_CONNECTED_WEBSITE, ContentType.CONNECTED_WEBSITE], + [TEST_MESSAGE_MIGRATE_FROM_CHAT_ID, ContentType.MIGRATE_FROM_CHAT_ID], + [TEST_MESSAGE_MIGRATE_TO_CHAT_ID, ContentType.MIGRATE_TO_CHAT_ID], + [TEST_MESSAGE_PINNED_MESSAGE, ContentType.PINNED_MESSAGE], + [TEST_MESSAGE_NEW_CHAT_TITLE, ContentType.NEW_CHAT_TITLE], + [TEST_MESSAGE_NEW_CHAT_PHOTO, ContentType.NEW_CHAT_PHOTO], + [TEST_MESSAGE_DELETE_CHAT_PHOTO, ContentType.DELETE_CHAT_PHOTO], + [TEST_MESSAGE_GROUP_CHAT_CREATED, ContentType.GROUP_CHAT_CREATED], + [TEST_MESSAGE_PASSPORT_DATA, ContentType.PASSPORT_DATA], + [TEST_MESSAGE_POLL, ContentType.POLL], [ - 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"), - ), - ContentType.TEXT, + TEST_MESSAGE_MESSAGE_AUTO_DELETE_TIMER_CHANGED, + ContentType.MESSAGE_AUTO_DELETE_TIMER_CHANGED, ], + [TEST_MESSAGE_VOICE_CHAT_STARTED, ContentType.VOICE_CHAT_STARTED], + [TEST_MESSAGE_VOICE_CHAT_ENDED, ContentType.VOICE_CHAT_ENDED], [ - Message( - message_id=42, - date=datetime.datetime.now(), - audio=Audio(file_id="file id", file_unique_id="file id", duration=42), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.AUDIO, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - animation=Animation( - file_id="file id", - file_unique_id="file id", - width=42, - height=42, - duration=0, - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.ANIMATION, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - document=Document(file_id="file id", file_unique_id="file id"), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.DOCUMENT, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - game=Game( - title="title", - description="description", - photo=[ - PhotoSize( - file_id="file id", file_unique_id="file id", width=42, height=42 - ) - ], - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.GAME, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - photo=[ - PhotoSize(file_id="file id", file_unique_id="file id", width=42, height=42) - ], - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.PHOTO, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - sticker=Sticker( - file_id="file id", - file_unique_id="file id", - width=42, - height=42, - is_animated=False, - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.STICKER, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - video=Video( - file_id="file id", - file_unique_id="file id", - width=42, - height=42, - duration=0, - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.VIDEO, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - video_note=VideoNote( - file_id="file id", file_unique_id="file id", length=0, duration=0 - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.VIDEO_NOTE, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - voice=Voice(file_id="file id", file_unique_id="file id", duration=0), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.VOICE, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - contact=Contact(phone_number="911", first_name="911"), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.CONTACT, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - venue=Venue( - location=Location(latitude=3.14, longitude=3.14), - title="Cupboard Under the Stairs", - address="Under the stairs, 4 Privet Drive, " - "Little Whinging, Surrey, England, Great Britain", - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.VENUE, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - location=Location(longitude=3.14, latitude=3.14), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.LOCATION, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - new_chat_members=[User(id=42, is_bot=False, first_name="Test")], - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.NEW_CHAT_MEMBERS, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - left_chat_member=User(id=42, is_bot=False, first_name="Test"), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.LEFT_CHAT_MEMBER, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - invoice=Invoice( - title="test", - description="test", - start_parameter="brilliant", - currency="BTC", - total_amount=1, - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.INVOICE, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - successful_payment=SuccessfulPayment( - currency="BTC", - total_amount=42, - invoice_payload="payload", - telegram_payment_charge_id="charge", - provider_payment_charge_id="payment", - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.SUCCESSFUL_PAYMENT, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - connected_website="token", - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.CONNECTED_WEBSITE, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - migrate_from_chat_id=42, - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.MIGRATE_FROM_CHAT_ID, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - migrate_to_chat_id=42, - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.MIGRATE_TO_CHAT_ID, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - pinned_message=Message( - message_id=42, - date=datetime.datetime.now(), - text="pinned", - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.PINNED_MESSAGE, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - new_chat_title="test", - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.NEW_CHAT_TITLE, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - new_chat_photo=[ - PhotoSize(file_id="file id", file_unique_id="file id", width=42, height=42) - ], - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.NEW_CHAT_PHOTO, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - delete_chat_photo=True, - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.DELETE_CHAT_PHOTO, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - group_chat_created=True, - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.GROUP_CHAT_CREATED, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - passport_data=PassportData( - data=[], - credentials=EncryptedCredentials(data="test", hash="test", secret="test"), - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.PASSPORT_DATA, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - poll=Poll( - id="QA", - question="Q", - options=[ - PollOption(text="A", voter_count=0), - PollOption(text="B", voter_count=0), - ], - is_closed=False, - is_anonymous=False, - type="quiz", - allows_multiple_answers=False, - total_voter_count=0, - correct_option_id=1, - ), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.POLL, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - chat=Chat(id=42, type="private"), - dice=Dice(value=6, emoji="X"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.DICE, - ], - [ - Message( - message_id=42, - date=datetime.datetime.now(), - chat=Chat(id=42, type="private"), - from_user=User(id=42, is_bot=False, first_name="Test"), - ), - ContentType.UNKNOWN, + TEST_MESSAGE_VOICE_CHAT_PARTICIPANTS_INVITED, + ContentType.VOICE_CHAT_PARTICIPANTS_INVITED, ], + [TEST_MESSAGE_DICE, ContentType.DICE], + [TEST_MESSAGE_UNKNOWN, ContentType.UNKNOWN], ], ) def test_content_type(self, message: Message, content_type: str): @@ -448,12 +410,7 @@ class TestMessage: ["sticker", dict(sticker="sticker"), SendSticker], [ "venue", - dict( - latitude=0.42, - longitude=0.42, - title="title", - address="address", - ), + dict(latitude=0.42, longitude=0.42, title="title", address="address",), SendVenue, ], ["video", dict(video="video"), SendVideo], @@ -508,3 +465,62 @@ class TestMessage: for key, value in kwargs.items(): assert getattr(api_method, key) == value + + def test_copy_to(self): + message = Message( + message_id=42, chat=Chat(id=42, type="private"), date=datetime.datetime.now() + ) + method = message.copy_to(chat_id=message.chat.id) + assert isinstance(method, CopyMessage) + assert method.chat_id == message.chat.id + + @pytest.mark.parametrize( + "message,expected_method", + [ + [TEST_MESSAGE_TEXT, SendMessage], + [TEST_MESSAGE_AUDIO, SendAudio], + [TEST_MESSAGE_ANIMATION, SendAnimation], + [TEST_MESSAGE_DOCUMENT, SendDocument], + [TEST_MESSAGE_GAME, None], + [TEST_MESSAGE_PHOTO, SendPhoto], + [TEST_MESSAGE_STICKER, SendSticker], + [TEST_MESSAGE_VIDEO, SendVideo], + [TEST_MESSAGE_VIDEO_NOTE, SendVideoNote], + [TEST_MESSAGE_VOICE, SendVoice], + [TEST_MESSAGE_CONTACT, SendContact], + [TEST_MESSAGE_VENUE, SendVenue], + [TEST_MESSAGE_LOCATION, SendLocation], + [TEST_MESSAGE_NEW_CHAT_MEMBERS, None], + [TEST_MESSAGE_LEFT_CHAT_MEMBER, None], + [TEST_MESSAGE_INVOICE, None], + [TEST_MESSAGE_SUCCESSFUL_PAYMENT, None], + [TEST_MESSAGE_CONNECTED_WEBSITE, None], + [TEST_MESSAGE_MIGRATE_FROM_CHAT_ID, None], + [TEST_MESSAGE_MIGRATE_TO_CHAT_ID, None], + [TEST_MESSAGE_PINNED_MESSAGE, None], + [TEST_MESSAGE_NEW_CHAT_TITLE, None], + [TEST_MESSAGE_NEW_CHAT_PHOTO, None], + [TEST_MESSAGE_DELETE_CHAT_PHOTO, None], + [TEST_MESSAGE_GROUP_CHAT_CREATED, None], + [TEST_MESSAGE_PASSPORT_DATA, None], + [TEST_MESSAGE_POLL, SendPoll], + [TEST_MESSAGE_MESSAGE_AUTO_DELETE_TIMER_CHANGED, None], + [TEST_MESSAGE_VOICE_CHAT_STARTED, None], + [TEST_MESSAGE_VOICE_CHAT_ENDED, None], + [TEST_MESSAGE_VOICE_CHAT_PARTICIPANTS_INVITED, None], + [TEST_MESSAGE_DICE, SendDice], + [TEST_MESSAGE_UNKNOWN, None], + ], + ) + def test_send_copy( + self, message: Message, expected_method: Optional[Type[TelegramMethod]], + ): + if expected_method is None: + with pytest.raises(TypeError, match="This type of message can't be copied."): + message.send_copy(chat_id=42) + return + + method = message.send_copy(chat_id=42) + if method: + assert isinstance(method, expected_method) + # TODO: Check additional fields diff --git a/tests/test_dispatcher/test_dispatcher.py b/tests/test_dispatcher/test_dispatcher.py index a353334c..6c5280b7 100644 --- a/tests/test_dispatcher/test_dispatcher.py +++ b/tests/test_dispatcher/test_dispatcher.py @@ -26,6 +26,8 @@ from aiogram.types import ( ShippingQuery, Update, User, + ChatMemberUpdated, + ChatMember, ) from tests.mocked_bot import MockedBot @@ -364,6 +366,44 @@ class TestDispatcher: False, True, ), + pytest.param( + "my_chat_member", + Update( + update_id=42, + my_chat_member=ChatMemberUpdated( + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), + date=datetime.datetime.now(), + old_chat_member=ChatMember( + user=User(id=42, is_bot=False, first_name="Test"), status="restricted" + ), + new_chat_member=ChatMember( + user=User(id=42, is_bot=False, first_name="Test"), status="restricted" + ), + ), + ), + True, + True, + ), + pytest.param( + "chat_member", + Update( + update_id=42, + chat_member=ChatMemberUpdated( + chat=Chat(id=42, type="private"), + from_user=User(id=42, is_bot=False, first_name="Test"), + date=datetime.datetime.now(), + old_chat_member=ChatMember( + user=User(id=42, is_bot=False, first_name="Test"), status="restricted" + ), + new_chat_member=ChatMember( + user=User(id=42, is_bot=False, first_name="Test"), status="restricted" + ), + ), + ), + True, + True, + ), ], ) async def test_listen_update( diff --git a/tests/test_dispatcher/test_event/test_handler.py b/tests/test_dispatcher/test_event/test_handler.py index f67b848e..d7e6a1da 100644 --- a/tests/test_dispatcher/test_event/test_handler.py +++ b/tests/test_dispatcher/test_event/test_handler.py @@ -3,6 +3,7 @@ from typing import Any, Dict, Union import pytest +from aiogram import F from aiogram.dispatcher.event.handler import CallableMixin, FilterObject, HandlerObject from aiogram.dispatcher.filters import Text from aiogram.dispatcher.filters.base import BaseFilter @@ -127,6 +128,14 @@ class TestCallableMixin: assert result == {"foo": 42, "bar": "test", "baz": "fuz"} +class TestFilterObject: + def test_post_init(self): + case = F.test + filter_obj = FilterObject(callback=case) + print(filter_obj.callback) + assert filter_obj.callback == case.resolve + + async def simple_handler(*args, **kwargs): return args, kwargs