Add class helper ChatAction (#803)

* Add class helper ChatAction

* Change using helper to using enum.Enum

* Add test for class ChatAction

* Use black formatting

* Add pull request description to CHANGES

* Add test coverage

* Use AutoName class for enum values

* Move `AutoName` to separate file

* Move inheritance from `str`

* Fix failing mypy

* Delete old actions

Co-authored-by: Evgen Fil <evgfilim1@yandex.ru>
This commit is contained in:
ShiroNoHaga 2022-07-09 23:47:11 +03:00 committed by GitHub
parent bc5b26de5f
commit 851f7a2a37
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 0 deletions

3
CHANGES/803.feature Normal file
View file

@ -0,0 +1,3 @@
Add class helper ChatAction for constants that Telegram BotAPI uses in sendChatAction request.
In my opinion, this will help users and will also improve compatibility with 2.x version
where similar class was called "ChatActions".

View file

@ -13,6 +13,7 @@ from .bot_command_scope_default import BotCommandScopeDefault
from .callback_game import CallbackGame
from .callback_query import CallbackQuery
from .chat import Chat
from .chat_action import ChatAction
from .chat_administrator_rights import ChatAdministratorRights
from .chat_invite_link import ChatInviteLink
from .chat_join_request import ChatJoinRequest
@ -275,6 +276,7 @@ __all__ = (
"Game",
"CallbackGame",
"GameHighScore",
"ChatAction",
)
# Load typing forward refs for every TelegramObject

View file

@ -0,0 +1,33 @@
import enum
from ..utils.enum import AutoName
class ChatAction(AutoName):
"""
This object represents bot actions.
Choose one, depending on what the user is about to receive:
typing for text messages,
upload_photo for photos,
record_video or upload_video for videos,
record_voice or upload_voice for voice notes,
upload_document for general files,
choose_sticker for stickers,
find_location for location data,
record_video_note or upload_video_note for video notes.
Source: https://core.telegram.org/bots/api#sendchataction
"""
TYPING = enum.auto()
UPLOAD_PHOTO = enum.auto()
RECORD_VIDEO = enum.auto()
UPLOAD_VIDEO = enum.auto()
RECORD_VOICE = enum.auto()
UPLOAD_VOICE = enum.auto()
UPLOAD_DOCUMENT = enum.auto()
CHOOSE_STICKER = enum.auto()
FIND_LOCATION = enum.auto()
RECORD_VIDEO_NOTE = enum.auto()
UPLOAD_VIDEO_NOTE = enum.auto()

8
aiogram/utils/enum.py Normal file
View file

@ -0,0 +1,8 @@
import enum
from typing import Any, List
class AutoName(str, enum.Enum):
@staticmethod
def _generate_next_value_(name: str, start: int, count: int, last_values: List[Any]) -> str:
return name.lower()

View file

@ -1,6 +1,7 @@
import pytest
from aiogram.methods import Request, SendChatAction
from aiogram.types import ChatAction
from tests.mocked_bot import MockedBot
pytestmark = pytest.mark.asyncio
@ -22,3 +23,12 @@ class TestSendChatAction:
request: Request = bot.get_request()
assert request.method == "sendChatAction"
assert response == prepare_result.result
async def test_chat_action_class(self, bot: MockedBot):
prepare_result = bot.add_result_for(SendChatAction, ok=True, result=True)
response: bool = await bot.send_chat_action(chat_id=42, action=ChatAction.TYPING)
request: Request = bot.get_request()
assert request.method == "sendChatAction"
assert request.data["action"] == "typing"
assert response == prepare_result.result