From cbb019283a9b5776ffcb7f86093421551bfc0bdc Mon Sep 17 00:00:00 2001 From: Gabben Date: Fri, 28 Jun 2019 14:35:49 +0500 Subject: [PATCH 1/4] ChatMember update Deprecated methods removed Added new RESTRICTED status is_chat_member method has been updated: user could be restricted but remain a member. Added tests for chat_member --- aiogram/types/chat_member.py | 39 +++++-------------- tests/types/test_chat_member.py | 68 +++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 tests/types/test_chat_member.py diff --git a/aiogram/types/chat_member.py b/aiogram/types/chat_member.py index 12789462..288b6d76 100644 --- a/aiogram/types/chat_member.py +++ b/aiogram/types/chat_member.py @@ -1,5 +1,6 @@ import datetime import warnings +from typing import Optional from . import base from . import fields @@ -31,19 +32,13 @@ class ChatMember(base.TelegramObject): can_send_other_messages: base.Boolean = fields.Field() can_add_web_page_previews: base.Boolean = fields.Field() - def is_admin(self): - warnings.warn('`is_admin` method deprecated due to updates in Bot API 4.2. ' - 'This method renamed to `is_chat_admin` and will be available until aiogram 2.3', - DeprecationWarning, stacklevel=2) - return self.is_chat_admin() + def is_chat_admin(self) -> bool: + return ChatMemberStatus.is_chat_admin(self.status) - def is_chat_admin(self): - return ChatMemberStatus.is_admin(self.status) + def is_chat_member(self) -> bool: + return ChatMemberStatus.is_chat_member(self.status, self.is_member) - def is_chat_member(self): - return ChatMemberStatus.is_member(self.status) - - def __int__(self): + def __int__(self) -> int: return self.user.id @@ -51,33 +46,19 @@ class ChatMemberStatus(helper.Helper): """ Chat member status """ - mode = helper.HelperMode.lowercase CREATOR = helper.Item() # creator ADMINISTRATOR = helper.Item() # administrator MEMBER = helper.Item() # member + RESTRICTED = helper.Item() # restricted LEFT = helper.Item() # left KICKED = helper.Item() # kicked @classmethod - def is_admin(cls, role): - warnings.warn('`is_admin` method deprecated due to updates in Bot API 4.2. ' - 'This method renamed to `is_chat_admin` and will be available until aiogram 2.3', - DeprecationWarning, stacklevel=2) - return cls.is_chat_admin(role) - - @classmethod - def is_member(cls, role): - warnings.warn('`is_member` method deprecated due to updates in Bot API 4.2. ' - 'This method renamed to `is_chat_member` and will be available until aiogram 2.3', - DeprecationWarning, stacklevel=2) - return cls.is_chat_member(role) - - @classmethod - def is_chat_admin(cls, role): + def is_chat_admin(cls, role: str) -> bool: return role in [cls.ADMINISTRATOR, cls.CREATOR] @classmethod - def is_chat_member(cls, role): - return role in [cls.MEMBER, cls.ADMINISTRATOR, cls.CREATOR] + def is_chat_member(cls, role: str, is_member: Optional[bool] = None) -> bool: + return (role == cls.RESTRICTED and is_member is True) or role in [cls.MEMBER, cls.ADMINISTRATOR, cls.CREATOR] diff --git a/tests/types/test_chat_member.py b/tests/types/test_chat_member.py new file mode 100644 index 00000000..62fad60f --- /dev/null +++ b/tests/types/test_chat_member.py @@ -0,0 +1,68 @@ +from aiogram import types +from .dataset import CHAT_MEMBER + +chat_member = types.ChatMember(**CHAT_MEMBER) + + +def test_export(): + exported = chat_member.to_python() + assert isinstance(exported, dict) + assert exported == CHAT_MEMBER + + +def test_user(): + assert isinstance(chat_member.user, types.User) + + +def test_status(): + assert isinstance(chat_member.status, str) + assert chat_member.status == CHAT_MEMBER['status'] + + +def test_privileges(): + assert isinstance(chat_member.can_be_edited, bool) + assert chat_member.can_be_edited == CHAT_MEMBER['can_be_edited'] + + assert isinstance(chat_member.can_change_info, bool) + assert chat_member.can_change_info == CHAT_MEMBER['can_change_info'] + + assert isinstance(chat_member.can_delete_messages, bool) + assert chat_member.can_delete_messages == CHAT_MEMBER['can_delete_messages'] + + assert isinstance(chat_member.can_invite_users, bool) + assert chat_member.can_invite_users == CHAT_MEMBER['can_invite_users'] + + assert isinstance(chat_member.can_restrict_members, bool) + assert chat_member.can_restrict_members == CHAT_MEMBER['can_restrict_members'] + + assert isinstance(chat_member.can_pin_messages, bool) + assert chat_member.can_pin_messages == CHAT_MEMBER['can_pin_messages'] + + assert isinstance(chat_member.can_promote_members, bool) + assert chat_member.can_promote_members == CHAT_MEMBER['can_promote_members'] + + +def test_int(): + assert int(chat_member) == chat_member.user.id + assert isinstance(int(chat_member), int) + + +def test_chat_member_status(): + assert types.ChatMemberStatus.CREATOR == 'creator' + assert types.ChatMemberStatus.ADMINISTRATOR == 'administrator' + assert types.ChatMemberStatus.MEMBER == 'member' + assert types.ChatMemberStatus.RESTRICTED == 'restricted' + assert types.ChatMemberStatus.LEFT == 'left' + assert types.ChatMemberStatus.KICKED == 'kicked' + + +def test_chat_member_status_filters(): + assert types.ChatMemberStatus.is_chat_admin(chat_member.status) + assert types.ChatMemberStatus.is_chat_member(chat_member.status) + assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.RESTRICTED, True) + assert not types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.RESTRICTED, False) + + +def test_chat_member_filters(): + assert chat_member.is_chat_admin() + assert chat_member.is_chat_member() From a00b854533fc2bac326cacdb790e0b2ed541801f Mon Sep 17 00:00:00 2001 From: Gabben Date: Fri, 28 Jun 2019 14:46:56 +0500 Subject: [PATCH 2/4] Update test_chat_member.py --- tests/types/test_chat_member.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/types/test_chat_member.py b/tests/types/test_chat_member.py index 62fad60f..97e365ec 100644 --- a/tests/types/test_chat_member.py +++ b/tests/types/test_chat_member.py @@ -59,8 +59,19 @@ def test_chat_member_status(): def test_chat_member_status_filters(): assert types.ChatMemberStatus.is_chat_admin(chat_member.status) assert types.ChatMemberStatus.is_chat_member(chat_member.status) + + assert types.ChatMemberStatus.is_chat_admin(types.ChatMemberStatus.CREATOR) + assert types.ChatMemberStatus.is_chat_admin(types.ChatMemberStatus.ADMINISTRATOR) + + assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.CREATOR) + assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.ADMINISTRATOR) + assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.MEMBER) assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.RESTRICTED, True) + + assert not types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.RESTRICTED) assert not types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.RESTRICTED, False) + assert not types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.LEFT) + assert not types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.KICKED) def test_chat_member_filters(): From c081846b0ea520212adfda6d515fe868e8935ac5 Mon Sep 17 00:00:00 2001 From: Gabben Date: Sun, 4 Aug 2019 23:11:07 +0500 Subject: [PATCH 3/4] Update chat_member.py --- aiogram/types/chat_member.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aiogram/types/chat_member.py b/aiogram/types/chat_member.py index 288b6d76..89506400 100644 --- a/aiogram/types/chat_member.py +++ b/aiogram/types/chat_member.py @@ -36,7 +36,7 @@ class ChatMember(base.TelegramObject): return ChatMemberStatus.is_chat_admin(self.status) def is_chat_member(self) -> bool: - return ChatMemberStatus.is_chat_member(self.status, self.is_member) + return ChatMemberStatus.is_chat_member(self.status) def __int__(self) -> int: return self.user.id @@ -60,5 +60,5 @@ class ChatMemberStatus(helper.Helper): return role in [cls.ADMINISTRATOR, cls.CREATOR] @classmethod - def is_chat_member(cls, role: str, is_member: Optional[bool] = None) -> bool: - return (role == cls.RESTRICTED and is_member is True) or role in [cls.MEMBER, cls.ADMINISTRATOR, cls.CREATOR] + def is_chat_member(cls, role: str) -> bool: + return role in [cls.MEMBER, cls.ADMINISTRATOR, cls.CREATOR, cls.RESTRICTED] From 1be6e1f31d4d2f5bb0676c3659aeab7a9d1109ca Mon Sep 17 00:00:00 2001 From: Gabben Date: Sun, 4 Aug 2019 23:18:57 +0500 Subject: [PATCH 4/4] Update test_chat_member.py --- tests/types/test_chat_member.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/types/test_chat_member.py b/tests/types/test_chat_member.py index 97e365ec..2cea44ce 100644 --- a/tests/types/test_chat_member.py +++ b/tests/types/test_chat_member.py @@ -66,10 +66,8 @@ def test_chat_member_status_filters(): assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.CREATOR) assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.ADMINISTRATOR) assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.MEMBER) - assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.RESTRICTED, True) + assert types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.RESTRICTED) - assert not types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.RESTRICTED) - assert not types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.RESTRICTED, False) assert not types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.LEFT) assert not types.ChatMemberStatus.is_chat_member(types.ChatMemberStatus.KICKED)