diff --git a/.butcher/types/Chat/aliases.yml b/.butcher/types/Chat/aliases.yml index 89b5843c..7a03c4a9 100644 --- a/.butcher/types/Chat/aliases.yml +++ b/.butcher/types/Chat/aliases.yml @@ -71,6 +71,10 @@ set_administrator_custom_title: method: setChatAdministratorCustomTitle fill: *self +set_member_tag: + method: setChatMemberTag + fill: *self + set_permissions: method: setChatPermissions fill: *self diff --git a/tests/test_api/test_methods/test_promote_chat_member.py b/tests/test_api/test_methods/test_promote_chat_member.py index ee3b7f4e..1f19f3da 100644 --- a/tests/test_api/test_methods/test_promote_chat_member.py +++ b/tests/test_api/test_methods/test_promote_chat_member.py @@ -6,6 +6,11 @@ class TestPromoteChatMember: async def test_bot_method(self, bot: MockedBot): prepare_result = bot.add_result_for(PromoteChatMember, ok=True, result=True) - response: bool = await bot.promote_chat_member(chat_id=-42, user_id=42) - bot.get_request() + response: bool = await bot.promote_chat_member( + chat_id=-42, + user_id=42, + can_manage_tags=True, + ) + request = bot.get_request() + assert request.can_manage_tags is True assert response == prepare_result.result diff --git a/tests/test_api/test_methods/test_set_chat_member_tag.py b/tests/test_api/test_methods/test_set_chat_member_tag.py index 4c6e4fd6..edc581cd 100644 --- a/tests/test_api/test_methods/test_set_chat_member_tag.py +++ b/tests/test_api/test_methods/test_set_chat_member_tag.py @@ -7,5 +7,8 @@ class TestSetChatMemberTag: prepare_result = bot.add_result_for(SetChatMemberTag, ok=True, result=True) response: bool = await bot.set_chat_member_tag(chat_id=-42, user_id=42, tag="test") - bot.get_request() + request = bot.get_request() + assert request.chat_id == -42 + assert request.user_id == 42 + assert request.tag == "test" assert response == prepare_result.result diff --git a/tests/test_api/test_types/test_chat_member_tag_permissions.py b/tests/test_api/test_types/test_chat_member_tag_permissions.py new file mode 100644 index 00000000..30aa5481 --- /dev/null +++ b/tests/test_api/test_types/test_chat_member_tag_permissions.py @@ -0,0 +1,84 @@ +from datetime import datetime + +from aiogram.types import ( + ChatAdministratorRights, + ChatMemberAdministrator, + ChatMemberMember, + ChatMemberRestricted, + ChatPermissions, + User, +) + + +class TestChatMemberTagPermissions: + def test_chat_administrator_rights_can_manage_tags(self): + rights = ChatAdministratorRights( + is_anonymous=False, + can_manage_chat=True, + can_delete_messages=True, + can_manage_video_chats=True, + can_restrict_members=True, + can_promote_members=True, + can_change_info=True, + can_invite_users=True, + can_post_stories=True, + can_edit_stories=True, + can_delete_stories=True, + can_manage_tags=True, + ) + assert rights.can_manage_tags is True + + def test_chat_member_administrator_can_manage_tags(self): + admin = ChatMemberAdministrator( + user=User(id=42, is_bot=False, first_name="User"), + can_be_edited=True, + is_anonymous=False, + can_manage_chat=True, + can_delete_messages=True, + can_manage_video_chats=True, + can_restrict_members=True, + can_promote_members=True, + can_change_info=True, + can_invite_users=True, + can_post_stories=True, + can_edit_stories=True, + can_delete_stories=True, + can_manage_tags=True, + ) + assert admin.can_manage_tags is True + + def test_chat_permissions_can_edit_tag(self): + permissions = ChatPermissions(can_edit_tag=True) + assert permissions.can_edit_tag is True + + def test_chat_member_member_tag(self): + member = ChatMemberMember( + user=User(id=42, is_bot=False, first_name="User"), + tag="premium", + ) + assert member.tag == "premium" + + def test_chat_member_restricted_can_edit_tag_and_tag(self): + restricted = ChatMemberRestricted( + user=User(id=42, is_bot=False, first_name="User"), + is_member=True, + can_send_messages=True, + can_send_audios=True, + can_send_documents=True, + can_send_photos=True, + can_send_videos=True, + can_send_video_notes=True, + can_send_voice_notes=True, + can_send_polls=True, + can_send_other_messages=True, + can_add_web_page_previews=True, + can_edit_tag=True, + can_change_info=True, + can_invite_users=True, + can_pin_messages=True, + can_manage_topics=True, + until_date=datetime.now(), + tag="premium", + ) + assert restricted.can_edit_tag is True + assert restricted.tag == "premium" diff --git a/tests/test_utils/test_formatting.py b/tests/test_utils/test_formatting.py index ffaef31e..5928fc62 100644 --- a/tests/test_utils/test_formatting.py +++ b/tests/test_utils/test_formatting.py @@ -9,6 +9,7 @@ from aiogram.utils.formatting import ( CashTag, Code, CustomEmoji, + DateTime, Email, ExpandableBlockQuote, HashTag, @@ -93,7 +94,7 @@ class TestNode: ], [ Pre("test", language="python"), - '
test
', + '
test
', ], [ TextLink("test", url="https://example.com"), @@ -105,7 +106,7 @@ class TestNode: ], [ CustomEmoji("test", custom_emoji_id="42"), - 'test', + 'test', ], [ BlockQuote("test"), @@ -115,6 +116,10 @@ class TestNode: ExpandableBlockQuote("test"), "
test
", ], + [ + DateTime("test", unix_time=42, date_time_format="yMd"), + 'test', + ], ], ) def test_render_plain_only(self, node: Text, result: str): @@ -358,6 +363,22 @@ class TestUtils: assert isinstance(node, Bold) assert node._body == ("test",) + def test_apply_entity_date_time(self): + node = _apply_entity( + MessageEntity( + type=MessageEntityType.DATE_TIME, + offset=0, + length=4, + unix_time=42, + date_time_format="yMd", + ), + "test", + ) + assert isinstance(node, DateTime) + assert node._body == ("test",) + assert node._params["unix_time"] == 42 + assert node._params["date_time_format"] == "yMd" + def test_as_line(self): node = as_line("test", "test", "test") assert isinstance(node, Text) diff --git a/tests/test_utils/test_text_decorations.py b/tests/test_utils/test_text_decorations.py index b4ccb5e8..82039229 100644 --- a/tests/test_utils/test_text_decorations.py +++ b/tests/test_utils/test_text_decorations.py @@ -25,7 +25,7 @@ class TestTextDecoration: [ html_decoration, MessageEntity(type="pre", offset=0, length=5, language="python"), - '
test
', + '
test
', ], [html_decoration, MessageEntity(type="underline", offset=0, length=5), "test"], [ @@ -57,7 +57,7 @@ class TestTextDecoration: [ html_decoration, MessageEntity(type="custom_emoji", offset=0, length=5, custom_emoji_id="42"), - 'test', + 'test', ], [ html_decoration, @@ -74,6 +74,17 @@ class TestTextDecoration: MessageEntity(type="expandable_blockquote", offset=0, length=5), "
test
", ], + [ + html_decoration, + MessageEntity( + type="date_time", + offset=0, + length=5, + unix_time=42, + date_time_format="yMd", + ), + 'test', + ], [markdown_decoration, MessageEntity(type="bold", offset=0, length=5), "*test*"], [markdown_decoration, MessageEntity(type="italic", offset=0, length=5), "_\rtest_\r"], [markdown_decoration, MessageEntity(type="code", offset=0, length=5), "`test`"], @@ -102,7 +113,7 @@ class TestTextDecoration: [ markdown_decoration, MessageEntity(type="custom_emoji", offset=0, length=5, custom_emoji_id="42"), - "![test](tg://emoji?id=42)", + "![test](tg://emoji?emoji_id=42)", ], [ markdown_decoration, @@ -124,6 +135,17 @@ class TestTextDecoration: MessageEntity(type="expandable_blockquote", offset=0, length=5), ">test||", ], + [ + markdown_decoration, + MessageEntity( + type="date_time", + offset=0, + length=5, + unix_time=42, + date_time_format="yMd", + ), + "![test](tg://time?unix=42&format=yMd)", + ], ], ) def test_apply_single_entity(