From 4d968ebc72fbffb66b0324d807ac8eed2268e633 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Fri, 5 Feb 2021 22:45:21 +0100 Subject: [PATCH 01/23] Change default handling, update signatures, get existing tests to pass. --- docs/source/conf.py | 3 + telegram/bot.py | 496 ++++++++++-------- telegram/callbackquery.py | 43 +- telegram/chat.py | 172 +++--- telegram/ext/defaults.py | 45 +- telegram/files/animation.py | 7 +- telegram/files/audio.py | 7 +- telegram/files/chatphoto.py | 11 +- telegram/files/document.py | 7 +- telegram/files/inputmedia.py | 14 +- telegram/files/photosize.py | 7 +- telegram/files/sticker.py | 7 +- telegram/files/video.py | 7 +- telegram/files/videonote.py | 7 +- telegram/files/voice.py | 7 +- telegram/inline/inlinequery.py | 5 +- telegram/inline/inlinequeryresult.py | 8 - telegram/inline/inlinequeryresultaudio.py | 5 +- .../inline/inlinequeryresultcachedaudio.py | 5 +- .../inline/inlinequeryresultcacheddocument.py | 5 +- telegram/inline/inlinequeryresultcachedgif.py | 5 +- .../inline/inlinequeryresultcachedmpeg4gif.py | 5 +- .../inline/inlinequeryresultcachedphoto.py | 5 +- .../inline/inlinequeryresultcachedvideo.py | 5 +- .../inline/inlinequeryresultcachedvoice.py | 5 +- telegram/inline/inlinequeryresultdocument.py | 5 +- telegram/inline/inlinequeryresultgif.py | 5 +- telegram/inline/inlinequeryresultmpeg4gif.py | 5 +- telegram/inline/inlinequeryresultphoto.py | 5 +- telegram/inline/inlinequeryresultvideo.py | 5 +- telegram/inline/inlinequeryresultvoice.py | 5 +- telegram/inline/inputmessagecontent.py | 8 - telegram/inline/inputtextmessagecontent.py | 8 +- telegram/message.py | 203 +++---- telegram/passport/passportfile.py | 7 +- telegram/payment/precheckoutquery.py | 5 +- telegram/payment/shippingquery.py | 5 +- telegram/user.py | 157 +++--- telegram/utils/helpers.py | 50 +- telegram/utils/types.py | 9 + tests/conftest.py | 32 +- tests/test_bot.py | 29 +- 42 files changed, 815 insertions(+), 621 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index c770db522be..b5b13afa6f3 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -33,6 +33,9 @@ 'sphinx.ext.autodoc', 'sphinx.ext.napoleon' ] +# Don't show type hints in the signature - that just makes it hardly readable +# and we document the types anyway +autodoc_typehints = 'description' # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/telegram/bot.py b/telegram/bot.py index c59eddf0cb4..58098c99e34 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -21,7 +21,6 @@ """This module contains an object that represents a Telegram Bot.""" import functools -import inspect import logging from datetime import datetime @@ -34,6 +33,9 @@ TypeVar, Union, no_type_check, + Dict, + Any, + cast, ) try: @@ -86,9 +88,11 @@ to_timestamp, is_local_file, parse_file_input, + DEFAULT_FALSE, + DEFAULT_20, ) from telegram.utils.request import Request -from telegram.utils.types import FileInput, JSONDict +from telegram.utils.types import FileInput, JSONDict, ODVInput, DVInput if TYPE_CHECKING: from telegram.ext import Defaults @@ -148,41 +152,6 @@ class Bot(TelegramObject): """ - def __new__(cls, *args: object, **kwargs: object) -> 'Bot': # pylint: disable=W0613 - # Get default values from kwargs - defaults = kwargs.get('defaults') - - # Make an instance of the class - instance = super().__new__(cls) - - if not defaults: - return instance - - # For each method ... - for method_name, method in inspect.getmembers(instance, predicate=inspect.ismethod): - # ... get kwargs - signature = inspect.signature(method, follow_wrapped=True) - kwarg_names = ( - p.name - for p in signature.parameters.values() - if p.default != inspect.Signature.empty - ) - # ... check if Defaults has a attribute that matches the kwarg name - needs_default = ( - kwarg_name for kwarg_name in kwarg_names if hasattr(defaults, kwarg_name) - ) - # ... make a dict of kwarg name and the default value - default_kwargs = { - kwarg_name: getattr(defaults, kwarg_name) - for kwarg_name in needs_default - if (getattr(defaults, kwarg_name) is not DEFAULT_NONE) - } - # ... apply the defaults using a partial - if default_kwargs: - setattr(instance, method_name, functools.partial(method, **default_kwargs)) - - return instance - def __init__( self, token: str, @@ -216,11 +185,41 @@ def __init__( private_key, password=private_key_password, backend=default_backend() ) + def _insert_defaults(self, data: Dict[str, Any], timeout: ODVInput[float]) -> Optional[float]: + """ + Inserts the defaults values for optional kwargs for which tg.ext.Defaults provides + convenience functionality, i.e. the kwargs with a tg.utils.helpers.DefaultValue default + + data is edited in-place. As timeout as not passed via the kwargs, it needs to be passed + separately and gets returned. + + This can only work, if all kwargs that may have defaults are passed in data! + """ + effective_timeout = DefaultValue.get_value(timeout) + + if not self.defaults: + data.update( + (key, value.value) + for key, value in data.items() + if isinstance(value, DefaultValue) + ) + return effective_timeout + + for key in data: + if isinstance(data[key], DefaultValue): + data[key] = self.defaults.api_defaults.get(key, data[key].value) + + return ( + self.defaults.timeout + if not isinstance(self.defaults.timeout, DefaultValue) + else effective_timeout + ) + def _post( self, endpoint: str, data: JSONDict = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[bool, JSONDict, None]: if data is None: @@ -232,27 +231,36 @@ def _post( else: data = api_kwargs - return self.request.post(f'{self.base_url}/{endpoint}', data=data, timeout=timeout) + # Insert is in-place, so no return value for data + if endpoint != 'getUpdates': + effective_timeout = self._insert_defaults(data, timeout) + else: + effective_timeout = cast(float, timeout) + # Drop any None values because Telegram doesn't handle them well + data = {key: value for key, value in data.items() if value is not None} + + return self.request.post( + f'{self.base_url}/{endpoint}', data=data, timeout=effective_timeout + ) def _message( self, endpoint: str, data: JSONDict, reply_to_message_id: Union[str, int] = None, - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_markup: ReplyMarkup = None, - allow_sending_without_reply: bool = None, - timeout: float = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[bool, Message]: if reply_to_message_id is not None: data['reply_to_message_id'] = reply_to_message_id - if disable_notification is not None: - data['disable_notification'] = disable_notification - - if allow_sending_without_reply is not None: - data['allow_sending_without_reply'] = allow_sending_without_reply + # We don't check if (DEFAULT_)None here, so that _put is able to insert the defaults + # correctly, if necessary + data['disable_notification'] = disable_notification + data['allow_sending_without_reply'] = allow_sending_without_reply if reply_markup is not None: if isinstance(reply_markup, ReplyMarkup): @@ -362,7 +370,7 @@ def name(self) -> str: return f'@{self.username}' @log - def get_me(self, timeout: int = None, api_kwargs: JSONDict = None) -> User: + def get_me(self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None) -> User: """A simple method for testing your bot's auth token. Requires no parameters. Args: @@ -391,14 +399,14 @@ def send_message( self, chat_id: Union[int, str], text: str, - parse_mode: str = None, - disable_web_page_preview: bool = None, - disable_notification: bool = False, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> Message: """Use this method to send text messages. @@ -437,14 +445,15 @@ def send_message( :class:`telegram.error.TelegramError` """ - data: JSONDict = {'chat_id': chat_id, 'text': text} + data: JSONDict = { + 'chat_id': chat_id, + 'text': text, + 'parse_mode': parse_mode, + 'disable_web_page_preview': disable_web_page_preview, + } - if parse_mode: - data['parse_mode'] = parse_mode if entities: data['entities'] = [me.to_dict() for me in entities] - if disable_web_page_preview: - data['disable_web_page_preview'] = disable_web_page_preview return self._message( # type: ignore[return-value] 'sendMessage', @@ -462,7 +471,7 @@ def delete_message( self, chat_id: Union[str, int], message_id: Union[str, int], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -508,8 +517,8 @@ def forward_message( chat_id: Union[int, str], from_chat_id: Union[str, int], message_id: Union[str, int], - disable_notification: bool = False, - timeout: float = None, + disable_notification: DVInput[bool] = DEFAULT_FALSE, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Message: """Use this method to forward messages of any kind. @@ -558,13 +567,13 @@ def send_photo( chat_id: int, photo: Union[FileInput, 'PhotoSize'], caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> Message: @@ -622,12 +631,12 @@ def send_photo( data: JSONDict = { 'chat_id': chat_id, 'photo': parse_file_input(photo, PhotoSize, filename=filename), + 'parse_mode': parse_mode, } if caption: data['caption'] = caption - if parse_mode: - data['parse_mode'] = parse_mode + if caption_entities: data['caption_entities'] = [me.to_dict() for me in caption_entities] @@ -651,14 +660,14 @@ def send_audio( performer: str = None, title: str = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> Message: @@ -735,6 +744,7 @@ def send_audio( data: JSONDict = { 'chat_id': chat_id, 'audio': parse_file_input(audio, Audio, filename=filename), + 'parse_mode': parse_mode, } if duration: @@ -745,8 +755,7 @@ def send_audio( data['title'] = title if caption: data['caption'] = caption - if parse_mode: - data['parse_mode'] = parse_mode + if caption_entities: data['caption_entities'] = [me.to_dict() for me in caption_entities] if thumb: @@ -770,15 +779,15 @@ def send_document( document: Union[FileInput, 'Document'], filename: str = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb: FileInput = None, api_kwargs: JSONDict = None, disable_content_type_detection: bool = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> Message: """ @@ -848,12 +857,12 @@ def send_document( data: JSONDict = { 'chat_id': chat_id, 'document': parse_file_input(document, Document, filename=filename), + 'parse_mode': parse_mode, } if caption: data['caption'] = caption - if parse_mode: - data['parse_mode'] = parse_mode + if caption_entities: data['caption_entities'] = [me.to_dict() for me in caption_entities] if disable_content_type_detection is not None: @@ -877,12 +886,12 @@ def send_sticker( self, chat_id: Union[int, str], sticker: Union[FileInput, 'Sticker'], - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> Message: """ Use this method to send static .WEBP or animated .TGS stickers. @@ -943,17 +952,17 @@ def send_video( video: Union[FileInput, 'Video'], duration: int = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, width: int = None, height: int = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, supports_streaming: bool = None, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> Message: @@ -1033,14 +1042,13 @@ def send_video( data: JSONDict = { 'chat_id': chat_id, 'video': parse_file_input(video, Video, filename=filename), + 'parse_mode': parse_mode, } if duration: data['duration'] = duration if caption: data['caption'] = caption - if parse_mode: - data['parse_mode'] = parse_mode if caption_entities: data['caption_entities'] = [me.to_dict() for me in caption_entities] if supports_streaming: @@ -1070,13 +1078,13 @@ def send_video_note( video_note: Union[FileInput, 'VideoNote'], duration: int = None, length: int = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, filename: str = None, ) -> Message: """ @@ -1172,13 +1180,13 @@ def send_animation( height: int = None, thumb: FileInput = None, caption: str = None, - parse_mode: str = None, - disable_notification: bool = False, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> Message: @@ -1252,6 +1260,7 @@ def send_animation( data: JSONDict = { 'chat_id': chat_id, 'animation': parse_file_input(animation, Animation, filename=filename), + 'parse_mode': parse_mode, } if duration: @@ -1264,8 +1273,6 @@ def send_animation( data['thumb'] = parse_file_input(thumb, attach=True) if caption: data['caption'] = caption - if parse_mode: - data['parse_mode'] = parse_mode if caption_entities: data['caption_entities'] = [me.to_dict() for me in caption_entities] @@ -1287,13 +1294,13 @@ def send_voice( voice: Union[FileInput, 'Voice'], duration: int = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> Message: @@ -1356,14 +1363,14 @@ def send_voice( data: JSONDict = { 'chat_id': chat_id, 'voice': parse_file_input(voice, Voice, filename=filename), + 'parse_mode': parse_mode, } if duration: data['duration'] = duration if caption: data['caption'] = caption - if parse_mode: - data['parse_mode'] = parse_mode + if caption_entities: data['caption_entities'] = [me.to_dict() for me in caption_entities] @@ -1385,11 +1392,11 @@ def send_media_group( media: List[ Union['InputMediaAudio', 'InputMediaDocument', 'InputMediaPhoto', 'InputMediaVideo'] ], - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> List[Message]: """Use this method to send a group of photos or videos as an album. @@ -1415,7 +1422,12 @@ def send_media_group( Raises: :class:`telegram.error.TelegramError` """ - data: JSONDict = {'chat_id': chat_id, 'media': media} + data: JSONDict = { + 'chat_id': chat_id, + 'media': media, + 'disable_notification': disable_notification, + 'allow_sending_without_reply': allow_sending_without_reply, + } for m in data['media']: if m.parse_mode == DEFAULT_NONE: @@ -1426,17 +1438,9 @@ def send_media_group( if reply_to_message_id: data['reply_to_message_id'] = reply_to_message_id - if disable_notification: - data['disable_notification'] = disable_notification - if allow_sending_without_reply is not None: - data['allow_sending_without_reply'] = allow_sending_without_reply result = self._post('sendMediaGroup', data, timeout=timeout, api_kwargs=api_kwargs) - if self.defaults: - for res in result: # type: ignore - res['default_quote'] = self.defaults.quote # type: ignore - return [Message.de_json(res, self) for res in result] # type: ignore @log @@ -1445,17 +1449,17 @@ def send_location( chat_id: Union[int, str], latitude: float = None, longitude: float = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, location: Location = None, live_period: int = None, api_kwargs: JSONDict = None, horizontal_accuracy: float = None, heading: int = None, proximity_alert_radius: int = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> Message: """Use this method to send point on the map. @@ -1545,7 +1549,7 @@ def edit_message_live_location( longitude: float = None, location: Location = None, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, horizontal_accuracy: float = None, heading: int = None, @@ -1631,7 +1635,7 @@ def stop_message_live_location( message_id: Union[str, int] = None, inline_message_id: Union[str, int] = None, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[Message, bool]: """Use this method to stop updating a live location message sent by the bot or via the bot @@ -1683,16 +1687,16 @@ def send_venue( title: str = None, address: str = None, foursquare_id: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, venue: Venue = None, foursquare_type: str = None, api_kwargs: JSONDict = None, google_place_id: str = None, google_place_type: str = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> Message: """Use this method to send information about a venue. @@ -1793,14 +1797,14 @@ def send_contact( phone_number: str = None, first_name: str = None, last_name: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, contact: Contact = None, vcard: str = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> Message: """Use this method to send phone contacts. @@ -1877,12 +1881,12 @@ def send_game( self, chat_id: Union[int, str], game_short_name: str, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> Message: """Use this method to send a game. @@ -1931,7 +1935,7 @@ def send_chat_action( self, chat_id: Union[str, int], action: str, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -1977,7 +1981,7 @@ def answer_inline_query( next_offset: str = None, switch_pm_text: str = None, switch_pm_parameter: str = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, current_offset: str = None, api_kwargs: JSONDict = None, ) -> bool: @@ -2042,14 +2046,14 @@ def answer_inline_query( @no_type_check def _set_defaults(res): # pylint: disable=W0212 - if res._has_parse_mode and res.parse_mode == DEFAULT_NONE: + if hasattr(res, 'parse_mode') and res.parse_mode == DEFAULT_NONE: if self.defaults: res.parse_mode = self.defaults.parse_mode else: res.parse_mode = None - if res._has_input_message_content and res.input_message_content: + if hasattr(res, 'input_message_content') and res.input_message_content: if ( - res.input_message_content._has_parse_mode + hasattr(res.input_message_content, 'parse_mode') and res.input_message_content.parse_mode == DEFAULT_NONE ): if self.defaults: @@ -2057,7 +2061,7 @@ def _set_defaults(res): else: res.input_message_content.parse_mode = None if ( - res.input_message_content._has_disable_web_page_preview + hasattr(res.input_message_content, 'disable_web_page_preview') and res.input_message_content.disable_web_page_preview == DEFAULT_NONE ): if self.defaults: @@ -2130,7 +2134,7 @@ def get_user_profile_photos( user_id: Union[str, int], offset: int = None, limit: int = 100, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Optional[UserProfilePhotos]: """Use this method to get a list of profile pictures for a user. @@ -2171,7 +2175,7 @@ def get_file( file_id: Union[ str, Animation, Audio, ChatPhoto, Document, PhotoSize, Sticker, Video, VideoNote, Voice ], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> File: """ @@ -2230,7 +2234,7 @@ def kick_chat_member( self, chat_id: Union[str, int], user_id: Union[str, int], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, until_date: Union[int, datetime] = None, api_kwargs: JSONDict = None, ) -> bool: @@ -2280,7 +2284,7 @@ def unban_chat_member( self, chat_id: Union[str, int], user_id: Union[str, int], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, only_if_banned: bool = None, ) -> bool: @@ -2327,7 +2331,7 @@ def answer_callback_query( show_alert: bool = False, url: str = None, cache_time: int = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -2389,10 +2393,10 @@ def edit_message_text( chat_id: Union[str, int] = None, message_id: Union[str, int] = None, inline_message_id: Union[str, int] = None, - parse_mode: str = None, - disable_web_page_preview: bool = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> Union[Message, bool]: @@ -2431,7 +2435,11 @@ def edit_message_text( :class:`telegram.error.TelegramError` """ - data: JSONDict = {'text': text} + data: JSONDict = { + 'text': text, + 'parse_mode': parse_mode, + 'disable_web_page_preview': disable_web_page_preview, + } if chat_id: data['chat_id'] = chat_id @@ -2439,12 +2447,8 @@ def edit_message_text( data['message_id'] = message_id if inline_message_id: data['inline_message_id'] = inline_message_id - if parse_mode: - data['parse_mode'] = parse_mode if entities: data['entities'] = [me.to_dict() for me in entities] - if disable_web_page_preview: - data['disable_web_page_preview'] = disable_web_page_preview return self._message( 'editMessageText', @@ -2462,8 +2466,8 @@ def edit_message_caption( inline_message_id: Union[str, int] = None, caption: str = None, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, - parse_mode: str = None, + timeout: ODVInput[float] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> Union[Message, bool]: @@ -2508,12 +2512,10 @@ def edit_message_caption( 'inline_message_id is not specified' ) - data: JSONDict = {} + data: JSONDict = {'parse_mode': parse_mode} if caption: data['caption'] = caption - if parse_mode: - data['parse_mode'] = parse_mode if caption_entities: data['caption_entities'] = [me.to_dict() for me in caption_entities] if chat_id: @@ -2539,7 +2541,7 @@ def edit_message_media( inline_message_id: Union[str, int] = None, media: 'InputMedia' = None, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[Message, bool]: """ @@ -2605,7 +2607,7 @@ def edit_message_reply_markup( message_id: Union[str, int] = None, inline_message_id: Union[str, int] = None, reply_markup: Optional['InlineKeyboardMarkup'] = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[Message, bool]: """ @@ -2684,6 +2686,9 @@ def get_updates( timeout (:obj:`int`, optional): Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling. Should be positive, short polling should be used for testing purposes only. + read_latency (Optional[float|int]): Grace time in seconds for receiving the reply from + server. Will be added to the ``timeout`` value and used as the read timeout from + server. Defaults to ``2``. allowed_updates (List[:obj:`str`]), optional): A JSON-serialized list the types of updates you want your bot to receive. For example, specify ["message", "edited_channel_post", "callback_query"] to only receive updates of these types. @@ -2733,10 +2738,6 @@ def get_updates( else: self.logger.debug('No new updates found.') - if self.defaults: - for u in result: # type: ignore - u['default_quote'] = self.defaults.quote # type: ignore - return [Update.de_json(u, self) for u in result] # type: ignore @log @@ -2744,7 +2745,7 @@ def set_webhook( self, url: str = None, certificate: FileInput = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, max_connections: int = 40, allowed_updates: List[str] = None, api_kwargs: JSONDict = None, @@ -2833,7 +2834,10 @@ def set_webhook( @log def delete_webhook( - self, timeout: float = None, api_kwargs: JSONDict = None, drop_pending_updates: bool = None + self, + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, + drop_pending_updates: bool = None, ) -> bool: """ Use this method to remove webhook integration if you decide to switch back to @@ -2866,7 +2870,10 @@ def delete_webhook( @log def leave_chat( - self, chat_id: Union[str, int], timeout: float = None, api_kwargs: JSONDict = None + self, + chat_id: Union[str, int], + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> bool: """Use this method for your bot to leave a group, supergroup or channel. @@ -2894,7 +2901,10 @@ def leave_chat( @log def get_chat( - self, chat_id: Union[str, int], timeout: float = None, api_kwargs: JSONDict = None + self, + chat_id: Union[str, int], + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> Chat: """ Use this method to get up to date information about the chat (current name of the user for @@ -2920,14 +2930,14 @@ def get_chat( result = self._post('getChat', data, timeout=timeout, api_kwargs=api_kwargs) - if self.defaults: - result['default_quote'] = self.defaults.quote # type: ignore - return Chat.de_json(result, self) # type: ignore @log def get_chat_administrators( - self, chat_id: Union[str, int], timeout: float = None, api_kwargs: JSONDict = None + self, + chat_id: Union[str, int], + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> List[ChatMember]: """ Use this method to get a list of administrators in a chat. @@ -2959,7 +2969,10 @@ def get_chat_administrators( @log def get_chat_members_count( - self, chat_id: Union[str, int], timeout: float = None, api_kwargs: JSONDict = None + self, + chat_id: Union[str, int], + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> int: """Use this method to get the number of members in a chat. @@ -2990,7 +3003,7 @@ def get_chat_member( self, chat_id: Union[str, int], user_id: Union[str, int], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> ChatMember: """Use this method to get information about a member of a chat. @@ -3023,7 +3036,7 @@ def set_chat_sticker_set( self, chat_id: Union[str, int], sticker_set_name: str, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Use this method to set a new group sticker set for a supergroup. @@ -3053,7 +3066,10 @@ def set_chat_sticker_set( @log def delete_chat_sticker_set( - self, chat_id: Union[str, int], timeout: float = None, api_kwargs: JSONDict = None + self, + chat_id: Union[str, int], + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> bool: """Use this method to delete a group sticker set from a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate admin rights. @@ -3078,7 +3094,9 @@ def delete_chat_sticker_set( return result # type: ignore[return-value] - def get_webhook_info(self, timeout: float = None, api_kwargs: JSONDict = None) -> WebhookInfo: + def get_webhook_info( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> WebhookInfo: """Use this method to get current webhook status. Requires no parameters. If the bot is using getUpdates, will return an object with the url field empty. @@ -3108,7 +3126,7 @@ def set_game_score( inline_message_id: Union[str, int] = None, force: bool = None, disable_edit_message: bool = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[Message, bool]: """ @@ -3169,7 +3187,7 @@ def get_game_high_scores( chat_id: Union[str, int] = None, message_id: Union[str, int] = None, inline_message_id: Union[str, int] = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> List[GameHighScore]: """ @@ -3230,15 +3248,15 @@ def send_invoice( need_email: bool = None, need_shipping_address: bool = None, is_flexible: bool = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: InlineKeyboardMarkup = None, provider_data: Union[str, object] = None, send_phone_number_to_provider: bool = None, send_email_to_provider: bool = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> Message: """Use this method to send invoices. @@ -3358,7 +3376,7 @@ def answer_shipping_query( ok: bool, shipping_options: List[ShippingOption] = None, error_message: str = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -3422,7 +3440,7 @@ def answer_pre_checkout_query( pre_checkout_query_id: str, ok: bool, error_message: str = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -3482,7 +3500,7 @@ def restrict_chat_member( user_id: Union[str, int], permissions: ChatPermissions, until_date: Union[int, datetime] = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -3549,7 +3567,7 @@ def promote_chat_member( can_restrict_members: bool = None, can_pin_messages: bool = None, can_promote_members: bool = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, is_anonymous: bool = None, ) -> bool: @@ -3625,7 +3643,7 @@ def set_chat_permissions( self, chat_id: Union[str, int], permissions: ChatPermissions, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -3662,7 +3680,7 @@ def set_chat_administrator_custom_title( chat_id: Union[int, str], user_id: Union[int, str], custom_title: str, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -3698,7 +3716,10 @@ def set_chat_administrator_custom_title( @log def export_chat_invite_link( - self, chat_id: Union[str, int], timeout: float = None, api_kwargs: JSONDict = None + self, + chat_id: Union[str, int], + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> str: """ Use this method to generate a new invite link for a chat; any previously generated link @@ -3732,7 +3753,7 @@ def set_chat_photo( self, chat_id: Union[str, int], photo: FileInput, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, ) -> bool: """Use this method to set a new profile photo for the chat. @@ -3768,7 +3789,10 @@ def set_chat_photo( @log def delete_chat_photo( - self, chat_id: Union[str, int], timeout: float = None, api_kwargs: JSONDict = None + self, + chat_id: Union[str, int], + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> bool: """ Use this method to delete a chat photo. Photos can't be changed for private chats. The bot @@ -3802,7 +3826,7 @@ def set_chat_title( self, chat_id: Union[str, int], title: str, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -3838,7 +3862,7 @@ def set_chat_description( self, chat_id: Union[str, int], description: str, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -3874,8 +3898,8 @@ def pin_chat_message( self, chat_id: Union[str, int], message_id: Union[str, int], - disable_notification: bool = None, - timeout: float = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -3904,10 +3928,11 @@ def pin_chat_message( :class:`telegram.error.TelegramError` """ - data: JSONDict = {'chat_id': chat_id, 'message_id': message_id} - - if disable_notification is not None: - data['disable_notification'] = disable_notification + data: JSONDict = { + 'chat_id': chat_id, + 'message_id': message_id, + 'disable_notification': disable_notification, + } return self._post( # type: ignore[return-value] 'pinChatMessage', data, timeout=timeout, api_kwargs=api_kwargs @@ -3917,7 +3942,7 @@ def pin_chat_message( def unpin_chat_message( self, chat_id: Union[str, int], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, message_id: Union[str, int] = None, ) -> bool: @@ -3958,7 +3983,7 @@ def unpin_chat_message( def unpin_all_chat_messages( self, chat_id: Union[str, int], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -3992,7 +4017,10 @@ def unpin_all_chat_messages( @log def get_sticker_set( - self, name: str, timeout: float = None, api_kwargs: JSONDict = None + self, + name: str, + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> StickerSet: """Use this method to get a sticker set. @@ -4022,7 +4050,7 @@ def upload_sticker_file( self, user_id: Union[str, int], png_sticker: FileInput, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, ) -> File: """ @@ -4072,7 +4100,7 @@ def create_new_sticker_set( png_sticker: FileInput = None, contains_masks: bool = None, mask_position: MaskPosition = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, tgs_sticker: FileInput = None, api_kwargs: JSONDict = None, ) -> bool: @@ -4159,7 +4187,7 @@ def add_sticker_to_set( emojis: str, png_sticker: FileInput = None, mask_position: MaskPosition = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, tgs_sticker: FileInput = None, api_kwargs: JSONDict = None, ) -> bool: @@ -4180,6 +4208,7 @@ def add_sticker_to_set( Args: user_id (:obj:`int`): User identifier of created sticker set owner. + name (:obj:`str`): Sticker set name. png_sticker (:obj:`str` | `filelike object` | :obj:`bytes` | :class:`pathlib.Path`, \ optional): PNG image with the sticker, @@ -4232,7 +4261,11 @@ def add_sticker_to_set( @log def set_sticker_position_in_set( - self, sticker: str, position: int, timeout: float = None, api_kwargs: JSONDict = None + self, + sticker: str, + position: int, + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> bool: """Use this method to move a sticker in a set created by the bot to a specific position. @@ -4262,7 +4295,10 @@ def set_sticker_position_in_set( @log def delete_sticker_from_set( - self, sticker: str, timeout: float = None, api_kwargs: JSONDict = None + self, + sticker: str, + timeout: ODVInput[float] = DEFAULT_NONE, + api_kwargs: JSONDict = None, ) -> bool: """Use this method to delete a sticker from a set created by the bot. @@ -4293,7 +4329,7 @@ def set_sticker_set_thumb( name: str, user_id: Union[str, int], thumb: FileInput = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Use this method to set the thumbnail of a sticker set. Animated thumbnails can be set @@ -4344,7 +4380,7 @@ def set_passport_data_errors( self, user_id: Union[str, int], errors: List[PassportElementError], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -4391,16 +4427,16 @@ def send_poll( allows_multiple_answers: bool = False, correct_option_id: int = None, is_closed: bool = None, - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, explanation: str = None, - explanation_parse_mode: Union[str, DefaultValue, None] = DEFAULT_NONE, + explanation_parse_mode: ODVInput[str] = DEFAULT_NONE, open_period: int = None, close_date: Union[int, datetime] = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, explanation_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> Message: """ @@ -4460,13 +4496,12 @@ def send_poll( :class:`telegram.error.TelegramError` """ - data: JSONDict = {'chat_id': chat_id, 'question': question, 'options': options} - - if explanation_parse_mode == DEFAULT_NONE: - if self.defaults: - explanation_parse_mode = self.defaults.parse_mode - else: - explanation_parse_mode = None + data: JSONDict = { + 'chat_id': chat_id, + 'question': question, + 'options': options, + 'explanation_parse_mode': explanation_parse_mode, + } if not is_anonymous: data['is_anonymous'] = is_anonymous @@ -4480,8 +4515,6 @@ def send_poll( data['is_closed'] = is_closed if explanation: data['explanation'] = explanation - if explanation_parse_mode: - data['explanation_parse_mode'] = explanation_parse_mode if explanation_entities: data['explanation_entities'] = [me.to_dict() for me in explanation_entities] if open_period: @@ -4510,7 +4543,7 @@ def stop_poll( chat_id: Union[int, str], message_id: Union[int, str], reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Poll: """ @@ -4554,13 +4587,13 @@ def stop_poll( def send_dice( self, chat_id: Union[int, str], - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, emoji: str = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> Message: """ Use this method to send an animated emoji, which will have a random value. On success, the @@ -4614,7 +4647,7 @@ def send_dice( @log def get_my_commands( - self, timeout: float = None, api_kwargs: JSONDict = None + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None ) -> List[BotCommand]: """ Use this method to get the current list of the bot's commands. @@ -4643,7 +4676,7 @@ def get_my_commands( def set_my_commands( self, commands: List[Union[BotCommand, Tuple[str, str]]], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """ @@ -4720,13 +4753,13 @@ def copy_message( from_chat_id: Union[str, int], message_id: Union[str, int], caption: str = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: bool = False, + allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> MessageId: """ @@ -4772,19 +4805,16 @@ def copy_message( 'chat_id': chat_id, 'from_chat_id': from_chat_id, 'message_id': message_id, + 'parse_mode': parse_mode, + 'disable_notification': disable_notification, + 'allow_sending_without_reply': allow_sending_without_reply, } if caption: data['caption'] = caption - if parse_mode: - data['parse_mode'] = parse_mode if caption_entities: data['caption_entities'] = caption_entities - if disable_notification: - data['disable_notification'] = disable_notification if reply_to_message_id: data['reply_to_message_id'] = reply_to_message_id - if allow_sending_without_reply: - data['allow_sending_without_reply'] = allow_sending_without_reply if reply_markup: if isinstance(reply_markup, ReplyMarkup): # We need to_json() instead of to_dict() here, because reply_markups may be diff --git a/telegram/callbackquery.py b/telegram/callbackquery.py index 94676f59ee3..d452f6bd08a 100644 --- a/telegram/callbackquery.py +++ b/telegram/callbackquery.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, List, Optional, Union, Tuple, ClassVar from telegram import Message, TelegramObject, User, Location, ReplyMarkup, constants -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE, DEFAULT_FALSE +from telegram.utils.types import JSONDict, ODVInput, DVInput if TYPE_CHECKING: from telegram import ( @@ -128,7 +129,7 @@ def answer( show_alert: bool = False, url: str = None, cache_time: int = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -155,10 +156,10 @@ def answer( def edit_message_text( self, text: str, - parse_mode: str = None, - disable_web_page_preview: bool = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, reply_markup: 'InlineKeyboardMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> Union[Message, bool]: @@ -206,8 +207,8 @@ def edit_message_caption( self, caption: str = None, reply_markup: 'InlineKeyboardMarkup' = None, - timeout: float = None, - parse_mode: str = None, + timeout: ODVInput[float] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> Union[Message, bool]: @@ -253,7 +254,7 @@ def edit_message_caption( def edit_message_reply_markup( self, reply_markup: Optional['InlineKeyboardMarkup'] = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[Message, bool]: """Shortcut for either:: @@ -300,7 +301,7 @@ def edit_message_media( self, media: 'InputMedia' = None, reply_markup: 'InlineKeyboardMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[Message, bool]: """Shortcut for either:: @@ -343,7 +344,7 @@ def edit_message_live_location( longitude: float = None, location: Location = None, reply_markup: 'InlineKeyboardMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, horizontal_accuracy: float = None, heading: int = None, @@ -398,7 +399,7 @@ def edit_message_live_location( def stop_message_live_location( self, reply_markup: 'InlineKeyboardMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[Message, bool]: """Shortcut for either:: @@ -441,7 +442,7 @@ def set_game_score( score: int, force: bool = None, disable_edit_message: bool = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union[Message, bool]: """Shortcut for either:: @@ -485,7 +486,7 @@ def set_game_score( def get_game_high_scores( self, user_id: Union[int, str], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> List['GameHighScore']: """Shortcut for either:: @@ -521,7 +522,7 @@ def get_game_high_scores( def delete_message( self, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -542,8 +543,8 @@ def delete_message( def pin_message( self, - disable_notification: bool = None, - timeout: float = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -568,7 +569,7 @@ def pin_message( def unpin_message( self, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -594,13 +595,13 @@ def copy_message( self, chat_id: Union[int, str], caption: str = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: bool = False, + allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> 'MessageId': """Shortcut for:: diff --git a/telegram/chat.py b/telegram/chat.py index dc55ffbe04d..92db7e3fa69 100644 --- a/telegram/chat.py +++ b/telegram/chat.py @@ -22,11 +22,11 @@ from typing import TYPE_CHECKING, List, Optional, ClassVar, Union, Tuple, Any from telegram import ChatPhoto, TelegramObject, constants -from telegram.utils.types import JSONDict, FileInput +from telegram.utils.types import JSONDict, FileInput, ODVInput, DVInput from .chatpermissions import ChatPermissions from .chatlocation import ChatLocation -from .utils.helpers import DefaultValue, DEFAULT_NONE +from .utils.helpers import DEFAULT_NONE, DEFAULT_FALSE, DEFAULT_20 if TYPE_CHECKING: from telegram import ( @@ -231,7 +231,7 @@ def de_json(cls, data: JSONDict, bot: 'Bot') -> Optional['Chat']: return cls(bot=bot, **data) - def leave(self, timeout: float = None, api_kwargs: JSONDict = None) -> bool: + def leave(self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None) -> bool: """Shortcut for:: bot.leave_chat(update.effective_chat.id, *args, **kwargs) @@ -249,7 +249,7 @@ def leave(self, timeout: float = None, api_kwargs: JSONDict = None) -> bool: ) def get_administrators( - self, timeout: float = None, api_kwargs: JSONDict = None + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None ) -> List['ChatMember']: """Shortcut for:: @@ -271,7 +271,9 @@ def get_administrators( api_kwargs=api_kwargs, ) - def get_members_count(self, timeout: float = None, api_kwargs: JSONDict = None) -> int: + def get_members_count( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> int: """Shortcut for:: bot.get_chat_members_count(update.effective_chat.id, *args, **kwargs) @@ -292,7 +294,7 @@ def get_members_count(self, timeout: float = None, api_kwargs: JSONDict = None) def get_member( self, user_id: Union[str, int], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> 'ChatMember': """Shortcut for:: @@ -315,7 +317,7 @@ def get_member( def kick_member( self, user_id: Union[str, int], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, until_date: Union[int, datetime] = None, api_kwargs: JSONDict = None, ) -> bool: @@ -346,7 +348,7 @@ def kick_member( def unban_member( self, user_id: Union[str, int], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, only_if_banned: bool = None, ) -> bool: @@ -379,7 +381,7 @@ def promote_member( can_restrict_members: bool = None, can_pin_messages: bool = None, can_promote_members: bool = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, is_anonymous: bool = None, ) -> bool: @@ -417,7 +419,7 @@ def restrict_member( user_id: Union[str, int], permissions: ChatPermissions, until_date: Union[int, datetime] = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -445,7 +447,7 @@ def restrict_member( def set_permissions( self, permissions: ChatPermissions, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -470,7 +472,7 @@ def set_administrator_custom_title( self, user_id: Union[int, str], custom_title: str, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -495,8 +497,8 @@ def set_administrator_custom_title( def pin_message( self, message_id: Union[str, int], - disable_notification: bool = None, - timeout: float = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -522,7 +524,7 @@ def pin_message( def unpin_message( self, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, message_id: Union[str, int] = None, ) -> bool: @@ -548,7 +550,7 @@ def unpin_message( def unpin_all_messages( self, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -573,14 +575,14 @@ def unpin_all_messages( def send_message( self, text: str, - parse_mode: str = None, - disable_web_page_preview: bool = None, - disable_notification: bool = False, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> 'Message': """Shortcut for:: @@ -612,11 +614,11 @@ def send_media_group( media: List[ Union['InputMediaAudio', 'InputMediaDocument', 'InputMediaPhoto', 'InputMediaVideo'] ], - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> List['Message']: """Shortcut for:: @@ -641,7 +643,7 @@ def send_media_group( def send_chat_action( self, action: str, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -668,13 +670,13 @@ def send_photo( self, photo: Union[FileInput, 'PhotoSize'], caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -708,14 +710,14 @@ def send_contact( phone_number: str = None, first_name: str = None, last_name: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, contact: 'Contact' = None, vcard: str = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -749,14 +751,14 @@ def send_audio( performer: str = None, title: str = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -794,15 +796,15 @@ def send_document( document: Union[FileInput, 'Document'], filename: str = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb: FileInput = None, api_kwargs: JSONDict = None, disable_content_type_detection: bool = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> 'Message': """Shortcut for:: @@ -834,13 +836,13 @@ def send_document( def send_dice( self, - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, emoji: str = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -866,12 +868,12 @@ def send_dice( def send_game( self, game_short_name: str, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -912,15 +914,15 @@ def send_invoice( need_email: bool = None, need_shipping_address: bool = None, is_flexible: bool = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, provider_data: Union[str, object] = None, send_phone_number_to_provider: bool = None, send_email_to_provider: bool = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -965,17 +967,17 @@ def send_location( self, latitude: float = None, longitude: float = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, location: 'Location' = None, live_period: int = None, api_kwargs: JSONDict = None, horizontal_accuracy: float = None, heading: int = None, proximity_alert_radius: int = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -1012,13 +1014,13 @@ def send_animation( height: int = None, thumb: FileInput = None, caption: str = None, - parse_mode: str = None, - disable_notification: bool = False, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -1054,12 +1056,12 @@ def send_animation( def send_sticker( self, sticker: Union[FileInput, 'Sticker'], - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -1089,16 +1091,16 @@ def send_venue( title: str = None, address: str = None, foursquare_id: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, venue: 'Venue' = None, foursquare_type: str = None, api_kwargs: JSONDict = None, google_place_id: str = None, google_place_type: str = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -1134,17 +1136,17 @@ def send_video( video: Union[FileInput, 'Video'], duration: int = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, width: int = None, height: int = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, supports_streaming: bool = None, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -1183,13 +1185,13 @@ def send_video_note( video_note: Union[FileInput, 'VideoNote'], duration: int = None, length: int = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, filename: str = None, ) -> 'Message': """Shortcut for:: @@ -1222,13 +1224,13 @@ def send_voice( voice: Union[FileInput, 'Voice'], duration: int = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -1268,16 +1270,16 @@ def send_poll( allows_multiple_answers: bool = False, correct_option_id: int = None, is_closed: bool = None, - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, explanation: str = None, - explanation_parse_mode: Union[str, DefaultValue, None] = DEFAULT_NONE, + explanation_parse_mode: ODVInput[str] = DEFAULT_NONE, open_period: int = None, close_date: Union[int, datetime] = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, explanation_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> 'Message': """Shortcut for:: @@ -1317,13 +1319,13 @@ def send_copy( from_chat_id: Union[str, int], message_id: Union[str, int], caption: str = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: bool = False, + allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> 'MessageId': """Shortcut for:: @@ -1356,13 +1358,13 @@ def copy_message( chat_id: Union[int, str], message_id: Union[str, int], caption: str = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: bool = False, + allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> 'MessageId': """Shortcut for:: diff --git a/telegram/ext/defaults.py b/telegram/ext/defaults.py index 417d9158ac9..bac294b3588 100644 --- a/telegram/ext/defaults.py +++ b/telegram/ext/defaults.py @@ -18,11 +18,12 @@ # along with this program. If not, see [http://www.gnu.org/licenses/]. # pylint: disable=R0201, E0401 """This module contains the class Defaults, which allows to pass default values to Updater.""" -from typing import NoReturn, Optional, Union +from typing import NoReturn, Optional, Dict, Any import pytz -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput class Defaults: @@ -47,6 +48,9 @@ class Defaults: appearing throughout PTB, i.e. if a timezone naive date(time) object is passed somewhere, it will be assumed to be in ``tzinfo``. Must be a timezone provided by the ``pytz`` module. Defaults to UTC. + + Note: + Will *not* be used for :meth:`telegram.Bot.get_updates`! run_async (:obj:`bool`, optional): Default setting for the ``run_async`` parameter of handlers and error handlers registered through :meth:`Dispatcher.add_handler` and :meth:`Dispatcher.add_error_handler`. Defaults to :obj:`False`. @@ -54,6 +58,8 @@ class Defaults: Attributes: parse_mode (:obj:`str`): Optional. Send Markdown or HTML, if you want Telegram apps to show bold, italic, fixed-width text or URLs in your bot's message. + explanation_parse_mode (:obj:`str`): Optional. Alias for :attr:`parse_mode`, used for + the corresponding parameter of :meth:`telegram.Bot.send_poll`. disable_notification (:obj:`bool`): Optional. Sends the message silently. Users will receive a notification with no sound. disable_web_page_preview (:obj:`bool`): Optional. Disables link previews for links in this @@ -80,7 +86,7 @@ def __init__( disable_web_page_preview: bool = None, # Timeout needs special treatment, since the bot methods have two different # default values for timeout (None and 20s) - timeout: Union[float, DefaultValue] = DEFAULT_NONE, + timeout: ODVInput[float] = DEFAULT_NONE, quote: bool = None, tzinfo: pytz.BaseTzInfo = pytz.utc, run_async: bool = False, @@ -95,6 +101,26 @@ def __init__( self._tzinfo = tzinfo self._run_async = run_async + # Gather all defaults that actually have a default value + self._api_defaults = {} + for kwarg in ( + 'parse_mode', + 'explanation_parse_mode', + 'disable_notification', + 'disable_web_page_preview', + 'allow_sending_without_reply', + ): + value = getattr(self, kwarg) + if value not in [None, DEFAULT_NONE]: + self._api_defaults[kwarg] = value + # Special casing, as None is a valid default value + if self.timeout != DEFAULT_NONE: + self._api_defaults['timeout'] = self.timeout + + @property + def api_defaults(self) -> Dict[str, Any]: + return self._api_defaults + @property def parse_mode(self) -> Optional[str]: return self._parse_mode @@ -106,6 +132,17 @@ def parse_mode(self, value: object) -> NoReturn: "not have any effect." ) + @property + def explanation_parse_mode(self) -> Optional[str]: + return self._parse_mode + + @explanation_parse_mode.setter + def explanation_parse_mode(self, value: object) -> NoReturn: + raise AttributeError( + "You can not assign a new value to defaults after because it would " + "not have any effect." + ) + @property def disable_notification(self) -> Optional[bool]: return self._disable_notification @@ -140,7 +177,7 @@ def allow_sending_without_reply(self, value: object) -> NoReturn: ) @property - def timeout(self) -> Union[float, DefaultValue]: + def timeout(self) -> ODVInput[float]: return self._timeout @timeout.setter diff --git a/telegram/files/animation.py b/telegram/files/animation.py index da636cc70e2..3f90dcc2971 100644 --- a/telegram/files/animation.py +++ b/telegram/files/animation.py @@ -20,7 +20,8 @@ from typing import TYPE_CHECKING, Any, Optional from telegram import PhotoSize, TelegramObject -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File @@ -104,7 +105,9 @@ def de_json(cls, data: Optional[JSONDict], bot: 'Bot') -> Optional['Animation']: return cls(bot=bot, **data) - def get_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. diff --git a/telegram/files/audio.py b/telegram/files/audio.py index f10ac93342f..bffeacec919 100644 --- a/telegram/files/audio.py +++ b/telegram/files/audio.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Optional from telegram import PhotoSize, TelegramObject -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File @@ -108,7 +109,9 @@ def de_json(cls, data: Optional[JSONDict], bot: 'Bot') -> Optional['Audio']: return cls(bot=bot, **data) - def get_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. diff --git a/telegram/files/chatphoto.py b/telegram/files/chatphoto.py index 506c05a4320..2a40203c5e2 100644 --- a/telegram/files/chatphoto.py +++ b/telegram/files/chatphoto.py @@ -20,7 +20,8 @@ from typing import TYPE_CHECKING, Any from telegram import TelegramObject -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File @@ -85,7 +86,9 @@ def __init__( self.big_file_unique_id, ) - def get_small_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_small_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` for getting the small (160x160) chat photo @@ -102,7 +105,9 @@ def get_small_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> file_id=self.small_file_id, timeout=timeout, api_kwargs=api_kwargs ) - def get_big_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_big_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` for getting the big (640x640) chat photo diff --git a/telegram/files/document.py b/telegram/files/document.py index 6ce569c6115..e70dd232306 100644 --- a/telegram/files/document.py +++ b/telegram/files/document.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Optional from telegram import PhotoSize, TelegramObject -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File @@ -95,7 +96,9 @@ def de_json(cls, data: Optional[JSONDict], bot: 'Bot') -> Optional['Document']: return cls(bot=bot, **data) - def get_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. diff --git a/telegram/files/inputmedia.py b/telegram/files/inputmedia.py index 10fc45294ff..501e26a282b 100644 --- a/telegram/files/inputmedia.py +++ b/telegram/files/inputmedia.py @@ -30,8 +30,8 @@ Video, MessageEntity, ) -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue, parse_file_input -from telegram.utils.types import FileInput, JSONDict +from telegram.utils.helpers import DEFAULT_NONE, parse_file_input +from telegram.utils.types import FileInput, JSONDict, ODVInput class InputMedia(TelegramObject): @@ -117,7 +117,7 @@ def __init__( media: Union[FileInput, Animation], thumb: FileInput = None, caption: str = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, width: int = None, height: int = None, duration: int = None, @@ -188,7 +188,7 @@ def __init__( self, media: Union[FileInput, PhotoSize], caption: str = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[List[MessageEntity], Tuple[MessageEntity, ...]] = None, filename: str = None, ): @@ -272,7 +272,7 @@ def __init__( height: int = None, duration: int = None, supports_streaming: bool = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb: FileInput = None, caption_entities: Union[List[MessageEntity], Tuple[MessageEntity, ...]] = None, filename: str = None, @@ -368,7 +368,7 @@ def __init__( media: Union[FileInput, Audio], thumb: FileInput = None, caption: str = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, duration: int = None, performer: str = None, title: str = None, @@ -456,7 +456,7 @@ def __init__( media: Union[FileInput, Document], thumb: FileInput = None, caption: str = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, disable_content_type_detection: bool = None, caption_entities: Union[List[MessageEntity], Tuple[MessageEntity, ...]] = None, filename: str = None, diff --git a/telegram/files/photosize.py b/telegram/files/photosize.py index e704b1f4440..1456a8060a7 100644 --- a/telegram/files/photosize.py +++ b/telegram/files/photosize.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any from telegram import TelegramObject -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File @@ -78,7 +79,9 @@ def __init__( self._id_attrs = (self.file_unique_id,) - def get_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. diff --git a/telegram/files/sticker.py b/telegram/files/sticker.py index 3a0ef3c5165..0703b65259a 100644 --- a/telegram/files/sticker.py +++ b/telegram/files/sticker.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, List, Optional, ClassVar from telegram import PhotoSize, TelegramObject, constants -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File @@ -115,7 +116,9 @@ def de_json(cls, data: Optional[JSONDict], bot: 'Bot') -> Optional['Sticker']: return cls(bot=bot, **data) - def get_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. diff --git a/telegram/files/video.py b/telegram/files/video.py index b26a82a57c8..48d59afc6bf 100644 --- a/telegram/files/video.py +++ b/telegram/files/video.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Optional from telegram import PhotoSize, TelegramObject -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File @@ -105,7 +106,9 @@ def de_json(cls, data: Optional[JSONDict], bot: 'Bot') -> Optional['Video']: return cls(bot=bot, **data) - def get_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. diff --git a/telegram/files/videonote.py b/telegram/files/videonote.py index f7855dbe0ef..497936ba54a 100644 --- a/telegram/files/videonote.py +++ b/telegram/files/videonote.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Optional, Any from telegram import PhotoSize, TelegramObject -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File @@ -94,7 +95,9 @@ def de_json(cls, data: Optional[JSONDict], bot: 'Bot') -> Optional['VideoNote']: return cls(bot=bot, **data) - def get_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. diff --git a/telegram/files/voice.py b/telegram/files/voice.py index d113e0ab8f6..185ab2970e4 100644 --- a/telegram/files/voice.py +++ b/telegram/files/voice.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any from telegram import TelegramObject -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File @@ -78,7 +79,9 @@ def __init__( self._id_attrs = (self.file_unique_id,) - def get_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """Convenience wrapper over :attr:`telegram.Bot.get_file` For the documentation of the arguments, please see :meth:`telegram.Bot.get_file`. diff --git a/telegram/inline/inlinequery.py b/telegram/inline/inlinequery.py index c25b4cfceff..2310465200e 100644 --- a/telegram/inline/inlinequery.py +++ b/telegram/inline/inlinequery.py @@ -22,7 +22,8 @@ from typing import TYPE_CHECKING, Any, Optional, List, Union, Callable, ClassVar from telegram import Location, TelegramObject, User, constants -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, InlineQueryResult @@ -103,7 +104,7 @@ def answer( next_offset: str = None, switch_pm_text: str = None, switch_pm_parameter: str = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, current_offset: str = None, api_kwargs: JSONDict = None, auto_pagination: bool = False, diff --git a/telegram/inline/inlinequeryresult.py b/telegram/inline/inlinequeryresult.py index 2381b2fffff..0280f6c9ea9 100644 --- a/telegram/inline/inlinequeryresult.py +++ b/telegram/inline/inlinequeryresult.py @@ -49,14 +49,6 @@ def __init__(self, type: str, id: str, **_kwargs: Any): self._id_attrs = (self.id,) - @property - def _has_parse_mode(self) -> bool: - return hasattr(self, 'parse_mode') - - @property - def _has_input_message_content(self) -> bool: - return hasattr(self, 'input_message_content') - def to_dict(self) -> JSONDict: data = super().to_dict() diff --git a/telegram/inline/inlinequeryresultaudio.py b/telegram/inline/inlinequeryresultaudio.py index cf40e61496c..91d329e30ab 100644 --- a/telegram/inline/inlinequeryresultaudio.py +++ b/telegram/inline/inlinequeryresultaudio.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -83,7 +84,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultcachedaudio.py b/telegram/inline/inlinequeryresultcachedaudio.py index 43c93e35c26..ed8b4b233d2 100644 --- a/telegram/inline/inlinequeryresultcachedaudio.py +++ b/telegram/inline/inlinequeryresultcachedaudio.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -74,7 +75,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultcacheddocument.py b/telegram/inline/inlinequeryresultcacheddocument.py index 3566471b74a..07a0d5127bc 100644 --- a/telegram/inline/inlinequeryresultcacheddocument.py +++ b/telegram/inline/inlinequeryresultcacheddocument.py @@ -22,7 +22,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -83,7 +84,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultcachedgif.py b/telegram/inline/inlinequeryresultcachedgif.py index fafd687f652..d9ddb4a7a51 100644 --- a/telegram/inline/inlinequeryresultcachedgif.py +++ b/telegram/inline/inlinequeryresultcachedgif.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -80,7 +81,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultcachedmpeg4gif.py b/telegram/inline/inlinequeryresultcachedmpeg4gif.py index 42dbe6553fb..3104eb77286 100644 --- a/telegram/inline/inlinequeryresultcachedmpeg4gif.py +++ b/telegram/inline/inlinequeryresultcachedmpeg4gif.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -80,7 +81,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultcachedphoto.py b/telegram/inline/inlinequeryresultcachedphoto.py index 6735c6d2d98..c3857937b6b 100644 --- a/telegram/inline/inlinequeryresultcachedphoto.py +++ b/telegram/inline/inlinequeryresultcachedphoto.py @@ -22,7 +22,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -84,7 +85,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultcachedvideo.py b/telegram/inline/inlinequeryresultcachedvideo.py index a1866853a54..6e46dc088a5 100644 --- a/telegram/inline/inlinequeryresultcachedvideo.py +++ b/telegram/inline/inlinequeryresultcachedvideo.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -83,7 +84,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultcachedvoice.py b/telegram/inline/inlinequeryresultcachedvoice.py index 0153bc3d713..b99817d1080 100644 --- a/telegram/inline/inlinequeryresultcachedvoice.py +++ b/telegram/inline/inlinequeryresultcachedvoice.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -77,7 +78,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultdocument.py b/telegram/inline/inlinequeryresultdocument.py index f231c8935b3..26328ff47d4 100644 --- a/telegram/inline/inlinequeryresultdocument.py +++ b/telegram/inline/inlinequeryresultdocument.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -97,7 +98,7 @@ def __init__( thumb_url: str = None, thumb_width: int = None, thumb_height: int = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultgif.py b/telegram/inline/inlinequeryresultgif.py index 4d2e3d4b9b1..c1888b5a6c4 100644 --- a/telegram/inline/inlinequeryresultgif.py +++ b/telegram/inline/inlinequeryresultgif.py @@ -22,7 +22,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -97,7 +98,7 @@ def __init__( reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, gif_duration: int = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb_mime_type: str = None, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, diff --git a/telegram/inline/inlinequeryresultmpeg4gif.py b/telegram/inline/inlinequeryresultmpeg4gif.py index 6e49cbf1c3e..9ddd44f4a57 100644 --- a/telegram/inline/inlinequeryresultmpeg4gif.py +++ b/telegram/inline/inlinequeryresultmpeg4gif.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -96,7 +97,7 @@ def __init__( reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, mpeg4_duration: int = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb_mime_type: str = None, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, diff --git a/telegram/inline/inlinequeryresultphoto.py b/telegram/inline/inlinequeryresultphoto.py index fd822316ec8..4f09254d356 100644 --- a/telegram/inline/inlinequeryresultphoto.py +++ b/telegram/inline/inlinequeryresultphoto.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -93,7 +94,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultvideo.py b/telegram/inline/inlinequeryresultvideo.py index 6d86e304994..0245d6fba34 100644 --- a/telegram/inline/inlinequeryresultvideo.py +++ b/telegram/inline/inlinequeryresultvideo.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -105,7 +106,7 @@ def __init__( description: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inlinequeryresultvoice.py b/telegram/inline/inlinequeryresultvoice.py index be47086cc28..a38aff13c98 100644 --- a/telegram/inline/inlinequeryresultvoice.py +++ b/telegram/inline/inlinequeryresultvoice.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Union, Tuple, List from telegram import InlineQueryResult, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import ODVInput if TYPE_CHECKING: from telegram import InputMessageContent, ReplyMarkup @@ -81,7 +82,7 @@ def __init__( caption: str = None, reply_markup: 'ReplyMarkup' = None, input_message_content: 'InputMessageContent' = None, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/inline/inputmessagecontent.py b/telegram/inline/inputmessagecontent.py index 3535100786d..f0b61f04a79 100644 --- a/telegram/inline/inputmessagecontent.py +++ b/telegram/inline/inputmessagecontent.py @@ -29,11 +29,3 @@ class InputMessageContent(TelegramObject): :class:`telegram.InputVenueMessageContent` for more details. """ - - @property - def _has_parse_mode(self) -> bool: - return hasattr(self, 'parse_mode') - - @property - def _has_disable_web_page_preview(self) -> bool: - return hasattr(self, 'disable_web_page_preview') diff --git a/telegram/inline/inputtextmessagecontent.py b/telegram/inline/inputtextmessagecontent.py index 843f8172e8c..4d469613135 100644 --- a/telegram/inline/inputtextmessagecontent.py +++ b/telegram/inline/inputtextmessagecontent.py @@ -21,8 +21,8 @@ from typing import Any, Union, Tuple, List from telegram import InputMessageContent, MessageEntity -from telegram.utils.helpers import DEFAULT_NONE, DefaultValue -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput class InputTextMessageContent(InputMessageContent): @@ -62,8 +62,8 @@ class InputTextMessageContent(InputMessageContent): def __init__( self, message_text: str, - parse_mode: Union[str, DefaultValue] = DEFAULT_NONE, - disable_web_page_preview: Union[bool, DefaultValue] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, entities: Union[Tuple[MessageEntity, ...], List[MessageEntity]] = None, **_kwargs: Any, ): diff --git a/telegram/message.py b/telegram/message.py index ff6f3061405..67ce05cce4d 100644 --- a/telegram/message.py +++ b/telegram/message.py @@ -55,9 +55,10 @@ from_timestamp, to_timestamp, DEFAULT_NONE, - DefaultValue, + DEFAULT_FALSE, + DEFAULT_20, ) -from telegram.utils.types import JSONDict, FileInput +from telegram.utils.types import JSONDict, FileInput, ODVInput, DVInput if TYPE_CHECKING: from telegram import ( @@ -605,14 +606,14 @@ def _quote( def reply_text( self, text: str, - parse_mode: str = None, - disable_web_page_preview: bool = None, - disable_notification: bool = False, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, quote: bool = None, ) -> 'Message': @@ -650,13 +651,13 @@ def reply_text( def reply_markdown( self, text: str, - disable_web_page_preview: bool = None, - disable_notification: bool = False, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, quote: bool = None, ) -> 'Message': @@ -704,13 +705,13 @@ def reply_markdown( def reply_markdown_v2( self, text: str, - disable_web_page_preview: bool = None, - disable_notification: bool = False, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, quote: bool = None, ) -> 'Message': @@ -754,13 +755,13 @@ def reply_markdown_v2( def reply_html( self, text: str, - disable_web_page_preview: bool = None, - disable_notification: bool = False, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, quote: bool = None, ) -> 'Message': @@ -806,11 +807,11 @@ def reply_media_group( media: List[ Union['InputMediaAudio', 'InputMediaDocument', 'InputMediaPhoto', 'InputMediaVideo'] ], - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, quote: bool = None, ) -> List['Message']: """Shortcut for:: @@ -846,13 +847,13 @@ def reply_photo( self, photo: Union[FileInput, 'PhotoSize'], caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, quote: bool = None, @@ -896,14 +897,14 @@ def reply_audio( performer: str = None, title: str = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, quote: bool = None, @@ -949,15 +950,15 @@ def reply_document( document: Union[FileInput, 'Document'], filename: str = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb: FileInput = None, api_kwargs: JSONDict = None, disable_content_type_detection: bool = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, quote: bool = None, ) -> 'Message': @@ -1003,13 +1004,13 @@ def reply_animation( height: int = None, thumb: FileInput = None, caption: str = None, - parse_mode: str = None, - disable_notification: bool = False, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, quote: bool = None, @@ -1053,12 +1054,12 @@ def reply_animation( def reply_sticker( self, sticker: Union[FileInput, 'Sticker'], - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, quote: bool = None, ) -> 'Message': """Shortcut for:: @@ -1094,17 +1095,17 @@ def reply_video( video: Union[FileInput, 'Video'], duration: int = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, width: int = None, height: int = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, supports_streaming: bool = None, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, quote: bool = None, @@ -1151,13 +1152,13 @@ def reply_video_note( video_note: Union[FileInput, 'VideoNote'], duration: int = None, length: int = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, filename: str = None, quote: bool = None, ) -> 'Message': @@ -1198,13 +1199,13 @@ def reply_voice( voice: Union[FileInput, 'Voice'], duration: int = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, quote: bool = None, @@ -1246,17 +1247,17 @@ def reply_location( self, latitude: float = None, longitude: float = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, location: Location = None, live_period: int = None, api_kwargs: JSONDict = None, horizontal_accuracy: float = None, heading: int = None, proximity_alert_radius: int = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, quote: bool = None, ) -> 'Message': """Shortcut for:: @@ -1300,16 +1301,16 @@ def reply_venue( title: str = None, address: str = None, foursquare_id: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, venue: Venue = None, foursquare_type: str = None, api_kwargs: JSONDict = None, google_place_id: str = None, google_place_type: str = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, quote: bool = None, ) -> 'Message': """Shortcut for:: @@ -1353,14 +1354,14 @@ def reply_contact( phone_number: str = None, first_name: str = None, last_name: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, contact: Contact = None, vcard: str = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, quote: bool = None, ) -> 'Message': """Shortcut for:: @@ -1404,16 +1405,16 @@ def reply_poll( allows_multiple_answers: bool = False, correct_option_id: int = None, is_closed: bool = None, - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, explanation: str = None, - explanation_parse_mode: Union[str, DefaultValue, None] = DEFAULT_NONE, + explanation_parse_mode: ODVInput[str] = DEFAULT_NONE, open_period: int = None, close_date: Union[int, datetime.datetime] = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, explanation_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, quote: bool = None, ) -> 'Message': @@ -1458,13 +1459,13 @@ def reply_poll( def reply_dice( self, - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, emoji: str = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, quote: bool = None, ) -> 'Message': """Shortcut for:: @@ -1498,7 +1499,7 @@ def reply_dice( def reply_chat_action( self, action: str, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -1523,12 +1524,12 @@ def reply_chat_action( def reply_game( self, game_short_name: str, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, quote: bool = None, ) -> 'Message': """Shortcut for:: @@ -1579,15 +1580,15 @@ def reply_invoice( need_email: bool = None, need_shipping_address: bool = None, is_flexible: bool = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, provider_data: Union[str, object] = None, send_phone_number_to_provider: bool = None, send_email_to_provider: bool = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, quote: bool = None, ) -> 'Message': """Shortcut for:: @@ -1641,8 +1642,8 @@ def reply_invoice( def forward( self, chat_id: Union[int, str], - disable_notification: bool = False, - timeout: float = None, + disable_notification: DVInput[bool] = DEFAULT_FALSE, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> 'Message': """Shortcut for:: @@ -1672,13 +1673,13 @@ def copy( self, chat_id: Union[int, str], caption: str = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: bool = False, + allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> 'MessageId': """Shortcut for:: @@ -1715,13 +1716,13 @@ def reply_copy( from_chat_id: Union[str, int], message_id: Union[str, int], caption: str = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: bool = False, + allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, reply_markup: ReplyMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, quote: bool = None, ) -> 'MessageId': @@ -1766,10 +1767,10 @@ def reply_copy( def edit_text( self, text: str, - parse_mode: str = None, - disable_web_page_preview: bool = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> Union['Message', bool]: @@ -1809,8 +1810,8 @@ def edit_caption( self, caption: str = None, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, - parse_mode: str = None, + timeout: ODVInput[float] = DEFAULT_NONE, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> Union['Message', bool]: @@ -1850,7 +1851,7 @@ def edit_media( self, media: 'InputMedia' = None, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union['Message', bool]: """Shortcut for:: @@ -1886,7 +1887,7 @@ def edit_media( def edit_reply_markup( self, reply_markup: Optional['InlineKeyboardMarkup'] = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union['Message', bool]: """Shortcut for:: @@ -1923,7 +1924,7 @@ def edit_live_location( longitude: float = None, location: Location = None, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, horizontal_accuracy: float = None, heading: int = None, @@ -1966,7 +1967,7 @@ def edit_live_location( def stop_live_location( self, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union['Message', bool]: """Shortcut for:: @@ -2003,7 +2004,7 @@ def set_game_score( score: int, force: bool = None, disable_edit_message: bool = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Union['Message', bool]: """Shortcut for:: @@ -2039,7 +2040,7 @@ def set_game_score( def get_game_high_scores( self, user_id: Union[int, str], - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> List['GameHighScore']: """Shortcut for:: @@ -2071,7 +2072,7 @@ def get_game_high_scores( def delete( self, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -2097,7 +2098,7 @@ def delete( def stop_poll( self, reply_markup: InlineKeyboardMarkup = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Poll: """Shortcut for:: @@ -2124,8 +2125,8 @@ def stop_poll( def pin( self, - disable_notification: bool = None, - timeout: float = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -2151,7 +2152,7 @@ def pin( def unpin( self, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: diff --git a/telegram/passport/passportfile.py b/telegram/passport/passportfile.py index 7933e6b6d9c..2506a80e945 100644 --- a/telegram/passport/passportfile.py +++ b/telegram/passport/passportfile.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, List, Optional from telegram import TelegramObject -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot, File, FileCredentials @@ -103,7 +104,9 @@ def de_list_decrypted( for i, passport_file in enumerate(data) ] - def get_file(self, timeout: float = None, api_kwargs: JSONDict = None) -> 'File': + def get_file( + self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None + ) -> 'File': """ Wrapper over :attr:`telegram.Bot.get_file`. Will automatically assign the correct credentials to the returned :class:`telegram.File` if originating from diff --git a/telegram/payment/precheckoutquery.py b/telegram/payment/precheckoutquery.py index 40ec79d31f7..60ea90ca0c0 100644 --- a/telegram/payment/precheckoutquery.py +++ b/telegram/payment/precheckoutquery.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Optional from telegram import OrderInfo, TelegramObject, User -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot @@ -106,7 +107,7 @@ def answer( # pylint: disable=C0103 self, ok: bool, error_message: str = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: diff --git a/telegram/payment/shippingquery.py b/telegram/payment/shippingquery.py index 1d06cf11ca2..df57a6b7ac9 100644 --- a/telegram/payment/shippingquery.py +++ b/telegram/payment/shippingquery.py @@ -21,7 +21,8 @@ from typing import TYPE_CHECKING, Any, Optional, List from telegram import ShippingAddress, TelegramObject, User, ShippingOption -from telegram.utils.types import JSONDict +from telegram.utils.helpers import DEFAULT_NONE +from telegram.utils.types import JSONDict, ODVInput if TYPE_CHECKING: from telegram import Bot @@ -88,7 +89,7 @@ def answer( # pylint: disable=C0103 ok: bool, shipping_options: List[ShippingOption] = None, error_message: str = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: diff --git a/telegram/user.py b/telegram/user.py index e0e6642978e..7021f6028d4 100644 --- a/telegram/user.py +++ b/telegram/user.py @@ -22,9 +22,14 @@ from typing import TYPE_CHECKING, Any, List, Optional, Union, Tuple from telegram import TelegramObject, constants -from telegram.utils.helpers import mention_html as util_mention_html, DefaultValue, DEFAULT_NONE +from telegram.utils.helpers import ( + mention_html as util_mention_html, + DEFAULT_NONE, + DEFAULT_FALSE, + DEFAULT_20, +) from telegram.utils.helpers import mention_markdown as util_mention_markdown -from telegram.utils.types import JSONDict, FileInput +from telegram.utils.types import JSONDict, FileInput, ODVInput, DVInput if TYPE_CHECKING: from telegram import ( @@ -151,7 +156,7 @@ def get_profile_photos( self, offset: int = None, limit: int = 100, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Optional['UserProfilePhotos']: """ @@ -218,8 +223,8 @@ def mention_html(self, name: str = None) -> str: def pin_message( self, message_id: Union[str, int], - disable_notification: bool = None, - timeout: float = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -244,7 +249,7 @@ def pin_message( def unpin_message( self, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, message_id: Union[str, int] = None, ) -> bool: @@ -269,7 +274,7 @@ def unpin_message( def unpin_all_messages( self, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -294,14 +299,14 @@ def unpin_all_messages( def send_message( self, text: str, - parse_mode: str = None, - disable_web_page_preview: bool = None, - disable_notification: bool = False, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> 'Message': """Shortcut for:: @@ -332,13 +337,13 @@ def send_photo( self, photo: Union[FileInput, 'PhotoSize'], caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -372,11 +377,11 @@ def send_media_group( media: List[ Union['InputMediaAudio', 'InputMediaDocument', 'InputMediaPhoto', 'InputMediaVideo'] ], - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> List['Message']: """Shortcut for:: @@ -405,14 +410,14 @@ def send_audio( performer: str = None, title: str = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -448,7 +453,7 @@ def send_audio( def send_chat_action( self, action: str, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> bool: """Shortcut for:: @@ -476,14 +481,14 @@ def send_contact( phone_number: str = None, first_name: str = None, last_name: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, contact: 'Contact' = None, vcard: str = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -512,13 +517,13 @@ def send_contact( def send_dice( self, - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, emoji: str = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -546,15 +551,15 @@ def send_document( document: Union[FileInput, 'Document'], filename: str = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, thumb: FileInput = None, api_kwargs: JSONDict = None, disable_content_type_detection: bool = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> 'Message': """Shortcut for:: @@ -587,12 +592,12 @@ def send_document( def send_game( self, game_short_name: str, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -633,15 +638,15 @@ def send_invoice( need_email: bool = None, need_shipping_address: bool = None, is_flexible: bool = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, provider_data: Union[str, object] = None, send_phone_number_to_provider: bool = None, send_email_to_provider: bool = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -686,17 +691,17 @@ def send_location( self, latitude: float = None, longitude: float = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, location: 'Location' = None, live_period: int = None, api_kwargs: JSONDict = None, horizontal_accuracy: float = None, heading: int = None, proximity_alert_radius: int = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -733,13 +738,13 @@ def send_animation( height: int = None, thumb: FileInput = None, caption: str = None, - parse_mode: str = None, - disable_notification: bool = False, + parse_mode: ODVInput[str] = DEFAULT_NONE, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -775,12 +780,12 @@ def send_animation( def send_sticker( self, sticker: Union[FileInput, 'Sticker'], - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -808,17 +813,17 @@ def send_video( video: Union[FileInput, 'Video'], duration: int = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, width: int = None, height: int = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, supports_streaming: bool = None, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -859,16 +864,16 @@ def send_venue( title: str = None, address: str = None, foursquare_id: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, venue: 'Venue' = None, foursquare_type: str = None, api_kwargs: JSONDict = None, google_place_id: str = None, google_place_type: str = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, ) -> 'Message': """Shortcut for:: @@ -904,13 +909,13 @@ def send_video_note( video_note: Union[FileInput, 'VideoNote'], duration: int = None, length: int = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, + timeout: DVInput[float] = DEFAULT_20, thumb: FileInput = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, filename: str = None, ) -> 'Message': """Shortcut for:: @@ -943,13 +948,13 @@ def send_voice( voice: Union[FileInput, 'Voice'], duration: int = None, caption: str = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = 20, - parse_mode: str = None, + timeout: DVInput[float] = DEFAULT_20, + parse_mode: ODVInput[str] = DEFAULT_NONE, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, caption_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, filename: str = None, ) -> 'Message': @@ -989,16 +994,16 @@ def send_poll( allows_multiple_answers: bool = False, correct_option_id: int = None, is_closed: bool = None, - disable_notification: bool = None, + disable_notification: ODVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, explanation: str = None, - explanation_parse_mode: Union[str, DefaultValue, None] = DEFAULT_NONE, + explanation_parse_mode: ODVInput[str] = DEFAULT_NONE, open_period: int = None, close_date: Union[int, datetime] = None, api_kwargs: JSONDict = None, - allow_sending_without_reply: bool = None, + allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE, explanation_entities: Union[List['MessageEntity'], Tuple['MessageEntity', ...]] = None, ) -> 'Message': """Shortcut for:: @@ -1038,13 +1043,13 @@ def send_copy( from_chat_id: Union[str, int], message_id: Union[str, int], caption: str = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: bool = False, + allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> 'MessageId': """Shortcut for:: @@ -1077,13 +1082,13 @@ def copy_message( chat_id: Union[int, str], message_id: Union[str, int], caption: str = None, - parse_mode: str = None, + parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: bool = False, + disable_notification: DVInput[bool] = DEFAULT_FALSE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: bool = False, + allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, reply_markup: 'ReplyMarkup' = None, - timeout: float = None, + timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> 'MessageId': """Shortcut for:: diff --git a/telegram/utils/helpers.py b/telegram/utils/helpers.py index 993f5834b9b..6ee67794654 100644 --- a/telegram/utils/helpers.py +++ b/telegram/utils/helpers.py @@ -38,6 +38,9 @@ Type, cast, IO, + TypeVar, + Generic, + overload, ) from telegram.utils.types import JSONDict, FileInput @@ -494,7 +497,11 @@ def decode_user_chat_data_from_json(data: str) -> DefaultDict[int, Dict[object, return tmp -class DefaultValue: +DVType = TypeVar('DVType', bound=object) +OT = TypeVar('OT', bound=object) + + +class DefaultValue(Generic[DVType]): """Wrapper for immutable default arguments that allows to check, if the default value was set explicitly. Usage:: @@ -531,6 +538,9 @@ def f(arg=DefaultOne): if value: ... + ``repr(DefaultValue(value))`` returns ``repr(value)`` and ``str(DefaultValue(value))`` returns + ``f'DefaultValue({value})'``. + Args: value (:obj:`obj`): The value of the default argument @@ -539,15 +549,51 @@ def f(arg=DefaultOne): """ - def __init__(self, value: object = None): + def __init__(self, value: DVType = None): self.value = value def __bool__(self) -> bool: return bool(self.value) + @overload + @staticmethod + def get_value(obj: 'DefaultValue[OT]') -> OT: + ... + + @overload + @staticmethod + def get_value(obj: OT) -> OT: + ... + + @staticmethod + def get_value(obj: Union[OT, 'DefaultValue[OT]']) -> OT: + """ + Shortcut for:: + + return obj.value if isinstance(obj, DefaultValue) else obj + + Args: + obj (:obj:`object`): The object to process + + Returns: + Same type as input, or the value of the input: The value + """ + return obj.value if isinstance(obj, DefaultValue) else obj # type: ignore[return-value] + + # This is mostly here for readability during debugging + def __str__(self) -> str: + return f'DefaultValue({self.value})' + + # This is here to have the default instances nicely rendered in the docs + def __repr__(self) -> str: + return repr(self.value) + DEFAULT_NONE: DefaultValue = DefaultValue(None) """:class:`DefaultValue`: Default :obj:`None`""" DEFAULT_FALSE: DefaultValue = DefaultValue(False) """:class:`DefaultValue`: Default :obj:`False`""" + +DEFAULT_20: DefaultValue = DefaultValue(20) +""":class:`DefaultValue`: Default :obj:`20`""" diff --git a/telegram/utils/types.py b/telegram/utils/types.py index 9a0a50e78f6..1ab5f4df2fc 100644 --- a/telegram/utils/types.py +++ b/telegram/utils/types.py @@ -22,6 +22,7 @@ if TYPE_CHECKING: from telegram import InputFile + from telegram.utils.helpers import DefaultValue FileLike = Union[IO, 'InputFile'] """Either an open file handler or a :class:`telegram.InputFile`.""" @@ -36,6 +37,14 @@ ConversationDict = Dict[Tuple[int, ...], Optional[object]] """Dicts as maintained by the :class:`telegram.ext.ConversationHandler`.""" +DVType = TypeVar('DVType') +ODVInput = Optional[Union['DefaultValue[DVType]', DVType]] +"""Generic type for bot method parameters which can have defaults. ``ODVInput[type]`` is the same +as ``Optional[Union[DefaultValue, type]]``.""" +DVInput = Union['DefaultValue[DVType]', DVType] +"""Generic type for bot method parameters which can have defaults. ``DVInput[type]`` is the same +as ``Union[DefaultValue, type]``.""" + RT = TypeVar("RT") SLT = Union[RT, List[RT], Tuple[RT, ...]] """Single instance or list/tuple of instances.""" diff --git a/tests/conftest.py b/tests/conftest.py index fa6f97b62cd..6b107d81ef4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -370,40 +370,42 @@ def check_shortcut_signature( expected_args.discard('self') args_check = expected_args == effective_shortcut_args + if not args_check: + pytest.fail(f'Expected arguments {expected_args}, got {effective_shortcut_args}') + return False # TODO: Also check annotation of return type. Would currently be a hassle b/c typing doesn't # resolve `ForwardRef('Type')` to `Type`. For now we rely on MyPy, which probably allows the # shortcuts to return more specific types than the bot method, but it's only annotations after # all - annotation_check = True for kwarg in effective_shortcut_args: if bot_sig.parameters[kwarg].annotation != shortcut_sig.parameters[kwarg].annotation: if isinstance(bot_sig.parameters[kwarg].annotation, type): if bot_sig.parameters[kwarg].annotation.__name__ != str( shortcut_sig.parameters[kwarg].annotation ): - print( - f'Expected {bot_sig.parameters[kwarg].annotation}, but ' - f'got {shortcut_sig.parameters[kwarg].annotation}' + pytest.fail( + f'For argument {kwarg} I expected {bot_sig.parameters[kwarg].annotation}, ' + f'but got {shortcut_sig.parameters[kwarg].annotation}' ) - annotation_check = False - break + return False else: - print( - f'Expected {bot_sig.parameters[kwarg].annotation}, but ' + pytest.fail( + f'For argument {kwarg} I expected {bot_sig.parameters[kwarg].annotation}, but ' f'got {shortcut_sig.parameters[kwarg].annotation}' ) - annotation_check = False - break + return False bot_method_sig = inspect.signature(bot_method) shortcut_sig = inspect.signature(shortcut) - default_check = all( - shortcut_sig.parameters[arg].default == bot_method_sig.parameters[arg].default - for arg in expected_args - ) + for arg in expected_args: + if not shortcut_sig.parameters[arg].default == bot_method_sig.parameters[arg].default: + pytest.fail( + f'Default for argument {arg} does not match the default of the Bot method.' + ) + return False - return args_check and annotation_check and default_check + return True def check_shortcut_call( diff --git a/tests/test_bot.py b/tests/test_bot.py index 21f8890a4d8..c499b6a17e9 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -672,6 +672,31 @@ def test(url, data, *args, **kwargs): @pytest.mark.parametrize('default_bot', [{'parse_mode': 'Markdown'}], indirect=True) def test_answer_inline_query_default_parse_mode(self, monkeypatch, default_bot): def test(url, data, *args, **kwargs): + print() + print(data) + print( + { + 'cache_time': 300, + 'results': [ + { + 'title': 'test_result', + 'id': '123', + 'type': 'document', + 'document_url': 'https://raw.githubusercontent.com/' + 'python-telegram-bot/logos/master/logo/png/' + 'ptb-logo_240.png', + 'mime_type': 'image/png', + 'caption': 'ptb_logo', + 'parse_mode': 'Markdown', + } + ], + 'next_offset': '42', + 'switch_pm_parameter': 'start_pm', + 'inline_query_id': 1234, + 'is_personal': True, + 'switch_pm_text': 'switch pm', + } + ) return data == { 'cache_time': 300, 'results': [ @@ -1790,8 +1815,8 @@ def test_copy_message_without_reply(self, bot, chat_id, media_message): 'default_bot', [ ({'parse_mode': ParseMode.HTML, 'allow_sending_without_reply': True}), - ({'parse_mode': False, 'allow_sending_without_reply': True}), - ({'parse_mode': False, 'allow_sending_without_reply': False}), + ({'parse_mode': None, 'allow_sending_without_reply': True}), + ({'parse_mode': None, 'allow_sending_without_reply': False}), ], indirect=['default_bot'], ) From fd5afe8d93fcb936abf59fb8b9474bc094006559 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sat, 6 Feb 2021 10:10:37 +0100 Subject: [PATCH 02/23] Try running tests on ubuntu 18.04 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e516f8ea165..9b33f7cf813 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: python-version: [3.6, 3.7, 3.8, 3.9] - os: [ubuntu-latest, windows-latest, macos-latest] + os: [ubuntu-18.04, windows-latest, macos-latest] include: - os: ubuntu-latest python-version: 3.7 From bd98519543c8dd6e1cd1312247b58e24bc35d36f Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sat, 6 Feb 2021 14:14:24 +0100 Subject: [PATCH 03/23] Roll back --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9b33f7cf813..e516f8ea165 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: python-version: [3.6, 3.7, 3.8, 3.9] - os: [ubuntu-18.04, windows-latest, macos-latest] + os: [ubuntu-latest, windows-latest, macos-latest] include: - os: ubuntu-latest python-version: 3.7 From 456d57e7ba458fc5d7863bdc0286e17e48e3baf0 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sat, 6 Feb 2021 17:59:58 +0100 Subject: [PATCH 04/23] Rework check_shortcut_call tests --- tests/conftest.py | 61 +++++-- tests/test_animation.py | 7 +- tests/test_audio.py | 7 +- tests/test_callbackquery.py | 128 +++++++++------ tests/test_chat.py | 255 ++++++++--------------------- tests/test_chatphoto.py | 14 +- tests/test_document.py | 7 +- tests/test_inlinequery.py | 7 +- tests/test_message.py | 283 +++++++++++++-------------------- tests/test_passportfile.py | 7 +- tests/test_photo.py | 7 +- tests/test_precheckoutquery.py | 11 +- tests/test_shippingquery.py | 9 +- tests/test_sticker.py | 7 +- tests/test_user.py | 192 ++++++---------------- tests/test_video.py | 7 +- tests/test_videonote.py | 9 +- tests/test_voice.py | 7 +- 18 files changed, 391 insertions(+), 634 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 6b107d81ef4..4ce9a627219 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -24,7 +24,7 @@ from queue import Queue from threading import Thread, Event from time import sleep -from typing import Callable, List, Dict +from typing import Callable, List, Iterable import pytest import pytz @@ -41,6 +41,7 @@ ShippingQuery, PreCheckoutQuery, ChosenInlineResult, + File, ) from telegram.ext import Dispatcher, JobQueue, Updater, MessageFilter, Defaults, UpdateFilter from telegram.error import BadRequest @@ -409,29 +410,57 @@ def check_shortcut_signature( def check_shortcut_call( - kwargs: Dict[str, object], - bot_method: Callable, + shortcut_method: Callable, + bot: Bot, + bot_method_name: str, + skip_params: Iterable[str] = None, ) -> bool: """ Checks that a shortcut passes all the existing arguments to the underlying bot method. Use as:: - send_message = message.bot.send_message - - def make_assertion(*_, **kwargs): - return check_shortcut_call(send_message, kwargs) - - monkeypatch.setattr(message.bot, 'send_message', make_assertion) - assert message.reply_text('foobar') - + assert check_shortcut_call(message.reply_text, message.bot, 'send_message') Args: - kwargs: The kwargs passed to the bot method by the shortcut - bot_method: The bot method, e.g. :meth:`telegram.Bot.send_message` + shortcut_method: The shortcut method, e.g. `message.reply_text` + bot: The bot + bot_method_name: The bot methods name, e.g. `'send_message'` + skip_params: Parameters that are allowed to be missing, e.g. `['inline_message_id']` Returns: :obj:`bool` """ - bot_signature = inspect.signature(bot_method) - expected_args = set(bot_signature.parameters.keys()).difference(['self']) + if not skip_params: + skip_params = set() + + orig_bot_method = getattr(bot, bot_method_name) + bot_signature = inspect.signature(orig_bot_method) + expected_args = set(bot_signature.parameters.keys()).difference(['self']) - set(skip_params) + + shortcut_signature = inspect.signature(shortcut_method) + # auto_pagination: Special casing for InlineQuery.answer + kwargs = {name: True for name in shortcut_signature.parameters if name != 'auto_pagination'} + + def make_assertion(**kw): + # "if value" makes sure that value is not None, False or DEFAULT_{NONE, FALSE} + # That will be the case for all args passed by the shortcuts directly (e.g. self.chat_id) + # and for the args set in kwargs above + received_kwargs = {param for param, value in kw.items() if value} + if not received_kwargs == expected_args: + pytest.fail( + f'{orig_bot_method.__name__} did not receive the parameters ' + f'{expected_args - received_kwargs}' + ) + + if bot_method_name == 'get_file': + # This is here mainly for PassportFile.get_file, which calls .set_credentials on the + # return value + return File(file_id='result', file_unique_id='result') + return True - return expected_args == set(kwargs.keys()) + setattr(bot, bot_method_name, make_assertion) + try: + shortcut_method(**kwargs) + finally: + setattr(bot, bot_method_name, orig_bot_method) + + return True diff --git a/tests/test_animation.py b/tests/test_animation.py index 6f16097cffa..ee37aac913a 100644 --- a/tests/test_animation.py +++ b/tests/test_animation.py @@ -309,14 +309,13 @@ def test_error_send_without_required_args(self, bot, chat_id): bot.send_animation(chat_id=chat_id) def test_get_file_instance_method(self, monkeypatch, animation): - get_file = animation.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == animation.file_id and check_shortcut_call(kwargs, get_file) + return kwargs['file_id'] == animation.file_id assert check_shortcut_signature(Animation.get_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(animation.get_file, animation.bot, 'get_file') - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(animation.bot, 'get_file', make_assertion) assert animation.get_file() def test_equality(self): diff --git a/tests/test_audio.py b/tests/test_audio.py index 43963affc90..7d60329d954 100644 --- a/tests/test_audio.py +++ b/tests/test_audio.py @@ -282,14 +282,13 @@ def test_error_send_without_required_args(self, bot, chat_id): bot.send_audio(chat_id=chat_id) def test_get_file_instance_method(self, monkeypatch, audio): - get_file = audio.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == audio.file_id and check_shortcut_call(kwargs, get_file) + return kwargs['file_id'] == audio.file_id assert check_shortcut_signature(Audio.get_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(audio.get_file, audio.bot, 'get_file') - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(audio.bot, 'get_file', make_assertion) assert audio.get_file() def test_equality(self, audio): diff --git a/tests/test_callbackquery.py b/tests/test_callbackquery.py index 0582d032c2b..8a7662fb236 100644 --- a/tests/test_callbackquery.py +++ b/tests/test_callbackquery.py @@ -23,7 +23,7 @@ from tests.conftest import check_shortcut_signature, check_shortcut_call -@pytest.fixture(scope='class', params=['message', 'inline']) +@pytest.fixture(scope='function', params=['message', 'inline']) def callback_query(bot, request): cbq = CallbackQuery( TestCallbackQuery.id_, @@ -50,6 +50,12 @@ class TestCallbackQuery: inline_message_id = 'inline_message_id' game_short_name = 'the_game' + @staticmethod + def skip_params(callback_query: CallbackQuery): + if callback_query.inline_message_id: + return {'message_id', 'chat_id'} + return {'inline_message_id'} + @staticmethod def check_passed_ids(callback_query: CallbackQuery, kwargs): if callback_query.inline_message_id: @@ -97,28 +103,25 @@ def test_to_dict(self, callback_query): assert callback_query_dict['game_short_name'] == callback_query.game_short_name def test_answer(self, monkeypatch, callback_query): - answer_callback_query = callback_query.bot.answer_callback_query - def make_assertion(*_, **kwargs): - return kwargs['callback_query_id'] == callback_query.id and check_shortcut_call( - kwargs, answer_callback_query - ) + return kwargs['callback_query_id'] == callback_query.id assert check_shortcut_signature( CallbackQuery.answer, Bot.answer_callback_query, ['callback_query_id'], [] ) + assert check_shortcut_call( + callback_query.answer, callback_query.bot, 'answer_callback_query' + ) monkeypatch.setattr(callback_query.bot, 'answer_callback_query', make_assertion) # TODO: PEP8 assert callback_query.answer() def test_edit_message_text(self, monkeypatch, callback_query): - edit_message_text = callback_query.bot.edit_message_text - def make_assertion(*_, **kwargs): text = kwargs['text'] == 'test' ids = self.check_passed_ids(callback_query, kwargs) - return ids and text and check_shortcut_call(kwargs, edit_message_text) + return ids and text assert check_shortcut_signature( CallbackQuery.edit_message_text, @@ -126,18 +129,22 @@ def make_assertion(*_, **kwargs): ['inline_message_id', 'message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.edit_message_text, + callback_query.bot, + 'edit_message_text', + skip_params=self.skip_params(callback_query), + ) monkeypatch.setattr(callback_query.bot, 'edit_message_text', make_assertion) assert callback_query.edit_message_text(text='test') assert callback_query.edit_message_text('test') def test_edit_message_caption(self, monkeypatch, callback_query): - edit_message_caption = callback_query.bot.edit_message_caption - def make_assertion(*_, **kwargs): caption = kwargs['caption'] == 'new caption' ids = self.check_passed_ids(callback_query, kwargs) - return ids and caption and check_shortcut_call(kwargs, edit_message_caption) + return ids and caption assert check_shortcut_signature( CallbackQuery.edit_message_caption, @@ -145,18 +152,22 @@ def make_assertion(*_, **kwargs): ['inline_message_id', 'message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.edit_message_caption, + callback_query.bot, + 'edit_message_caption', + skip_params=self.skip_params(callback_query), + ) monkeypatch.setattr(callback_query.bot, 'edit_message_caption', make_assertion) assert callback_query.edit_message_caption(caption='new caption') assert callback_query.edit_message_caption('new caption') def test_edit_message_reply_markup(self, monkeypatch, callback_query): - edit_message_reply_markup = callback_query.bot.edit_message_reply_markup - def make_assertion(*_, **kwargs): reply_markup = kwargs['reply_markup'] == [['1', '2']] ids = self.check_passed_ids(callback_query, kwargs) - return ids and reply_markup and check_shortcut_call(kwargs, edit_message_reply_markup) + return ids and reply_markup assert check_shortcut_signature( CallbackQuery.edit_message_reply_markup, @@ -164,18 +175,22 @@ def make_assertion(*_, **kwargs): ['inline_message_id', 'message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.edit_message_reply_markup, + callback_query.bot, + 'edit_message_reply_markup', + skip_params=self.skip_params(callback_query), + ) monkeypatch.setattr(callback_query.bot, 'edit_message_reply_markup', make_assertion) assert callback_query.edit_message_reply_markup(reply_markup=[['1', '2']]) assert callback_query.edit_message_reply_markup([['1', '2']]) def test_edit_message_media(self, monkeypatch, callback_query): - edit_message_media = callback_query.bot.edit_message_media - def make_assertion(*_, **kwargs): message_media = kwargs.get('media') == [['1', '2']] ids = self.check_passed_ids(callback_query, kwargs) - return ids and message_media and check_shortcut_call(kwargs, edit_message_media) + return ids and message_media assert check_shortcut_signature( CallbackQuery.edit_message_media, @@ -183,24 +198,23 @@ def make_assertion(*_, **kwargs): ['inline_message_id', 'message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.edit_message_media, + callback_query.bot, + 'edit_message_media', + skip_params=self.skip_params(callback_query), + ) monkeypatch.setattr(callback_query.bot, 'edit_message_media', make_assertion) assert callback_query.edit_message_media(media=[['1', '2']]) assert callback_query.edit_message_media([['1', '2']]) def test_edit_message_live_location(self, monkeypatch, callback_query): - edit_message_live_location = callback_query.bot.edit_message_live_location - def make_assertion(*_, **kwargs): latitude = kwargs.get('latitude') == 1 longitude = kwargs.get('longitude') == 2 ids = self.check_passed_ids(callback_query, kwargs) - return ( - ids - and latitude - and longitude - and check_shortcut_call(kwargs, edit_message_live_location) - ) + return ids and latitude and longitude assert check_shortcut_signature( CallbackQuery.edit_message_live_location, @@ -208,17 +222,21 @@ def make_assertion(*_, **kwargs): ['inline_message_id', 'message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.edit_message_live_location, + callback_query.bot, + 'edit_message_live_location', + skip_params=self.skip_params(callback_query), + ) monkeypatch.setattr(callback_query.bot, 'edit_message_live_location', make_assertion) assert callback_query.edit_message_live_location(latitude=1, longitude=2) assert callback_query.edit_message_live_location(1, 2) def test_stop_message_live_location(self, monkeypatch, callback_query): - stop_message_live_location = callback_query.bot.stop_message_live_location - def make_assertion(*_, **kwargs): ids = self.check_passed_ids(callback_query, kwargs) - return ids and check_shortcut_call(kwargs, stop_message_live_location) + return ids assert check_shortcut_signature( CallbackQuery.stop_message_live_location, @@ -226,18 +244,22 @@ def make_assertion(*_, **kwargs): ['inline_message_id', 'message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.stop_message_live_location, + callback_query.bot, + 'stop_message_live_location', + skip_params=self.skip_params(callback_query), + ) monkeypatch.setattr(callback_query.bot, 'stop_message_live_location', make_assertion) assert callback_query.stop_message_live_location() def test_set_game_score(self, monkeypatch, callback_query): - set_game_score = callback_query.bot.set_game_score - def make_assertion(*_, **kwargs): user_id = kwargs.get('user_id') == 1 score = kwargs.get('score') == 2 ids = self.check_passed_ids(callback_query, kwargs) - return ids and user_id and score and check_shortcut_call(kwargs, set_game_score) + return ids and user_id and score assert check_shortcut_signature( CallbackQuery.set_game_score, @@ -245,18 +267,22 @@ def make_assertion(*_, **kwargs): ['inline_message_id', 'message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.set_game_score, + callback_query.bot, + 'set_game_score', + skip_params=self.skip_params(callback_query), + ) monkeypatch.setattr(callback_query.bot, 'set_game_score', make_assertion) assert callback_query.set_game_score(user_id=1, score=2) assert callback_query.set_game_score(1, 2) def test_get_game_high_scores(self, monkeypatch, callback_query): - get_game_high_scores = callback_query.bot.get_game_high_scores - def make_assertion(*_, **kwargs): user_id = kwargs.get('user_id') == 1 ids = self.check_passed_ids(callback_query, kwargs) - return ids and user_id and check_shortcut_call(kwargs, get_game_high_scores) + return ids and user_id assert check_shortcut_signature( CallbackQuery.get_game_high_scores, @@ -264,20 +290,25 @@ def make_assertion(*_, **kwargs): ['inline_message_id', 'message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.get_game_high_scores, + callback_query.bot, + 'get_game_high_scores', + skip_params=self.skip_params(callback_query), + ) monkeypatch.setattr(callback_query.bot, 'get_game_high_scores', make_assertion) assert callback_query.get_game_high_scores(user_id=1) assert callback_query.get_game_high_scores(1) def test_delete_message(self, monkeypatch, callback_query): - delete_message = callback_query.bot.delete_message if callback_query.inline_message_id: pytest.skip("Can't delete inline messages") def make_assertion(*args, **kwargs): id_ = kwargs['chat_id'] == callback_query.message.chat_id message = kwargs['message_id'] == callback_query.message.message_id - return id_ and message and check_shortcut_call(kwargs, delete_message) + return id_ and message assert check_shortcut_signature( CallbackQuery.delete_message, @@ -285,19 +316,19 @@ def make_assertion(*args, **kwargs): ['message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.delete_message, callback_query.bot, 'delete_message' + ) monkeypatch.setattr(callback_query.bot, 'delete_message', make_assertion) assert callback_query.delete_message() def test_pin_message(self, monkeypatch, callback_query): - pin_message = callback_query.bot.pin_chat_message if callback_query.inline_message_id: pytest.skip("Can't pin inline messages") def make_assertion(*args, **kwargs): - return kwargs['chat_id'] == callback_query.message.chat_id and check_shortcut_call( - kwargs, pin_message - ) + return kwargs['chat_id'] == callback_query.message.chat_id assert check_shortcut_signature( CallbackQuery.pin_message, @@ -305,19 +336,19 @@ def make_assertion(*args, **kwargs): ['message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.pin_message, callback_query.bot, 'pin_chat_message' + ) monkeypatch.setattr(callback_query.bot, 'pin_chat_message', make_assertion) assert callback_query.pin_message() def test_unpin_message(self, monkeypatch, callback_query): - unpin_message = callback_query.bot.unpin_chat_message if callback_query.inline_message_id: pytest.skip("Can't unpin inline messages") def make_assertion(*args, **kwargs): - return kwargs['chat_id'] == callback_query.message.chat_id and check_shortcut_call( - kwargs, unpin_message - ) + return kwargs['chat_id'] == callback_query.message.chat_id assert check_shortcut_signature( CallbackQuery.unpin_message, @@ -325,12 +356,14 @@ def make_assertion(*args, **kwargs): ['message_id', 'chat_id'], [], ) + assert check_shortcut_call( + callback_query.unpin_message, callback_query.bot, 'unpin_chat_message' + ) monkeypatch.setattr(callback_query.bot, 'unpin_chat_message', make_assertion) assert callback_query.unpin_message() def test_copy_message(self, monkeypatch, callback_query): - copy_message = callback_query.bot.copy_message if callback_query.inline_message_id: pytest.skip("Can't copy inline messages") @@ -338,7 +371,7 @@ def make_assertion(*args, **kwargs): id_ = kwargs['from_chat_id'] == callback_query.message.chat_id chat_id = kwargs['chat_id'] == 1 message = kwargs['message_id'] == callback_query.message.message_id - return id_ and message and chat_id and check_shortcut_call(kwargs, copy_message) + return id_ and message and chat_id assert check_shortcut_signature( CallbackQuery.copy_message, @@ -346,6 +379,7 @@ def make_assertion(*args, **kwargs): ['message_id', 'from_chat_id'], [], ) + assert check_shortcut_call(callback_query.copy_message, callback_query.bot, 'copy_message') monkeypatch.setattr(callback_query.bot, 'copy_message', make_assertion) assert callback_query.copy_message(1) diff --git a/tests/test_chat.py b/tests/test_chat.py index e8e95748d05..295f5d1f44c 100644 --- a/tests/test_chat.py +++ b/tests/test_chat.py @@ -126,153 +126,134 @@ def test_full_name(self): assert chat.full_name is None def test_send_action(self, monkeypatch, chat): - send_chat_action = chat.bot.send_chat_action - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == chat.id action = kwargs['action'] == ChatAction.TYPING - return id_ and action and check_shortcut_call(kwargs, send_chat_action) + return id_ and action - assert check_shortcut_signature( - Chat.send_chat_action, Bot.send_chat_action, ['chat_id'], [] - ) + assert check_shortcut_signature(chat.send_action, Bot.send_chat_action, ['chat_id'], []) + assert check_shortcut_call(chat.send_action, chat.bot, 'send_chat_action') monkeypatch.setattr(chat.bot, 'send_chat_action', make_assertion) assert chat.send_action(action=ChatAction.TYPING) - assert chat.send_chat_action(action=ChatAction.TYPING) + assert chat.send_action(action=ChatAction.TYPING) def test_leave(self, monkeypatch, chat): - leave_chat = chat.bot.leave_chat - def make_assertion(*_, **kwargs): - return kwargs['chat_id'] == chat.id and check_shortcut_call(kwargs, leave_chat) + return kwargs['chat_id'] == chat.id assert check_shortcut_signature(Chat.leave, Bot.leave_chat, ['chat_id'], []) + assert check_shortcut_call(chat.leave, chat.bot, 'leave_chat') monkeypatch.setattr(chat.bot, 'leave_chat', make_assertion) assert chat.leave() def test_get_administrators(self, monkeypatch, chat): - get_chat_administrators = chat.bot.get_chat_administrators - def make_assertion(*_, **kwargs): - return kwargs['chat_id'] == chat.id and check_shortcut_call( - kwargs, get_chat_administrators - ) + return kwargs['chat_id'] == chat.id assert check_shortcut_signature( Chat.get_administrators, Bot.get_chat_administrators, ['chat_id'], [] ) + assert check_shortcut_call(chat.get_administrators, chat.bot, 'get_chat_administrators') monkeypatch.setattr(chat.bot, 'get_chat_administrators', make_assertion) assert chat.get_administrators() def test_get_members_count(self, monkeypatch, chat): - get_chat_members_count = chat.bot.get_chat_members_count - def make_assertion(*_, **kwargs): - return kwargs['chat_id'] == chat.id and check_shortcut_call( - kwargs, get_chat_members_count - ) + return kwargs['chat_id'] == chat.id assert check_shortcut_signature( Chat.get_members_count, Bot.get_chat_members_count, ['chat_id'], [] ) + assert check_shortcut_call(chat.get_members_count, chat.bot, 'get_chat_members_count') monkeypatch.setattr(chat.bot, 'get_chat_members_count', make_assertion) assert chat.get_members_count() def test_get_member(self, monkeypatch, chat): - get_chat_member = chat.bot.get_chat_member - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == chat.id user_id = kwargs['user_id'] == 42 - return chat_id and user_id and check_shortcut_call(kwargs, get_chat_member) + return chat_id and user_id assert check_shortcut_signature(Chat.get_member, Bot.get_chat_member, ['chat_id'], []) + assert check_shortcut_call(chat.get_member, chat.bot, 'get_chat_member') monkeypatch.setattr(chat.bot, 'get_chat_member', make_assertion) assert chat.get_member(user_id=42) def test_kick_member(self, monkeypatch, chat): - kick_chat_member = chat.bot.kick_chat_member - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == chat.id user_id = kwargs['user_id'] == 42 until = kwargs['until_date'] == 43 - return chat_id and user_id and until and check_shortcut_call(kwargs, kick_chat_member) + return chat_id and user_id and until assert check_shortcut_signature(Chat.kick_member, Bot.kick_chat_member, ['chat_id'], []) + assert check_shortcut_call(chat.kick_member, chat.bot, 'kick_chat_member') monkeypatch.setattr(chat.bot, 'kick_chat_member', make_assertion) assert chat.kick_member(user_id=42, until_date=43) @pytest.mark.parametrize('only_if_banned', [True, False, None]) def test_unban_member(self, monkeypatch, chat, only_if_banned): - unban_chat_member = chat.bot.unban_chat_member - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == chat.id user_id = kwargs['user_id'] == 42 o_i_b = kwargs.get('only_if_banned', None) == only_if_banned - return chat_id and user_id and o_i_b and check_shortcut_call(kwargs, unban_chat_member) + return chat_id and user_id and o_i_b assert check_shortcut_signature(Chat.unban_member, Bot.unban_chat_member, ['chat_id'], []) + assert check_shortcut_call(chat.unban_member, chat.bot, 'unban_chat_member') monkeypatch.setattr(chat.bot, 'unban_chat_member', make_assertion) assert chat.unban_member(user_id=42, only_if_banned=only_if_banned) @pytest.mark.parametrize('is_anonymous', [True, False, None]) def test_promote_member(self, monkeypatch, chat, is_anonymous): - promote_chat_member = chat.bot.promote_chat_member - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == chat.id user_id = kwargs['user_id'] == 42 o_i_b = kwargs.get('is_anonymous', None) == is_anonymous - return ( - chat_id and user_id and o_i_b and check_shortcut_call(kwargs, promote_chat_member) - ) + return chat_id and user_id and o_i_b assert check_shortcut_signature( Chat.promote_member, Bot.promote_chat_member, ['chat_id'], [] ) + assert check_shortcut_call(chat.promote_member, chat.bot, 'promote_chat_member') monkeypatch.setattr(chat.bot, 'promote_chat_member', make_assertion) assert chat.promote_member(user_id=42, is_anonymous=is_anonymous) def test_restrict_member(self, monkeypatch, chat): - restrict_chat_member = chat.bot.restrict_chat_member permissions = ChatPermissions(True, False, True, False, True, False, True, False) def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == chat.id user_id = kwargs['user_id'] == 42 o_i_b = kwargs.get('permissions', None) == permissions - return ( - chat_id and user_id and o_i_b and check_shortcut_call(kwargs, restrict_chat_member) - ) + return chat_id and user_id and o_i_b assert check_shortcut_signature( Chat.restrict_member, Bot.restrict_chat_member, ['chat_id'], [] ) + assert check_shortcut_call(chat.restrict_member, chat.bot, 'restrict_chat_member') monkeypatch.setattr(chat.bot, 'restrict_chat_member', make_assertion) assert chat.restrict_member(user_id=42, permissions=permissions) def test_set_permissions(self, monkeypatch, chat): - set_chat_permissions = chat.bot.set_chat_permissions - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == chat.id permissions = kwargs['permissions'] == self.permissions - return chat_id and permissions and check_shortcut_call(kwargs, set_chat_permissions) + return chat_id and permissions assert check_shortcut_signature( Chat.set_permissions, Bot.set_chat_permissions, ['chat_id'], [] ) + assert check_shortcut_call(chat.set_permissions, chat.bot, 'set_chat_permissions') monkeypatch.setattr(chat.bot, 'set_chat_permissions', make_assertion) assert chat.set_permissions(permissions=self.permissions) @@ -288,173 +269,122 @@ def make_assertion(*_, **kwargs): assert chat.set_administrator_custom_title(user_id=42, custom_title='custom_title') def test_pin_message(self, monkeypatch, chat): - pin_chat_message = chat.bot.pin_chat_message - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['message_id'] == 42 - and check_shortcut_call(kwargs, pin_chat_message) - ) + return kwargs['chat_id'] == chat.id and kwargs['message_id'] == 42 assert check_shortcut_signature(Chat.pin_message, Bot.pin_chat_message, ['chat_id'], []) + assert check_shortcut_call(chat.pin_message, chat.bot, 'pin_chat_message') monkeypatch.setattr(chat.bot, 'pin_chat_message', make_assertion) assert chat.pin_message(message_id=42) def test_unpin_message(self, monkeypatch, chat): - unpin_chat_message = chat.bot.unpin_chat_message - def make_assertion(*_, **kwargs): - return kwargs['chat_id'] == chat.id and check_shortcut_call(kwargs, unpin_chat_message) + return kwargs['chat_id'] == chat.id assert check_shortcut_signature( Chat.unpin_message, Bot.unpin_chat_message, ['chat_id'], [] ) + assert check_shortcut_call(chat.unpin_message, chat.bot, 'unpin_chat_message') monkeypatch.setattr(chat.bot, 'unpin_chat_message', make_assertion) assert chat.unpin_message() def test_unpin_all_messages(self, monkeypatch, chat): - unpin_all_chat_messages = chat.bot.unpin_all_chat_messages - def make_assertion(*_, **kwargs): - return kwargs['chat_id'] == chat.id and check_shortcut_call( - kwargs, unpin_all_chat_messages - ) + return kwargs['chat_id'] == chat.id assert check_shortcut_signature( Chat.unpin_all_messages, Bot.unpin_all_chat_messages, ['chat_id'], [] ) + assert check_shortcut_call(chat.unpin_all_messages, chat.bot, 'unpin_all_chat_messages') monkeypatch.setattr(chat.bot, 'unpin_all_chat_messages', make_assertion) assert chat.unpin_all_messages() def test_instance_method_send_message(self, monkeypatch, chat): - send_message = chat.bot.send_message - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['text'] == 'test' - and check_shortcut_call(kwargs, send_message) - ) + return kwargs['chat_id'] == chat.id and kwargs['text'] == 'test' assert check_shortcut_signature(Chat.send_message, Bot.send_message, ['chat_id'], []) + assert check_shortcut_call(chat.send_message, chat.bot, 'send_message') monkeypatch.setattr(chat.bot, 'send_message', make_assertion) assert chat.send_message(text='test') def test_instance_method_send_media_group(self, monkeypatch, chat): - send_media_group = chat.bot.send_media_group - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['media'] == 'test_media_group' - and check_shortcut_call(kwargs, send_media_group) - ) + return kwargs['chat_id'] == chat.id and kwargs['media'] == 'test_media_group' assert check_shortcut_signature( Chat.send_media_group, Bot.send_media_group, ['chat_id'], [] ) + assert check_shortcut_call(chat.send_media_group, chat.bot, 'send_media_group') monkeypatch.setattr(chat.bot, 'send_media_group', make_assertion) assert chat.send_media_group(media='test_media_group') def test_instance_method_send_photo(self, monkeypatch, chat): - send_photo = chat.bot.send_photo - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['photo'] == 'test_photo' - and check_shortcut_call(kwargs, send_photo) - ) + return kwargs['chat_id'] == chat.id and kwargs['photo'] == 'test_photo' assert check_shortcut_signature(Chat.send_photo, Bot.send_photo, ['chat_id'], []) + assert check_shortcut_call(chat.send_photo, chat.bot, 'send_photo') monkeypatch.setattr(chat.bot, 'send_photo', make_assertion) assert chat.send_photo(photo='test_photo') def test_instance_method_send_contact(self, monkeypatch, chat): - send_contact = chat.bot.send_contact - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['phone_number'] == 'test_contact' - and check_shortcut_call(kwargs, send_contact) - ) + return kwargs['chat_id'] == chat.id and kwargs['phone_number'] == 'test_contact' assert check_shortcut_signature(Chat.send_contact, Bot.send_contact, ['chat_id'], []) + assert check_shortcut_call(chat.send_contact, chat.bot, 'send_contact') monkeypatch.setattr(chat.bot, 'send_contact', make_assertion) assert chat.send_contact(phone_number='test_contact') def test_instance_method_send_audio(self, monkeypatch, chat): - send_audio = chat.bot.send_audio - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['audio'] == 'test_audio' - and check_shortcut_call(kwargs, send_audio) - ) + return kwargs['chat_id'] == chat.id and kwargs['audio'] == 'test_audio' assert check_shortcut_signature(Chat.send_audio, Bot.send_audio, ['chat_id'], []) + assert check_shortcut_call(chat.send_audio, chat.bot, 'send_audio') monkeypatch.setattr(chat.bot, 'send_audio', make_assertion) assert chat.send_audio(audio='test_audio') def test_instance_method_send_document(self, monkeypatch, chat): - send_document = chat.bot.send_document - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['document'] == 'test_document' - and check_shortcut_call(kwargs, send_document) - ) + return kwargs['chat_id'] == chat.id and kwargs['document'] == 'test_document' assert check_shortcut_signature(Chat.send_document, Bot.send_document, ['chat_id'], []) + assert check_shortcut_call(chat.send_document, chat.bot, 'send_document') monkeypatch.setattr(chat.bot, 'send_document', make_assertion) assert chat.send_document(document='test_document') def test_instance_method_send_dice(self, monkeypatch, chat): - send_dice = chat.bot.send_dice - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['emoji'] == 'test_dice' - and check_shortcut_call(kwargs, send_dice) - ) + return kwargs['chat_id'] == chat.id and kwargs['emoji'] == 'test_dice' assert check_shortcut_signature(Chat.send_dice, Bot.send_dice, ['chat_id'], []) + assert check_shortcut_call(chat.send_dice, chat.bot, 'send_dice') monkeypatch.setattr(chat.bot, 'send_dice', make_assertion) assert chat.send_dice(emoji='test_dice') def test_instance_method_send_game(self, monkeypatch, chat): - send_game = chat.bot.send_game - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['game_short_name'] == 'test_game' - and check_shortcut_call(kwargs, send_game) - ) + return kwargs['chat_id'] == chat.id and kwargs['game_short_name'] == 'test_game' assert check_shortcut_signature(Chat.send_game, Bot.send_game, ['chat_id'], []) + assert check_shortcut_call(chat.send_game, chat.bot, 'send_game') monkeypatch.setattr(chat.bot, 'send_game', make_assertion) assert chat.send_game(game_short_name='test_game') def test_instance_method_send_invoice(self, monkeypatch, chat): - send_invoice = chat.bot.send_invoice - def make_assertion(*_, **kwargs): title = kwargs['title'] == 'title' description = kwargs['description'] == 'description' @@ -472,11 +402,10 @@ def make_assertion(*_, **kwargs): and currency and prices ) - return ( - kwargs['chat_id'] == chat.id and args and check_shortcut_call(kwargs, send_invoice) - ) + return kwargs['chat_id'] == chat.id and args assert check_shortcut_signature(Chat.send_invoice, Bot.send_invoice, ['chat_id'], []) + assert check_shortcut_call(chat.send_invoice, chat.bot, 'send_invoice') monkeypatch.setattr(chat.bot, 'send_invoice', make_assertion) assert chat.send_invoice( @@ -490,159 +419,107 @@ def make_assertion(*_, **kwargs): ) def test_instance_method_send_location(self, monkeypatch, chat): - send_location = chat.bot.send_location - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['latitude'] == 'test_location' - and check_shortcut_call(kwargs, send_location) - ) + return kwargs['chat_id'] == chat.id and kwargs['latitude'] == 'test_location' assert check_shortcut_signature(Chat.send_location, Bot.send_location, ['chat_id'], []) + assert check_shortcut_call(chat.send_location, chat.bot, 'send_location') monkeypatch.setattr(chat.bot, 'send_location', make_assertion) assert chat.send_location(latitude='test_location') def test_instance_method_send_sticker(self, monkeypatch, chat): - send_sticker = chat.bot.send_sticker - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['sticker'] == 'test_sticker' - and check_shortcut_call(kwargs, send_sticker) - ) + return kwargs['chat_id'] == chat.id and kwargs['sticker'] == 'test_sticker' assert check_shortcut_signature(Chat.send_sticker, Bot.send_sticker, ['chat_id'], []) + assert check_shortcut_call(chat.send_sticker, chat.bot, 'send_sticker') monkeypatch.setattr(chat.bot, 'send_sticker', make_assertion) assert chat.send_sticker(sticker='test_sticker') def test_instance_method_send_venue(self, monkeypatch, chat): - send_venue = chat.bot.send_venue - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['title'] == 'test_venue' - and check_shortcut_call(kwargs, send_venue) - ) + return kwargs['chat_id'] == chat.id and kwargs['title'] == 'test_venue' assert check_shortcut_signature(Chat.send_venue, Bot.send_venue, ['chat_id'], []) + assert check_shortcut_call(chat.send_venue, chat.bot, 'send_venue') monkeypatch.setattr(chat.bot, 'send_venue', make_assertion) assert chat.send_venue(title='test_venue') def test_instance_method_send_video(self, monkeypatch, chat): - send_video = chat.bot.send_video - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['video'] == 'test_video' - and check_shortcut_call(kwargs, send_video) - ) + return kwargs['chat_id'] == chat.id and kwargs['video'] == 'test_video' assert check_shortcut_signature(Chat.send_video, Bot.send_video, ['chat_id'], []) + assert check_shortcut_call(chat.send_video, chat.bot, 'send_video') monkeypatch.setattr(chat.bot, 'send_video', make_assertion) assert chat.send_video(video='test_video') def test_instance_method_send_video_note(self, monkeypatch, chat): - send_video_note = chat.bot.send_video_note - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['video_note'] == 'test_video_note' - and check_shortcut_call(kwargs, send_video_note) - ) + return kwargs['chat_id'] == chat.id and kwargs['video_note'] == 'test_video_note' assert check_shortcut_signature(Chat.send_video_note, Bot.send_video_note, ['chat_id'], []) + assert check_shortcut_call(chat.send_video_note, chat.bot, 'send_video_note') monkeypatch.setattr(chat.bot, 'send_video_note', make_assertion) assert chat.send_video_note(video_note='test_video_note') def test_instance_method_send_voice(self, monkeypatch, chat): - send_voice = chat.bot.send_voice - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['voice'] == 'test_voice' - and check_shortcut_call(kwargs, send_voice) - ) + return kwargs['chat_id'] == chat.id and kwargs['voice'] == 'test_voice' assert check_shortcut_signature(Chat.send_voice, Bot.send_voice, ['chat_id'], []) + assert check_shortcut_call(chat.send_voice, chat.bot, 'send_voice') monkeypatch.setattr(chat.bot, 'send_voice', make_assertion) assert chat.send_voice(voice='test_voice') def test_instance_method_send_animation(self, monkeypatch, chat): - send_animation = chat.bot.send_animation - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['animation'] == 'test_animation' - and check_shortcut_call(kwargs, send_animation) - ) + return kwargs['chat_id'] == chat.id and kwargs['animation'] == 'test_animation' assert check_shortcut_signature(Chat.send_animation, Bot.send_animation, ['chat_id'], []) + assert check_shortcut_call(chat.send_animation, chat.bot, 'send_animation') monkeypatch.setattr(chat.bot, 'send_animation', make_assertion) assert chat.send_animation(animation='test_animation') def test_instance_method_send_poll(self, monkeypatch, chat): - send_poll = chat.bot.send_poll - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == chat.id - and kwargs['question'] == 'test_poll' - and check_shortcut_call(kwargs, send_poll) - ) + return kwargs['chat_id'] == chat.id and kwargs['question'] == 'test_poll' assert check_shortcut_signature(Chat.send_poll, Bot.send_poll, ['chat_id'], []) + assert check_shortcut_call(chat.send_poll, chat.bot, 'send_poll') monkeypatch.setattr(chat.bot, 'send_poll', make_assertion) assert chat.send_poll(question='test_poll', options=[1, 2]) def test_instance_method_send_copy(self, monkeypatch, chat): - copy_message = chat.bot.copy_message - def make_assertion(*_, **kwargs): from_chat_id = kwargs['from_chat_id'] == 'test_copy' message_id = kwargs['message_id'] == 42 chat_id = kwargs['chat_id'] == chat.id - return ( - from_chat_id - and message_id - and chat_id - and check_shortcut_call(kwargs, copy_message) - ) + return from_chat_id and message_id and chat_id assert check_shortcut_signature(Chat.send_copy, Bot.copy_message, ['chat_id'], []) + assert check_shortcut_call(chat.copy_message, chat.bot, 'copy_message') monkeypatch.setattr(chat.bot, 'copy_message', make_assertion) assert chat.send_copy(from_chat_id='test_copy', message_id=42) def test_instance_method_copy_message(self, monkeypatch, chat): - copy_message = chat.bot.copy_message - def make_assertion(*_, **kwargs): from_chat_id = kwargs['from_chat_id'] == chat.id message_id = kwargs['message_id'] == 42 chat_id = kwargs['chat_id'] == 'test_copy' - return ( - from_chat_id - and message_id - and chat_id - and check_shortcut_call(kwargs, copy_message) - ) + return from_chat_id and message_id and chat_id assert check_shortcut_signature(Chat.copy_message, Bot.copy_message, ['from_chat_id'], []) + assert check_shortcut_call(chat.copy_message, chat.bot, 'copy_message') monkeypatch.setattr(chat.bot, 'copy_message', make_assertion) assert chat.copy_message(chat_id='test_copy', message_id=42) diff --git a/tests/test_chatphoto.py b/tests/test_chatphoto.py index 64203c3d7ab..2ae21da79cb 100644 --- a/tests/test_chatphoto.py +++ b/tests/test_chatphoto.py @@ -125,27 +125,21 @@ def test_error_send_without_required_args(self, bot, super_group_id): bot.set_chat_photo(chat_id=super_group_id) def test_get_small_file_instance_method(self, monkeypatch, chat_photo): - get_small_file = chat_photo.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == chat_photo.small_file_id and check_shortcut_call( - kwargs, get_small_file - ) + return kwargs['file_id'] == chat_photo.small_file_id assert check_shortcut_signature(ChatPhoto.get_small_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(chat_photo.get_small_file, chat_photo.bot, 'get_file') monkeypatch.setattr('telegram.Bot.get_file', make_assertion) assert chat_photo.get_small_file() def test_get_big_file_instance_method(self, monkeypatch, chat_photo): - get_big_file = chat_photo.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == chat_photo.big_file_id and check_shortcut_call( - kwargs, get_big_file - ) + return kwargs['file_id'] == chat_photo.big_file_id assert check_shortcut_signature(ChatPhoto.get_big_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(chat_photo.get_big_file, chat_photo.bot, 'get_file') monkeypatch.setattr('telegram.Bot.get_file', make_assertion) assert chat_photo.get_big_file() diff --git a/tests/test_document.py b/tests/test_document.py index b72668cb94c..6013e64ac97 100644 --- a/tests/test_document.py +++ b/tests/test_document.py @@ -298,14 +298,13 @@ def test_error_send_without_required_args(self, bot, chat_id): bot.send_document(chat_id=chat_id) def test_get_file_instance_method(self, monkeypatch, document): - get_file = document.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == document.file_id and check_shortcut_call(kwargs, get_file) + return kwargs['file_id'] == document.file_id assert check_shortcut_signature(Document.get_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(document.get_file, document.bot, 'get_file') - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(document.bot, 'get_file', make_assertion) assert document.get_file() def test_equality(self, document): diff --git a/tests/test_inlinequery.py b/tests/test_inlinequery.py index 5f6bb9a9b87..0b07821ef90 100644 --- a/tests/test_inlinequery.py +++ b/tests/test_inlinequery.py @@ -69,16 +69,13 @@ def test_to_dict(self, inline_query): assert inline_query_dict['offset'] == inline_query.offset def test_answer(self, monkeypatch, inline_query): - answer_inline_query = inline_query.bot.answer_inline_query - def make_assertion(*_, **kwargs): - return kwargs['inline_query_id'] == inline_query.id and check_shortcut_call( - kwargs, answer_inline_query - ) + return kwargs['inline_query_id'] == inline_query.id assert check_shortcut_signature( InlineQuery.answer, Bot.answer_inline_query, ['inline_query_id'], ['auto_pagination'] ) + assert check_shortcut_call(inline_query.answer, inline_query.bot, 'answer_inline_query') monkeypatch.setattr(inline_query.bot, 'answer_inline_query', make_assertion) assert inline_query.answer(results=[]) diff --git a/tests/test_message.py b/tests/test_message.py index 542a80e4348..d190ce25f90 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -638,8 +638,6 @@ def test_effective_attachment(self, message_params): assert message_params.effective_attachment == item def test_reply_text(self, monkeypatch, message): - send_message = message.bot.send_message - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id text = kwargs['text'] == 'test' @@ -647,11 +645,12 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and text and reply and check_shortcut_call(kwargs, send_message) + return id_ and text and reply assert check_shortcut_signature( Message.reply_text, Bot.send_message, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_text, message.bot, 'send_message') monkeypatch.setattr(message.bot, 'send_message', make_assertion) assert message.reply_text('test') @@ -659,7 +658,6 @@ def make_assertion(*_, **kwargs): assert message.reply_text('test', reply_to_message_id=message.message_id, quote=True) def test_reply_markdown(self, monkeypatch, message): - send_message = message.bot.send_message test_md_string = ( r'Test for <*bold*, _ita_\__lic_, `code`, ' '[links](http://github.com/ab_), ' @@ -675,13 +673,12 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return all([cid, markdown_text, reply, markdown_enabled]) and check_shortcut_call( - kwargs, send_message - ) + return all([cid, markdown_text, reply, markdown_enabled]) assert check_shortcut_signature( Message.reply_markdown, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) + assert check_shortcut_call(message.reply_text, message.bot, 'send_message') text_markdown = self.test_message.text_markdown assert text_markdown == test_md_string @@ -694,7 +691,6 @@ def make_assertion(*_, **kwargs): ) def test_reply_markdown_v2(self, monkeypatch, message): - send_message = message.bot.send_message test_md_string = ( r'__Test__ for <*bold*, _ita\_lic_, `\\\`code`, ' '[links](http://github.com/abc\\\\\\)def), ' @@ -711,13 +707,12 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return all([cid, markdown_text, reply, markdown_enabled]) and check_shortcut_call( - kwargs, send_message - ) + return all([cid, markdown_text, reply, markdown_enabled]) assert check_shortcut_signature( Message.reply_markdown_v2, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) + assert check_shortcut_call(message.reply_text, message.bot, 'send_message') text_markdown = self.test_message_v2.text_markdown_v2 assert text_markdown == test_md_string @@ -732,7 +727,6 @@ def make_assertion(*_, **kwargs): ) def test_reply_html(self, monkeypatch, message): - send_message = message.bot.send_message test_html_string = ( 'Test for <bold, ita_lic, ' r'\`code, ' @@ -751,13 +745,12 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return all([cid, html_text, reply, html_enabled]) and check_shortcut_call( - kwargs, send_message - ) + return all([cid, html_text, reply, html_enabled]) assert check_shortcut_signature( Message.reply_html, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) + assert check_shortcut_call(message.reply_text, message.bot, 'send_message') text_html = self.test_message_v2.text_html assert text_html == test_html_string @@ -770,8 +763,6 @@ def make_assertion(*_, **kwargs): ) def test_reply_media_group(self, monkeypatch, message): - send_media_group = message.bot.send_media_group - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id media = kwargs['media'] == 'reply_media_group' @@ -779,19 +770,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and media and reply and check_shortcut_call(kwargs, send_media_group) + return id_ and media and reply assert check_shortcut_signature( Message.reply_media_group, Bot.send_media_group, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_media_group, message.bot, 'send_media_group') monkeypatch.setattr(message.bot, 'send_media_group', make_assertion) assert message.reply_media_group(media='reply_media_group') assert message.reply_media_group(media='reply_media_group', quote=True) def test_reply_photo(self, monkeypatch, message): - send_photo = message.bot.send_photo - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id photo = kwargs['photo'] == 'test_photo' @@ -799,19 +789,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and photo and reply and check_shortcut_call(kwargs, send_photo) + return id_ and photo and reply assert check_shortcut_signature( Message.reply_photo, Bot.send_photo, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_photo, message.bot, 'send_photo') monkeypatch.setattr(message.bot, 'send_photo', make_assertion) assert message.reply_photo(photo='test_photo') assert message.reply_photo(photo='test_photo', quote=True) def test_reply_audio(self, monkeypatch, message): - send_audio = message.bot.send_audio - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id audio = kwargs['audio'] == 'test_audio' @@ -819,19 +808,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and audio and reply and check_shortcut_call(kwargs, send_audio) + return id_ and audio and reply assert check_shortcut_signature( Message.reply_audio, Bot.send_audio, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_audio, message.bot, 'send_audio') monkeypatch.setattr(message.bot, 'send_audio', make_assertion) assert message.reply_audio(audio='test_audio') assert message.reply_audio(audio='test_audio', quote=True) def test_reply_document(self, monkeypatch, message): - send_document = message.bot.send_document - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id document = kwargs['document'] == 'test_document' @@ -839,19 +827,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and document and reply and check_shortcut_call(kwargs, send_document) + return id_ and document and reply assert check_shortcut_signature( Message.reply_document, Bot.send_document, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_document, message.bot, 'send_document') monkeypatch.setattr(message.bot, 'send_document', make_assertion) assert message.reply_document(document='test_document') assert message.reply_document(document='test_document', quote=True) def test_reply_animation(self, monkeypatch, message): - send_animation = message.bot.send_animation - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id animation = kwargs['animation'] == 'test_animation' @@ -859,19 +846,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and animation and reply and check_shortcut_call(kwargs, send_animation) + return id_ and animation and reply assert check_shortcut_signature( Message.reply_animation, Bot.send_animation, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_animation, message.bot, 'send_animation') monkeypatch.setattr(message.bot, 'send_animation', make_assertion) assert message.reply_animation(animation='test_animation') assert message.reply_animation(animation='test_animation', quote=True) def test_reply_sticker(self, monkeypatch, message): - send_sticker = message.bot.send_sticker - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id sticker = kwargs['sticker'] == 'test_sticker' @@ -879,19 +865,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and sticker and reply and check_shortcut_call(kwargs, send_sticker) + return id_ and sticker and reply assert check_shortcut_signature( Message.reply_sticker, Bot.send_sticker, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_sticker, message.bot, 'send_sticker') monkeypatch.setattr(message.bot, 'send_sticker', make_assertion) assert message.reply_sticker(sticker='test_sticker') assert message.reply_sticker(sticker='test_sticker', quote=True) def test_reply_video(self, monkeypatch, message): - send_video = message.bot.send_video - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id video = kwargs['video'] == 'test_video' @@ -899,19 +884,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and video and reply and check_shortcut_call(kwargs, send_video) + return id_ and video and reply assert check_shortcut_signature( Message.reply_video, Bot.send_video, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_video, message.bot, 'send_video') monkeypatch.setattr(message.bot, 'send_video', make_assertion) assert message.reply_video(video='test_video') assert message.reply_video(video='test_video', quote=True) def test_reply_video_note(self, monkeypatch, message): - send_video_note = message.bot.send_video_note - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id video_note = kwargs['video_note'] == 'test_video_note' @@ -919,19 +903,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and video_note and reply and check_shortcut_call(kwargs, send_video_note) + return id_ and video_note and reply assert check_shortcut_signature( Message.reply_video_note, Bot.send_video_note, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_video_note, message.bot, 'send_video_note') monkeypatch.setattr(message.bot, 'send_video_note', make_assertion) assert message.reply_video_note(video_note='test_video_note') assert message.reply_video_note(video_note='test_video_note', quote=True) def test_reply_voice(self, monkeypatch, message): - send_voice = message.bot.send_voice - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id voice = kwargs['voice'] == 'test_voice' @@ -939,19 +922,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and voice and reply and check_shortcut_call(kwargs, send_voice) + return id_ and voice and reply assert check_shortcut_signature( Message.reply_voice, Bot.send_voice, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_voice, message.bot, 'send_voice') monkeypatch.setattr(message.bot, 'send_voice', make_assertion) assert message.reply_voice(voice='test_voice') assert message.reply_voice(voice='test_voice', quote=True) def test_reply_location(self, monkeypatch, message): - send_location = message.bot.send_location - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id location = kwargs['location'] == 'test_location' @@ -959,19 +941,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and location and reply and check_shortcut_call(kwargs, send_location) + return id_ and location and reply assert check_shortcut_signature( Message.reply_location, Bot.send_location, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_location, message.bot, 'send_location') monkeypatch.setattr(message.bot, 'send_location', make_assertion) assert message.reply_location(location='test_location') assert message.reply_location(location='test_location', quote=True) def test_reply_venue(self, monkeypatch, message): - send_venue = message.bot.send_venue - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id venue = kwargs['venue'] == 'test_venue' @@ -979,19 +960,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and venue and reply and check_shortcut_call(kwargs, send_venue) + return id_ and venue and reply assert check_shortcut_signature( Message.reply_venue, Bot.send_venue, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_venue, message.bot, 'send_venue') monkeypatch.setattr(message.bot, 'send_venue', make_assertion) assert message.reply_venue(venue='test_venue') assert message.reply_venue(venue='test_venue', quote=True) def test_reply_contact(self, monkeypatch, message): - send_contact = message.bot.send_contact - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id contact = kwargs['contact'] == 'test_contact' @@ -999,19 +979,18 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and contact and reply and check_shortcut_call(kwargs, send_contact) + return id_ and contact and reply assert check_shortcut_signature( Message.reply_contact, Bot.send_contact, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_contact, message.bot, 'send_contact') monkeypatch.setattr(message.bot, 'send_contact', make_assertion) assert message.reply_contact(contact='test_contact') assert message.reply_contact(contact='test_contact', quote=True) def test_reply_poll(self, monkeypatch, message): - send_poll = message.bot.send_poll - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id question = kwargs['question'] == 'test_poll' @@ -1020,19 +999,16 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return ( - id_ and question and options and reply and check_shortcut_call(kwargs, send_poll) - ) + return id_ and question and options and reply assert check_shortcut_signature(Message.reply_poll, Bot.send_poll, ['chat_id'], ['quote']) + assert check_shortcut_call(message.reply_poll, message.bot, 'send_poll') monkeypatch.setattr(message.bot, 'send_poll', make_assertion) assert message.reply_poll(question='test_poll', options=['1', '2', '3']) assert message.reply_poll(question='test_poll', quote=True, options=['1', '2', '3']) def test_reply_dice(self, monkeypatch, message): - send_dice = message.bot.send_dice - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id contact = kwargs['disable_notification'] is True @@ -1040,48 +1016,43 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return id_ and contact and reply and check_shortcut_call(kwargs, send_dice) + return id_ and contact and reply assert check_shortcut_signature(Message.reply_dice, Bot.send_dice, ['chat_id'], ['quote']) + assert check_shortcut_call(message.reply_dice, message.bot, 'send_dice') monkeypatch.setattr(message.bot, 'send_dice', make_assertion) assert message.reply_dice(disable_notification=True) assert message.reply_dice(disable_notification=True, quote=True) def test_reply_action(self, monkeypatch, message: Message): - send_chat_action = message.bot.send_chat_action - def make_assertion(*_, **kwargs): id_ = kwargs['chat_id'] == message.chat_id action = kwargs['action'] == ChatAction.TYPING - return id_ and action and check_shortcut_call(kwargs, send_chat_action) + return id_ and action assert check_shortcut_signature( Message.reply_chat_action, Bot.send_chat_action, ['chat_id'], [] ) + assert check_shortcut_call(message.reply_chat_action, message.bot, 'send_chat_action') monkeypatch.setattr(message.bot, 'send_chat_action', make_assertion) assert message.reply_chat_action(action=ChatAction.TYPING) def test_reply_game(self, monkeypatch, message: Message): - send_game = message.bot.send_game - def make_assertion(*_, **kwargs): return ( - kwargs['chat_id'] == message.chat_id - and kwargs['game_short_name'] == 'test_game' - and check_shortcut_call(kwargs, send_game) + kwargs['chat_id'] == message.chat_id and kwargs['game_short_name'] == 'test_game' ) assert check_shortcut_signature(Message.reply_game, Bot.send_game, ['chat_id'], ['quote']) + assert check_shortcut_call(message.reply_game, message.bot, 'send_game') monkeypatch.setattr(message.bot, 'send_game', make_assertion) assert message.reply_game(game_short_name='test_game') assert message.reply_game(game_short_name='test_game', quote=True) def test_reply_invoice(self, monkeypatch, message: Message): - send_invoice = message.bot.send_invoice - def make_assertion(*_, **kwargs): title = kwargs['title'] == 'title' description = kwargs['description'] == 'description' @@ -1099,15 +1070,12 @@ def make_assertion(*_, **kwargs): and currency and prices ) - return ( - kwargs['chat_id'] == message.chat_id - and args - and check_shortcut_call(kwargs, send_invoice) - ) + return kwargs['chat_id'] == message.chat_id and args assert check_shortcut_signature( Message.reply_invoice, Bot.send_invoice, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.reply_invoice, message.bot, 'send_invoice') monkeypatch.setattr(message.bot, 'send_invoice', make_assertion) assert message.reply_invoice( @@ -1132,24 +1100,17 @@ def make_assertion(*_, **kwargs): @pytest.mark.parametrize('disable_notification', [False, True]) def test_forward(self, monkeypatch, message, disable_notification): - forward_message = message.bot.forward_message - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == 123456 from_chat = kwargs['from_chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id notification = kwargs['disable_notification'] == disable_notification - return ( - chat_id - and from_chat - and message_id - and notification - and check_shortcut_call(kwargs, forward_message) - ) + return chat_id and from_chat and message_id and notification assert check_shortcut_signature( Message.forward, Bot.forward_message, ['from_chat_id', 'message_id'], [] ) + assert check_shortcut_call(message.forward, message.bot, 'forward_message') monkeypatch.setattr(message.bot, 'forward_message', make_assertion) assert message.forward(123456, disable_notification=disable_notification) @@ -1158,7 +1119,6 @@ def make_assertion(*_, **kwargs): @pytest.mark.parametrize('disable_notification', [True, False]) def test_copy(self, monkeypatch, message, disable_notification): keyboard = [[1, 2]] - copy_message = message.bot.copy_message def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == 123456 @@ -1169,18 +1129,12 @@ def make_assertion(*_, **kwargs): reply_markup = kwargs['reply_markup'] is keyboard else: reply_markup = True - return ( - chat_id - and from_chat - and message_id - and notification - and reply_markup - and check_shortcut_call(kwargs, copy_message) - ) + return chat_id and from_chat and message_id and notification and reply_markup assert check_shortcut_signature( Message.copy, Bot.copy_message, ['from_chat_id', 'message_id'], [] ) + assert check_shortcut_call(message.copy, message.bot, 'copy_message') monkeypatch.setattr(message.bot, 'copy_message', make_assertion) assert message.copy(123456, disable_notification=disable_notification) @@ -1192,7 +1146,6 @@ def make_assertion(*_, **kwargs): @pytest.mark.parametrize('disable_notification', [True, False]) def test_reply_copy(self, monkeypatch, message, disable_notification): keyboard = [[1, 2]] - copy_message = message.bot.copy_message def make_assertion(*_, **kwargs): chat_id = kwargs['from_chat_id'] == 123456 @@ -1207,19 +1160,12 @@ def make_assertion(*_, **kwargs): reply = kwargs['reply_to_message_id'] == message.message_id else: reply = True - return ( - chat_id - and from_chat - and message_id - and notification - and reply_markup - and reply - and check_shortcut_call(kwargs, copy_message) - ) + return chat_id and from_chat and message_id and notification and reply_markup and reply assert check_shortcut_signature( Message.reply_copy, Bot.copy_message, ['chat_id'], ['quote'] ) + assert check_shortcut_call(message.copy, message.bot, 'copy_message') monkeypatch.setattr(message.bot, 'copy_message', make_assertion) assert message.reply_copy(123456, 456789, disable_notification=disable_notification) @@ -1238,15 +1184,11 @@ def make_assertion(*_, **kwargs): ) def test_edit_text(self, monkeypatch, message): - edit_message_text = message.bot.edit_message_text - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id text = kwargs['text'] == 'test' - return ( - chat_id and message_id and text and check_shortcut_call(kwargs, edit_message_text) - ) + return chat_id and message_id and text assert check_shortcut_signature( Message.edit_text, @@ -1254,23 +1196,19 @@ def make_assertion(*_, **kwargs): ['chat_id', 'message_id', 'inline_message_id'], [], ) + assert check_shortcut_call( + message.edit_text, message.bot, 'edit_message_text', skip_params=['inline_message_id'] + ) monkeypatch.setattr(message.bot, 'edit_message_text', make_assertion) assert message.edit_text(text='test') def test_edit_caption(self, monkeypatch, message): - edit_message_caption = message.bot.edit_message_caption - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id caption = kwargs['caption'] == 'new caption' - return ( - chat_id - and message_id - and caption - and check_shortcut_call(kwargs, edit_message_caption) - ) + return chat_id and message_id and caption assert check_shortcut_signature( Message.edit_caption, @@ -1278,23 +1216,22 @@ def make_assertion(*_, **kwargs): ['chat_id', 'message_id', 'inline_message_id'], [], ) + assert check_shortcut_call( + message.edit_caption, + message.bot, + 'edit_message_caption', + skip_params=['inline_message_id'], + ) monkeypatch.setattr(message.bot, 'edit_message_caption', make_assertion) assert message.edit_caption(caption='new caption') def test_edit_media(self, monkeypatch, message): - edit_message_media = message.bot.edit_message_media - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id media = kwargs['media'] == 'my_media' - return ( - chat_id - and message_id - and media - and check_shortcut_call(kwargs, edit_message_media) - ) + return chat_id and message_id and media assert check_shortcut_signature( Message.edit_media, @@ -1302,23 +1239,22 @@ def make_assertion(*_, **kwargs): ['chat_id', 'message_id', 'inline_message_id'], [], ) + assert check_shortcut_call( + message.edit_media, + message.bot, + 'edit_message_media', + skip_params=['inline_message_id'], + ) monkeypatch.setattr(message.bot, 'edit_message_media', make_assertion) assert message.edit_media('my_media') def test_edit_reply_markup(self, monkeypatch, message): - edit_message_reply_markup = message.bot.edit_message_reply_markup - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id reply_markup = kwargs['reply_markup'] == [['1', '2']] - return ( - chat_id - and message_id - and reply_markup - and check_shortcut_call(kwargs, edit_message_reply_markup) - ) + return chat_id and message_id and reply_markup assert check_shortcut_signature( Message.edit_reply_markup, @@ -1326,25 +1262,23 @@ def make_assertion(*_, **kwargs): ['chat_id', 'message_id', 'inline_message_id'], [], ) + assert check_shortcut_call( + message.edit_reply_markup, + message.bot, + 'edit_message_reply_markup', + skip_params=['inline_message_id'], + ) monkeypatch.setattr(message.bot, 'edit_message_reply_markup', make_assertion) assert message.edit_reply_markup(reply_markup=[['1', '2']]) def test_edit_live_location(self, monkeypatch, message): - edit_message_live_location = message.bot.edit_message_live_location - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id latitude = kwargs['latitude'] == 1 longitude = kwargs['longitude'] == 2 - return ( - chat_id - and message_id - and longitude - and latitude - and check_shortcut_call(kwargs, edit_message_live_location) - ) + return chat_id and message_id and longitude and latitude assert check_shortcut_signature( Message.edit_live_location, @@ -1352,19 +1286,21 @@ def make_assertion(*_, **kwargs): ['chat_id', 'message_id', 'inline_message_id'], [], ) + assert check_shortcut_call( + message.edit_live_location, + message.bot, + 'edit_message_live_location', + skip_params=['inline_message_id'], + ) monkeypatch.setattr(message.bot, 'edit_message_live_location', make_assertion) assert message.edit_live_location(latitude=1, longitude=2) def test_stop_live_location(self, monkeypatch, message): - stop_message_live_location = message.bot.stop_message_live_location - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id - return ( - chat_id and message_id and check_shortcut_call(kwargs, stop_message_live_location) - ) + return chat_id and message_id assert check_shortcut_signature( Message.stop_live_location, @@ -1372,25 +1308,23 @@ def make_assertion(*_, **kwargs): ['chat_id', 'message_id', 'inline_message_id'], [], ) + assert check_shortcut_call( + message.stop_live_location, + message.bot, + 'stop_message_live_location', + skip_params=['inline_message_id'], + ) monkeypatch.setattr(message.bot, 'stop_message_live_location', make_assertion) assert message.stop_live_location() def test_set_game_score(self, monkeypatch, message): - set_game_score = message.bot.set_game_score - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id user_id = kwargs['user_id'] == 1 score = kwargs['score'] == 2 - return ( - chat_id - and message_id - and user_id - and score - and check_shortcut_call(kwargs, set_game_score) - ) + return chat_id and message_id and user_id and score assert check_shortcut_signature( Message.set_game_score, @@ -1398,23 +1332,22 @@ def make_assertion(*_, **kwargs): ['chat_id', 'message_id', 'inline_message_id'], [], ) + assert check_shortcut_call( + message.set_game_score, + message.bot, + 'set_game_score', + skip_params=['inline_message_id'], + ) monkeypatch.setattr(message.bot, 'set_game_score', make_assertion) assert message.set_game_score(user_id=1, score=2) def test_get_game_high_scores(self, monkeypatch, message): - get_game_high_scores = message.bot.get_game_high_scores - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id user_id = kwargs['user_id'] == 1 - return ( - chat_id - and message_id - and user_id - and check_shortcut_call(kwargs, get_game_high_scores) - ) + return chat_id and message_id and user_id assert check_shortcut_signature( Message.get_game_high_scores, @@ -1422,66 +1355,68 @@ def make_assertion(*_, **kwargs): ['chat_id', 'message_id', 'inline_message_id'], [], ) + assert check_shortcut_call( + message.get_game_high_scores, + message.bot, + 'get_game_high_scores', + skip_params=['inline_message_id'], + ) monkeypatch.setattr(message.bot, 'get_game_high_scores', make_assertion) assert message.get_game_high_scores(user_id=1) def test_delete(self, monkeypatch, message): - delete_message = message.bot.delete_message - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id - return chat_id and message_id and check_shortcut_call(kwargs, delete_message) + return chat_id and message_id assert check_shortcut_signature( Message.delete, Bot.delete_message, ['chat_id', 'message_id'], [] ) + assert check_shortcut_call(message.delete, message.bot, 'delete_message') monkeypatch.setattr(message.bot, 'delete_message', make_assertion) assert message.delete() def test_stop_poll(self, monkeypatch, message): - stop_poll = message.bot.stop_poll - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id - return chat_id and message_id and check_shortcut_call(kwargs, stop_poll) + return chat_id and message_id assert check_shortcut_signature( Message.stop_poll, Bot.stop_poll, ['chat_id', 'message_id'], [] ) + assert check_shortcut_call(message.stop_poll, message.bot, 'stop_poll') monkeypatch.setattr(message.bot, 'stop_poll', make_assertion) assert message.stop_poll() def test_pin(self, monkeypatch, message): - pin_chat_message = message.bot.pin_chat_message - def make_assertion(*args, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id - return chat_id and message_id and check_shortcut_call(kwargs, pin_chat_message) + return chat_id and message_id assert check_shortcut_signature( Message.pin, Bot.pin_chat_message, ['chat_id', 'message_id'], [] ) + assert check_shortcut_call(message.pin, message.bot, 'pin_chat_message') monkeypatch.setattr(message.bot, 'pin_chat_message', make_assertion) assert message.pin() def test_unpin(self, monkeypatch, message): - unpin_chat_message = message.bot.unpin_chat_message - def make_assertion(*args, **kwargs): chat_id = kwargs['chat_id'] == message.chat_id message_id = kwargs['message_id'] == message.message_id - return chat_id and message_id and check_shortcut_call(kwargs, unpin_chat_message) + return chat_id and message_id assert check_shortcut_signature( Message.unpin, Bot.unpin_chat_message, ['chat_id', 'message_id'], [] ) + assert check_shortcut_call(message.unpin, message.bot, 'unpin_chat_message') monkeypatch.setattr(message.bot, 'unpin_chat_message', make_assertion) assert message.unpin() diff --git a/tests/test_passportfile.py b/tests/test_passportfile.py index ac9af58d7f5..d6fcafce466 100644 --- a/tests/test_passportfile.py +++ b/tests/test_passportfile.py @@ -56,16 +56,13 @@ def test_to_dict(self, passport_file): assert passport_file_dict['file_date'] == passport_file.file_date def test_get_file_instance_method(self, monkeypatch, passport_file): - get_file = passport_file.bot.get_file - def make_assertion(*_, **kwargs): - result = kwargs['file_id'] == passport_file.file_id and check_shortcut_call( - kwargs, get_file - ) + result = kwargs['file_id'] == passport_file.file_id # we need to be a bit hacky here, b/c PF.get_file needs Bot.get_file to return a File return File(file_id=result, file_unique_id=result) assert check_shortcut_signature(PassportFile.get_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(passport_file.get_file, passport_file.bot, 'get_file') monkeypatch.setattr(passport_file.bot, 'get_file', make_assertion) assert passport_file.get_file().file_id == 'True' diff --git a/tests/test_photo.py b/tests/test_photo.py index 9969dc5f1cb..8cf31fe6ad0 100644 --- a/tests/test_photo.py +++ b/tests/test_photo.py @@ -465,14 +465,13 @@ def test_error_without_required_args(self, bot, chat_id): bot.send_photo(chat_id=chat_id) def test_get_file_instance_method(self, monkeypatch, photo): - get_file = photo.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == photo.file_id and check_shortcut_call(kwargs, get_file) + return kwargs['file_id'] == photo.file_id assert check_shortcut_signature(PhotoSize.get_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(photo.get_file, photo.bot, 'get_file') - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(photo.bot, 'get_file', make_assertion) assert photo.get_file() def test_equality(self, photo): diff --git a/tests/test_precheckoutquery.py b/tests/test_precheckoutquery.py index d594a2f5a04..19bb319d862 100644 --- a/tests/test_precheckoutquery.py +++ b/tests/test_precheckoutquery.py @@ -80,16 +80,17 @@ def test_to_dict(self, pre_checkout_query): assert pre_checkout_query_dict['order_info'] == pre_checkout_query.order_info.to_dict() def test_answer(self, monkeypatch, pre_checkout_query): - answer_pre_checkout_query = pre_checkout_query.bot.answer_pre_checkout_query - def make_assertion(*_, **kwargs): - return kwargs[ - 'pre_checkout_query_id' - ] == pre_checkout_query.id and check_shortcut_call(kwargs, answer_pre_checkout_query) + return kwargs['pre_checkout_query_id'] == pre_checkout_query.id assert check_shortcut_signature( PreCheckoutQuery.answer, Bot.answer_pre_checkout_query, ['pre_checkout_query_id'], [] ) + assert check_shortcut_call( + pre_checkout_query.answer, + pre_checkout_query.bot, + 'answer_pre_checkout_query', + ) monkeypatch.setattr(pre_checkout_query.bot, 'answer_pre_checkout_query', make_assertion) assert pre_checkout_query.answer(ok=True) diff --git a/tests/test_shippingquery.py b/tests/test_shippingquery.py index 49b75523013..0c7af75992c 100644 --- a/tests/test_shippingquery.py +++ b/tests/test_shippingquery.py @@ -65,16 +65,15 @@ def test_to_dict(self, shipping_query): assert shipping_query_dict['shipping_address'] == shipping_query.shipping_address.to_dict() def test_answer(self, monkeypatch, shipping_query): - answer_shipping_query = shipping_query.bot.answer_shipping_query - def make_assertion(*_, **kwargs): - return kwargs['shipping_query_id'] == shipping_query.id and check_shortcut_call( - kwargs, answer_shipping_query - ) + return kwargs['shipping_query_id'] == shipping_query.id assert check_shortcut_signature( ShippingQuery.answer, Bot.answer_shipping_query, ['shipping_query_id'], [] ) + assert check_shortcut_call( + shipping_query.answer, shipping_query.bot, 'answer_shipping_query' + ) monkeypatch.setattr(shipping_query.bot, 'answer_shipping_query', make_assertion) assert shipping_query.answer(ok=True) diff --git a/tests/test_sticker.py b/tests/test_sticker.py index 3d8e3abac63..2e6b7463bf5 100644 --- a/tests/test_sticker.py +++ b/tests/test_sticker.py @@ -505,14 +505,13 @@ def make_assertion(_, data, *args, **kwargs): assert test_flag def test_get_file_instance_method(self, monkeypatch, sticker): - get_file = sticker.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == sticker.file_id and check_shortcut_call(kwargs, get_file) + return kwargs['file_id'] == sticker.file_id assert check_shortcut_signature(Sticker.get_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(sticker.get_file, sticker.bot, 'get_file') - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(sticker.bot, 'get_file', make_assertion) assert sticker.get_file() def test_equality(self): diff --git a/tests/test_user.py b/tests/test_user.py index ce18d2c01ca..7b462d6a80a 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -129,197 +129,146 @@ def test_link(self, user): assert user.link is None def test_instance_method_get_profile_photos(self, monkeypatch, user): - get_profile_photos = user.bot.get_user_profile_photos - def make_assertion(*_, **kwargs): - return kwargs['user_id'] == user.id and check_shortcut_call(kwargs, get_profile_photos) + return kwargs['user_id'] == user.id assert check_shortcut_signature( User.get_profile_photos, Bot.get_user_profile_photos, ['user_id'], [] ) + assert check_shortcut_call(user.get_profile_photos, user.bot, 'get_user_profile_photos') monkeypatch.setattr(user.bot, 'get_user_profile_photos', make_assertion) assert user.get_profile_photos() def test_instance_method_pin_message(self, monkeypatch, user): - pin_message = user.bot.pin_chat_message - def make_assertion(*_, **kwargs): - return kwargs['chat_id'] == user.id and check_shortcut_call(kwargs, pin_message) + return kwargs['chat_id'] == user.id assert check_shortcut_signature(User.pin_message, Bot.pin_chat_message, ['chat_id'], []) + assert check_shortcut_call(user.pin_message, user.bot, 'pin_chat_message') monkeypatch.setattr(user.bot, 'pin_chat_message', make_assertion) assert user.pin_message(1) def test_instance_method_unpin_message(self, monkeypatch, user): - unpin_message = user.bot.unpin_chat_message - def make_assertion(*_, **kwargs): - return kwargs['chat_id'] == user.id and check_shortcut_call(kwargs, unpin_message) + return kwargs['chat_id'] == user.id assert check_shortcut_signature( User.unpin_message, Bot.unpin_chat_message, ['chat_id'], [] ) + assert check_shortcut_call(user.unpin_message, user.bot, 'unpin_chat_message') monkeypatch.setattr(user.bot, 'unpin_chat_message', make_assertion) assert user.unpin_message() def test_instance_method_unpin_all_messages(self, monkeypatch, user): - unpin_all_messages = user.bot.unpin_all_chat_messages - def make_assertion(*_, **kwargs): - return kwargs['chat_id'] == user.id and check_shortcut_call(kwargs, unpin_all_messages) + return kwargs['chat_id'] == user.id assert check_shortcut_signature( User.unpin_all_messages, Bot.unpin_all_chat_messages, ['chat_id'], [] ) + assert check_shortcut_call(user.unpin_all_messages, user.bot, 'unpin_all_chat_messages') monkeypatch.setattr(user.bot, 'unpin_all_chat_messages', make_assertion) assert user.unpin_all_messages() def test_instance_method_send_message(self, monkeypatch, user): - send_message = user.bot.send_message - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['text'] == 'test' - and check_shortcut_call(kwargs, send_message) - ) + return kwargs['chat_id'] == user.id and kwargs['text'] == 'test' assert check_shortcut_signature(User.send_message, Bot.send_message, ['chat_id'], []) + assert check_shortcut_call(user.send_message, user.bot, 'send_message') monkeypatch.setattr(user.bot, 'send_message', make_assertion) assert user.send_message('test') def test_instance_method_send_photo(self, monkeypatch, user): - send_photo = user.bot.send_photo - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['photo'] == 'test_photo' - and check_shortcut_call(kwargs, send_photo) - ) + return kwargs['chat_id'] == user.id and kwargs['photo'] == 'test_photo' assert check_shortcut_signature(User.send_photo, Bot.send_photo, ['chat_id'], []) + assert check_shortcut_call(user.send_photo, user.bot, 'send_photo') monkeypatch.setattr(user.bot, 'send_photo', make_assertion) assert user.send_photo('test_photo') def test_instance_method_send_media_group(self, monkeypatch, user): - send_media_group = user.bot.send_media_group - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['media'] == 'test_media_group' - and check_shortcut_call(kwargs, send_media_group) - ) + return kwargs['chat_id'] == user.id and kwargs['media'] == 'test_media_group' assert check_shortcut_signature( User.send_media_group, Bot.send_media_group, ['chat_id'], [] ) + assert check_shortcut_call(user.send_media_group, user.bot, 'send_media_group') monkeypatch.setattr(user.bot, 'send_media_group', make_assertion) assert user.send_media_group('test_media_group') def test_instance_method_send_audio(self, monkeypatch, user): - send_audio = user.bot.send_audio - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['audio'] == 'test_audio' - and check_shortcut_call(kwargs, send_audio) - ) + return kwargs['chat_id'] == user.id and kwargs['audio'] == 'test_audio' assert check_shortcut_signature(User.send_audio, Bot.send_audio, ['chat_id'], []) + assert check_shortcut_call(user.send_audio, user.bot, 'send_audio') monkeypatch.setattr(user.bot, 'send_audio', make_assertion) assert user.send_audio('test_audio') def test_instance_method_send_chat_action(self, monkeypatch, user): - send_chat_action = user.bot.send_chat_action - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['action'] == 'test_chat_action' - and check_shortcut_call(kwargs, send_chat_action) - ) + return kwargs['chat_id'] == user.id and kwargs['action'] == 'test_chat_action' assert check_shortcut_signature( User.send_chat_action, Bot.send_chat_action, ['chat_id'], [] ) + assert check_shortcut_call(user.send_chat_action, user.bot, 'send_chat_action') monkeypatch.setattr(user.bot, 'send_chat_action', make_assertion) assert user.send_chat_action('test_chat_action') def test_instance_method_send_contact(self, monkeypatch, user): - send_contact = user.bot.send_contact - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['phone_number'] == 'test_contact' - and check_shortcut_call(kwargs, send_contact) - ) + return kwargs['chat_id'] == user.id and kwargs['phone_number'] == 'test_contact' assert check_shortcut_signature(User.send_contact, Bot.send_contact, ['chat_id'], []) + assert check_shortcut_call(user.send_contact, user.bot, 'send_contact') monkeypatch.setattr(user.bot, 'send_contact', make_assertion) assert user.send_contact(phone_number='test_contact') def test_instance_method_send_dice(self, monkeypatch, user): - send_dice = user.bot.send_dice - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['emoji'] == 'test_dice' - and check_shortcut_call(kwargs, send_dice) - ) + return kwargs['chat_id'] == user.id and kwargs['emoji'] == 'test_dice' assert check_shortcut_signature(User.send_dice, Bot.send_dice, ['chat_id'], []) + assert check_shortcut_call(user.send_dice, user.bot, 'send_dice') monkeypatch.setattr(user.bot, 'send_dice', make_assertion) assert user.send_dice(emoji='test_dice') def test_instance_method_send_document(self, monkeypatch, user): - send_document = user.bot.send_document - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['document'] == 'test_document' - and check_shortcut_call(kwargs, send_document) - ) + return kwargs['chat_id'] == user.id and kwargs['document'] == 'test_document' assert check_shortcut_signature(User.send_document, Bot.send_document, ['chat_id'], []) + assert check_shortcut_call(user.send_document, user.bot, 'send_document') monkeypatch.setattr(user.bot, 'send_document', make_assertion) assert user.send_document('test_document') def test_instance_method_send_game(self, monkeypatch, user): - send_game = user.bot.send_game - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['game_short_name'] == 'test_game' - and check_shortcut_call(kwargs, send_game) - ) + return kwargs['chat_id'] == user.id and kwargs['game_short_name'] == 'test_game' assert check_shortcut_signature(User.send_game, Bot.send_game, ['chat_id'], []) + assert check_shortcut_call(user.send_game, user.bot, 'send_game') monkeypatch.setattr(user.bot, 'send_game', make_assertion) assert user.send_game(game_short_name='test_game') def test_instance_method_send_invoice(self, monkeypatch, user): - send_invoice = user.bot.send_invoice - def make_assertion(*_, **kwargs): title = kwargs['title'] == 'title' description = kwargs['description'] == 'description' @@ -337,11 +286,10 @@ def make_assertion(*_, **kwargs): and currency and prices ) - return ( - kwargs['chat_id'] == user.id and args and check_shortcut_call(kwargs, send_invoice) - ) + return kwargs['chat_id'] == user.id and args assert check_shortcut_signature(User.send_invoice, Bot.send_invoice, ['chat_id'], []) + assert check_shortcut_call(user.send_invoice, user.bot, 'send_invoice') monkeypatch.setattr(user.bot, 'send_invoice', make_assertion) assert user.send_invoice( @@ -355,151 +303,107 @@ def make_assertion(*_, **kwargs): ) def test_instance_method_send_location(self, monkeypatch, user): - send_location = user.bot.send_location - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['latitude'] == 'test_location' - and check_shortcut_call(kwargs, send_location) - ) + return kwargs['chat_id'] == user.id and kwargs['latitude'] == 'test_location' assert check_shortcut_signature(User.send_location, Bot.send_location, ['chat_id'], []) + assert check_shortcut_call(user.send_location, user.bot, 'send_location') monkeypatch.setattr(user.bot, 'send_location', make_assertion) assert user.send_location('test_location') def test_instance_method_send_sticker(self, monkeypatch, user): - send_sticker = user.bot.send_sticker - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['sticker'] == 'test_sticker' - and check_shortcut_call(kwargs, send_sticker) - ) + return kwargs['chat_id'] == user.id and kwargs['sticker'] == 'test_sticker' assert check_shortcut_signature(User.send_sticker, Bot.send_sticker, ['chat_id'], []) + assert check_shortcut_call(user.send_sticker, user.bot, 'send_sticker') monkeypatch.setattr(user.bot, 'send_sticker', make_assertion) assert user.send_sticker('test_sticker') def test_instance_method_send_video(self, monkeypatch, user): - send_video = user.bot.send_video - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['video'] == 'test_video' - and check_shortcut_call(kwargs, send_video) - ) + return kwargs['chat_id'] == user.id and kwargs['video'] == 'test_video' assert check_shortcut_signature(User.send_video, Bot.send_video, ['chat_id'], []) + assert check_shortcut_call(user.send_video, user.bot, 'send_video') monkeypatch.setattr(user.bot, 'send_video', make_assertion) assert user.send_video('test_video') def test_instance_method_send_venue(self, monkeypatch, user): - send_venue = user.bot.send_venue - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['title'] == 'test_venue' - and check_shortcut_call(kwargs, send_venue) - ) + return kwargs['chat_id'] == user.id and kwargs['title'] == 'test_venue' assert check_shortcut_signature(User.send_venue, Bot.send_venue, ['chat_id'], []) + assert check_shortcut_call(user.send_venue, user.bot, 'send_venue') monkeypatch.setattr(user.bot, 'send_venue', make_assertion) assert user.send_venue(title='test_venue') def test_instance_method_send_video_note(self, monkeypatch, user): - send_video_note = user.bot.send_video_note - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['video_note'] == 'test_video_note' - and check_shortcut_call(kwargs, send_video_note) - ) + return kwargs['chat_id'] == user.id and kwargs['video_note'] == 'test_video_note' assert check_shortcut_signature(User.send_video_note, Bot.send_video_note, ['chat_id'], []) + assert check_shortcut_call(user.send_video_note, user.bot, 'send_video_note') monkeypatch.setattr(user.bot, 'send_video_note', make_assertion) assert user.send_video_note('test_video_note') def test_instance_method_send_voice(self, monkeypatch, user): - send_voice = user.bot.send_voice - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['voice'] == 'test_voice' - and check_shortcut_call(kwargs, send_voice) - ) + return kwargs['chat_id'] == user.id and kwargs['voice'] == 'test_voice' assert check_shortcut_signature(User.send_voice, Bot.send_voice, ['chat_id'], []) + assert check_shortcut_call(user.send_voice, user.bot, 'send_voice') monkeypatch.setattr(user.bot, 'send_voice', make_assertion) assert user.send_voice('test_voice') def test_instance_method_send_animation(self, monkeypatch, user): - send_animation = user.bot.send_animation - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['animation'] == 'test_animation' - and check_shortcut_call(kwargs, send_animation) - ) + return kwargs['chat_id'] == user.id and kwargs['animation'] == 'test_animation' assert check_shortcut_signature(User.send_animation, Bot.send_animation, ['chat_id'], []) + assert check_shortcut_call(user.send_animation, user.bot, 'send_animation') monkeypatch.setattr(user.bot, 'send_animation', make_assertion) assert user.send_animation('test_animation') def test_instance_method_send_poll(self, monkeypatch, user): - send_poll = user.bot.send_poll - def make_assertion(*_, **kwargs): - return ( - kwargs['chat_id'] == user.id - and kwargs['question'] == 'test_poll' - and check_shortcut_call(kwargs, send_poll) - ) + return kwargs['chat_id'] == user.id and kwargs['question'] == 'test_poll' assert check_shortcut_signature(User.send_poll, Bot.send_poll, ['chat_id'], []) + assert check_shortcut_call(user.send_poll, user.bot, 'send_poll') monkeypatch.setattr(user.bot, 'send_poll', make_assertion) assert user.send_poll(question='test_poll', options=[1, 2]) def test_instance_method_send_copy(self, monkeypatch, user): - send_copy = user.bot.copy_message - def make_assertion(*_, **kwargs): user_id = kwargs['chat_id'] == user.id message_id = kwargs['message_id'] == 'message_id' from_chat_id = kwargs['from_chat_id'] == 'from_chat_id' - return ( - from_chat_id and message_id and user_id and check_shortcut_call(kwargs, send_copy) - ) + return from_chat_id and message_id and user_id assert check_shortcut_signature(User.send_copy, Bot.copy_message, ['chat_id'], []) + assert check_shortcut_call(user.copy_message, user.bot, 'copy_message') monkeypatch.setattr(user.bot, 'copy_message', make_assertion) assert user.send_copy(from_chat_id='from_chat_id', message_id='message_id') def test_instance_method_copy_message(self, monkeypatch, user): - copy_message = user.bot.copy_message - def make_assertion(*_, **kwargs): chat_id = kwargs['chat_id'] == 'chat_id' message_id = kwargs['message_id'] == 'message_id' user_id = kwargs['from_chat_id'] == user.id - return chat_id and message_id and user_id and check_shortcut_call(kwargs, copy_message) + return chat_id and message_id and user_id assert check_shortcut_signature(User.copy_message, Bot.copy_message, ['from_chat_id'], []) + assert check_shortcut_call(user.copy_message, user.bot, 'copy_message') monkeypatch.setattr(user.bot, 'copy_message', make_assertion) assert user.copy_message(chat_id='chat_id', message_id='message_id') diff --git a/tests/test_video.py b/tests/test_video.py index ec9f486a8d3..c1061f672a3 100644 --- a/tests/test_video.py +++ b/tests/test_video.py @@ -330,14 +330,13 @@ def test_error_without_required_args(self, bot, chat_id): bot.send_video(chat_id=chat_id) def test_get_file_instance_method(self, monkeypatch, video): - get_file = video.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == video.file_id and check_shortcut_call(kwargs, get_file) + return kwargs['file_id'] == video.file_id assert check_shortcut_signature(Video.get_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(video.get_file, video.bot, 'get_file') - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(video.bot, 'get_file', make_assertion) assert video.get_file() def test_equality(self, video): diff --git a/tests/test_videonote.py b/tests/test_videonote.py index e93c3e879d1..57573be4d3c 100644 --- a/tests/test_videonote.py +++ b/tests/test_videonote.py @@ -228,16 +228,13 @@ def test_error_without_required_args(self, bot, chat_id): bot.send_video_note(chat_id=chat_id) def test_get_file_instance_method(self, monkeypatch, video_note): - get_file = video_note.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == video_note.file_id and check_shortcut_call( - kwargs, get_file - ) + return kwargs['file_id'] == video_note.file_id assert check_shortcut_signature(VideoNote.get_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(video_note.get_file, video_note.bot, 'get_file') - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(video_note.bot, 'get_file', make_assertion) assert video_note.get_file() def test_equality(self, video_note): diff --git a/tests/test_voice.py b/tests/test_voice.py index 6ff2bd269e5..06cb78f73dc 100644 --- a/tests/test_voice.py +++ b/tests/test_voice.py @@ -284,14 +284,13 @@ def test_error_without_required_args(self, bot, chat_id): bot.sendVoice(chat_id) def test_get_file_instance_method(self, monkeypatch, voice): - get_file = voice.bot.get_file - def make_assertion(*_, **kwargs): - return kwargs['file_id'] == voice.file_id and check_shortcut_call(kwargs, get_file) + return kwargs['file_id'] == voice.file_id assert check_shortcut_signature(Voice.get_file, Bot.get_file, ['file_id'], []) + assert check_shortcut_call(voice.get_file, voice.bot, 'get_file') - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(voice.bot, 'get_file', make_assertion) assert voice.get_file() def test_equality(self, voice): From 043ee3484decdc9d80cd61b6cc91ee637843633a Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sat, 6 Feb 2021 18:59:52 +0100 Subject: [PATCH 05/23] Further improve check_shortcut_call tests --- tests/conftest.py | 22 ++++++++++++++++------ tests/test_callbackquery.py | 19 ++++++++++++++++++- tests/test_message.py | 20 ++++++++++++++++++-- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 4ce9a627219..64f53445deb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -414,6 +414,7 @@ def check_shortcut_call( bot: Bot, bot_method_name: str, skip_params: Iterable[str] = None, + shortcut_kwargs: Iterable[str] = None, ) -> bool: """ Checks that a shortcut passes all the existing arguments to the underlying bot method. Use as:: @@ -425,29 +426,38 @@ def check_shortcut_call( bot: The bot bot_method_name: The bot methods name, e.g. `'send_message'` skip_params: Parameters that are allowed to be missing, e.g. `['inline_message_id']` + shortcut_kwargs: The kwargs passed by the shortcut directly, e.g. ``chat_id`` Returns: :obj:`bool` """ if not skip_params: skip_params = set() + if not shortcut_kwargs: + shortcut_kwargs = set() orig_bot_method = getattr(bot, bot_method_name) bot_signature = inspect.signature(orig_bot_method) expected_args = set(bot_signature.parameters.keys()).difference(['self']) - set(skip_params) + positional_args = { + name for name, param in bot_signature.parameters.items() if param.default == param.empty + } + ignored_args = positional_args | set(shortcut_kwargs) shortcut_signature = inspect.signature(shortcut_method) # auto_pagination: Special casing for InlineQuery.answer - kwargs = {name: True for name in shortcut_signature.parameters if name != 'auto_pagination'} + kwargs = {name: name for name in shortcut_signature.parameters if name != 'auto_pagination'} def make_assertion(**kw): - # "if value" makes sure that value is not None, False or DEFAULT_{NONE, FALSE} - # That will be the case for all args passed by the shortcuts directly (e.g. self.chat_id) - # and for the args set in kwargs above - received_kwargs = {param for param, value in kw.items() if value} + # name == value makes sure that + # a) we receive non-None input for all parameters + # b) we receive the correct input for each kwarg + received_kwargs = { + name for name, value in kw.items() if name in ignored_args or value == name + } if not received_kwargs == expected_args: pytest.fail( - f'{orig_bot_method.__name__} did not receive the parameters ' + f'{orig_bot_method.__name__} did not receive correct value for the parameters ' f'{expected_args - received_kwargs}' ) diff --git a/tests/test_callbackquery.py b/tests/test_callbackquery.py index 8a7662fb236..434cf48c072 100644 --- a/tests/test_callbackquery.py +++ b/tests/test_callbackquery.py @@ -56,6 +56,12 @@ def skip_params(callback_query: CallbackQuery): return {'message_id', 'chat_id'} return {'inline_message_id'} + @staticmethod + def shortcut_kwargs(callback_query: CallbackQuery): + if not callback_query.inline_message_id: + return {'message_id', 'chat_id'} + return {'inline_message_id'} + @staticmethod def check_passed_ids(callback_query: CallbackQuery, kwargs): if callback_query.inline_message_id: @@ -134,6 +140,7 @@ def make_assertion(*_, **kwargs): callback_query.bot, 'edit_message_text', skip_params=self.skip_params(callback_query), + shortcut_kwargs=self.shortcut_kwargs(callback_query), ) monkeypatch.setattr(callback_query.bot, 'edit_message_text', make_assertion) @@ -157,6 +164,7 @@ def make_assertion(*_, **kwargs): callback_query.bot, 'edit_message_caption', skip_params=self.skip_params(callback_query), + shortcut_kwargs=self.shortcut_kwargs(callback_query), ) monkeypatch.setattr(callback_query.bot, 'edit_message_caption', make_assertion) @@ -180,6 +188,7 @@ def make_assertion(*_, **kwargs): callback_query.bot, 'edit_message_reply_markup', skip_params=self.skip_params(callback_query), + shortcut_kwargs=self.shortcut_kwargs(callback_query), ) monkeypatch.setattr(callback_query.bot, 'edit_message_reply_markup', make_assertion) @@ -203,6 +212,7 @@ def make_assertion(*_, **kwargs): callback_query.bot, 'edit_message_media', skip_params=self.skip_params(callback_query), + shortcut_kwargs=self.shortcut_kwargs(callback_query), ) monkeypatch.setattr(callback_query.bot, 'edit_message_media', make_assertion) @@ -227,6 +237,7 @@ def make_assertion(*_, **kwargs): callback_query.bot, 'edit_message_live_location', skip_params=self.skip_params(callback_query), + shortcut_kwargs=self.shortcut_kwargs(callback_query), ) monkeypatch.setattr(callback_query.bot, 'edit_message_live_location', make_assertion) @@ -249,6 +260,7 @@ def make_assertion(*_, **kwargs): callback_query.bot, 'stop_message_live_location', skip_params=self.skip_params(callback_query), + shortcut_kwargs=self.shortcut_kwargs(callback_query), ) monkeypatch.setattr(callback_query.bot, 'stop_message_live_location', make_assertion) @@ -272,6 +284,7 @@ def make_assertion(*_, **kwargs): callback_query.bot, 'set_game_score', skip_params=self.skip_params(callback_query), + shortcut_kwargs=self.shortcut_kwargs(callback_query), ) monkeypatch.setattr(callback_query.bot, 'set_game_score', make_assertion) @@ -295,6 +308,7 @@ def make_assertion(*_, **kwargs): callback_query.bot, 'get_game_high_scores', skip_params=self.skip_params(callback_query), + shortcut_kwargs=self.shortcut_kwargs(callback_query), ) monkeypatch.setattr(callback_query.bot, 'get_game_high_scores', make_assertion) @@ -357,7 +371,10 @@ def make_assertion(*args, **kwargs): [], ) assert check_shortcut_call( - callback_query.unpin_message, callback_query.bot, 'unpin_chat_message' + callback_query.unpin_message, + callback_query.bot, + 'unpin_chat_message', + shortcut_kwargs=['message_id', 'chat_id'], ) monkeypatch.setattr(callback_query.bot, 'unpin_chat_message', make_assertion) diff --git a/tests/test_message.py b/tests/test_message.py index d190ce25f90..42d29b78ac8 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -1197,7 +1197,11 @@ def make_assertion(*_, **kwargs): [], ) assert check_shortcut_call( - message.edit_text, message.bot, 'edit_message_text', skip_params=['inline_message_id'] + message.edit_text, + message.bot, + 'edit_message_text', + skip_params=['inline_message_id'], + shortcut_kwargs=['message_id', 'chat_id'], ) monkeypatch.setattr(message.bot, 'edit_message_text', make_assertion) @@ -1221,6 +1225,7 @@ def make_assertion(*_, **kwargs): message.bot, 'edit_message_caption', skip_params=['inline_message_id'], + shortcut_kwargs=['message_id', 'chat_id'], ) monkeypatch.setattr(message.bot, 'edit_message_caption', make_assertion) @@ -1244,6 +1249,7 @@ def make_assertion(*_, **kwargs): message.bot, 'edit_message_media', skip_params=['inline_message_id'], + shortcut_kwargs=['message_id', 'chat_id'], ) monkeypatch.setattr(message.bot, 'edit_message_media', make_assertion) @@ -1267,6 +1273,7 @@ def make_assertion(*_, **kwargs): message.bot, 'edit_message_reply_markup', skip_params=['inline_message_id'], + shortcut_kwargs=['message_id', 'chat_id'], ) monkeypatch.setattr(message.bot, 'edit_message_reply_markup', make_assertion) @@ -1291,6 +1298,7 @@ def make_assertion(*_, **kwargs): message.bot, 'edit_message_live_location', skip_params=['inline_message_id'], + shortcut_kwargs=['message_id', 'chat_id'], ) monkeypatch.setattr(message.bot, 'edit_message_live_location', make_assertion) @@ -1313,6 +1321,7 @@ def make_assertion(*_, **kwargs): message.bot, 'stop_message_live_location', skip_params=['inline_message_id'], + shortcut_kwargs=['message_id', 'chat_id'], ) monkeypatch.setattr(message.bot, 'stop_message_live_location', make_assertion) @@ -1337,6 +1346,7 @@ def make_assertion(*_, **kwargs): message.bot, 'set_game_score', skip_params=['inline_message_id'], + shortcut_kwargs=['message_id', 'chat_id'], ) monkeypatch.setattr(message.bot, 'set_game_score', make_assertion) @@ -1360,6 +1370,7 @@ def make_assertion(*_, **kwargs): message.bot, 'get_game_high_scores', skip_params=['inline_message_id'], + shortcut_kwargs=['message_id', 'chat_id'], ) monkeypatch.setattr(message.bot, 'get_game_high_scores', make_assertion) @@ -1416,7 +1427,12 @@ def make_assertion(*args, **kwargs): assert check_shortcut_signature( Message.unpin, Bot.unpin_chat_message, ['chat_id', 'message_id'], [] ) - assert check_shortcut_call(message.unpin, message.bot, 'unpin_chat_message') + assert check_shortcut_call( + message.unpin, + message.bot, + 'unpin_chat_message', + shortcut_kwargs=['chat_id', 'message_id'], + ) monkeypatch.setattr(message.bot, 'unpin_chat_message', make_assertion) assert message.unpin() From 2b68fa4b760ac82c5814fd43b650989f6ef8bcae Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sun, 7 Feb 2021 12:18:02 +0100 Subject: [PATCH 06/23] Start on defaults-checks for shortcuts, get it working for test_message --- examples/persistentconversationbot.py | 2 +- examples/pollbot.py | 2 +- telegram/bot.py | 59 +++++++-------- telegram/callbackquery.py | 6 +- telegram/chat.py | 38 +++++----- telegram/ext/basepersistence.py | 8 +- telegram/ext/callbackcontext.py | 6 +- telegram/message.py | 45 ++++++----- telegram/user.py | 37 +++++---- tests/conftest.py | 103 +++++++++++++++++++++++++- tests/test_filters.py | 2 +- tests/test_message.py | 47 +++++++++++- 12 files changed, 250 insertions(+), 105 deletions(-) diff --git a/examples/persistentconversationbot.py b/examples/persistentconversationbot.py index 1d9afe10959..1c9129af899 100644 --- a/examples/persistentconversationbot.py +++ b/examples/persistentconversationbot.py @@ -122,7 +122,7 @@ def done(update: Update, context: CallbackContext) -> None: del context.user_data['choice'] update.message.reply_text( - "I learned these facts about you:" f"{facts_to_str(context.user_data)}" "Until next time!" + "I learned these facts about you:" f"{facts_to_str(context.user_data)} Until next time!" ) return ConversationHandler.END diff --git a/examples/pollbot.py b/examples/pollbot.py index 50f80110714..d2f27123d30 100644 --- a/examples/pollbot.py +++ b/examples/pollbot.py @@ -148,7 +148,7 @@ def receive_poll(update: Update, context: CallbackContext) -> None: def help_handler(update: Update, context: CallbackContext) -> None: """Display a help message""" - update.message.reply_text("Use /quiz, /poll or /preview to test this " "bot.") + update.message.reply_text("Use /quiz, /poll or /preview to test this bot.") def main() -> None: diff --git a/telegram/bot.py b/telegram/bot.py index 58098c99e34..6443958095f 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -88,7 +88,6 @@ to_timestamp, is_local_file, parse_file_input, - DEFAULT_FALSE, DEFAULT_20, ) from telegram.utils.request import Request @@ -209,11 +208,13 @@ def _insert_defaults(self, data: Dict[str, Any], timeout: ODVInput[float]) -> Op if isinstance(data[key], DefaultValue): data[key] = self.defaults.api_defaults.get(key, data[key].value) - return ( - self.defaults.timeout - if not isinstance(self.defaults.timeout, DefaultValue) - else effective_timeout - ) + if isinstance(timeout, DefaultValue): + return ( + self.defaults.timeout + if not isinstance(self.defaults.timeout, DefaultValue) + else effective_timeout + ) + return effective_timeout def _post( self, @@ -401,7 +402,7 @@ def send_message( text: str, parse_mode: ODVInput[str] = DEFAULT_NONE, disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -517,7 +518,7 @@ def forward_message( chat_id: Union[int, str], from_chat_id: Union[str, int], message_id: Union[str, int], - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> Message: @@ -567,7 +568,7 @@ def send_photo( chat_id: int, photo: Union[FileInput, 'PhotoSize'], caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -660,7 +661,7 @@ def send_audio( performer: str = None, title: str = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -779,7 +780,7 @@ def send_document( document: Union[FileInput, 'Document'], filename: str = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -886,7 +887,7 @@ def send_sticker( self, chat_id: Union[int, str], sticker: Union[FileInput, 'Sticker'], - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -952,7 +953,7 @@ def send_video( video: Union[FileInput, 'Video'], duration: int = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1078,7 +1079,7 @@ def send_video_note( video_note: Union[FileInput, 'VideoNote'], duration: int = None, length: int = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1181,7 +1182,7 @@ def send_animation( thumb: FileInput = None, caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1294,7 +1295,7 @@ def send_voice( voice: Union[FileInput, 'Voice'], duration: int = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1441,7 +1442,7 @@ def send_media_group( result = self._post('sendMediaGroup', data, timeout=timeout, api_kwargs=api_kwargs) - return [Message.de_json(res, self) for res in result] # type: ignore + return Message.de_list(result, self) # type: ignore @log def send_location( @@ -1449,7 +1450,7 @@ def send_location( chat_id: Union[int, str], latitude: float = None, longitude: float = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -1505,12 +1506,12 @@ def send_location( """ if not ((latitude is not None and longitude is not None) or location): raise ValueError( - "Either location or latitude and longitude must be passed as" "argument." + "Either location or latitude and longitude must be passed as argument." ) if not (latitude is not None or longitude is not None) ^ bool(location): raise ValueError( - "Either location or latitude and longitude must be passed as" "argument. Not both." + "Either location or latitude and longitude must be passed as argument. Not both." ) if isinstance(location, Location): @@ -1594,11 +1595,11 @@ def edit_message_live_location( """ if not (all([latitude, longitude]) or location): raise ValueError( - "Either location or latitude and longitude must be passed as" "argument." + "Either location or latitude and longitude must be passed as argument." ) if not (latitude is not None or longitude is not None) ^ bool(location): raise ValueError( - "Either location or latitude and longitude must be passed as" "argument. Not both." + "Either location or latitude and longitude must be passed as argument. Not both." ) if isinstance(location, Location): @@ -1687,7 +1688,7 @@ def send_venue( title: str = None, address: str = None, foursquare_id: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -1797,7 +1798,7 @@ def send_contact( phone_number: str = None, first_name: str = None, last_name: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -1845,7 +1846,7 @@ def send_contact( """ if (not contact) and (not all([phone_number, first_name])): raise ValueError( - "Either contact or phone_number and first_name must be passed as" "arguments." + "Either contact or phone_number and first_name must be passed as arguments." ) if isinstance(contact, Contact): @@ -1881,7 +1882,7 @@ def send_game( self, chat_id: Union[int, str], game_short_name: str, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: InlineKeyboardMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -3248,7 +3249,7 @@ def send_invoice( need_email: bool = None, need_shipping_address: bool = None, is_flexible: bool = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: InlineKeyboardMarkup = None, provider_data: Union[str, object] = None, @@ -4755,9 +4756,9 @@ def copy_message( caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, + allow_sending_without_reply: DVInput[bool] = DEFAULT_NONE, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, diff --git a/telegram/callbackquery.py b/telegram/callbackquery.py index d452f6bd08a..3bafb8d31c9 100644 --- a/telegram/callbackquery.py +++ b/telegram/callbackquery.py @@ -21,7 +21,7 @@ from typing import TYPE_CHECKING, Any, List, Optional, Union, Tuple, ClassVar from telegram import Message, TelegramObject, User, Location, ReplyMarkup, constants -from telegram.utils.helpers import DEFAULT_NONE, DEFAULT_FALSE +from telegram.utils.helpers import DEFAULT_NONE from telegram.utils.types import JSONDict, ODVInput, DVInput if TYPE_CHECKING: @@ -597,9 +597,9 @@ def copy_message( caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, + allow_sending_without_reply: DVInput[bool] = DEFAULT_NONE, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, diff --git a/telegram/chat.py b/telegram/chat.py index 92db7e3fa69..aa9cbc31d3e 100644 --- a/telegram/chat.py +++ b/telegram/chat.py @@ -26,7 +26,7 @@ from .chatpermissions import ChatPermissions from .chatlocation import ChatLocation -from .utils.helpers import DEFAULT_NONE, DEFAULT_FALSE, DEFAULT_20 +from .utils.helpers import DEFAULT_NONE, DEFAULT_20 if TYPE_CHECKING: from telegram import ( @@ -577,7 +577,7 @@ def send_message( text: str, parse_mode: ODVInput[str] = DEFAULT_NONE, disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -670,7 +670,7 @@ def send_photo( self, photo: Union[FileInput, 'PhotoSize'], caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -710,7 +710,7 @@ def send_contact( phone_number: str = None, first_name: str = None, last_name: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -751,7 +751,7 @@ def send_audio( performer: str = None, title: str = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -796,7 +796,7 @@ def send_document( document: Union[FileInput, 'Document'], filename: str = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -868,7 +868,7 @@ def send_dice( def send_game( self, game_short_name: str, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -914,7 +914,7 @@ def send_invoice( need_email: bool = None, need_shipping_address: bool = None, is_flexible: bool = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, provider_data: Union[str, object] = None, @@ -967,7 +967,7 @@ def send_location( self, latitude: float = None, longitude: float = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -1015,7 +1015,7 @@ def send_animation( thumb: FileInput = None, caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -1056,7 +1056,7 @@ def send_animation( def send_sticker( self, sticker: Union[FileInput, 'Sticker'], - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -1091,7 +1091,7 @@ def send_venue( title: str = None, address: str = None, foursquare_id: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -1136,7 +1136,7 @@ def send_video( video: Union[FileInput, 'Video'], duration: int = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -1185,7 +1185,7 @@ def send_video_note( video_note: Union[FileInput, 'VideoNote'], duration: int = None, length: int = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -1224,7 +1224,7 @@ def send_voice( voice: Union[FileInput, 'Voice'], duration: int = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -1321,9 +1321,9 @@ def send_copy( caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, + allow_sending_without_reply: DVInput[bool] = DEFAULT_NONE, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, @@ -1360,9 +1360,9 @@ def copy_message( caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, + allow_sending_without_reply: DVInput[bool] = DEFAULT_NONE, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, diff --git a/telegram/ext/basepersistence.py b/telegram/ext/basepersistence.py index 834bfa7f203..c7968f4bdff 100644 --- a/telegram/ext/basepersistence.py +++ b/telegram/ext/basepersistence.py @@ -291,7 +291,7 @@ def _insert_bot(self, obj: object, memo: Dict[int, object]) -> object: # pylint @abstractmethod def get_user_data(self) -> DefaultDict[int, Dict[object, object]]: - """ "Will be called by :class:`telegram.ext.Dispatcher` upon creation with a + """Will be called by :class:`telegram.ext.Dispatcher` upon creation with a persistence object. It should return the ``user_data`` if stored, or an empty ``defaultdict(dict)``. @@ -301,7 +301,7 @@ def get_user_data(self) -> DefaultDict[int, Dict[object, object]]: @abstractmethod def get_chat_data(self) -> DefaultDict[int, Dict[object, object]]: - """ "Will be called by :class:`telegram.ext.Dispatcher` upon creation with a + """Will be called by :class:`telegram.ext.Dispatcher` upon creation with a persistence object. It should return the ``chat_data`` if stored, or an empty ``defaultdict(dict)``. @@ -311,7 +311,7 @@ def get_chat_data(self) -> DefaultDict[int, Dict[object, object]]: @abstractmethod def get_bot_data(self) -> Dict[object, object]: - """ "Will be called by :class:`telegram.ext.Dispatcher` upon creation with a + """Will be called by :class:`telegram.ext.Dispatcher` upon creation with a persistence object. It should return the ``bot_data`` if stored, or an empty :obj:`dict`. @@ -321,7 +321,7 @@ def get_bot_data(self) -> Dict[object, object]: @abstractmethod def get_conversations(self, name: str) -> ConversationDict: - """ "Will be called by :class:`telegram.ext.Dispatcher` when a + """Will be called by :class:`telegram.ext.Dispatcher` when a :class:`telegram.ext.ConversationHandler` is added if :attr:`telegram.ext.ConversationHandler.persistent` is :obj:`True`. It should return the conversations for the handler with `name` or an empty :obj:`dict` diff --git a/telegram/ext/callbackcontext.py b/telegram/ext/callbackcontext.py index cb4dde61f48..e42db3890a7 100644 --- a/telegram/ext/callbackcontext.py +++ b/telegram/ext/callbackcontext.py @@ -118,7 +118,7 @@ def bot_data(self) -> Dict: @bot_data.setter def bot_data(self, value: object) -> NoReturn: raise AttributeError( - "You can not assign a new value to bot_data, see " "https://git.io/fjxKe" + "You can not assign a new value to bot_data, see https://git.io/fjxKe" ) @property @@ -128,7 +128,7 @@ def chat_data(self) -> Optional[Dict]: @chat_data.setter def chat_data(self, value: object) -> NoReturn: raise AttributeError( - "You can not assign a new value to chat_data, see " "https://git.io/fjxKe" + "You can not assign a new value to chat_data, see https://git.io/fjxKe" ) @property @@ -138,7 +138,7 @@ def user_data(self) -> Optional[Dict]: @user_data.setter def user_data(self, value: object) -> NoReturn: raise AttributeError( - "You can not assign a new value to user_data, see " "https://git.io/fjxKe" + "You can not assign a new value to user_data, see https://git.io/fjxKe" ) @classmethod diff --git a/telegram/message.py b/telegram/message.py index 67ce05cce4d..92fc529a15a 100644 --- a/telegram/message.py +++ b/telegram/message.py @@ -55,7 +55,6 @@ from_timestamp, to_timestamp, DEFAULT_NONE, - DEFAULT_FALSE, DEFAULT_20, ) from telegram.utils.types import JSONDict, FileInput, ODVInput, DVInput @@ -608,7 +607,7 @@ def reply_text( text: str, parse_mode: ODVInput[str] = DEFAULT_NONE, disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -652,7 +651,7 @@ def reply_markdown( self, text: str, disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -706,7 +705,7 @@ def reply_markdown_v2( self, text: str, disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -756,7 +755,7 @@ def reply_html( self, text: str, disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -847,7 +846,7 @@ def reply_photo( self, photo: Union[FileInput, 'PhotoSize'], caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -897,7 +896,7 @@ def reply_audio( performer: str = None, title: str = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -950,7 +949,7 @@ def reply_document( document: Union[FileInput, 'Document'], filename: str = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1005,7 +1004,7 @@ def reply_animation( thumb: FileInput = None, caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1054,7 +1053,7 @@ def reply_animation( def reply_sticker( self, sticker: Union[FileInput, 'Sticker'], - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1095,7 +1094,7 @@ def reply_video( video: Union[FileInput, 'Video'], duration: int = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1152,7 +1151,7 @@ def reply_video_note( video_note: Union[FileInput, 'VideoNote'], duration: int = None, length: int = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1199,7 +1198,7 @@ def reply_voice( voice: Union[FileInput, 'Voice'], duration: int = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: DVInput[float] = DEFAULT_20, @@ -1247,7 +1246,7 @@ def reply_location( self, latitude: float = None, longitude: float = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -1301,7 +1300,7 @@ def reply_venue( title: str = None, address: str = None, foursquare_id: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -1354,7 +1353,7 @@ def reply_contact( phone_number: str = None, first_name: str = None, last_name: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -1524,7 +1523,7 @@ def reply_chat_action( def reply_game( self, game_short_name: str, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -1580,7 +1579,7 @@ def reply_invoice( need_email: bool = None, need_shipping_address: bool = None, is_flexible: bool = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, provider_data: Union[str, object] = None, @@ -1642,7 +1641,7 @@ def reply_invoice( def forward( self, chat_id: Union[int, str], - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, ) -> 'Message': @@ -1675,9 +1674,9 @@ def copy( caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, + allow_sending_without_reply: DVInput[bool] = DEFAULT_NONE, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, @@ -1718,9 +1717,9 @@ def reply_copy( caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, + allow_sending_without_reply: DVInput[bool] = DEFAULT_NONE, reply_markup: ReplyMarkup = None, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, diff --git a/telegram/user.py b/telegram/user.py index 7021f6028d4..1db9d7a0983 100644 --- a/telegram/user.py +++ b/telegram/user.py @@ -25,7 +25,6 @@ from telegram.utils.helpers import ( mention_html as util_mention_html, DEFAULT_NONE, - DEFAULT_FALSE, DEFAULT_20, ) from telegram.utils.helpers import mention_markdown as util_mention_markdown @@ -301,7 +300,7 @@ def send_message( text: str, parse_mode: ODVInput[str] = DEFAULT_NONE, disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -337,7 +336,7 @@ def send_photo( self, photo: Union[FileInput, 'PhotoSize'], caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -410,7 +409,7 @@ def send_audio( performer: str = None, title: str = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -481,7 +480,7 @@ def send_contact( phone_number: str = None, first_name: str = None, last_name: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -551,7 +550,7 @@ def send_document( document: Union[FileInput, 'Document'], filename: str = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -592,7 +591,7 @@ def send_document( def send_game( self, game_short_name: str, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -638,7 +637,7 @@ def send_invoice( need_email: bool = None, need_shipping_address: bool = None, is_flexible: bool = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'InlineKeyboardMarkup' = None, provider_data: Union[str, object] = None, @@ -691,7 +690,7 @@ def send_location( self, latitude: float = None, longitude: float = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -739,7 +738,7 @@ def send_animation( thumb: FileInput = None, caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -780,7 +779,7 @@ def send_animation( def send_sticker( self, sticker: Union[FileInput, 'Sticker'], - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -813,7 +812,7 @@ def send_video( video: Union[FileInput, 'Video'], duration: int = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -864,7 +863,7 @@ def send_venue( title: str = None, address: str = None, foursquare_id: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, @@ -909,7 +908,7 @@ def send_video_note( video_note: Union[FileInput, 'VideoNote'], duration: int = None, length: int = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -948,7 +947,7 @@ def send_voice( voice: Union[FileInput, 'Voice'], duration: int = None, caption: str = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, reply_markup: 'ReplyMarkup' = None, timeout: DVInput[float] = DEFAULT_20, @@ -1045,9 +1044,9 @@ def send_copy( caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, + allow_sending_without_reply: DVInput[bool] = DEFAULT_NONE, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, @@ -1084,9 +1083,9 @@ def copy_message( caption: str = None, parse_mode: ODVInput[str] = DEFAULT_NONE, caption_entities: Union[Tuple['MessageEntity', ...], List['MessageEntity']] = None, - disable_notification: DVInput[bool] = DEFAULT_FALSE, + disable_notification: DVInput[bool] = DEFAULT_NONE, reply_to_message_id: Union[int, str] = None, - allow_sending_without_reply: DVInput[bool] = DEFAULT_FALSE, + allow_sending_without_reply: DVInput[bool] = DEFAULT_NONE, reply_markup: 'ReplyMarkup' = None, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None, diff --git a/tests/conftest.py b/tests/conftest.py index 64f53445deb..eee1754cc88 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -17,6 +17,7 @@ # You should have received a copy of the GNU Lesser Public License # along with this program. If not, see [http://www.gnu.org/licenses/]. import datetime +import functools import inspect import os import re @@ -24,7 +25,7 @@ from queue import Queue from threading import Thread, Event from time import sleep -from typing import Callable, List, Iterable +from typing import Callable, List, Iterable, Any import pytest import pytz @@ -45,6 +46,7 @@ ) from telegram.ext import Dispatcher, JobQueue, Updater, MessageFilter, Defaults, UpdateFilter from telegram.error import BadRequest +from telegram.utils.helpers import DefaultValue, DEFAULT_NONE from tests.bots import get_bot GITHUB_ACTION = os.getenv('GITHUB_ACTION', False) @@ -474,3 +476,102 @@ def make_assertion(**kw): setattr(bot, bot_method_name, orig_bot_method) return True + + +def check_shortcut_defaults( + shortcut_method: Callable, + bot: Bot, + monkeypatch, + method_timeout: float = None, +) -> bool: + def build_kwargs(signature: inspect.Signature, default_kwargs, dfv: Any = DEFAULT_NONE): + kws = {} + for name, param in signature.parameters.items(): + # For required params we need to pass something and because + # send_invoice.prices needs a list, we rather use a list + if param.default == param.empty: + kws[name] = [] # 'required_arg' + # pass values for params that can have defaults only if we don't want to use the + # standard default + elif name in default_kwargs: + if dfv != DEFAULT_NONE: + kws[name] = dfv + # Some special casing for methods that have "exactly one of the optionals" type args + elif name in ['location', 'contact', 'venue']: + kws[name] = True + return kws + + shortcut_signature = inspect.signature(shortcut_method) + kwargs_need_default = [ + kwarg + for kwarg, value in shortcut_signature.parameters.items() + if isinstance(value.default, DefaultValue) + ] + + default_kwarg_names = kwargs_need_default + # special case explanation_parse_mode of Bot.send_poll: + if 'explanation_parse_mode' in default_kwarg_names: + default_kwarg_names.remove('explanation_parse_mode') + + defaults_no_custom_defaults = Defaults() + defaults_custom_defaults = Defaults( + **{kwarg: 'custom_default' for kwarg in default_kwarg_names} + ) + + def make_assertion(_, data, timeout=DEFAULT_NONE, df_value=DEFAULT_NONE): + expected_timeout = method_timeout if df_value == DEFAULT_NONE else df_value + if timeout != expected_timeout: + pytest.fail(f'Got value {timeout} for "timeout", expected {expected_timeout}') + + for arg in (dkw for dkw in kwargs_need_default if dkw != 'timeout'): + # 'None' should not be passed along to Telegram + if df_value in [None, DEFAULT_NONE]: + if arg in data: + pytest.fail( + f'Got value {data[arg]} for argument {arg}, expected it to be absent' + ) + else: + value = data.get(arg, '`not passed at all`') + if value != df_value: + pytest.fail(f'Got value {value} for argument {arg} instead of {df_value}') + + if shortcut_method.__name__ == 'get_file': + # This is here mainly for PassportFile.get_file, which calls .set_credentials on the + # return value + return File(file_id='result', file_unique_id='result') + # Otherwise return None, as TGObject.de_json/list(None) in [None, []] + # That way we can check what gets passed to Request.post without having to actually + # make a request + return None + + for default_value, defaults in [ + (DEFAULT_NONE, defaults_no_custom_defaults), + ('custom_default', defaults_custom_defaults), + ]: + bot.defaults = defaults + # 1: test that we get the correct default value, if we don't specify anything + kwargs = build_kwargs( + shortcut_signature, + kwargs_need_default, + ) + assertion_callback = functools.partial(make_assertion, df_value=default_value) + monkeypatch.setattr(bot.request, 'post', assertion_callback) + assert shortcut_method(**kwargs) in [None, []] + + # 2: test that we get the manually passed non-None value + kwargs = build_kwargs(shortcut_signature, kwargs_need_default, dfv='non-None-value') + assertion_callback = functools.partial(make_assertion, df_value='non-None-value') + monkeypatch.setattr(bot.request, 'post', assertion_callback) + assert shortcut_method(**kwargs) in [None, []] + + # 3: test that we get the manually passed None value + kwargs = build_kwargs( + shortcut_signature, + kwargs_need_default, + dfv=None, + ) + assertion_callback = functools.partial(make_assertion, df_value=None) + monkeypatch.setattr(bot.request, 'post', assertion_callback) + assert shortcut_method(**kwargs) in [None, []] + + return True diff --git a/tests/test_filters.py b/tests/test_filters.py index 1cfa69dd6bd..f8d95edad45 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -547,7 +547,7 @@ def test_filters_document_type(self, update): assert not Filters.document.audio(update) update.message.document.mime_type = ( - "application/vnd.openxmlformats-officedocument." "wordprocessingml.document" + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ) assert Filters.document.docx(update) assert Filters.document.application(update) diff --git a/tests/test_message.py b/tests/test_message.py index 42d29b78ac8..b5176c6e51f 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -50,7 +50,7 @@ ChatAction, ) from telegram.ext import Defaults -from tests.conftest import check_shortcut_signature, check_shortcut_call +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults from tests.test_passport import RAW_PASSPORT_DATA @@ -651,6 +651,7 @@ def make_assertion(*_, **kwargs): Message.reply_text, Bot.send_message, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') + assert check_shortcut_defaults(message.reply_text, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'send_message', make_assertion) assert message.reply_text('test') @@ -679,6 +680,7 @@ def make_assertion(*_, **kwargs): Message.reply_markdown, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') + assert check_shortcut_defaults(message.reply_text, message.bot, monkeypatch) text_markdown = self.test_message.text_markdown assert text_markdown == test_md_string @@ -713,6 +715,7 @@ def make_assertion(*_, **kwargs): Message.reply_markdown_v2, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') + assert check_shortcut_defaults(message.reply_text, message.bot, monkeypatch) text_markdown = self.test_message_v2.text_markdown_v2 assert text_markdown == test_md_string @@ -751,6 +754,7 @@ def make_assertion(*_, **kwargs): Message.reply_html, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') + assert check_shortcut_defaults(message.reply_text, message.bot, monkeypatch) text_html = self.test_message_v2.text_html assert text_html == test_html_string @@ -776,6 +780,9 @@ def make_assertion(*_, **kwargs): Message.reply_media_group, Bot.send_media_group, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_media_group, message.bot, 'send_media_group') + assert check_shortcut_defaults( + message.reply_media_group, message.bot, monkeypatch, method_timeout=20 + ) monkeypatch.setattr(message.bot, 'send_media_group', make_assertion) assert message.reply_media_group(media='reply_media_group') @@ -795,6 +802,9 @@ def make_assertion(*_, **kwargs): Message.reply_photo, Bot.send_photo, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_photo, message.bot, 'send_photo') + assert check_shortcut_defaults( + message.reply_photo, message.bot, monkeypatch, method_timeout=20 + ) monkeypatch.setattr(message.bot, 'send_photo', make_assertion) assert message.reply_photo(photo='test_photo') @@ -814,6 +824,9 @@ def make_assertion(*_, **kwargs): Message.reply_audio, Bot.send_audio, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_audio, message.bot, 'send_audio') + assert check_shortcut_defaults( + message.reply_audio, message.bot, monkeypatch, method_timeout=20 + ) monkeypatch.setattr(message.bot, 'send_audio', make_assertion) assert message.reply_audio(audio='test_audio') @@ -833,6 +846,9 @@ def make_assertion(*_, **kwargs): Message.reply_document, Bot.send_document, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_document, message.bot, 'send_document') + assert check_shortcut_defaults( + message.reply_document, message.bot, monkeypatch, method_timeout=20 + ) monkeypatch.setattr(message.bot, 'send_document', make_assertion) assert message.reply_document(document='test_document') @@ -852,6 +868,9 @@ def make_assertion(*_, **kwargs): Message.reply_animation, Bot.send_animation, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_animation, message.bot, 'send_animation') + assert check_shortcut_defaults( + message.reply_animation, message.bot, monkeypatch, method_timeout=20 + ) monkeypatch.setattr(message.bot, 'send_animation', make_assertion) assert message.reply_animation(animation='test_animation') @@ -871,6 +890,9 @@ def make_assertion(*_, **kwargs): Message.reply_sticker, Bot.send_sticker, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_sticker, message.bot, 'send_sticker') + assert check_shortcut_defaults( + message.reply_sticker, message.bot, monkeypatch, method_timeout=20 + ) monkeypatch.setattr(message.bot, 'send_sticker', make_assertion) assert message.reply_sticker(sticker='test_sticker') @@ -890,6 +912,9 @@ def make_assertion(*_, **kwargs): Message.reply_video, Bot.send_video, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_video, message.bot, 'send_video') + assert check_shortcut_defaults( + message.reply_video, message.bot, monkeypatch, method_timeout=20 + ) monkeypatch.setattr(message.bot, 'send_video', make_assertion) assert message.reply_video(video='test_video') @@ -909,6 +934,9 @@ def make_assertion(*_, **kwargs): Message.reply_video_note, Bot.send_video_note, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_video_note, message.bot, 'send_video_note') + assert check_shortcut_defaults( + message.reply_video_note, message.bot, monkeypatch, method_timeout=20 + ) monkeypatch.setattr(message.bot, 'send_video_note', make_assertion) assert message.reply_video_note(video_note='test_video_note') @@ -928,6 +956,9 @@ def make_assertion(*_, **kwargs): Message.reply_voice, Bot.send_voice, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_voice, message.bot, 'send_voice') + assert check_shortcut_defaults( + message.reply_voice, message.bot, monkeypatch, method_timeout=20 + ) monkeypatch.setattr(message.bot, 'send_voice', make_assertion) assert message.reply_voice(voice='test_voice') @@ -947,6 +978,7 @@ def make_assertion(*_, **kwargs): Message.reply_location, Bot.send_location, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_location, message.bot, 'send_location') + assert check_shortcut_defaults(message.reply_location, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'send_location', make_assertion) assert message.reply_location(location='test_location') @@ -966,6 +998,7 @@ def make_assertion(*_, **kwargs): Message.reply_venue, Bot.send_venue, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_venue, message.bot, 'send_venue') + assert check_shortcut_defaults(message.reply_venue, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'send_venue', make_assertion) assert message.reply_venue(venue='test_venue') @@ -985,6 +1018,7 @@ def make_assertion(*_, **kwargs): Message.reply_contact, Bot.send_contact, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_contact, message.bot, 'send_contact') + assert check_shortcut_defaults(message.reply_contact, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'send_contact', make_assertion) assert message.reply_contact(contact='test_contact') @@ -1003,6 +1037,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Message.reply_poll, Bot.send_poll, ['chat_id'], ['quote']) assert check_shortcut_call(message.reply_poll, message.bot, 'send_poll') + assert check_shortcut_defaults(message.reply_poll, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'send_poll', make_assertion) assert message.reply_poll(question='test_poll', options=['1', '2', '3']) @@ -1020,6 +1055,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Message.reply_dice, Bot.send_dice, ['chat_id'], ['quote']) assert check_shortcut_call(message.reply_dice, message.bot, 'send_dice') + assert check_shortcut_defaults(message.reply_dice, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'send_dice', make_assertion) assert message.reply_dice(disable_notification=True) @@ -1035,6 +1071,7 @@ def make_assertion(*_, **kwargs): Message.reply_chat_action, Bot.send_chat_action, ['chat_id'], [] ) assert check_shortcut_call(message.reply_chat_action, message.bot, 'send_chat_action') + assert check_shortcut_defaults(message.reply_chat_action, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'send_chat_action', make_assertion) assert message.reply_chat_action(action=ChatAction.TYPING) @@ -1047,6 +1084,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Message.reply_game, Bot.send_game, ['chat_id'], ['quote']) assert check_shortcut_call(message.reply_game, message.bot, 'send_game') + assert check_shortcut_defaults(message.reply_game, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'send_game', make_assertion) assert message.reply_game(game_short_name='test_game') @@ -1076,6 +1114,7 @@ def make_assertion(*_, **kwargs): Message.reply_invoice, Bot.send_invoice, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_invoice, message.bot, 'send_invoice') + assert check_shortcut_defaults(message.reply_invoice, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'send_invoice', make_assertion) assert message.reply_invoice( @@ -1111,6 +1150,7 @@ def make_assertion(*_, **kwargs): Message.forward, Bot.forward_message, ['from_chat_id', 'message_id'], [] ) assert check_shortcut_call(message.forward, message.bot, 'forward_message') + assert check_shortcut_defaults(message.forward, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'forward_message', make_assertion) assert message.forward(123456, disable_notification=disable_notification) @@ -1135,6 +1175,7 @@ def make_assertion(*_, **kwargs): Message.copy, Bot.copy_message, ['from_chat_id', 'message_id'], [] ) assert check_shortcut_call(message.copy, message.bot, 'copy_message') + assert check_shortcut_defaults(message.copy, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'copy_message', make_assertion) assert message.copy(123456, disable_notification=disable_notification) @@ -1166,6 +1207,7 @@ def make_assertion(*_, **kwargs): Message.reply_copy, Bot.copy_message, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.copy, message.bot, 'copy_message') + assert check_shortcut_defaults(message.copy, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'copy_message', make_assertion) assert message.reply_copy(123456, 456789, disable_notification=disable_notification) @@ -1386,6 +1428,7 @@ def make_assertion(*_, **kwargs): Message.delete, Bot.delete_message, ['chat_id', 'message_id'], [] ) assert check_shortcut_call(message.delete, message.bot, 'delete_message') + assert check_shortcut_defaults(message.delete, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'delete_message', make_assertion) assert message.delete() @@ -1400,6 +1443,7 @@ def make_assertion(*_, **kwargs): Message.stop_poll, Bot.stop_poll, ['chat_id', 'message_id'], [] ) assert check_shortcut_call(message.stop_poll, message.bot, 'stop_poll') + assert check_shortcut_defaults(message.stop_poll, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'stop_poll', make_assertion) assert message.stop_poll() @@ -1414,6 +1458,7 @@ def make_assertion(*args, **kwargs): Message.pin, Bot.pin_chat_message, ['chat_id', 'message_id'], [] ) assert check_shortcut_call(message.pin, message.bot, 'pin_chat_message') + assert check_shortcut_defaults(message.pin, message.bot, monkeypatch) monkeypatch.setattr(message.bot, 'pin_chat_message', make_assertion) assert message.pin() From 6d1d32615fcd0bd08c760aa92956c3d795e951d8 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sun, 7 Feb 2021 13:37:04 +0100 Subject: [PATCH 07/23] Add check_shortcut_defaults to all other shortcut tests --- telegram/bot.py | 4 +- tests/conftest.py | 128 +++++++++++++++++++++------------ tests/test_animation.py | 3 +- tests/test_audio.py | 3 +- tests/test_callbackquery.py | 7 +- tests/test_chat.py | 34 ++++++++- tests/test_chatphoto.py | 13 +++- tests/test_document.py | 3 +- tests/test_inlinequery.py | 3 +- tests/test_message.py | 81 ++++++++++----------- tests/test_passportfile.py | 3 +- tests/test_photo.py | 8 ++- tests/test_precheckoutquery.py | 3 +- tests/test_shippingquery.py | 3 +- tests/test_sticker.py | 3 +- tests/test_user.py | 26 ++++++- tests/test_video.py | 3 +- tests/test_videonote.py | 3 +- tests/test_voice.py | 3 +- 19 files changed, 222 insertions(+), 112 deletions(-) diff --git a/telegram/bot.py b/telegram/bot.py index 6443958095f..0985871fbf3 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -2966,7 +2966,7 @@ def get_chat_administrators( result = self._post('getChatAdministrators', data, timeout=timeout, api_kwargs=api_kwargs) - return [ChatMember.de_json(x, self) for x in result] # type: ignore + return ChatMember.de_list(result, self) # type: ignore @log def get_chat_members_count( @@ -3227,7 +3227,7 @@ def get_game_high_scores( result = self._post('getGameHighScores', data, timeout=timeout, api_kwargs=api_kwargs) - return [GameHighScore.de_json(hs, self) for hs in result] # type: ignore + return GameHighScore.de_list(result, self) # type: ignore @log def send_invoice( diff --git a/tests/conftest.py b/tests/conftest.py index eee1754cc88..4a5130987c0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -43,6 +43,7 @@ PreCheckoutQuery, ChosenInlineResult, File, + ChatPermissions, ) from telegram.ext import Dispatcher, JobQueue, Updater, MessageFilter, Defaults, UpdateFilter from telegram.error import BadRequest @@ -374,8 +375,7 @@ def check_shortcut_signature( args_check = expected_args == effective_shortcut_args if not args_check: - pytest.fail(f'Expected arguments {expected_args}, got {effective_shortcut_args}') - return False + raise Exception(f'Expected arguments {expected_args}, got {effective_shortcut_args}') # TODO: Also check annotation of return type. Would currently be a hassle b/c typing doesn't # resolve `ForwardRef('Type')` to `Type`. For now we rely on MyPy, which probably allows the @@ -387,26 +387,23 @@ def check_shortcut_signature( if bot_sig.parameters[kwarg].annotation.__name__ != str( shortcut_sig.parameters[kwarg].annotation ): - pytest.fail( + raise Exception( f'For argument {kwarg} I expected {bot_sig.parameters[kwarg].annotation}, ' f'but got {shortcut_sig.parameters[kwarg].annotation}' ) - return False else: - pytest.fail( + raise Exception( f'For argument {kwarg} I expected {bot_sig.parameters[kwarg].annotation}, but ' f'got {shortcut_sig.parameters[kwarg].annotation}' ) - return False bot_method_sig = inspect.signature(bot_method) shortcut_sig = inspect.signature(shortcut) for arg in expected_args: if not shortcut_sig.parameters[arg].default == bot_method_sig.parameters[arg].default: - pytest.fail( + raise Exception( f'Default for argument {arg} does not match the default of the Bot method.' ) - return False return True @@ -458,7 +455,7 @@ def make_assertion(**kw): name for name, value in kw.items() if name in ignored_args or value == name } if not received_kwargs == expected_args: - pytest.fail( + raise Exception( f'{orig_bot_method.__name__} did not receive correct value for the parameters ' f'{expected_args - received_kwargs}' ) @@ -472,6 +469,8 @@ def make_assertion(**kw): setattr(bot, bot_method_name, make_assertion) try: shortcut_method(**kwargs) + except Exception as exc: + raise exc finally: setattr(bot, bot_method_name, orig_bot_method) @@ -481,16 +480,38 @@ def make_assertion(**kw): def check_shortcut_defaults( shortcut_method: Callable, bot: Bot, - monkeypatch, method_timeout: float = None, + return_value=None, ) -> bool: + """ + Checks that tg.ext.Defaults are handled correctly. + + Args: + shortcut_method: The shortcut/bot_method + bot: The bot + monkeypatch: The monkeypatch fixture + method_timeout: Optional. The default timeout for the method. Relevant for media methods, + i.e. pass 20. Defaults to None. + return_value: Optional. The return value of Bot._post that the method expects. Defaults to + None. get_file is automatically handled. + + """ + def build_kwargs(signature: inspect.Signature, default_kwargs, dfv: Any = DEFAULT_NONE): kws = {} for name, param in signature.parameters.items(): - # For required params we need to pass something and because - # send_invoice.prices needs a list, we rather use a list + # For required params we need to pass something if param.default == param.empty: - kws[name] = [] # 'required_arg' + # Some special casing + if name == 'permissions': + kws[name] = ChatPermissions() + elif name in ['prices', 'media', 'results']: + kws[name] = [] + elif name == 'ok': + kws['ok'] = False + kws['error_message'] = 'error' + else: + kws[name] = True # pass values for params that can have defaults only if we don't want to use the # standard default elif name in default_kwargs: @@ -518,6 +539,8 @@ def build_kwargs(signature: inspect.Signature, default_kwargs, dfv: Any = DEFAUL **{kwarg: 'custom_default' for kwarg in default_kwarg_names} ) + expected_return_values = [None, []] if return_value is None else [return_value] + def make_assertion(_, data, timeout=DEFAULT_NONE, df_value=DEFAULT_NONE): expected_timeout = method_timeout if df_value == DEFAULT_NONE else df_value if timeout != expected_timeout: @@ -535,43 +558,54 @@ def make_assertion(_, data, timeout=DEFAULT_NONE, df_value=DEFAULT_NONE): if value != df_value: pytest.fail(f'Got value {value} for argument {arg} instead of {df_value}') - if shortcut_method.__name__ == 'get_file': + if shortcut_method.__name__ in ['get_file', 'get_small_file', 'get_big_file']: # This is here mainly for PassportFile.get_file, which calls .set_credentials on the # return value - return File(file_id='result', file_unique_id='result') - # Otherwise return None, as TGObject.de_json/list(None) in [None, []] + out = File(file_id='result', file_unique_id='result') + nonlocal expected_return_values + expected_return_values = [out] + return out.to_dict() + # Otherwise return None by default, as TGObject.de_json/list(None) in [None, []] # That way we can check what gets passed to Request.post without having to actually # make a request - return None - - for default_value, defaults in [ - (DEFAULT_NONE, defaults_no_custom_defaults), - ('custom_default', defaults_custom_defaults), - ]: - bot.defaults = defaults - # 1: test that we get the correct default value, if we don't specify anything - kwargs = build_kwargs( - shortcut_signature, - kwargs_need_default, - ) - assertion_callback = functools.partial(make_assertion, df_value=default_value) - monkeypatch.setattr(bot.request, 'post', assertion_callback) - assert shortcut_method(**kwargs) in [None, []] - - # 2: test that we get the manually passed non-None value - kwargs = build_kwargs(shortcut_signature, kwargs_need_default, dfv='non-None-value') - assertion_callback = functools.partial(make_assertion, df_value='non-None-value') - monkeypatch.setattr(bot.request, 'post', assertion_callback) - assert shortcut_method(**kwargs) in [None, []] - - # 3: test that we get the manually passed None value - kwargs = build_kwargs( - shortcut_signature, - kwargs_need_default, - dfv=None, - ) - assertion_callback = functools.partial(make_assertion, df_value=None) - monkeypatch.setattr(bot.request, 'post', assertion_callback) - assert shortcut_method(**kwargs) in [None, []] + # Some methods expect specific output, so we allow to customize that + return return_value + + orig_post = bot.request.post + try: + for default_value, defaults in [ + (DEFAULT_NONE, defaults_no_custom_defaults), + ('custom_default', defaults_custom_defaults), + ]: + bot.defaults = defaults + # 1: test that we get the correct default value, if we don't specify anything + kwargs = build_kwargs( + shortcut_signature, + kwargs_need_default, + ) + assertion_callback = functools.partial(make_assertion, df_value=default_value) + setattr(bot.request, 'post', assertion_callback) + assert shortcut_method(**kwargs) in expected_return_values + + # 2: test that we get the manually passed non-None value + kwargs = build_kwargs(shortcut_signature, kwargs_need_default, dfv='non-None-value') + assertion_callback = functools.partial(make_assertion, df_value='non-None-value') + setattr(bot.request, 'post', assertion_callback) + assert shortcut_method(**kwargs) in expected_return_values + + # 3: test that we get the manually passed None value + kwargs = build_kwargs( + shortcut_signature, + kwargs_need_default, + dfv=None, + ) + assertion_callback = functools.partial(make_assertion, df_value=None) + setattr(bot.request, 'post', assertion_callback) + assert shortcut_method(**kwargs) in expected_return_values + except Exception as exc: + raise exc + finally: + setattr(bot.request, 'post', orig_post) + bot.defaults = None return True diff --git a/tests/test_animation.py b/tests/test_animation.py index ee37aac913a..330f0393208 100644 --- a/tests/test_animation.py +++ b/tests/test_animation.py @@ -26,7 +26,7 @@ from telegram import PhotoSize, Animation, Voice, TelegramError, MessageEntity, Bot from telegram.error import BadRequest from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_call, check_shortcut_signature +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults @pytest.fixture(scope='function') @@ -314,6 +314,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Animation.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(animation.get_file, animation.bot, 'get_file') + assert check_shortcut_defaults(animation.get_file, animation.bot) monkeypatch.setattr(animation.bot, 'get_file', make_assertion) assert animation.get_file() diff --git a/tests/test_audio.py b/tests/test_audio.py index 7d60329d954..91cd91748a3 100644 --- a/tests/test_audio.py +++ b/tests/test_audio.py @@ -24,7 +24,7 @@ from telegram import Audio, TelegramError, Voice, MessageEntity, Bot from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_call, check_shortcut_signature +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults @pytest.fixture(scope='function') @@ -287,6 +287,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Audio.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(audio.get_file, audio.bot, 'get_file') + assert check_shortcut_defaults(audio.get_file, audio.bot) monkeypatch.setattr(audio.bot, 'get_file', make_assertion) assert audio.get_file() diff --git a/tests/test_callbackquery.py b/tests/test_callbackquery.py index 434cf48c072..569db21d999 100644 --- a/tests/test_callbackquery.py +++ b/tests/test_callbackquery.py @@ -20,7 +20,7 @@ import pytest from telegram import CallbackQuery, User, Message, Chat, Audio, Bot -from tests.conftest import check_shortcut_signature, check_shortcut_call +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults @pytest.fixture(scope='function', params=['message', 'inline']) @@ -118,6 +118,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_call( callback_query.answer, callback_query.bot, 'answer_callback_query' ) + assert check_shortcut_defaults(callback_query.answer, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'answer_callback_query', make_assertion) # TODO: PEP8 @@ -333,6 +334,7 @@ def make_assertion(*args, **kwargs): assert check_shortcut_call( callback_query.delete_message, callback_query.bot, 'delete_message' ) + assert check_shortcut_defaults(callback_query.delete_message, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'delete_message', make_assertion) assert callback_query.delete_message() @@ -353,6 +355,7 @@ def make_assertion(*args, **kwargs): assert check_shortcut_call( callback_query.pin_message, callback_query.bot, 'pin_chat_message' ) + assert check_shortcut_defaults(callback_query.pin_message, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'pin_chat_message', make_assertion) assert callback_query.pin_message() @@ -376,6 +379,7 @@ def make_assertion(*args, **kwargs): 'unpin_chat_message', shortcut_kwargs=['message_id', 'chat_id'], ) + assert check_shortcut_defaults(callback_query.unpin_message, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'unpin_chat_message', make_assertion) assert callback_query.unpin_message() @@ -397,6 +401,7 @@ def make_assertion(*args, **kwargs): [], ) assert check_shortcut_call(callback_query.copy_message, callback_query.bot, 'copy_message') + assert check_shortcut_defaults(callback_query.copy_message, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'copy_message', make_assertion) assert callback_query.copy_message(1) diff --git a/tests/test_chat.py b/tests/test_chat.py index 295f5d1f44c..253a3bafb73 100644 --- a/tests/test_chat.py +++ b/tests/test_chat.py @@ -21,7 +21,7 @@ from telegram import Chat, ChatAction, ChatPermissions, ChatLocation, Location, Bot from telegram import User -from tests.conftest import check_shortcut_signature, check_shortcut_call +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults @pytest.fixture(scope='class') @@ -133,6 +133,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(chat.send_action, Bot.send_chat_action, ['chat_id'], []) assert check_shortcut_call(chat.send_action, chat.bot, 'send_chat_action') + assert check_shortcut_defaults(chat.send_action, chat.bot) monkeypatch.setattr(chat.bot, 'send_chat_action', make_assertion) assert chat.send_action(action=ChatAction.TYPING) @@ -144,6 +145,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.leave, Bot.leave_chat, ['chat_id'], []) assert check_shortcut_call(chat.leave, chat.bot, 'leave_chat') + assert check_shortcut_defaults(chat.leave, chat.bot) monkeypatch.setattr(chat.bot, 'leave_chat', make_assertion) assert chat.leave() @@ -156,6 +158,7 @@ def make_assertion(*_, **kwargs): Chat.get_administrators, Bot.get_chat_administrators, ['chat_id'], [] ) assert check_shortcut_call(chat.get_administrators, chat.bot, 'get_chat_administrators') + assert check_shortcut_defaults(chat.get_administrators, chat.bot) monkeypatch.setattr(chat.bot, 'get_chat_administrators', make_assertion) assert chat.get_administrators() @@ -168,6 +171,7 @@ def make_assertion(*_, **kwargs): Chat.get_members_count, Bot.get_chat_members_count, ['chat_id'], [] ) assert check_shortcut_call(chat.get_members_count, chat.bot, 'get_chat_members_count') + assert check_shortcut_defaults(chat.get_members_count, chat.bot) monkeypatch.setattr(chat.bot, 'get_chat_members_count', make_assertion) assert chat.get_members_count() @@ -180,6 +184,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.get_member, Bot.get_chat_member, ['chat_id'], []) assert check_shortcut_call(chat.get_member, chat.bot, 'get_chat_member') + assert check_shortcut_defaults(chat.get_member, chat.bot) monkeypatch.setattr(chat.bot, 'get_chat_member', make_assertion) assert chat.get_member(user_id=42) @@ -193,6 +198,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.kick_member, Bot.kick_chat_member, ['chat_id'], []) assert check_shortcut_call(chat.kick_member, chat.bot, 'kick_chat_member') + assert check_shortcut_defaults(chat.kick_member, chat.bot) monkeypatch.setattr(chat.bot, 'kick_chat_member', make_assertion) assert chat.kick_member(user_id=42, until_date=43) @@ -207,6 +213,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.unban_member, Bot.unban_chat_member, ['chat_id'], []) assert check_shortcut_call(chat.unban_member, chat.bot, 'unban_chat_member') + assert check_shortcut_defaults(chat.unban_member, chat.bot) monkeypatch.setattr(chat.bot, 'unban_chat_member', make_assertion) assert chat.unban_member(user_id=42, only_if_banned=only_if_banned) @@ -223,6 +230,7 @@ def make_assertion(*_, **kwargs): Chat.promote_member, Bot.promote_chat_member, ['chat_id'], [] ) assert check_shortcut_call(chat.promote_member, chat.bot, 'promote_chat_member') + assert check_shortcut_defaults(chat.promote_member, chat.bot) monkeypatch.setattr(chat.bot, 'promote_chat_member', make_assertion) assert chat.promote_member(user_id=42, is_anonymous=is_anonymous) @@ -240,6 +248,7 @@ def make_assertion(*_, **kwargs): Chat.restrict_member, Bot.restrict_chat_member, ['chat_id'], [] ) assert check_shortcut_call(chat.restrict_member, chat.bot, 'restrict_chat_member') + assert check_shortcut_defaults(chat.restrict_member, chat.bot) monkeypatch.setattr(chat.bot, 'restrict_chat_member', make_assertion) assert chat.restrict_member(user_id=42, permissions=permissions) @@ -254,6 +263,7 @@ def make_assertion(*_, **kwargs): Chat.set_permissions, Bot.set_chat_permissions, ['chat_id'], [] ) assert check_shortcut_call(chat.set_permissions, chat.bot, 'set_chat_permissions') + assert check_shortcut_defaults(chat.set_permissions, chat.bot) monkeypatch.setattr(chat.bot, 'set_chat_permissions', make_assertion) assert chat.set_permissions(permissions=self.permissions) @@ -274,6 +284,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.pin_message, Bot.pin_chat_message, ['chat_id'], []) assert check_shortcut_call(chat.pin_message, chat.bot, 'pin_chat_message') + assert check_shortcut_defaults(chat.pin_message, chat.bot) monkeypatch.setattr(chat.bot, 'pin_chat_message', make_assertion) assert chat.pin_message(message_id=42) @@ -286,6 +297,7 @@ def make_assertion(*_, **kwargs): Chat.unpin_message, Bot.unpin_chat_message, ['chat_id'], [] ) assert check_shortcut_call(chat.unpin_message, chat.bot, 'unpin_chat_message') + assert check_shortcut_defaults(chat.unpin_message, chat.bot) monkeypatch.setattr(chat.bot, 'unpin_chat_message', make_assertion) assert chat.unpin_message() @@ -298,6 +310,7 @@ def make_assertion(*_, **kwargs): Chat.unpin_all_messages, Bot.unpin_all_chat_messages, ['chat_id'], [] ) assert check_shortcut_call(chat.unpin_all_messages, chat.bot, 'unpin_all_chat_messages') + assert check_shortcut_defaults(chat.unpin_all_messages, chat.bot) monkeypatch.setattr(chat.bot, 'unpin_all_chat_messages', make_assertion) assert chat.unpin_all_messages() @@ -308,6 +321,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_message, Bot.send_message, ['chat_id'], []) assert check_shortcut_call(chat.send_message, chat.bot, 'send_message') + assert check_shortcut_defaults(chat.send_message, chat.bot) monkeypatch.setattr(chat.bot, 'send_message', make_assertion) assert chat.send_message(text='test') @@ -320,6 +334,7 @@ def make_assertion(*_, **kwargs): Chat.send_media_group, Bot.send_media_group, ['chat_id'], [] ) assert check_shortcut_call(chat.send_media_group, chat.bot, 'send_media_group') + assert check_shortcut_defaults(chat.send_media_group, chat.bot, method_timeout=20) monkeypatch.setattr(chat.bot, 'send_media_group', make_assertion) assert chat.send_media_group(media='test_media_group') @@ -330,6 +345,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_photo, Bot.send_photo, ['chat_id'], []) assert check_shortcut_call(chat.send_photo, chat.bot, 'send_photo') + assert check_shortcut_defaults(chat.send_photo, chat.bot, method_timeout=20) monkeypatch.setattr(chat.bot, 'send_photo', make_assertion) assert chat.send_photo(photo='test_photo') @@ -340,6 +356,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_contact, Bot.send_contact, ['chat_id'], []) assert check_shortcut_call(chat.send_contact, chat.bot, 'send_contact') + assert check_shortcut_defaults(chat.send_contact, chat.bot) monkeypatch.setattr(chat.bot, 'send_contact', make_assertion) assert chat.send_contact(phone_number='test_contact') @@ -350,6 +367,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_audio, Bot.send_audio, ['chat_id'], []) assert check_shortcut_call(chat.send_audio, chat.bot, 'send_audio') + assert check_shortcut_defaults(chat.send_audio, chat.bot, method_timeout=20) monkeypatch.setattr(chat.bot, 'send_audio', make_assertion) assert chat.send_audio(audio='test_audio') @@ -360,6 +378,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_document, Bot.send_document, ['chat_id'], []) assert check_shortcut_call(chat.send_document, chat.bot, 'send_document') + assert check_shortcut_defaults(chat.send_document, chat.bot, method_timeout=20) monkeypatch.setattr(chat.bot, 'send_document', make_assertion) assert chat.send_document(document='test_document') @@ -370,6 +389,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_dice, Bot.send_dice, ['chat_id'], []) assert check_shortcut_call(chat.send_dice, chat.bot, 'send_dice') + assert check_shortcut_defaults(chat.send_dice, chat.bot) monkeypatch.setattr(chat.bot, 'send_dice', make_assertion) assert chat.send_dice(emoji='test_dice') @@ -380,6 +400,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_game, Bot.send_game, ['chat_id'], []) assert check_shortcut_call(chat.send_game, chat.bot, 'send_game') + assert check_shortcut_defaults(chat.send_game, chat.bot) monkeypatch.setattr(chat.bot, 'send_game', make_assertion) assert chat.send_game(game_short_name='test_game') @@ -406,6 +427,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_invoice, Bot.send_invoice, ['chat_id'], []) assert check_shortcut_call(chat.send_invoice, chat.bot, 'send_invoice') + assert check_shortcut_defaults(chat.send_invoice, chat.bot) monkeypatch.setattr(chat.bot, 'send_invoice', make_assertion) assert chat.send_invoice( @@ -424,6 +446,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_location, Bot.send_location, ['chat_id'], []) assert check_shortcut_call(chat.send_location, chat.bot, 'send_location') + assert check_shortcut_defaults(chat.send_location, chat.bot) monkeypatch.setattr(chat.bot, 'send_location', make_assertion) assert chat.send_location(latitude='test_location') @@ -434,6 +457,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_sticker, Bot.send_sticker, ['chat_id'], []) assert check_shortcut_call(chat.send_sticker, chat.bot, 'send_sticker') + assert check_shortcut_defaults(chat.send_sticker, chat.bot, method_timeout=20) monkeypatch.setattr(chat.bot, 'send_sticker', make_assertion) assert chat.send_sticker(sticker='test_sticker') @@ -444,6 +468,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_venue, Bot.send_venue, ['chat_id'], []) assert check_shortcut_call(chat.send_venue, chat.bot, 'send_venue') + assert check_shortcut_defaults(chat.send_venue, chat.bot) monkeypatch.setattr(chat.bot, 'send_venue', make_assertion) assert chat.send_venue(title='test_venue') @@ -454,6 +479,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_video, Bot.send_video, ['chat_id'], []) assert check_shortcut_call(chat.send_video, chat.bot, 'send_video') + assert check_shortcut_defaults(chat.send_video, chat.bot, method_timeout=20) monkeypatch.setattr(chat.bot, 'send_video', make_assertion) assert chat.send_video(video='test_video') @@ -464,6 +490,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_video_note, Bot.send_video_note, ['chat_id'], []) assert check_shortcut_call(chat.send_video_note, chat.bot, 'send_video_note') + assert check_shortcut_defaults(chat.send_video_note, chat.bot, method_timeout=20) monkeypatch.setattr(chat.bot, 'send_video_note', make_assertion) assert chat.send_video_note(video_note='test_video_note') @@ -474,6 +501,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_voice, Bot.send_voice, ['chat_id'], []) assert check_shortcut_call(chat.send_voice, chat.bot, 'send_voice') + assert check_shortcut_defaults(chat.send_voice, chat.bot, method_timeout=20) monkeypatch.setattr(chat.bot, 'send_voice', make_assertion) assert chat.send_voice(voice='test_voice') @@ -484,6 +512,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_animation, Bot.send_animation, ['chat_id'], []) assert check_shortcut_call(chat.send_animation, chat.bot, 'send_animation') + assert check_shortcut_defaults(chat.send_animation, chat.bot, method_timeout=20) monkeypatch.setattr(chat.bot, 'send_animation', make_assertion) assert chat.send_animation(animation='test_animation') @@ -494,6 +523,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_poll, Bot.send_poll, ['chat_id'], []) assert check_shortcut_call(chat.send_poll, chat.bot, 'send_poll') + assert check_shortcut_defaults(chat.send_poll, chat.bot) monkeypatch.setattr(chat.bot, 'send_poll', make_assertion) assert chat.send_poll(question='test_poll', options=[1, 2]) @@ -507,6 +537,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_copy, Bot.copy_message, ['chat_id'], []) assert check_shortcut_call(chat.copy_message, chat.bot, 'copy_message') + assert check_shortcut_defaults(chat.copy_message, chat.bot) monkeypatch.setattr(chat.bot, 'copy_message', make_assertion) assert chat.send_copy(from_chat_id='test_copy', message_id=42) @@ -520,6 +551,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.copy_message, Bot.copy_message, ['from_chat_id'], []) assert check_shortcut_call(chat.copy_message, chat.bot, 'copy_message') + assert check_shortcut_defaults(chat.copy_message, chat.bot) monkeypatch.setattr(chat.bot, 'copy_message', make_assertion) assert chat.copy_message(chat_id='test_copy', message_id=42) diff --git a/tests/test_chatphoto.py b/tests/test_chatphoto.py index 2ae21da79cb..6bf51c58e68 100644 --- a/tests/test_chatphoto.py +++ b/tests/test_chatphoto.py @@ -22,7 +22,12 @@ from flaky import flaky from telegram import ChatPhoto, Voice, TelegramError, Bot -from tests.conftest import expect_bad_request, check_shortcut_call, check_shortcut_signature +from tests.conftest import ( + expect_bad_request, + check_shortcut_call, + check_shortcut_signature, + check_shortcut_defaults, +) @pytest.fixture(scope='function') @@ -130,8 +135,9 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(ChatPhoto.get_small_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(chat_photo.get_small_file, chat_photo.bot, 'get_file') + assert check_shortcut_defaults(chat_photo.get_small_file, chat_photo.bot) - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(chat_photo.bot, 'get_file', make_assertion) assert chat_photo.get_small_file() def test_get_big_file_instance_method(self, monkeypatch, chat_photo): @@ -140,8 +146,9 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(ChatPhoto.get_big_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(chat_photo.get_big_file, chat_photo.bot, 'get_file') + assert check_shortcut_defaults(chat_photo.get_big_file, chat_photo.bot) - monkeypatch.setattr('telegram.Bot.get_file', make_assertion) + monkeypatch.setattr(chat_photo.bot, 'get_file', make_assertion) assert chat_photo.get_big_file() def test_equality(self): diff --git a/tests/test_document.py b/tests/test_document.py index 6013e64ac97..245c021ebd8 100644 --- a/tests/test_document.py +++ b/tests/test_document.py @@ -25,7 +25,7 @@ from telegram import Document, PhotoSize, TelegramError, Voice, MessageEntity, Bot from telegram.error import BadRequest from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_signature, check_shortcut_call +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults @pytest.fixture(scope='function') @@ -303,6 +303,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Document.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(document.get_file, document.bot, 'get_file') + assert check_shortcut_defaults(document.get_file, document.bot) monkeypatch.setattr(document.bot, 'get_file', make_assertion) assert document.get_file() diff --git a/tests/test_inlinequery.py b/tests/test_inlinequery.py index 0b07821ef90..43d104999cc 100644 --- a/tests/test_inlinequery.py +++ b/tests/test_inlinequery.py @@ -20,7 +20,7 @@ import pytest from telegram import User, Location, InlineQuery, Update, Bot -from tests.conftest import check_shortcut_signature, check_shortcut_call +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults @pytest.fixture(scope='class') @@ -76,6 +76,7 @@ def make_assertion(*_, **kwargs): InlineQuery.answer, Bot.answer_inline_query, ['inline_query_id'], ['auto_pagination'] ) assert check_shortcut_call(inline_query.answer, inline_query.bot, 'answer_inline_query') + assert check_shortcut_defaults(inline_query.answer, inline_query.bot) monkeypatch.setattr(inline_query.bot, 'answer_inline_query', make_assertion) assert inline_query.answer(results=[]) diff --git a/tests/test_message.py b/tests/test_message.py index b5176c6e51f..911fdfbb053 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -651,7 +651,7 @@ def make_assertion(*_, **kwargs): Message.reply_text, Bot.send_message, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') - assert check_shortcut_defaults(message.reply_text, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_text, message.bot) monkeypatch.setattr(message.bot, 'send_message', make_assertion) assert message.reply_text('test') @@ -680,7 +680,7 @@ def make_assertion(*_, **kwargs): Message.reply_markdown, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') - assert check_shortcut_defaults(message.reply_text, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_text, message.bot) text_markdown = self.test_message.text_markdown assert text_markdown == test_md_string @@ -715,7 +715,7 @@ def make_assertion(*_, **kwargs): Message.reply_markdown_v2, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') - assert check_shortcut_defaults(message.reply_text, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_text, message.bot) text_markdown = self.test_message_v2.text_markdown_v2 assert text_markdown == test_md_string @@ -754,7 +754,7 @@ def make_assertion(*_, **kwargs): Message.reply_html, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') - assert check_shortcut_defaults(message.reply_text, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_text, message.bot) text_html = self.test_message_v2.text_html assert text_html == test_html_string @@ -780,9 +780,7 @@ def make_assertion(*_, **kwargs): Message.reply_media_group, Bot.send_media_group, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_media_group, message.bot, 'send_media_group') - assert check_shortcut_defaults( - message.reply_media_group, message.bot, monkeypatch, method_timeout=20 - ) + assert check_shortcut_defaults(message.reply_media_group, message.bot, method_timeout=20) monkeypatch.setattr(message.bot, 'send_media_group', make_assertion) assert message.reply_media_group(media='reply_media_group') @@ -802,9 +800,7 @@ def make_assertion(*_, **kwargs): Message.reply_photo, Bot.send_photo, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_photo, message.bot, 'send_photo') - assert check_shortcut_defaults( - message.reply_photo, message.bot, monkeypatch, method_timeout=20 - ) + assert check_shortcut_defaults(message.reply_photo, message.bot, method_timeout=20) monkeypatch.setattr(message.bot, 'send_photo', make_assertion) assert message.reply_photo(photo='test_photo') @@ -824,9 +820,7 @@ def make_assertion(*_, **kwargs): Message.reply_audio, Bot.send_audio, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_audio, message.bot, 'send_audio') - assert check_shortcut_defaults( - message.reply_audio, message.bot, monkeypatch, method_timeout=20 - ) + assert check_shortcut_defaults(message.reply_audio, message.bot, method_timeout=20) monkeypatch.setattr(message.bot, 'send_audio', make_assertion) assert message.reply_audio(audio='test_audio') @@ -846,9 +840,7 @@ def make_assertion(*_, **kwargs): Message.reply_document, Bot.send_document, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_document, message.bot, 'send_document') - assert check_shortcut_defaults( - message.reply_document, message.bot, monkeypatch, method_timeout=20 - ) + assert check_shortcut_defaults(message.reply_document, message.bot, method_timeout=20) monkeypatch.setattr(message.bot, 'send_document', make_assertion) assert message.reply_document(document='test_document') @@ -868,9 +860,7 @@ def make_assertion(*_, **kwargs): Message.reply_animation, Bot.send_animation, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_animation, message.bot, 'send_animation') - assert check_shortcut_defaults( - message.reply_animation, message.bot, monkeypatch, method_timeout=20 - ) + assert check_shortcut_defaults(message.reply_animation, message.bot, method_timeout=20) monkeypatch.setattr(message.bot, 'send_animation', make_assertion) assert message.reply_animation(animation='test_animation') @@ -890,9 +880,7 @@ def make_assertion(*_, **kwargs): Message.reply_sticker, Bot.send_sticker, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_sticker, message.bot, 'send_sticker') - assert check_shortcut_defaults( - message.reply_sticker, message.bot, monkeypatch, method_timeout=20 - ) + assert check_shortcut_defaults(message.reply_sticker, message.bot, method_timeout=20) monkeypatch.setattr(message.bot, 'send_sticker', make_assertion) assert message.reply_sticker(sticker='test_sticker') @@ -912,9 +900,7 @@ def make_assertion(*_, **kwargs): Message.reply_video, Bot.send_video, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_video, message.bot, 'send_video') - assert check_shortcut_defaults( - message.reply_video, message.bot, monkeypatch, method_timeout=20 - ) + assert check_shortcut_defaults(message.reply_video, message.bot, method_timeout=20) monkeypatch.setattr(message.bot, 'send_video', make_assertion) assert message.reply_video(video='test_video') @@ -934,9 +920,7 @@ def make_assertion(*_, **kwargs): Message.reply_video_note, Bot.send_video_note, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_video_note, message.bot, 'send_video_note') - assert check_shortcut_defaults( - message.reply_video_note, message.bot, monkeypatch, method_timeout=20 - ) + assert check_shortcut_defaults(message.reply_video_note, message.bot, method_timeout=20) monkeypatch.setattr(message.bot, 'send_video_note', make_assertion) assert message.reply_video_note(video_note='test_video_note') @@ -956,9 +940,7 @@ def make_assertion(*_, **kwargs): Message.reply_voice, Bot.send_voice, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_voice, message.bot, 'send_voice') - assert check_shortcut_defaults( - message.reply_voice, message.bot, monkeypatch, method_timeout=20 - ) + assert check_shortcut_defaults(message.reply_voice, message.bot, method_timeout=20) monkeypatch.setattr(message.bot, 'send_voice', make_assertion) assert message.reply_voice(voice='test_voice') @@ -978,7 +960,7 @@ def make_assertion(*_, **kwargs): Message.reply_location, Bot.send_location, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_location, message.bot, 'send_location') - assert check_shortcut_defaults(message.reply_location, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_location, message.bot) monkeypatch.setattr(message.bot, 'send_location', make_assertion) assert message.reply_location(location='test_location') @@ -998,7 +980,7 @@ def make_assertion(*_, **kwargs): Message.reply_venue, Bot.send_venue, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_venue, message.bot, 'send_venue') - assert check_shortcut_defaults(message.reply_venue, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_venue, message.bot) monkeypatch.setattr(message.bot, 'send_venue', make_assertion) assert message.reply_venue(venue='test_venue') @@ -1018,7 +1000,7 @@ def make_assertion(*_, **kwargs): Message.reply_contact, Bot.send_contact, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_contact, message.bot, 'send_contact') - assert check_shortcut_defaults(message.reply_contact, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_contact, message.bot) monkeypatch.setattr(message.bot, 'send_contact', make_assertion) assert message.reply_contact(contact='test_contact') @@ -1037,7 +1019,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Message.reply_poll, Bot.send_poll, ['chat_id'], ['quote']) assert check_shortcut_call(message.reply_poll, message.bot, 'send_poll') - assert check_shortcut_defaults(message.reply_poll, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_poll, message.bot) monkeypatch.setattr(message.bot, 'send_poll', make_assertion) assert message.reply_poll(question='test_poll', options=['1', '2', '3']) @@ -1055,7 +1037,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Message.reply_dice, Bot.send_dice, ['chat_id'], ['quote']) assert check_shortcut_call(message.reply_dice, message.bot, 'send_dice') - assert check_shortcut_defaults(message.reply_dice, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_dice, message.bot) monkeypatch.setattr(message.bot, 'send_dice', make_assertion) assert message.reply_dice(disable_notification=True) @@ -1071,7 +1053,7 @@ def make_assertion(*_, **kwargs): Message.reply_chat_action, Bot.send_chat_action, ['chat_id'], [] ) assert check_shortcut_call(message.reply_chat_action, message.bot, 'send_chat_action') - assert check_shortcut_defaults(message.reply_chat_action, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_chat_action, message.bot) monkeypatch.setattr(message.bot, 'send_chat_action', make_assertion) assert message.reply_chat_action(action=ChatAction.TYPING) @@ -1084,7 +1066,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Message.reply_game, Bot.send_game, ['chat_id'], ['quote']) assert check_shortcut_call(message.reply_game, message.bot, 'send_game') - assert check_shortcut_defaults(message.reply_game, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_game, message.bot) monkeypatch.setattr(message.bot, 'send_game', make_assertion) assert message.reply_game(game_short_name='test_game') @@ -1114,7 +1096,7 @@ def make_assertion(*_, **kwargs): Message.reply_invoice, Bot.send_invoice, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_invoice, message.bot, 'send_invoice') - assert check_shortcut_defaults(message.reply_invoice, message.bot, monkeypatch) + assert check_shortcut_defaults(message.reply_invoice, message.bot) monkeypatch.setattr(message.bot, 'send_invoice', make_assertion) assert message.reply_invoice( @@ -1150,7 +1132,7 @@ def make_assertion(*_, **kwargs): Message.forward, Bot.forward_message, ['from_chat_id', 'message_id'], [] ) assert check_shortcut_call(message.forward, message.bot, 'forward_message') - assert check_shortcut_defaults(message.forward, message.bot, monkeypatch) + assert check_shortcut_defaults(message.forward, message.bot) monkeypatch.setattr(message.bot, 'forward_message', make_assertion) assert message.forward(123456, disable_notification=disable_notification) @@ -1175,7 +1157,7 @@ def make_assertion(*_, **kwargs): Message.copy, Bot.copy_message, ['from_chat_id', 'message_id'], [] ) assert check_shortcut_call(message.copy, message.bot, 'copy_message') - assert check_shortcut_defaults(message.copy, message.bot, monkeypatch) + assert check_shortcut_defaults(message.copy, message.bot) monkeypatch.setattr(message.bot, 'copy_message', make_assertion) assert message.copy(123456, disable_notification=disable_notification) @@ -1207,7 +1189,7 @@ def make_assertion(*_, **kwargs): Message.reply_copy, Bot.copy_message, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.copy, message.bot, 'copy_message') - assert check_shortcut_defaults(message.copy, message.bot, monkeypatch) + assert check_shortcut_defaults(message.copy, message.bot) monkeypatch.setattr(message.bot, 'copy_message', make_assertion) assert message.reply_copy(123456, 456789, disable_notification=disable_notification) @@ -1245,6 +1227,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) + assert check_shortcut_defaults(message.edit_text, message.bot) monkeypatch.setattr(message.bot, 'edit_message_text', make_assertion) assert message.edit_text(text='test') @@ -1269,6 +1252,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) + assert check_shortcut_defaults(message.edit_caption, message.bot) monkeypatch.setattr(message.bot, 'edit_message_caption', make_assertion) assert message.edit_caption(caption='new caption') @@ -1293,6 +1277,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) + assert check_shortcut_defaults(message.edit_media, message.bot) monkeypatch.setattr(message.bot, 'edit_message_media', make_assertion) assert message.edit_media('my_media') @@ -1317,6 +1302,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) + assert check_shortcut_defaults(message.edit_reply_markup, message.bot) monkeypatch.setattr(message.bot, 'edit_message_reply_markup', make_assertion) assert message.edit_reply_markup(reply_markup=[['1', '2']]) @@ -1342,6 +1328,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) + assert check_shortcut_defaults(message.edit_live_location, message.bot) monkeypatch.setattr(message.bot, 'edit_message_live_location', make_assertion) assert message.edit_live_location(latitude=1, longitude=2) @@ -1365,6 +1352,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) + assert check_shortcut_defaults(message.stop_live_location, message.bot) monkeypatch.setattr(message.bot, 'stop_message_live_location', make_assertion) assert message.stop_live_location() @@ -1390,6 +1378,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) + assert check_shortcut_defaults(message.set_game_score, message.bot) monkeypatch.setattr(message.bot, 'set_game_score', make_assertion) assert message.set_game_score(user_id=1, score=2) @@ -1414,6 +1403,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) + assert check_shortcut_defaults(message.get_game_high_scores, message.bot) monkeypatch.setattr(message.bot, 'get_game_high_scores', make_assertion) assert message.get_game_high_scores(user_id=1) @@ -1428,7 +1418,7 @@ def make_assertion(*_, **kwargs): Message.delete, Bot.delete_message, ['chat_id', 'message_id'], [] ) assert check_shortcut_call(message.delete, message.bot, 'delete_message') - assert check_shortcut_defaults(message.delete, message.bot, monkeypatch) + assert check_shortcut_defaults(message.delete, message.bot) monkeypatch.setattr(message.bot, 'delete_message', make_assertion) assert message.delete() @@ -1443,7 +1433,7 @@ def make_assertion(*_, **kwargs): Message.stop_poll, Bot.stop_poll, ['chat_id', 'message_id'], [] ) assert check_shortcut_call(message.stop_poll, message.bot, 'stop_poll') - assert check_shortcut_defaults(message.stop_poll, message.bot, monkeypatch) + assert check_shortcut_defaults(message.stop_poll, message.bot) monkeypatch.setattr(message.bot, 'stop_poll', make_assertion) assert message.stop_poll() @@ -1458,7 +1448,7 @@ def make_assertion(*args, **kwargs): Message.pin, Bot.pin_chat_message, ['chat_id', 'message_id'], [] ) assert check_shortcut_call(message.pin, message.bot, 'pin_chat_message') - assert check_shortcut_defaults(message.pin, message.bot, monkeypatch) + assert check_shortcut_defaults(message.pin, message.bot) monkeypatch.setattr(message.bot, 'pin_chat_message', make_assertion) assert message.pin() @@ -1478,6 +1468,7 @@ def make_assertion(*args, **kwargs): 'unpin_chat_message', shortcut_kwargs=['chat_id', 'message_id'], ) + assert check_shortcut_defaults(message.unpin, message.bot) monkeypatch.setattr(message.bot, 'unpin_chat_message', make_assertion) assert message.unpin() diff --git a/tests/test_passportfile.py b/tests/test_passportfile.py index d6fcafce466..f9d83cd7f0c 100644 --- a/tests/test_passportfile.py +++ b/tests/test_passportfile.py @@ -20,7 +20,7 @@ import pytest from telegram import PassportFile, PassportElementError, Bot, File -from tests.conftest import check_shortcut_signature, check_shortcut_call +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults @pytest.fixture(scope='class') @@ -63,6 +63,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(PassportFile.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(passport_file.get_file, passport_file.bot, 'get_file') + assert check_shortcut_defaults(passport_file.get_file, passport_file.bot) monkeypatch.setattr(passport_file.bot, 'get_file', make_assertion) assert passport_file.get_file().file_id == 'True' diff --git a/tests/test_photo.py b/tests/test_photo.py index 8cf31fe6ad0..84271c3f665 100644 --- a/tests/test_photo.py +++ b/tests/test_photo.py @@ -25,7 +25,12 @@ from telegram import Sticker, TelegramError, PhotoSize, InputFile, MessageEntity, Bot from telegram.error import BadRequest from telegram.utils.helpers import escape_markdown -from tests.conftest import expect_bad_request, check_shortcut_call, check_shortcut_signature +from tests.conftest import ( + expect_bad_request, + check_shortcut_call, + check_shortcut_signature, + check_shortcut_defaults, +) @pytest.fixture(scope='function') @@ -470,6 +475,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(PhotoSize.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(photo.get_file, photo.bot, 'get_file') + assert check_shortcut_defaults(photo.get_file, photo.bot) monkeypatch.setattr(photo.bot, 'get_file', make_assertion) assert photo.get_file() diff --git a/tests/test_precheckoutquery.py b/tests/test_precheckoutquery.py index 19bb319d862..523c389d267 100644 --- a/tests/test_precheckoutquery.py +++ b/tests/test_precheckoutquery.py @@ -20,7 +20,7 @@ import pytest from telegram import Update, User, PreCheckoutQuery, OrderInfo, Bot -from tests.conftest import check_shortcut_call, check_shortcut_signature +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults @pytest.fixture(scope='class') @@ -91,6 +91,7 @@ def make_assertion(*_, **kwargs): pre_checkout_query.bot, 'answer_pre_checkout_query', ) + assert check_shortcut_defaults(pre_checkout_query.answer, pre_checkout_query.bot) monkeypatch.setattr(pre_checkout_query.bot, 'answer_pre_checkout_query', make_assertion) assert pre_checkout_query.answer(ok=True) diff --git a/tests/test_shippingquery.py b/tests/test_shippingquery.py index 0c7af75992c..43cee42a7ba 100644 --- a/tests/test_shippingquery.py +++ b/tests/test_shippingquery.py @@ -20,7 +20,7 @@ import pytest from telegram import Update, User, ShippingAddress, ShippingQuery, Bot -from tests.conftest import check_shortcut_call, check_shortcut_signature +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults @pytest.fixture(scope='class') @@ -74,6 +74,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_call( shipping_query.answer, shipping_query.bot, 'answer_shipping_query' ) + assert check_shortcut_defaults(shipping_query.answer, shipping_query.bot) monkeypatch.setattr(shipping_query.bot, 'answer_shipping_query', make_assertion) assert shipping_query.answer(ok=True) diff --git a/tests/test_sticker.py b/tests/test_sticker.py index 2e6b7463bf5..265202ef4b4 100644 --- a/tests/test_sticker.py +++ b/tests/test_sticker.py @@ -25,7 +25,7 @@ from telegram import Sticker, PhotoSize, TelegramError, StickerSet, Audio, MaskPosition, Bot from telegram.error import BadRequest -from tests.conftest import check_shortcut_call, check_shortcut_signature +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults @pytest.fixture(scope='function') @@ -510,6 +510,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Sticker.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(sticker.get_file, sticker.bot, 'get_file') + assert check_shortcut_defaults(sticker.get_file, sticker.bot) monkeypatch.setattr(sticker.bot, 'get_file', make_assertion) assert sticker.get_file() diff --git a/tests/test_user.py b/tests/test_user.py index 7b462d6a80a..fdce744d661 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -20,7 +20,7 @@ from telegram import Update, User, Bot from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_signature, check_shortcut_call +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults @pytest.fixture(scope='function') @@ -136,6 +136,7 @@ def make_assertion(*_, **kwargs): User.get_profile_photos, Bot.get_user_profile_photos, ['user_id'], [] ) assert check_shortcut_call(user.get_profile_photos, user.bot, 'get_user_profile_photos') + assert check_shortcut_defaults(user.get_profile_photos, user.bot) monkeypatch.setattr(user.bot, 'get_user_profile_photos', make_assertion) assert user.get_profile_photos() @@ -146,6 +147,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.pin_message, Bot.pin_chat_message, ['chat_id'], []) assert check_shortcut_call(user.pin_message, user.bot, 'pin_chat_message') + assert check_shortcut_defaults(user.pin_message, user.bot) monkeypatch.setattr(user.bot, 'pin_chat_message', make_assertion) assert user.pin_message(1) @@ -158,6 +160,7 @@ def make_assertion(*_, **kwargs): User.unpin_message, Bot.unpin_chat_message, ['chat_id'], [] ) assert check_shortcut_call(user.unpin_message, user.bot, 'unpin_chat_message') + assert check_shortcut_defaults(user.unpin_message, user.bot) monkeypatch.setattr(user.bot, 'unpin_chat_message', make_assertion) assert user.unpin_message() @@ -170,6 +173,7 @@ def make_assertion(*_, **kwargs): User.unpin_all_messages, Bot.unpin_all_chat_messages, ['chat_id'], [] ) assert check_shortcut_call(user.unpin_all_messages, user.bot, 'unpin_all_chat_messages') + assert check_shortcut_defaults(user.unpin_all_messages, user.bot) monkeypatch.setattr(user.bot, 'unpin_all_chat_messages', make_assertion) assert user.unpin_all_messages() @@ -180,6 +184,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_message, Bot.send_message, ['chat_id'], []) assert check_shortcut_call(user.send_message, user.bot, 'send_message') + assert check_shortcut_defaults(user.send_message, user.bot) monkeypatch.setattr(user.bot, 'send_message', make_assertion) assert user.send_message('test') @@ -190,6 +195,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_photo, Bot.send_photo, ['chat_id'], []) assert check_shortcut_call(user.send_photo, user.bot, 'send_photo') + assert check_shortcut_defaults(user.send_photo, user.bot, method_timeout=20) monkeypatch.setattr(user.bot, 'send_photo', make_assertion) assert user.send_photo('test_photo') @@ -202,6 +208,7 @@ def make_assertion(*_, **kwargs): User.send_media_group, Bot.send_media_group, ['chat_id'], [] ) assert check_shortcut_call(user.send_media_group, user.bot, 'send_media_group') + assert check_shortcut_defaults(user.send_media_group, user.bot, method_timeout=20) monkeypatch.setattr(user.bot, 'send_media_group', make_assertion) assert user.send_media_group('test_media_group') @@ -212,6 +219,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_audio, Bot.send_audio, ['chat_id'], []) assert check_shortcut_call(user.send_audio, user.bot, 'send_audio') + assert check_shortcut_defaults(user.send_audio, user.bot, method_timeout=20) monkeypatch.setattr(user.bot, 'send_audio', make_assertion) assert user.send_audio('test_audio') @@ -224,6 +232,7 @@ def make_assertion(*_, **kwargs): User.send_chat_action, Bot.send_chat_action, ['chat_id'], [] ) assert check_shortcut_call(user.send_chat_action, user.bot, 'send_chat_action') + assert check_shortcut_defaults(user.send_chat_action, user.bot) monkeypatch.setattr(user.bot, 'send_chat_action', make_assertion) assert user.send_chat_action('test_chat_action') @@ -234,6 +243,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_contact, Bot.send_contact, ['chat_id'], []) assert check_shortcut_call(user.send_contact, user.bot, 'send_contact') + assert check_shortcut_defaults(user.send_contact, user.bot) monkeypatch.setattr(user.bot, 'send_contact', make_assertion) assert user.send_contact(phone_number='test_contact') @@ -244,6 +254,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_dice, Bot.send_dice, ['chat_id'], []) assert check_shortcut_call(user.send_dice, user.bot, 'send_dice') + assert check_shortcut_defaults(user.send_dice, user.bot) monkeypatch.setattr(user.bot, 'send_dice', make_assertion) assert user.send_dice(emoji='test_dice') @@ -254,6 +265,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_document, Bot.send_document, ['chat_id'], []) assert check_shortcut_call(user.send_document, user.bot, 'send_document') + assert check_shortcut_defaults(user.send_document, user.bot, method_timeout=20) monkeypatch.setattr(user.bot, 'send_document', make_assertion) assert user.send_document('test_document') @@ -264,6 +276,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_game, Bot.send_game, ['chat_id'], []) assert check_shortcut_call(user.send_game, user.bot, 'send_game') + assert check_shortcut_defaults(user.send_game, user.bot) monkeypatch.setattr(user.bot, 'send_game', make_assertion) assert user.send_game(game_short_name='test_game') @@ -290,6 +303,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_invoice, Bot.send_invoice, ['chat_id'], []) assert check_shortcut_call(user.send_invoice, user.bot, 'send_invoice') + assert check_shortcut_defaults(user.send_invoice, user.bot) monkeypatch.setattr(user.bot, 'send_invoice', make_assertion) assert user.send_invoice( @@ -308,6 +322,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_location, Bot.send_location, ['chat_id'], []) assert check_shortcut_call(user.send_location, user.bot, 'send_location') + assert check_shortcut_defaults(user.send_location, user.bot) monkeypatch.setattr(user.bot, 'send_location', make_assertion) assert user.send_location('test_location') @@ -318,6 +333,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_sticker, Bot.send_sticker, ['chat_id'], []) assert check_shortcut_call(user.send_sticker, user.bot, 'send_sticker') + assert check_shortcut_defaults(user.send_sticker, user.bot, method_timeout=20) monkeypatch.setattr(user.bot, 'send_sticker', make_assertion) assert user.send_sticker('test_sticker') @@ -328,6 +344,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_video, Bot.send_video, ['chat_id'], []) assert check_shortcut_call(user.send_video, user.bot, 'send_video') + assert check_shortcut_defaults(user.send_video, user.bot, method_timeout=20) monkeypatch.setattr(user.bot, 'send_video', make_assertion) assert user.send_video('test_video') @@ -338,6 +355,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_venue, Bot.send_venue, ['chat_id'], []) assert check_shortcut_call(user.send_venue, user.bot, 'send_venue') + assert check_shortcut_defaults(user.send_venue, user.bot) monkeypatch.setattr(user.bot, 'send_venue', make_assertion) assert user.send_venue(title='test_venue') @@ -348,6 +366,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_video_note, Bot.send_video_note, ['chat_id'], []) assert check_shortcut_call(user.send_video_note, user.bot, 'send_video_note') + assert check_shortcut_defaults(user.send_video_note, user.bot, method_timeout=20) monkeypatch.setattr(user.bot, 'send_video_note', make_assertion) assert user.send_video_note('test_video_note') @@ -358,6 +377,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_voice, Bot.send_voice, ['chat_id'], []) assert check_shortcut_call(user.send_voice, user.bot, 'send_voice') + assert check_shortcut_defaults(user.send_voice, user.bot, method_timeout=20) monkeypatch.setattr(user.bot, 'send_voice', make_assertion) assert user.send_voice('test_voice') @@ -368,6 +388,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_animation, Bot.send_animation, ['chat_id'], []) assert check_shortcut_call(user.send_animation, user.bot, 'send_animation') + assert check_shortcut_defaults(user.send_animation, user.bot, method_timeout=20) monkeypatch.setattr(user.bot, 'send_animation', make_assertion) assert user.send_animation('test_animation') @@ -378,6 +399,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_poll, Bot.send_poll, ['chat_id'], []) assert check_shortcut_call(user.send_poll, user.bot, 'send_poll') + assert check_shortcut_defaults(user.send_poll, user.bot) monkeypatch.setattr(user.bot, 'send_poll', make_assertion) assert user.send_poll(question='test_poll', options=[1, 2]) @@ -391,6 +413,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_copy, Bot.copy_message, ['chat_id'], []) assert check_shortcut_call(user.copy_message, user.bot, 'copy_message') + assert check_shortcut_defaults(user.copy_message, user.bot) monkeypatch.setattr(user.bot, 'copy_message', make_assertion) assert user.send_copy(from_chat_id='from_chat_id', message_id='message_id') @@ -404,6 +427,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.copy_message, Bot.copy_message, ['from_chat_id'], []) assert check_shortcut_call(user.copy_message, user.bot, 'copy_message') + assert check_shortcut_defaults(user.copy_message, user.bot) monkeypatch.setattr(user.bot, 'copy_message', make_assertion) assert user.copy_message(chat_id='chat_id', message_id='message_id') diff --git a/tests/test_video.py b/tests/test_video.py index c1061f672a3..d1666eac376 100644 --- a/tests/test_video.py +++ b/tests/test_video.py @@ -25,7 +25,7 @@ from telegram import Video, TelegramError, Voice, PhotoSize, MessageEntity, Bot from telegram.error import BadRequest from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_call, check_shortcut_signature +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults @pytest.fixture(scope='function') @@ -335,6 +335,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Video.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(video.get_file, video.bot, 'get_file') + assert check_shortcut_defaults(video.get_file, video.bot) monkeypatch.setattr(video.bot, 'get_file', make_assertion) assert video.get_file() diff --git a/tests/test_videonote.py b/tests/test_videonote.py index 57573be4d3c..30e2f362d6d 100644 --- a/tests/test_videonote.py +++ b/tests/test_videonote.py @@ -24,7 +24,7 @@ from telegram import VideoNote, TelegramError, Voice, PhotoSize, Bot from telegram.error import BadRequest -from tests.conftest import check_shortcut_call, check_shortcut_signature +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults @pytest.fixture(scope='function') @@ -233,6 +233,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(VideoNote.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(video_note.get_file, video_note.bot, 'get_file') + assert check_shortcut_defaults(video_note.get_file, video_note.bot) monkeypatch.setattr(video_note.bot, 'get_file', make_assertion) assert video_note.get_file() diff --git a/tests/test_voice.py b/tests/test_voice.py index 06cb78f73dc..ce154e7d6fe 100644 --- a/tests/test_voice.py +++ b/tests/test_voice.py @@ -25,7 +25,7 @@ from telegram import Audio, Voice, TelegramError, MessageEntity, Bot from telegram.error import BadRequest from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_call, check_shortcut_signature +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults @pytest.fixture(scope='function') @@ -289,6 +289,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Voice.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(voice.get_file, voice.bot, 'get_file') + assert check_shortcut_defaults(voice.get_file, voice.bot) monkeypatch.setattr(voice.bot, 'get_file', make_assertion) assert voice.get_file() From 0be6847e1b35d58ff01f6cb74f7e160a04630cda Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sun, 7 Feb 2021 16:21:47 +0100 Subject: [PATCH 08/23] Some fine tuning --- tests/conftest.py | 3 ++- tests/test_chat.py | 18 +++++++++--------- tests/test_message.py | 18 +++++++++--------- tests/test_user.py | 18 +++++++++--------- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 4a5130987c0..0f1bb1e4986 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -480,7 +480,6 @@ def make_assertion(**kw): def check_shortcut_defaults( shortcut_method: Callable, bot: Bot, - method_timeout: float = None, return_value=None, ) -> bool: """ @@ -528,6 +527,8 @@ def build_kwargs(signature: inspect.Signature, default_kwargs, dfv: Any = DEFAUL for kwarg, value in shortcut_signature.parameters.items() if isinstance(value.default, DefaultValue) ] + # shortcut_signature.parameters['timeout'] is of type DefaultValue + method_timeout = shortcut_signature.parameters['timeout'].default.value default_kwarg_names = kwargs_need_default # special case explanation_parse_mode of Bot.send_poll: diff --git a/tests/test_chat.py b/tests/test_chat.py index 253a3bafb73..e932b4656bc 100644 --- a/tests/test_chat.py +++ b/tests/test_chat.py @@ -334,7 +334,7 @@ def make_assertion(*_, **kwargs): Chat.send_media_group, Bot.send_media_group, ['chat_id'], [] ) assert check_shortcut_call(chat.send_media_group, chat.bot, 'send_media_group') - assert check_shortcut_defaults(chat.send_media_group, chat.bot, method_timeout=20) + assert check_shortcut_defaults(chat.send_media_group, chat.bot) monkeypatch.setattr(chat.bot, 'send_media_group', make_assertion) assert chat.send_media_group(media='test_media_group') @@ -345,7 +345,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_photo, Bot.send_photo, ['chat_id'], []) assert check_shortcut_call(chat.send_photo, chat.bot, 'send_photo') - assert check_shortcut_defaults(chat.send_photo, chat.bot, method_timeout=20) + assert check_shortcut_defaults(chat.send_photo, chat.bot) monkeypatch.setattr(chat.bot, 'send_photo', make_assertion) assert chat.send_photo(photo='test_photo') @@ -367,7 +367,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_audio, Bot.send_audio, ['chat_id'], []) assert check_shortcut_call(chat.send_audio, chat.bot, 'send_audio') - assert check_shortcut_defaults(chat.send_audio, chat.bot, method_timeout=20) + assert check_shortcut_defaults(chat.send_audio, chat.bot) monkeypatch.setattr(chat.bot, 'send_audio', make_assertion) assert chat.send_audio(audio='test_audio') @@ -378,7 +378,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_document, Bot.send_document, ['chat_id'], []) assert check_shortcut_call(chat.send_document, chat.bot, 'send_document') - assert check_shortcut_defaults(chat.send_document, chat.bot, method_timeout=20) + assert check_shortcut_defaults(chat.send_document, chat.bot) monkeypatch.setattr(chat.bot, 'send_document', make_assertion) assert chat.send_document(document='test_document') @@ -457,7 +457,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_sticker, Bot.send_sticker, ['chat_id'], []) assert check_shortcut_call(chat.send_sticker, chat.bot, 'send_sticker') - assert check_shortcut_defaults(chat.send_sticker, chat.bot, method_timeout=20) + assert check_shortcut_defaults(chat.send_sticker, chat.bot) monkeypatch.setattr(chat.bot, 'send_sticker', make_assertion) assert chat.send_sticker(sticker='test_sticker') @@ -479,7 +479,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_video, Bot.send_video, ['chat_id'], []) assert check_shortcut_call(chat.send_video, chat.bot, 'send_video') - assert check_shortcut_defaults(chat.send_video, chat.bot, method_timeout=20) + assert check_shortcut_defaults(chat.send_video, chat.bot) monkeypatch.setattr(chat.bot, 'send_video', make_assertion) assert chat.send_video(video='test_video') @@ -490,7 +490,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_video_note, Bot.send_video_note, ['chat_id'], []) assert check_shortcut_call(chat.send_video_note, chat.bot, 'send_video_note') - assert check_shortcut_defaults(chat.send_video_note, chat.bot, method_timeout=20) + assert check_shortcut_defaults(chat.send_video_note, chat.bot) monkeypatch.setattr(chat.bot, 'send_video_note', make_assertion) assert chat.send_video_note(video_note='test_video_note') @@ -501,7 +501,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_voice, Bot.send_voice, ['chat_id'], []) assert check_shortcut_call(chat.send_voice, chat.bot, 'send_voice') - assert check_shortcut_defaults(chat.send_voice, chat.bot, method_timeout=20) + assert check_shortcut_defaults(chat.send_voice, chat.bot) monkeypatch.setattr(chat.bot, 'send_voice', make_assertion) assert chat.send_voice(voice='test_voice') @@ -512,7 +512,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_animation, Bot.send_animation, ['chat_id'], []) assert check_shortcut_call(chat.send_animation, chat.bot, 'send_animation') - assert check_shortcut_defaults(chat.send_animation, chat.bot, method_timeout=20) + assert check_shortcut_defaults(chat.send_animation, chat.bot) monkeypatch.setattr(chat.bot, 'send_animation', make_assertion) assert chat.send_animation(animation='test_animation') diff --git a/tests/test_message.py b/tests/test_message.py index 911fdfbb053..f8740d2f9ec 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -780,7 +780,7 @@ def make_assertion(*_, **kwargs): Message.reply_media_group, Bot.send_media_group, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_media_group, message.bot, 'send_media_group') - assert check_shortcut_defaults(message.reply_media_group, message.bot, method_timeout=20) + assert check_shortcut_defaults(message.reply_media_group, message.bot) monkeypatch.setattr(message.bot, 'send_media_group', make_assertion) assert message.reply_media_group(media='reply_media_group') @@ -800,7 +800,7 @@ def make_assertion(*_, **kwargs): Message.reply_photo, Bot.send_photo, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_photo, message.bot, 'send_photo') - assert check_shortcut_defaults(message.reply_photo, message.bot, method_timeout=20) + assert check_shortcut_defaults(message.reply_photo, message.bot) monkeypatch.setattr(message.bot, 'send_photo', make_assertion) assert message.reply_photo(photo='test_photo') @@ -820,7 +820,7 @@ def make_assertion(*_, **kwargs): Message.reply_audio, Bot.send_audio, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_audio, message.bot, 'send_audio') - assert check_shortcut_defaults(message.reply_audio, message.bot, method_timeout=20) + assert check_shortcut_defaults(message.reply_audio, message.bot) monkeypatch.setattr(message.bot, 'send_audio', make_assertion) assert message.reply_audio(audio='test_audio') @@ -840,7 +840,7 @@ def make_assertion(*_, **kwargs): Message.reply_document, Bot.send_document, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_document, message.bot, 'send_document') - assert check_shortcut_defaults(message.reply_document, message.bot, method_timeout=20) + assert check_shortcut_defaults(message.reply_document, message.bot) monkeypatch.setattr(message.bot, 'send_document', make_assertion) assert message.reply_document(document='test_document') @@ -860,7 +860,7 @@ def make_assertion(*_, **kwargs): Message.reply_animation, Bot.send_animation, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_animation, message.bot, 'send_animation') - assert check_shortcut_defaults(message.reply_animation, message.bot, method_timeout=20) + assert check_shortcut_defaults(message.reply_animation, message.bot) monkeypatch.setattr(message.bot, 'send_animation', make_assertion) assert message.reply_animation(animation='test_animation') @@ -880,7 +880,7 @@ def make_assertion(*_, **kwargs): Message.reply_sticker, Bot.send_sticker, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_sticker, message.bot, 'send_sticker') - assert check_shortcut_defaults(message.reply_sticker, message.bot, method_timeout=20) + assert check_shortcut_defaults(message.reply_sticker, message.bot) monkeypatch.setattr(message.bot, 'send_sticker', make_assertion) assert message.reply_sticker(sticker='test_sticker') @@ -900,7 +900,7 @@ def make_assertion(*_, **kwargs): Message.reply_video, Bot.send_video, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_video, message.bot, 'send_video') - assert check_shortcut_defaults(message.reply_video, message.bot, method_timeout=20) + assert check_shortcut_defaults(message.reply_video, message.bot) monkeypatch.setattr(message.bot, 'send_video', make_assertion) assert message.reply_video(video='test_video') @@ -920,7 +920,7 @@ def make_assertion(*_, **kwargs): Message.reply_video_note, Bot.send_video_note, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_video_note, message.bot, 'send_video_note') - assert check_shortcut_defaults(message.reply_video_note, message.bot, method_timeout=20) + assert check_shortcut_defaults(message.reply_video_note, message.bot) monkeypatch.setattr(message.bot, 'send_video_note', make_assertion) assert message.reply_video_note(video_note='test_video_note') @@ -940,7 +940,7 @@ def make_assertion(*_, **kwargs): Message.reply_voice, Bot.send_voice, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_voice, message.bot, 'send_voice') - assert check_shortcut_defaults(message.reply_voice, message.bot, method_timeout=20) + assert check_shortcut_defaults(message.reply_voice, message.bot) monkeypatch.setattr(message.bot, 'send_voice', make_assertion) assert message.reply_voice(voice='test_voice') diff --git a/tests/test_user.py b/tests/test_user.py index fdce744d661..06ace6bc905 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -195,7 +195,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_photo, Bot.send_photo, ['chat_id'], []) assert check_shortcut_call(user.send_photo, user.bot, 'send_photo') - assert check_shortcut_defaults(user.send_photo, user.bot, method_timeout=20) + assert check_shortcut_defaults(user.send_photo, user.bot) monkeypatch.setattr(user.bot, 'send_photo', make_assertion) assert user.send_photo('test_photo') @@ -208,7 +208,7 @@ def make_assertion(*_, **kwargs): User.send_media_group, Bot.send_media_group, ['chat_id'], [] ) assert check_shortcut_call(user.send_media_group, user.bot, 'send_media_group') - assert check_shortcut_defaults(user.send_media_group, user.bot, method_timeout=20) + assert check_shortcut_defaults(user.send_media_group, user.bot) monkeypatch.setattr(user.bot, 'send_media_group', make_assertion) assert user.send_media_group('test_media_group') @@ -219,7 +219,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_audio, Bot.send_audio, ['chat_id'], []) assert check_shortcut_call(user.send_audio, user.bot, 'send_audio') - assert check_shortcut_defaults(user.send_audio, user.bot, method_timeout=20) + assert check_shortcut_defaults(user.send_audio, user.bot) monkeypatch.setattr(user.bot, 'send_audio', make_assertion) assert user.send_audio('test_audio') @@ -265,7 +265,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_document, Bot.send_document, ['chat_id'], []) assert check_shortcut_call(user.send_document, user.bot, 'send_document') - assert check_shortcut_defaults(user.send_document, user.bot, method_timeout=20) + assert check_shortcut_defaults(user.send_document, user.bot) monkeypatch.setattr(user.bot, 'send_document', make_assertion) assert user.send_document('test_document') @@ -333,7 +333,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_sticker, Bot.send_sticker, ['chat_id'], []) assert check_shortcut_call(user.send_sticker, user.bot, 'send_sticker') - assert check_shortcut_defaults(user.send_sticker, user.bot, method_timeout=20) + assert check_shortcut_defaults(user.send_sticker, user.bot) monkeypatch.setattr(user.bot, 'send_sticker', make_assertion) assert user.send_sticker('test_sticker') @@ -344,7 +344,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_video, Bot.send_video, ['chat_id'], []) assert check_shortcut_call(user.send_video, user.bot, 'send_video') - assert check_shortcut_defaults(user.send_video, user.bot, method_timeout=20) + assert check_shortcut_defaults(user.send_video, user.bot) monkeypatch.setattr(user.bot, 'send_video', make_assertion) assert user.send_video('test_video') @@ -366,7 +366,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_video_note, Bot.send_video_note, ['chat_id'], []) assert check_shortcut_call(user.send_video_note, user.bot, 'send_video_note') - assert check_shortcut_defaults(user.send_video_note, user.bot, method_timeout=20) + assert check_shortcut_defaults(user.send_video_note, user.bot) monkeypatch.setattr(user.bot, 'send_video_note', make_assertion) assert user.send_video_note('test_video_note') @@ -377,7 +377,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_voice, Bot.send_voice, ['chat_id'], []) assert check_shortcut_call(user.send_voice, user.bot, 'send_voice') - assert check_shortcut_defaults(user.send_voice, user.bot, method_timeout=20) + assert check_shortcut_defaults(user.send_voice, user.bot) monkeypatch.setattr(user.bot, 'send_voice', make_assertion) assert user.send_voice('test_voice') @@ -388,7 +388,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_animation, Bot.send_animation, ['chat_id'], []) assert check_shortcut_call(user.send_animation, user.bot, 'send_animation') - assert check_shortcut_defaults(user.send_animation, user.bot, method_timeout=20) + assert check_shortcut_defaults(user.send_animation, user.bot) monkeypatch.setattr(user.bot, 'send_animation', make_assertion) assert user.send_animation('test_animation') From 4e874673722f5c89c38fcb04039009ee7617986a Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sun, 7 Feb 2021 17:17:27 +0100 Subject: [PATCH 09/23] Add defaults checking for bot methods --- telegram/bot.py | 22 +++++++--- tests/conftest.py | 23 +++++------ tests/test_animation.py | 4 +- tests/test_audio.py | 4 +- tests/test_bot.py | 37 ++++++++++++++++- tests/test_callbackquery.py | 12 +++--- tests/test_chat.py | 66 +++++++++++++++--------------- tests/test_chatphoto.py | 6 +-- tests/test_document.py | 4 +- tests/test_inlinequery.py | 4 +- tests/test_message.py | 74 +++++++++++++++++----------------- tests/test_passportfile.py | 4 +- tests/test_photo.py | 4 +- tests/test_precheckoutquery.py | 4 +- tests/test_shippingquery.py | 4 +- tests/test_sticker.py | 4 +- tests/test_user.py | 50 +++++++++++------------ tests/test_video.py | 4 +- tests/test_videonote.py | 4 +- tests/test_voice.py | 4 +- 20 files changed, 190 insertions(+), 148 deletions(-) diff --git a/telegram/bot.py b/telegram/bot.py index 0985871fbf3..ffa3d4cab40 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -4669,9 +4669,9 @@ def get_my_commands( """ result = self._post('getMyCommands', timeout=timeout, api_kwargs=api_kwargs) - self._commands = [BotCommand.de_json(c, self) for c in result] # type: ignore + self._commands = BotCommand.de_list(result, self) # type: ignore[assignment,arg-type] - return self._commands + return self._commands # type: ignore[return-value] @log def set_my_commands( @@ -4713,7 +4713,7 @@ def set_my_commands( return result # type: ignore[return-value] @log - def log_out(self) -> bool: + def log_out(self, timeout: ODVInput[float] = DEFAULT_NONE) -> bool: """ Use this method to log out from the cloud Bot API server before launching the bot locally. You *must* log out the bot before running it locally, otherwise there is no guarantee that @@ -4721,6 +4721,11 @@ def log_out(self) -> bool: local server, but will not be able to log in back to the cloud Bot API server for 10 minutes. + Args: + timeout (:obj:`int` | :obj:`float`, optional): If this value is specified, use it as + the read timeout from the server (instead of the one specified during creation of + the connection pool). + Returns: :obj:`True`: On success @@ -4728,16 +4733,21 @@ def log_out(self) -> bool: :class:`telegram.error.TelegramError` """ - return self._post('logOut') # type: ignore[return-value] + return self._post('logOut', timeout=timeout) # type: ignore[return-value] @log - def close(self) -> bool: + def close(self, timeout: ODVInput[float] = DEFAULT_NONE) -> bool: """ Use this method to close the bot instance before moving it from one local server to another. You need to delete the webhook before calling this method to ensure that the bot isn't launched again after server restart. The method will return error 429 in the first 10 minutes after the bot is launched. + Args: + timeout (:obj:`int` | :obj:`float`, optional): If this value is specified, use it as + the read timeout from the server (instead of the one specified during creation of + the connection pool). + Returns: :obj:`True`: On success @@ -4745,7 +4755,7 @@ def close(self) -> bool: :class:`telegram.error.TelegramError` """ - return self._post('close') # type: ignore[return-value] + return self._post('close', timeout=timeout) # type: ignore[return-value] @log def copy_message( diff --git a/tests/conftest.py b/tests/conftest.py index 0f1bb1e4986..ff79af853bf 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -477,8 +477,8 @@ def make_assertion(**kw): return True -def check_shortcut_defaults( - shortcut_method: Callable, +def check_defaults_handling( + method: Callable, bot: Bot, return_value=None, ) -> bool: @@ -486,11 +486,8 @@ def check_shortcut_defaults( Checks that tg.ext.Defaults are handled correctly. Args: - shortcut_method: The shortcut/bot_method + method: The shortcut/bot_method bot: The bot - monkeypatch: The monkeypatch fixture - method_timeout: Optional. The default timeout for the method. Relevant for media methods, - i.e. pass 20. Defaults to None. return_value: Optional. The return value of Bot._post that the method expects. Defaults to None. get_file is automatically handled. @@ -504,7 +501,7 @@ def build_kwargs(signature: inspect.Signature, default_kwargs, dfv: Any = DEFAUL # Some special casing if name == 'permissions': kws[name] = ChatPermissions() - elif name in ['prices', 'media', 'results']: + elif name in ['prices', 'media', 'results', 'commands', 'errors']: kws[name] = [] elif name == 'ok': kws['ok'] = False @@ -517,11 +514,11 @@ def build_kwargs(signature: inspect.Signature, default_kwargs, dfv: Any = DEFAUL if dfv != DEFAULT_NONE: kws[name] = dfv # Some special casing for methods that have "exactly one of the optionals" type args - elif name in ['location', 'contact', 'venue']: + elif name in ['location', 'contact', 'venue', 'inline_message_id']: kws[name] = True return kws - shortcut_signature = inspect.signature(shortcut_method) + shortcut_signature = inspect.signature(method) kwargs_need_default = [ kwarg for kwarg, value in shortcut_signature.parameters.items() @@ -559,7 +556,7 @@ def make_assertion(_, data, timeout=DEFAULT_NONE, df_value=DEFAULT_NONE): if value != df_value: pytest.fail(f'Got value {value} for argument {arg} instead of {df_value}') - if shortcut_method.__name__ in ['get_file', 'get_small_file', 'get_big_file']: + if method.__name__ in ['get_file', 'get_small_file', 'get_big_file']: # This is here mainly for PassportFile.get_file, which calls .set_credentials on the # return value out = File(file_id='result', file_unique_id='result') @@ -586,13 +583,13 @@ def make_assertion(_, data, timeout=DEFAULT_NONE, df_value=DEFAULT_NONE): ) assertion_callback = functools.partial(make_assertion, df_value=default_value) setattr(bot.request, 'post', assertion_callback) - assert shortcut_method(**kwargs) in expected_return_values + assert method(**kwargs) in expected_return_values # 2: test that we get the manually passed non-None value kwargs = build_kwargs(shortcut_signature, kwargs_need_default, dfv='non-None-value') assertion_callback = functools.partial(make_assertion, df_value='non-None-value') setattr(bot.request, 'post', assertion_callback) - assert shortcut_method(**kwargs) in expected_return_values + assert method(**kwargs) in expected_return_values # 3: test that we get the manually passed None value kwargs = build_kwargs( @@ -602,7 +599,7 @@ def make_assertion(_, data, timeout=DEFAULT_NONE, df_value=DEFAULT_NONE): ) assertion_callback = functools.partial(make_assertion, df_value=None) setattr(bot.request, 'post', assertion_callback) - assert shortcut_method(**kwargs) in expected_return_values + assert method(**kwargs) in expected_return_values except Exception as exc: raise exc finally: diff --git a/tests/test_animation.py b/tests/test_animation.py index 330f0393208..1fd697400bd 100644 --- a/tests/test_animation.py +++ b/tests/test_animation.py @@ -26,7 +26,7 @@ from telegram import PhotoSize, Animation, Voice, TelegramError, MessageEntity, Bot from telegram.error import BadRequest from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_defaults_handling @pytest.fixture(scope='function') @@ -314,7 +314,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Animation.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(animation.get_file, animation.bot, 'get_file') - assert check_shortcut_defaults(animation.get_file, animation.bot) + assert check_defaults_handling(animation.get_file, animation.bot) monkeypatch.setattr(animation.bot, 'get_file', make_assertion) assert animation.get_file() diff --git a/tests/test_audio.py b/tests/test_audio.py index 91cd91748a3..e187b096b11 100644 --- a/tests/test_audio.py +++ b/tests/test_audio.py @@ -24,7 +24,7 @@ from telegram import Audio, TelegramError, Voice, MessageEntity, Bot from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_defaults_handling @pytest.fixture(scope='function') @@ -287,7 +287,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Audio.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(audio.get_file, audio.bot, 'get_file') - assert check_shortcut_defaults(audio.get_file, audio.bot) + assert check_defaults_handling(audio.get_file, audio.bot) monkeypatch.setattr(audio.bot, 'get_file', make_assertion) assert audio.get_file() diff --git a/tests/test_bot.py b/tests/test_bot.py index c499b6a17e9..1b2ea47e8c9 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -16,6 +16,7 @@ # # You should have received a copy of the GNU Lesser Public License # along with this program. If not, see [http://www.gnu.org/licenses/]. +import inspect import time import datetime as dtm from pathlib import Path @@ -47,7 +48,7 @@ from telegram.constants import MAX_INLINE_QUERY_RESULTS from telegram.error import BadRequest, InvalidToken, NetworkError, RetryAfter from telegram.utils.helpers import from_timestamp, escape_markdown, to_timestamp -from tests.conftest import expect_bad_request +from tests.conftest import expect_bad_request, check_defaults_handling from tests.bots import FALLBACKS @@ -177,6 +178,40 @@ def test_to_dict(self, bot): if bot.last_name: assert to_dict_bot["last_name"] == bot.last_name + @pytest.mark.parametrize( + 'bot_method_name', + argvalues=[ + name + for name, _ in inspect.getmembers(Bot, predicate=inspect.isfunction) + if not name.startswith('_') + and name + not in [ + 'de_json', + 'de_list', + 'to_dict', + 'to_json', + 'parse_data', + 'get_updates', + 'getUpdates', + ] + ], + ) + def test_defaults_handling(self, bot_method_name, bot): + """ + Here we check that the bot methods handle tg.ext.Defaults correctly. As for most defaults, + we can't really check the effect, we just check if we're passing the correct kwargs to + Request.post. As bot method tests a scattered across the different test files, we do + this here in one place. + + The same test is also run for all the shortcuts (Message.reply_text) etc in the + corresponding tests. + + Finally, there are some tests for Defaults.{parse_mode, quote} at the appropriate places, + as those are the only things we can actually check. + """ + bot_method = getattr(bot, bot_method_name) + assert check_defaults_handling(bot_method, bot) + @flaky(3, 1) @pytest.mark.timeout(10) def test_forward_message(self, bot, chat_id, message): diff --git a/tests/test_callbackquery.py b/tests/test_callbackquery.py index 569db21d999..a786d369870 100644 --- a/tests/test_callbackquery.py +++ b/tests/test_callbackquery.py @@ -20,7 +20,7 @@ import pytest from telegram import CallbackQuery, User, Message, Chat, Audio, Bot -from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_defaults_handling @pytest.fixture(scope='function', params=['message', 'inline']) @@ -118,7 +118,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_call( callback_query.answer, callback_query.bot, 'answer_callback_query' ) - assert check_shortcut_defaults(callback_query.answer, callback_query.bot) + assert check_defaults_handling(callback_query.answer, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'answer_callback_query', make_assertion) # TODO: PEP8 @@ -334,7 +334,7 @@ def make_assertion(*args, **kwargs): assert check_shortcut_call( callback_query.delete_message, callback_query.bot, 'delete_message' ) - assert check_shortcut_defaults(callback_query.delete_message, callback_query.bot) + assert check_defaults_handling(callback_query.delete_message, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'delete_message', make_assertion) assert callback_query.delete_message() @@ -355,7 +355,7 @@ def make_assertion(*args, **kwargs): assert check_shortcut_call( callback_query.pin_message, callback_query.bot, 'pin_chat_message' ) - assert check_shortcut_defaults(callback_query.pin_message, callback_query.bot) + assert check_defaults_handling(callback_query.pin_message, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'pin_chat_message', make_assertion) assert callback_query.pin_message() @@ -379,7 +379,7 @@ def make_assertion(*args, **kwargs): 'unpin_chat_message', shortcut_kwargs=['message_id', 'chat_id'], ) - assert check_shortcut_defaults(callback_query.unpin_message, callback_query.bot) + assert check_defaults_handling(callback_query.unpin_message, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'unpin_chat_message', make_assertion) assert callback_query.unpin_message() @@ -401,7 +401,7 @@ def make_assertion(*args, **kwargs): [], ) assert check_shortcut_call(callback_query.copy_message, callback_query.bot, 'copy_message') - assert check_shortcut_defaults(callback_query.copy_message, callback_query.bot) + assert check_defaults_handling(callback_query.copy_message, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'copy_message', make_assertion) assert callback_query.copy_message(1) diff --git a/tests/test_chat.py b/tests/test_chat.py index e932b4656bc..5d313cf1898 100644 --- a/tests/test_chat.py +++ b/tests/test_chat.py @@ -21,7 +21,7 @@ from telegram import Chat, ChatAction, ChatPermissions, ChatLocation, Location, Bot from telegram import User -from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_defaults_handling @pytest.fixture(scope='class') @@ -133,7 +133,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(chat.send_action, Bot.send_chat_action, ['chat_id'], []) assert check_shortcut_call(chat.send_action, chat.bot, 'send_chat_action') - assert check_shortcut_defaults(chat.send_action, chat.bot) + assert check_defaults_handling(chat.send_action, chat.bot) monkeypatch.setattr(chat.bot, 'send_chat_action', make_assertion) assert chat.send_action(action=ChatAction.TYPING) @@ -145,7 +145,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.leave, Bot.leave_chat, ['chat_id'], []) assert check_shortcut_call(chat.leave, chat.bot, 'leave_chat') - assert check_shortcut_defaults(chat.leave, chat.bot) + assert check_defaults_handling(chat.leave, chat.bot) monkeypatch.setattr(chat.bot, 'leave_chat', make_assertion) assert chat.leave() @@ -158,7 +158,7 @@ def make_assertion(*_, **kwargs): Chat.get_administrators, Bot.get_chat_administrators, ['chat_id'], [] ) assert check_shortcut_call(chat.get_administrators, chat.bot, 'get_chat_administrators') - assert check_shortcut_defaults(chat.get_administrators, chat.bot) + assert check_defaults_handling(chat.get_administrators, chat.bot) monkeypatch.setattr(chat.bot, 'get_chat_administrators', make_assertion) assert chat.get_administrators() @@ -171,7 +171,7 @@ def make_assertion(*_, **kwargs): Chat.get_members_count, Bot.get_chat_members_count, ['chat_id'], [] ) assert check_shortcut_call(chat.get_members_count, chat.bot, 'get_chat_members_count') - assert check_shortcut_defaults(chat.get_members_count, chat.bot) + assert check_defaults_handling(chat.get_members_count, chat.bot) monkeypatch.setattr(chat.bot, 'get_chat_members_count', make_assertion) assert chat.get_members_count() @@ -184,7 +184,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.get_member, Bot.get_chat_member, ['chat_id'], []) assert check_shortcut_call(chat.get_member, chat.bot, 'get_chat_member') - assert check_shortcut_defaults(chat.get_member, chat.bot) + assert check_defaults_handling(chat.get_member, chat.bot) monkeypatch.setattr(chat.bot, 'get_chat_member', make_assertion) assert chat.get_member(user_id=42) @@ -198,7 +198,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.kick_member, Bot.kick_chat_member, ['chat_id'], []) assert check_shortcut_call(chat.kick_member, chat.bot, 'kick_chat_member') - assert check_shortcut_defaults(chat.kick_member, chat.bot) + assert check_defaults_handling(chat.kick_member, chat.bot) monkeypatch.setattr(chat.bot, 'kick_chat_member', make_assertion) assert chat.kick_member(user_id=42, until_date=43) @@ -213,7 +213,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.unban_member, Bot.unban_chat_member, ['chat_id'], []) assert check_shortcut_call(chat.unban_member, chat.bot, 'unban_chat_member') - assert check_shortcut_defaults(chat.unban_member, chat.bot) + assert check_defaults_handling(chat.unban_member, chat.bot) monkeypatch.setattr(chat.bot, 'unban_chat_member', make_assertion) assert chat.unban_member(user_id=42, only_if_banned=only_if_banned) @@ -230,7 +230,7 @@ def make_assertion(*_, **kwargs): Chat.promote_member, Bot.promote_chat_member, ['chat_id'], [] ) assert check_shortcut_call(chat.promote_member, chat.bot, 'promote_chat_member') - assert check_shortcut_defaults(chat.promote_member, chat.bot) + assert check_defaults_handling(chat.promote_member, chat.bot) monkeypatch.setattr(chat.bot, 'promote_chat_member', make_assertion) assert chat.promote_member(user_id=42, is_anonymous=is_anonymous) @@ -248,7 +248,7 @@ def make_assertion(*_, **kwargs): Chat.restrict_member, Bot.restrict_chat_member, ['chat_id'], [] ) assert check_shortcut_call(chat.restrict_member, chat.bot, 'restrict_chat_member') - assert check_shortcut_defaults(chat.restrict_member, chat.bot) + assert check_defaults_handling(chat.restrict_member, chat.bot) monkeypatch.setattr(chat.bot, 'restrict_chat_member', make_assertion) assert chat.restrict_member(user_id=42, permissions=permissions) @@ -263,7 +263,7 @@ def make_assertion(*_, **kwargs): Chat.set_permissions, Bot.set_chat_permissions, ['chat_id'], [] ) assert check_shortcut_call(chat.set_permissions, chat.bot, 'set_chat_permissions') - assert check_shortcut_defaults(chat.set_permissions, chat.bot) + assert check_defaults_handling(chat.set_permissions, chat.bot) monkeypatch.setattr(chat.bot, 'set_chat_permissions', make_assertion) assert chat.set_permissions(permissions=self.permissions) @@ -284,7 +284,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.pin_message, Bot.pin_chat_message, ['chat_id'], []) assert check_shortcut_call(chat.pin_message, chat.bot, 'pin_chat_message') - assert check_shortcut_defaults(chat.pin_message, chat.bot) + assert check_defaults_handling(chat.pin_message, chat.bot) monkeypatch.setattr(chat.bot, 'pin_chat_message', make_assertion) assert chat.pin_message(message_id=42) @@ -297,7 +297,7 @@ def make_assertion(*_, **kwargs): Chat.unpin_message, Bot.unpin_chat_message, ['chat_id'], [] ) assert check_shortcut_call(chat.unpin_message, chat.bot, 'unpin_chat_message') - assert check_shortcut_defaults(chat.unpin_message, chat.bot) + assert check_defaults_handling(chat.unpin_message, chat.bot) monkeypatch.setattr(chat.bot, 'unpin_chat_message', make_assertion) assert chat.unpin_message() @@ -310,7 +310,7 @@ def make_assertion(*_, **kwargs): Chat.unpin_all_messages, Bot.unpin_all_chat_messages, ['chat_id'], [] ) assert check_shortcut_call(chat.unpin_all_messages, chat.bot, 'unpin_all_chat_messages') - assert check_shortcut_defaults(chat.unpin_all_messages, chat.bot) + assert check_defaults_handling(chat.unpin_all_messages, chat.bot) monkeypatch.setattr(chat.bot, 'unpin_all_chat_messages', make_assertion) assert chat.unpin_all_messages() @@ -321,7 +321,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_message, Bot.send_message, ['chat_id'], []) assert check_shortcut_call(chat.send_message, chat.bot, 'send_message') - assert check_shortcut_defaults(chat.send_message, chat.bot) + assert check_defaults_handling(chat.send_message, chat.bot) monkeypatch.setattr(chat.bot, 'send_message', make_assertion) assert chat.send_message(text='test') @@ -334,7 +334,7 @@ def make_assertion(*_, **kwargs): Chat.send_media_group, Bot.send_media_group, ['chat_id'], [] ) assert check_shortcut_call(chat.send_media_group, chat.bot, 'send_media_group') - assert check_shortcut_defaults(chat.send_media_group, chat.bot) + assert check_defaults_handling(chat.send_media_group, chat.bot) monkeypatch.setattr(chat.bot, 'send_media_group', make_assertion) assert chat.send_media_group(media='test_media_group') @@ -345,7 +345,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_photo, Bot.send_photo, ['chat_id'], []) assert check_shortcut_call(chat.send_photo, chat.bot, 'send_photo') - assert check_shortcut_defaults(chat.send_photo, chat.bot) + assert check_defaults_handling(chat.send_photo, chat.bot) monkeypatch.setattr(chat.bot, 'send_photo', make_assertion) assert chat.send_photo(photo='test_photo') @@ -356,7 +356,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_contact, Bot.send_contact, ['chat_id'], []) assert check_shortcut_call(chat.send_contact, chat.bot, 'send_contact') - assert check_shortcut_defaults(chat.send_contact, chat.bot) + assert check_defaults_handling(chat.send_contact, chat.bot) monkeypatch.setattr(chat.bot, 'send_contact', make_assertion) assert chat.send_contact(phone_number='test_contact') @@ -367,7 +367,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_audio, Bot.send_audio, ['chat_id'], []) assert check_shortcut_call(chat.send_audio, chat.bot, 'send_audio') - assert check_shortcut_defaults(chat.send_audio, chat.bot) + assert check_defaults_handling(chat.send_audio, chat.bot) monkeypatch.setattr(chat.bot, 'send_audio', make_assertion) assert chat.send_audio(audio='test_audio') @@ -378,7 +378,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_document, Bot.send_document, ['chat_id'], []) assert check_shortcut_call(chat.send_document, chat.bot, 'send_document') - assert check_shortcut_defaults(chat.send_document, chat.bot) + assert check_defaults_handling(chat.send_document, chat.bot) monkeypatch.setattr(chat.bot, 'send_document', make_assertion) assert chat.send_document(document='test_document') @@ -389,7 +389,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_dice, Bot.send_dice, ['chat_id'], []) assert check_shortcut_call(chat.send_dice, chat.bot, 'send_dice') - assert check_shortcut_defaults(chat.send_dice, chat.bot) + assert check_defaults_handling(chat.send_dice, chat.bot) monkeypatch.setattr(chat.bot, 'send_dice', make_assertion) assert chat.send_dice(emoji='test_dice') @@ -400,7 +400,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_game, Bot.send_game, ['chat_id'], []) assert check_shortcut_call(chat.send_game, chat.bot, 'send_game') - assert check_shortcut_defaults(chat.send_game, chat.bot) + assert check_defaults_handling(chat.send_game, chat.bot) monkeypatch.setattr(chat.bot, 'send_game', make_assertion) assert chat.send_game(game_short_name='test_game') @@ -427,7 +427,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_invoice, Bot.send_invoice, ['chat_id'], []) assert check_shortcut_call(chat.send_invoice, chat.bot, 'send_invoice') - assert check_shortcut_defaults(chat.send_invoice, chat.bot) + assert check_defaults_handling(chat.send_invoice, chat.bot) monkeypatch.setattr(chat.bot, 'send_invoice', make_assertion) assert chat.send_invoice( @@ -446,7 +446,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_location, Bot.send_location, ['chat_id'], []) assert check_shortcut_call(chat.send_location, chat.bot, 'send_location') - assert check_shortcut_defaults(chat.send_location, chat.bot) + assert check_defaults_handling(chat.send_location, chat.bot) monkeypatch.setattr(chat.bot, 'send_location', make_assertion) assert chat.send_location(latitude='test_location') @@ -457,7 +457,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_sticker, Bot.send_sticker, ['chat_id'], []) assert check_shortcut_call(chat.send_sticker, chat.bot, 'send_sticker') - assert check_shortcut_defaults(chat.send_sticker, chat.bot) + assert check_defaults_handling(chat.send_sticker, chat.bot) monkeypatch.setattr(chat.bot, 'send_sticker', make_assertion) assert chat.send_sticker(sticker='test_sticker') @@ -468,7 +468,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_venue, Bot.send_venue, ['chat_id'], []) assert check_shortcut_call(chat.send_venue, chat.bot, 'send_venue') - assert check_shortcut_defaults(chat.send_venue, chat.bot) + assert check_defaults_handling(chat.send_venue, chat.bot) monkeypatch.setattr(chat.bot, 'send_venue', make_assertion) assert chat.send_venue(title='test_venue') @@ -479,7 +479,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_video, Bot.send_video, ['chat_id'], []) assert check_shortcut_call(chat.send_video, chat.bot, 'send_video') - assert check_shortcut_defaults(chat.send_video, chat.bot) + assert check_defaults_handling(chat.send_video, chat.bot) monkeypatch.setattr(chat.bot, 'send_video', make_assertion) assert chat.send_video(video='test_video') @@ -490,7 +490,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_video_note, Bot.send_video_note, ['chat_id'], []) assert check_shortcut_call(chat.send_video_note, chat.bot, 'send_video_note') - assert check_shortcut_defaults(chat.send_video_note, chat.bot) + assert check_defaults_handling(chat.send_video_note, chat.bot) monkeypatch.setattr(chat.bot, 'send_video_note', make_assertion) assert chat.send_video_note(video_note='test_video_note') @@ -501,7 +501,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_voice, Bot.send_voice, ['chat_id'], []) assert check_shortcut_call(chat.send_voice, chat.bot, 'send_voice') - assert check_shortcut_defaults(chat.send_voice, chat.bot) + assert check_defaults_handling(chat.send_voice, chat.bot) monkeypatch.setattr(chat.bot, 'send_voice', make_assertion) assert chat.send_voice(voice='test_voice') @@ -512,7 +512,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_animation, Bot.send_animation, ['chat_id'], []) assert check_shortcut_call(chat.send_animation, chat.bot, 'send_animation') - assert check_shortcut_defaults(chat.send_animation, chat.bot) + assert check_defaults_handling(chat.send_animation, chat.bot) monkeypatch.setattr(chat.bot, 'send_animation', make_assertion) assert chat.send_animation(animation='test_animation') @@ -523,7 +523,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_poll, Bot.send_poll, ['chat_id'], []) assert check_shortcut_call(chat.send_poll, chat.bot, 'send_poll') - assert check_shortcut_defaults(chat.send_poll, chat.bot) + assert check_defaults_handling(chat.send_poll, chat.bot) monkeypatch.setattr(chat.bot, 'send_poll', make_assertion) assert chat.send_poll(question='test_poll', options=[1, 2]) @@ -537,7 +537,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.send_copy, Bot.copy_message, ['chat_id'], []) assert check_shortcut_call(chat.copy_message, chat.bot, 'copy_message') - assert check_shortcut_defaults(chat.copy_message, chat.bot) + assert check_defaults_handling(chat.copy_message, chat.bot) monkeypatch.setattr(chat.bot, 'copy_message', make_assertion) assert chat.send_copy(from_chat_id='test_copy', message_id=42) @@ -551,7 +551,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Chat.copy_message, Bot.copy_message, ['from_chat_id'], []) assert check_shortcut_call(chat.copy_message, chat.bot, 'copy_message') - assert check_shortcut_defaults(chat.copy_message, chat.bot) + assert check_defaults_handling(chat.copy_message, chat.bot) monkeypatch.setattr(chat.bot, 'copy_message', make_assertion) assert chat.copy_message(chat_id='test_copy', message_id=42) diff --git a/tests/test_chatphoto.py b/tests/test_chatphoto.py index 6bf51c58e68..cb9fd16f70a 100644 --- a/tests/test_chatphoto.py +++ b/tests/test_chatphoto.py @@ -26,7 +26,7 @@ expect_bad_request, check_shortcut_call, check_shortcut_signature, - check_shortcut_defaults, + check_defaults_handling, ) @@ -135,7 +135,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(ChatPhoto.get_small_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(chat_photo.get_small_file, chat_photo.bot, 'get_file') - assert check_shortcut_defaults(chat_photo.get_small_file, chat_photo.bot) + assert check_defaults_handling(chat_photo.get_small_file, chat_photo.bot) monkeypatch.setattr(chat_photo.bot, 'get_file', make_assertion) assert chat_photo.get_small_file() @@ -146,7 +146,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(ChatPhoto.get_big_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(chat_photo.get_big_file, chat_photo.bot, 'get_file') - assert check_shortcut_defaults(chat_photo.get_big_file, chat_photo.bot) + assert check_defaults_handling(chat_photo.get_big_file, chat_photo.bot) monkeypatch.setattr(chat_photo.bot, 'get_file', make_assertion) assert chat_photo.get_big_file() diff --git a/tests/test_document.py b/tests/test_document.py index 245c021ebd8..37de5dc6bb1 100644 --- a/tests/test_document.py +++ b/tests/test_document.py @@ -25,7 +25,7 @@ from telegram import Document, PhotoSize, TelegramError, Voice, MessageEntity, Bot from telegram.error import BadRequest from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_defaults_handling @pytest.fixture(scope='function') @@ -303,7 +303,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Document.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(document.get_file, document.bot, 'get_file') - assert check_shortcut_defaults(document.get_file, document.bot) + assert check_defaults_handling(document.get_file, document.bot) monkeypatch.setattr(document.bot, 'get_file', make_assertion) assert document.get_file() diff --git a/tests/test_inlinequery.py b/tests/test_inlinequery.py index 43d104999cc..ab2fb6281e6 100644 --- a/tests/test_inlinequery.py +++ b/tests/test_inlinequery.py @@ -20,7 +20,7 @@ import pytest from telegram import User, Location, InlineQuery, Update, Bot -from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_defaults_handling @pytest.fixture(scope='class') @@ -76,7 +76,7 @@ def make_assertion(*_, **kwargs): InlineQuery.answer, Bot.answer_inline_query, ['inline_query_id'], ['auto_pagination'] ) assert check_shortcut_call(inline_query.answer, inline_query.bot, 'answer_inline_query') - assert check_shortcut_defaults(inline_query.answer, inline_query.bot) + assert check_defaults_handling(inline_query.answer, inline_query.bot) monkeypatch.setattr(inline_query.bot, 'answer_inline_query', make_assertion) assert inline_query.answer(results=[]) diff --git a/tests/test_message.py b/tests/test_message.py index f8740d2f9ec..2959f81d678 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -50,7 +50,7 @@ ChatAction, ) from telegram.ext import Defaults -from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_defaults_handling from tests.test_passport import RAW_PASSPORT_DATA @@ -651,7 +651,7 @@ def make_assertion(*_, **kwargs): Message.reply_text, Bot.send_message, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') - assert check_shortcut_defaults(message.reply_text, message.bot) + assert check_defaults_handling(message.reply_text, message.bot) monkeypatch.setattr(message.bot, 'send_message', make_assertion) assert message.reply_text('test') @@ -680,7 +680,7 @@ def make_assertion(*_, **kwargs): Message.reply_markdown, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') - assert check_shortcut_defaults(message.reply_text, message.bot) + assert check_defaults_handling(message.reply_text, message.bot) text_markdown = self.test_message.text_markdown assert text_markdown == test_md_string @@ -715,7 +715,7 @@ def make_assertion(*_, **kwargs): Message.reply_markdown_v2, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') - assert check_shortcut_defaults(message.reply_text, message.bot) + assert check_defaults_handling(message.reply_text, message.bot) text_markdown = self.test_message_v2.text_markdown_v2 assert text_markdown == test_md_string @@ -754,7 +754,7 @@ def make_assertion(*_, **kwargs): Message.reply_html, Bot.send_message, ['chat_id', 'parse_mode'], ['quote'] ) assert check_shortcut_call(message.reply_text, message.bot, 'send_message') - assert check_shortcut_defaults(message.reply_text, message.bot) + assert check_defaults_handling(message.reply_text, message.bot) text_html = self.test_message_v2.text_html assert text_html == test_html_string @@ -780,7 +780,7 @@ def make_assertion(*_, **kwargs): Message.reply_media_group, Bot.send_media_group, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_media_group, message.bot, 'send_media_group') - assert check_shortcut_defaults(message.reply_media_group, message.bot) + assert check_defaults_handling(message.reply_media_group, message.bot) monkeypatch.setattr(message.bot, 'send_media_group', make_assertion) assert message.reply_media_group(media='reply_media_group') @@ -800,7 +800,7 @@ def make_assertion(*_, **kwargs): Message.reply_photo, Bot.send_photo, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_photo, message.bot, 'send_photo') - assert check_shortcut_defaults(message.reply_photo, message.bot) + assert check_defaults_handling(message.reply_photo, message.bot) monkeypatch.setattr(message.bot, 'send_photo', make_assertion) assert message.reply_photo(photo='test_photo') @@ -820,7 +820,7 @@ def make_assertion(*_, **kwargs): Message.reply_audio, Bot.send_audio, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_audio, message.bot, 'send_audio') - assert check_shortcut_defaults(message.reply_audio, message.bot) + assert check_defaults_handling(message.reply_audio, message.bot) monkeypatch.setattr(message.bot, 'send_audio', make_assertion) assert message.reply_audio(audio='test_audio') @@ -840,7 +840,7 @@ def make_assertion(*_, **kwargs): Message.reply_document, Bot.send_document, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_document, message.bot, 'send_document') - assert check_shortcut_defaults(message.reply_document, message.bot) + assert check_defaults_handling(message.reply_document, message.bot) monkeypatch.setattr(message.bot, 'send_document', make_assertion) assert message.reply_document(document='test_document') @@ -860,7 +860,7 @@ def make_assertion(*_, **kwargs): Message.reply_animation, Bot.send_animation, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_animation, message.bot, 'send_animation') - assert check_shortcut_defaults(message.reply_animation, message.bot) + assert check_defaults_handling(message.reply_animation, message.bot) monkeypatch.setattr(message.bot, 'send_animation', make_assertion) assert message.reply_animation(animation='test_animation') @@ -880,7 +880,7 @@ def make_assertion(*_, **kwargs): Message.reply_sticker, Bot.send_sticker, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_sticker, message.bot, 'send_sticker') - assert check_shortcut_defaults(message.reply_sticker, message.bot) + assert check_defaults_handling(message.reply_sticker, message.bot) monkeypatch.setattr(message.bot, 'send_sticker', make_assertion) assert message.reply_sticker(sticker='test_sticker') @@ -900,7 +900,7 @@ def make_assertion(*_, **kwargs): Message.reply_video, Bot.send_video, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_video, message.bot, 'send_video') - assert check_shortcut_defaults(message.reply_video, message.bot) + assert check_defaults_handling(message.reply_video, message.bot) monkeypatch.setattr(message.bot, 'send_video', make_assertion) assert message.reply_video(video='test_video') @@ -920,7 +920,7 @@ def make_assertion(*_, **kwargs): Message.reply_video_note, Bot.send_video_note, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_video_note, message.bot, 'send_video_note') - assert check_shortcut_defaults(message.reply_video_note, message.bot) + assert check_defaults_handling(message.reply_video_note, message.bot) monkeypatch.setattr(message.bot, 'send_video_note', make_assertion) assert message.reply_video_note(video_note='test_video_note') @@ -940,7 +940,7 @@ def make_assertion(*_, **kwargs): Message.reply_voice, Bot.send_voice, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_voice, message.bot, 'send_voice') - assert check_shortcut_defaults(message.reply_voice, message.bot) + assert check_defaults_handling(message.reply_voice, message.bot) monkeypatch.setattr(message.bot, 'send_voice', make_assertion) assert message.reply_voice(voice='test_voice') @@ -960,7 +960,7 @@ def make_assertion(*_, **kwargs): Message.reply_location, Bot.send_location, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_location, message.bot, 'send_location') - assert check_shortcut_defaults(message.reply_location, message.bot) + assert check_defaults_handling(message.reply_location, message.bot) monkeypatch.setattr(message.bot, 'send_location', make_assertion) assert message.reply_location(location='test_location') @@ -980,7 +980,7 @@ def make_assertion(*_, **kwargs): Message.reply_venue, Bot.send_venue, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_venue, message.bot, 'send_venue') - assert check_shortcut_defaults(message.reply_venue, message.bot) + assert check_defaults_handling(message.reply_venue, message.bot) monkeypatch.setattr(message.bot, 'send_venue', make_assertion) assert message.reply_venue(venue='test_venue') @@ -1000,7 +1000,7 @@ def make_assertion(*_, **kwargs): Message.reply_contact, Bot.send_contact, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_contact, message.bot, 'send_contact') - assert check_shortcut_defaults(message.reply_contact, message.bot) + assert check_defaults_handling(message.reply_contact, message.bot) monkeypatch.setattr(message.bot, 'send_contact', make_assertion) assert message.reply_contact(contact='test_contact') @@ -1019,7 +1019,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Message.reply_poll, Bot.send_poll, ['chat_id'], ['quote']) assert check_shortcut_call(message.reply_poll, message.bot, 'send_poll') - assert check_shortcut_defaults(message.reply_poll, message.bot) + assert check_defaults_handling(message.reply_poll, message.bot) monkeypatch.setattr(message.bot, 'send_poll', make_assertion) assert message.reply_poll(question='test_poll', options=['1', '2', '3']) @@ -1037,7 +1037,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Message.reply_dice, Bot.send_dice, ['chat_id'], ['quote']) assert check_shortcut_call(message.reply_dice, message.bot, 'send_dice') - assert check_shortcut_defaults(message.reply_dice, message.bot) + assert check_defaults_handling(message.reply_dice, message.bot) monkeypatch.setattr(message.bot, 'send_dice', make_assertion) assert message.reply_dice(disable_notification=True) @@ -1053,7 +1053,7 @@ def make_assertion(*_, **kwargs): Message.reply_chat_action, Bot.send_chat_action, ['chat_id'], [] ) assert check_shortcut_call(message.reply_chat_action, message.bot, 'send_chat_action') - assert check_shortcut_defaults(message.reply_chat_action, message.bot) + assert check_defaults_handling(message.reply_chat_action, message.bot) monkeypatch.setattr(message.bot, 'send_chat_action', make_assertion) assert message.reply_chat_action(action=ChatAction.TYPING) @@ -1066,7 +1066,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Message.reply_game, Bot.send_game, ['chat_id'], ['quote']) assert check_shortcut_call(message.reply_game, message.bot, 'send_game') - assert check_shortcut_defaults(message.reply_game, message.bot) + assert check_defaults_handling(message.reply_game, message.bot) monkeypatch.setattr(message.bot, 'send_game', make_assertion) assert message.reply_game(game_short_name='test_game') @@ -1096,7 +1096,7 @@ def make_assertion(*_, **kwargs): Message.reply_invoice, Bot.send_invoice, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.reply_invoice, message.bot, 'send_invoice') - assert check_shortcut_defaults(message.reply_invoice, message.bot) + assert check_defaults_handling(message.reply_invoice, message.bot) monkeypatch.setattr(message.bot, 'send_invoice', make_assertion) assert message.reply_invoice( @@ -1132,7 +1132,7 @@ def make_assertion(*_, **kwargs): Message.forward, Bot.forward_message, ['from_chat_id', 'message_id'], [] ) assert check_shortcut_call(message.forward, message.bot, 'forward_message') - assert check_shortcut_defaults(message.forward, message.bot) + assert check_defaults_handling(message.forward, message.bot) monkeypatch.setattr(message.bot, 'forward_message', make_assertion) assert message.forward(123456, disable_notification=disable_notification) @@ -1157,7 +1157,7 @@ def make_assertion(*_, **kwargs): Message.copy, Bot.copy_message, ['from_chat_id', 'message_id'], [] ) assert check_shortcut_call(message.copy, message.bot, 'copy_message') - assert check_shortcut_defaults(message.copy, message.bot) + assert check_defaults_handling(message.copy, message.bot) monkeypatch.setattr(message.bot, 'copy_message', make_assertion) assert message.copy(123456, disable_notification=disable_notification) @@ -1189,7 +1189,7 @@ def make_assertion(*_, **kwargs): Message.reply_copy, Bot.copy_message, ['chat_id'], ['quote'] ) assert check_shortcut_call(message.copy, message.bot, 'copy_message') - assert check_shortcut_defaults(message.copy, message.bot) + assert check_defaults_handling(message.copy, message.bot) monkeypatch.setattr(message.bot, 'copy_message', make_assertion) assert message.reply_copy(123456, 456789, disable_notification=disable_notification) @@ -1227,7 +1227,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) - assert check_shortcut_defaults(message.edit_text, message.bot) + assert check_defaults_handling(message.edit_text, message.bot) monkeypatch.setattr(message.bot, 'edit_message_text', make_assertion) assert message.edit_text(text='test') @@ -1252,7 +1252,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) - assert check_shortcut_defaults(message.edit_caption, message.bot) + assert check_defaults_handling(message.edit_caption, message.bot) monkeypatch.setattr(message.bot, 'edit_message_caption', make_assertion) assert message.edit_caption(caption='new caption') @@ -1277,7 +1277,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) - assert check_shortcut_defaults(message.edit_media, message.bot) + assert check_defaults_handling(message.edit_media, message.bot) monkeypatch.setattr(message.bot, 'edit_message_media', make_assertion) assert message.edit_media('my_media') @@ -1302,7 +1302,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) - assert check_shortcut_defaults(message.edit_reply_markup, message.bot) + assert check_defaults_handling(message.edit_reply_markup, message.bot) monkeypatch.setattr(message.bot, 'edit_message_reply_markup', make_assertion) assert message.edit_reply_markup(reply_markup=[['1', '2']]) @@ -1328,7 +1328,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) - assert check_shortcut_defaults(message.edit_live_location, message.bot) + assert check_defaults_handling(message.edit_live_location, message.bot) monkeypatch.setattr(message.bot, 'edit_message_live_location', make_assertion) assert message.edit_live_location(latitude=1, longitude=2) @@ -1352,7 +1352,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) - assert check_shortcut_defaults(message.stop_live_location, message.bot) + assert check_defaults_handling(message.stop_live_location, message.bot) monkeypatch.setattr(message.bot, 'stop_message_live_location', make_assertion) assert message.stop_live_location() @@ -1378,7 +1378,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) - assert check_shortcut_defaults(message.set_game_score, message.bot) + assert check_defaults_handling(message.set_game_score, message.bot) monkeypatch.setattr(message.bot, 'set_game_score', make_assertion) assert message.set_game_score(user_id=1, score=2) @@ -1403,7 +1403,7 @@ def make_assertion(*_, **kwargs): skip_params=['inline_message_id'], shortcut_kwargs=['message_id', 'chat_id'], ) - assert check_shortcut_defaults(message.get_game_high_scores, message.bot) + assert check_defaults_handling(message.get_game_high_scores, message.bot) monkeypatch.setattr(message.bot, 'get_game_high_scores', make_assertion) assert message.get_game_high_scores(user_id=1) @@ -1418,7 +1418,7 @@ def make_assertion(*_, **kwargs): Message.delete, Bot.delete_message, ['chat_id', 'message_id'], [] ) assert check_shortcut_call(message.delete, message.bot, 'delete_message') - assert check_shortcut_defaults(message.delete, message.bot) + assert check_defaults_handling(message.delete, message.bot) monkeypatch.setattr(message.bot, 'delete_message', make_assertion) assert message.delete() @@ -1433,7 +1433,7 @@ def make_assertion(*_, **kwargs): Message.stop_poll, Bot.stop_poll, ['chat_id', 'message_id'], [] ) assert check_shortcut_call(message.stop_poll, message.bot, 'stop_poll') - assert check_shortcut_defaults(message.stop_poll, message.bot) + assert check_defaults_handling(message.stop_poll, message.bot) monkeypatch.setattr(message.bot, 'stop_poll', make_assertion) assert message.stop_poll() @@ -1448,7 +1448,7 @@ def make_assertion(*args, **kwargs): Message.pin, Bot.pin_chat_message, ['chat_id', 'message_id'], [] ) assert check_shortcut_call(message.pin, message.bot, 'pin_chat_message') - assert check_shortcut_defaults(message.pin, message.bot) + assert check_defaults_handling(message.pin, message.bot) monkeypatch.setattr(message.bot, 'pin_chat_message', make_assertion) assert message.pin() @@ -1468,7 +1468,7 @@ def make_assertion(*args, **kwargs): 'unpin_chat_message', shortcut_kwargs=['chat_id', 'message_id'], ) - assert check_shortcut_defaults(message.unpin, message.bot) + assert check_defaults_handling(message.unpin, message.bot) monkeypatch.setattr(message.bot, 'unpin_chat_message', make_assertion) assert message.unpin() diff --git a/tests/test_passportfile.py b/tests/test_passportfile.py index f9d83cd7f0c..0a4af5d6c9e 100644 --- a/tests/test_passportfile.py +++ b/tests/test_passportfile.py @@ -20,7 +20,7 @@ import pytest from telegram import PassportFile, PassportElementError, Bot, File -from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_defaults_handling @pytest.fixture(scope='class') @@ -63,7 +63,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(PassportFile.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(passport_file.get_file, passport_file.bot, 'get_file') - assert check_shortcut_defaults(passport_file.get_file, passport_file.bot) + assert check_defaults_handling(passport_file.get_file, passport_file.bot) monkeypatch.setattr(passport_file.bot, 'get_file', make_assertion) assert passport_file.get_file().file_id == 'True' diff --git a/tests/test_photo.py b/tests/test_photo.py index 84271c3f665..f00c226fcfb 100644 --- a/tests/test_photo.py +++ b/tests/test_photo.py @@ -29,7 +29,7 @@ expect_bad_request, check_shortcut_call, check_shortcut_signature, - check_shortcut_defaults, + check_defaults_handling, ) @@ -475,7 +475,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(PhotoSize.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(photo.get_file, photo.bot, 'get_file') - assert check_shortcut_defaults(photo.get_file, photo.bot) + assert check_defaults_handling(photo.get_file, photo.bot) monkeypatch.setattr(photo.bot, 'get_file', make_assertion) assert photo.get_file() diff --git a/tests/test_precheckoutquery.py b/tests/test_precheckoutquery.py index 523c389d267..6f70fb9ff23 100644 --- a/tests/test_precheckoutquery.py +++ b/tests/test_precheckoutquery.py @@ -20,7 +20,7 @@ import pytest from telegram import Update, User, PreCheckoutQuery, OrderInfo, Bot -from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_defaults_handling @pytest.fixture(scope='class') @@ -91,7 +91,7 @@ def make_assertion(*_, **kwargs): pre_checkout_query.bot, 'answer_pre_checkout_query', ) - assert check_shortcut_defaults(pre_checkout_query.answer, pre_checkout_query.bot) + assert check_defaults_handling(pre_checkout_query.answer, pre_checkout_query.bot) monkeypatch.setattr(pre_checkout_query.bot, 'answer_pre_checkout_query', make_assertion) assert pre_checkout_query.answer(ok=True) diff --git a/tests/test_shippingquery.py b/tests/test_shippingquery.py index 43cee42a7ba..98cf0e01b97 100644 --- a/tests/test_shippingquery.py +++ b/tests/test_shippingquery.py @@ -20,7 +20,7 @@ import pytest from telegram import Update, User, ShippingAddress, ShippingQuery, Bot -from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_defaults_handling @pytest.fixture(scope='class') @@ -74,7 +74,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_call( shipping_query.answer, shipping_query.bot, 'answer_shipping_query' ) - assert check_shortcut_defaults(shipping_query.answer, shipping_query.bot) + assert check_defaults_handling(shipping_query.answer, shipping_query.bot) monkeypatch.setattr(shipping_query.bot, 'answer_shipping_query', make_assertion) assert shipping_query.answer(ok=True) diff --git a/tests/test_sticker.py b/tests/test_sticker.py index 265202ef4b4..80dad9af63b 100644 --- a/tests/test_sticker.py +++ b/tests/test_sticker.py @@ -25,7 +25,7 @@ from telegram import Sticker, PhotoSize, TelegramError, StickerSet, Audio, MaskPosition, Bot from telegram.error import BadRequest -from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_defaults_handling @pytest.fixture(scope='function') @@ -510,7 +510,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Sticker.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(sticker.get_file, sticker.bot, 'get_file') - assert check_shortcut_defaults(sticker.get_file, sticker.bot) + assert check_defaults_handling(sticker.get_file, sticker.bot) monkeypatch.setattr(sticker.bot, 'get_file', make_assertion) assert sticker.get_file() diff --git a/tests/test_user.py b/tests/test_user.py index 06ace6bc905..30b32c85ef7 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -20,7 +20,7 @@ from telegram import Update, User, Bot from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_signature, check_shortcut_call, check_shortcut_defaults +from tests.conftest import check_shortcut_signature, check_shortcut_call, check_defaults_handling @pytest.fixture(scope='function') @@ -136,7 +136,7 @@ def make_assertion(*_, **kwargs): User.get_profile_photos, Bot.get_user_profile_photos, ['user_id'], [] ) assert check_shortcut_call(user.get_profile_photos, user.bot, 'get_user_profile_photos') - assert check_shortcut_defaults(user.get_profile_photos, user.bot) + assert check_defaults_handling(user.get_profile_photos, user.bot) monkeypatch.setattr(user.bot, 'get_user_profile_photos', make_assertion) assert user.get_profile_photos() @@ -147,7 +147,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.pin_message, Bot.pin_chat_message, ['chat_id'], []) assert check_shortcut_call(user.pin_message, user.bot, 'pin_chat_message') - assert check_shortcut_defaults(user.pin_message, user.bot) + assert check_defaults_handling(user.pin_message, user.bot) monkeypatch.setattr(user.bot, 'pin_chat_message', make_assertion) assert user.pin_message(1) @@ -160,7 +160,7 @@ def make_assertion(*_, **kwargs): User.unpin_message, Bot.unpin_chat_message, ['chat_id'], [] ) assert check_shortcut_call(user.unpin_message, user.bot, 'unpin_chat_message') - assert check_shortcut_defaults(user.unpin_message, user.bot) + assert check_defaults_handling(user.unpin_message, user.bot) monkeypatch.setattr(user.bot, 'unpin_chat_message', make_assertion) assert user.unpin_message() @@ -173,7 +173,7 @@ def make_assertion(*_, **kwargs): User.unpin_all_messages, Bot.unpin_all_chat_messages, ['chat_id'], [] ) assert check_shortcut_call(user.unpin_all_messages, user.bot, 'unpin_all_chat_messages') - assert check_shortcut_defaults(user.unpin_all_messages, user.bot) + assert check_defaults_handling(user.unpin_all_messages, user.bot) monkeypatch.setattr(user.bot, 'unpin_all_chat_messages', make_assertion) assert user.unpin_all_messages() @@ -184,7 +184,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_message, Bot.send_message, ['chat_id'], []) assert check_shortcut_call(user.send_message, user.bot, 'send_message') - assert check_shortcut_defaults(user.send_message, user.bot) + assert check_defaults_handling(user.send_message, user.bot) monkeypatch.setattr(user.bot, 'send_message', make_assertion) assert user.send_message('test') @@ -195,7 +195,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_photo, Bot.send_photo, ['chat_id'], []) assert check_shortcut_call(user.send_photo, user.bot, 'send_photo') - assert check_shortcut_defaults(user.send_photo, user.bot) + assert check_defaults_handling(user.send_photo, user.bot) monkeypatch.setattr(user.bot, 'send_photo', make_assertion) assert user.send_photo('test_photo') @@ -208,7 +208,7 @@ def make_assertion(*_, **kwargs): User.send_media_group, Bot.send_media_group, ['chat_id'], [] ) assert check_shortcut_call(user.send_media_group, user.bot, 'send_media_group') - assert check_shortcut_defaults(user.send_media_group, user.bot) + assert check_defaults_handling(user.send_media_group, user.bot) monkeypatch.setattr(user.bot, 'send_media_group', make_assertion) assert user.send_media_group('test_media_group') @@ -219,7 +219,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_audio, Bot.send_audio, ['chat_id'], []) assert check_shortcut_call(user.send_audio, user.bot, 'send_audio') - assert check_shortcut_defaults(user.send_audio, user.bot) + assert check_defaults_handling(user.send_audio, user.bot) monkeypatch.setattr(user.bot, 'send_audio', make_assertion) assert user.send_audio('test_audio') @@ -232,7 +232,7 @@ def make_assertion(*_, **kwargs): User.send_chat_action, Bot.send_chat_action, ['chat_id'], [] ) assert check_shortcut_call(user.send_chat_action, user.bot, 'send_chat_action') - assert check_shortcut_defaults(user.send_chat_action, user.bot) + assert check_defaults_handling(user.send_chat_action, user.bot) monkeypatch.setattr(user.bot, 'send_chat_action', make_assertion) assert user.send_chat_action('test_chat_action') @@ -243,7 +243,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_contact, Bot.send_contact, ['chat_id'], []) assert check_shortcut_call(user.send_contact, user.bot, 'send_contact') - assert check_shortcut_defaults(user.send_contact, user.bot) + assert check_defaults_handling(user.send_contact, user.bot) monkeypatch.setattr(user.bot, 'send_contact', make_assertion) assert user.send_contact(phone_number='test_contact') @@ -254,7 +254,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_dice, Bot.send_dice, ['chat_id'], []) assert check_shortcut_call(user.send_dice, user.bot, 'send_dice') - assert check_shortcut_defaults(user.send_dice, user.bot) + assert check_defaults_handling(user.send_dice, user.bot) monkeypatch.setattr(user.bot, 'send_dice', make_assertion) assert user.send_dice(emoji='test_dice') @@ -265,7 +265,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_document, Bot.send_document, ['chat_id'], []) assert check_shortcut_call(user.send_document, user.bot, 'send_document') - assert check_shortcut_defaults(user.send_document, user.bot) + assert check_defaults_handling(user.send_document, user.bot) monkeypatch.setattr(user.bot, 'send_document', make_assertion) assert user.send_document('test_document') @@ -276,7 +276,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_game, Bot.send_game, ['chat_id'], []) assert check_shortcut_call(user.send_game, user.bot, 'send_game') - assert check_shortcut_defaults(user.send_game, user.bot) + assert check_defaults_handling(user.send_game, user.bot) monkeypatch.setattr(user.bot, 'send_game', make_assertion) assert user.send_game(game_short_name='test_game') @@ -303,7 +303,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_invoice, Bot.send_invoice, ['chat_id'], []) assert check_shortcut_call(user.send_invoice, user.bot, 'send_invoice') - assert check_shortcut_defaults(user.send_invoice, user.bot) + assert check_defaults_handling(user.send_invoice, user.bot) monkeypatch.setattr(user.bot, 'send_invoice', make_assertion) assert user.send_invoice( @@ -322,7 +322,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_location, Bot.send_location, ['chat_id'], []) assert check_shortcut_call(user.send_location, user.bot, 'send_location') - assert check_shortcut_defaults(user.send_location, user.bot) + assert check_defaults_handling(user.send_location, user.bot) monkeypatch.setattr(user.bot, 'send_location', make_assertion) assert user.send_location('test_location') @@ -333,7 +333,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_sticker, Bot.send_sticker, ['chat_id'], []) assert check_shortcut_call(user.send_sticker, user.bot, 'send_sticker') - assert check_shortcut_defaults(user.send_sticker, user.bot) + assert check_defaults_handling(user.send_sticker, user.bot) monkeypatch.setattr(user.bot, 'send_sticker', make_assertion) assert user.send_sticker('test_sticker') @@ -344,7 +344,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_video, Bot.send_video, ['chat_id'], []) assert check_shortcut_call(user.send_video, user.bot, 'send_video') - assert check_shortcut_defaults(user.send_video, user.bot) + assert check_defaults_handling(user.send_video, user.bot) monkeypatch.setattr(user.bot, 'send_video', make_assertion) assert user.send_video('test_video') @@ -355,7 +355,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_venue, Bot.send_venue, ['chat_id'], []) assert check_shortcut_call(user.send_venue, user.bot, 'send_venue') - assert check_shortcut_defaults(user.send_venue, user.bot) + assert check_defaults_handling(user.send_venue, user.bot) monkeypatch.setattr(user.bot, 'send_venue', make_assertion) assert user.send_venue(title='test_venue') @@ -366,7 +366,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_video_note, Bot.send_video_note, ['chat_id'], []) assert check_shortcut_call(user.send_video_note, user.bot, 'send_video_note') - assert check_shortcut_defaults(user.send_video_note, user.bot) + assert check_defaults_handling(user.send_video_note, user.bot) monkeypatch.setattr(user.bot, 'send_video_note', make_assertion) assert user.send_video_note('test_video_note') @@ -377,7 +377,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_voice, Bot.send_voice, ['chat_id'], []) assert check_shortcut_call(user.send_voice, user.bot, 'send_voice') - assert check_shortcut_defaults(user.send_voice, user.bot) + assert check_defaults_handling(user.send_voice, user.bot) monkeypatch.setattr(user.bot, 'send_voice', make_assertion) assert user.send_voice('test_voice') @@ -388,7 +388,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_animation, Bot.send_animation, ['chat_id'], []) assert check_shortcut_call(user.send_animation, user.bot, 'send_animation') - assert check_shortcut_defaults(user.send_animation, user.bot) + assert check_defaults_handling(user.send_animation, user.bot) monkeypatch.setattr(user.bot, 'send_animation', make_assertion) assert user.send_animation('test_animation') @@ -399,7 +399,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_poll, Bot.send_poll, ['chat_id'], []) assert check_shortcut_call(user.send_poll, user.bot, 'send_poll') - assert check_shortcut_defaults(user.send_poll, user.bot) + assert check_defaults_handling(user.send_poll, user.bot) monkeypatch.setattr(user.bot, 'send_poll', make_assertion) assert user.send_poll(question='test_poll', options=[1, 2]) @@ -413,7 +413,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.send_copy, Bot.copy_message, ['chat_id'], []) assert check_shortcut_call(user.copy_message, user.bot, 'copy_message') - assert check_shortcut_defaults(user.copy_message, user.bot) + assert check_defaults_handling(user.copy_message, user.bot) monkeypatch.setattr(user.bot, 'copy_message', make_assertion) assert user.send_copy(from_chat_id='from_chat_id', message_id='message_id') @@ -427,7 +427,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(User.copy_message, Bot.copy_message, ['from_chat_id'], []) assert check_shortcut_call(user.copy_message, user.bot, 'copy_message') - assert check_shortcut_defaults(user.copy_message, user.bot) + assert check_defaults_handling(user.copy_message, user.bot) monkeypatch.setattr(user.bot, 'copy_message', make_assertion) assert user.copy_message(chat_id='chat_id', message_id='message_id') diff --git a/tests/test_video.py b/tests/test_video.py index d1666eac376..1cfd9e04084 100644 --- a/tests/test_video.py +++ b/tests/test_video.py @@ -25,7 +25,7 @@ from telegram import Video, TelegramError, Voice, PhotoSize, MessageEntity, Bot from telegram.error import BadRequest from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_defaults_handling @pytest.fixture(scope='function') @@ -335,7 +335,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Video.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(video.get_file, video.bot, 'get_file') - assert check_shortcut_defaults(video.get_file, video.bot) + assert check_defaults_handling(video.get_file, video.bot) monkeypatch.setattr(video.bot, 'get_file', make_assertion) assert video.get_file() diff --git a/tests/test_videonote.py b/tests/test_videonote.py index 30e2f362d6d..9cae229e334 100644 --- a/tests/test_videonote.py +++ b/tests/test_videonote.py @@ -24,7 +24,7 @@ from telegram import VideoNote, TelegramError, Voice, PhotoSize, Bot from telegram.error import BadRequest -from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_defaults_handling @pytest.fixture(scope='function') @@ -233,7 +233,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(VideoNote.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(video_note.get_file, video_note.bot, 'get_file') - assert check_shortcut_defaults(video_note.get_file, video_note.bot) + assert check_defaults_handling(video_note.get_file, video_note.bot) monkeypatch.setattr(video_note.bot, 'get_file', make_assertion) assert video_note.get_file() diff --git a/tests/test_voice.py b/tests/test_voice.py index ce154e7d6fe..5c9384dfaa3 100644 --- a/tests/test_voice.py +++ b/tests/test_voice.py @@ -25,7 +25,7 @@ from telegram import Audio, Voice, TelegramError, MessageEntity, Bot from telegram.error import BadRequest from telegram.utils.helpers import escape_markdown -from tests.conftest import check_shortcut_call, check_shortcut_signature, check_shortcut_defaults +from tests.conftest import check_shortcut_call, check_shortcut_signature, check_defaults_handling @pytest.fixture(scope='function') @@ -289,7 +289,7 @@ def make_assertion(*_, **kwargs): assert check_shortcut_signature(Voice.get_file, Bot.get_file, ['file_id'], []) assert check_shortcut_call(voice.get_file, voice.bot, 'get_file') - assert check_shortcut_defaults(voice.get_file, voice.bot) + assert check_defaults_handling(voice.get_file, voice.bot) monkeypatch.setattr(voice.bot, 'get_file', make_assertion) assert voice.get_file() From 3144d046127e399f746543a144d58806d2c36c42 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sun, 7 Feb 2021 17:25:52 +0100 Subject: [PATCH 10/23] Missing tests for TestCallbackQuery --- tests/test_callbackquery.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/test_callbackquery.py b/tests/test_callbackquery.py index a786d369870..7ea3ca85748 100644 --- a/tests/test_callbackquery.py +++ b/tests/test_callbackquery.py @@ -143,6 +143,7 @@ def make_assertion(*_, **kwargs): skip_params=self.skip_params(callback_query), shortcut_kwargs=self.shortcut_kwargs(callback_query), ) + assert check_defaults_handling(callback_query.edit_message_text, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'edit_message_text', make_assertion) assert callback_query.edit_message_text(text='test') @@ -167,6 +168,7 @@ def make_assertion(*_, **kwargs): skip_params=self.skip_params(callback_query), shortcut_kwargs=self.shortcut_kwargs(callback_query), ) + assert check_defaults_handling(callback_query.edit_message_caption, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'edit_message_caption', make_assertion) assert callback_query.edit_message_caption(caption='new caption') @@ -191,6 +193,9 @@ def make_assertion(*_, **kwargs): skip_params=self.skip_params(callback_query), shortcut_kwargs=self.shortcut_kwargs(callback_query), ) + assert check_defaults_handling( + callback_query.edit_message_reply_markup, callback_query.bot + ) monkeypatch.setattr(callback_query.bot, 'edit_message_reply_markup', make_assertion) assert callback_query.edit_message_reply_markup(reply_markup=[['1', '2']]) @@ -215,6 +220,7 @@ def make_assertion(*_, **kwargs): skip_params=self.skip_params(callback_query), shortcut_kwargs=self.shortcut_kwargs(callback_query), ) + assert check_defaults_handling(callback_query.edit_message_media, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'edit_message_media', make_assertion) assert callback_query.edit_message_media(media=[['1', '2']]) @@ -240,6 +246,9 @@ def make_assertion(*_, **kwargs): skip_params=self.skip_params(callback_query), shortcut_kwargs=self.shortcut_kwargs(callback_query), ) + assert check_defaults_handling( + callback_query.edit_message_live_location, callback_query.bot + ) monkeypatch.setattr(callback_query.bot, 'edit_message_live_location', make_assertion) assert callback_query.edit_message_live_location(latitude=1, longitude=2) @@ -263,6 +272,9 @@ def make_assertion(*_, **kwargs): skip_params=self.skip_params(callback_query), shortcut_kwargs=self.shortcut_kwargs(callback_query), ) + assert check_defaults_handling( + callback_query.stop_message_live_location, callback_query.bot + ) monkeypatch.setattr(callback_query.bot, 'stop_message_live_location', make_assertion) assert callback_query.stop_message_live_location() @@ -287,6 +299,7 @@ def make_assertion(*_, **kwargs): skip_params=self.skip_params(callback_query), shortcut_kwargs=self.shortcut_kwargs(callback_query), ) + assert check_defaults_handling(callback_query.set_game_score, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'set_game_score', make_assertion) assert callback_query.set_game_score(user_id=1, score=2) @@ -311,6 +324,7 @@ def make_assertion(*_, **kwargs): skip_params=self.skip_params(callback_query), shortcut_kwargs=self.shortcut_kwargs(callback_query), ) + assert check_defaults_handling(callback_query.get_game_high_scores, callback_query.bot) monkeypatch.setattr(callback_query.bot, 'get_game_high_scores', make_assertion) assert callback_query.get_game_high_scores(user_id=1) From 78c04e550dd20ee10fe4da611fc7ee74a980c489 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sun, 7 Feb 2021 22:10:29 +0100 Subject: [PATCH 11/23] Test edit_message_media with defaults & some comments --- telegram/bot.py | 14 ++++---- tests/test_bot.py | 4 +-- tests/test_inputmedia.py | 78 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 8 deletions(-) diff --git a/telegram/bot.py b/telegram/bot.py index ffa3d4cab40..7e7e856c203 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -196,19 +196,21 @@ def _insert_defaults(self, data: Dict[str, Any], timeout: ODVInput[float]) -> Op """ effective_timeout = DefaultValue.get_value(timeout) + # If we have no Defaults, we just need to replace DefaultValue instances + # with the actual value if not self.defaults: - data.update( - (key, value.value) - for key, value in data.items() - if isinstance(value, DefaultValue) - ) + data.update((key, DefaultValue.get_value(value)) for key, value in data.items()) return effective_timeout + # if we have Defaults, we replace all DefaultValue instances with the relevant + # Defaults value. If there is none, we fall back to the default value of the bot method for key in data: if isinstance(data[key], DefaultValue): data[key] = self.defaults.api_defaults.get(key, data[key].value) if isinstance(timeout, DefaultValue): + # If we get here, we use Defaults.timeout, unless that's not set, which is the + # case if isinstance(self.defaults.timeout, DefaultValue) return ( self.defaults.timeout if not isinstance(self.defaults.timeout, DefaultValue) @@ -1433,7 +1435,7 @@ def send_media_group( for m in data['media']: if m.parse_mode == DEFAULT_NONE: if self.defaults: - m.parse_mode = self.defaults.parse_mode + m.parse_mode = DefaultValue.get_value(self.defaults.parse_mode) else: m.parse_mode = None diff --git a/tests/test_bot.py b/tests/test_bot.py index 1b2ea47e8c9..07a3760e2aa 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -206,8 +206,8 @@ def test_defaults_handling(self, bot_method_name, bot): The same test is also run for all the shortcuts (Message.reply_text) etc in the corresponding tests. - Finally, there are some tests for Defaults.{parse_mode, quote} at the appropriate places, - as those are the only things we can actually check. + Finally, there are some tests for Defaults.{parse_mode, quote, allow_sending_without_reply} + at the appropriate places, as those are the only things we can actually check. """ bot_method = getattr(bot, bot_method_name) assert check_defaults_handling(bot_method, bot) diff --git a/tests/test_inputmedia.py b/tests/test_inputmedia.py index ef2e1cd426b..62152007439 100644 --- a/tests/test_inputmedia.py +++ b/tests/test_inputmedia.py @@ -30,6 +30,7 @@ InputMediaAudio, InputMediaDocument, MessageEntity, + ParseMode, ) # noinspection PyUnresolvedReferences @@ -551,3 +552,80 @@ def test_edit_message_media_new_file(self, bot, chat_id, media_group, thumb_file chat_id=cid, message_id=mid, media=InputMediaPhoto(thumb_file) ) assert isinstance(new_message, Message) + + @flaky(3, 1) + @pytest.mark.timeout(10) + @pytest.mark.parametrize( + 'default_bot', [{'parse_mode': ParseMode.HTML}], indirect=True, ids=['HTML-Bot'] + ) + @pytest.mark.parametrize('media_type', ['animation', 'document', 'audio', 'photo', 'video']) + def test_edit_message_media_default_parse_mode( + self, + chat_id, + default_bot, + media_type, + animation, # noqa: F811 + document, # noqa: F811 + audio, # noqa: F811 + photo, # noqa: F811 + video, # noqa: F811 + ): + html_caption = 'bold italic code' + markdown_caption = '*bold* _italic_ `code`' + test_caption = 'bold italic code' + test_entities = [ + MessageEntity(MessageEntity.BOLD, 0, 4), + MessageEntity(MessageEntity.ITALIC, 5, 6), + MessageEntity(MessageEntity.CODE, 12, 4), + ] + + def build_media(parse_mode, med_type): + kwargs = {} + if parse_mode != ParseMode.HTML: + kwargs['parse_mode'] = parse_mode + kwargs['caption'] = markdown_caption + else: + kwargs['caption'] = html_caption + + if med_type == 'animation': + return InputMediaAnimation(animation, **kwargs) + if med_type == 'document': + return InputMediaDocument(document, **kwargs) + if med_type == 'audio': + return InputMediaAudio(audio, **kwargs) + if med_type == 'photo': + return InputMediaPhoto(photo, **kwargs) + if med_type == 'video': + return InputMediaVideo(video, **kwargs) + + message = default_bot.send_photo(chat_id, photo) + + message = default_bot.edit_message_media( + message.chat_id, + message.message_id, + media=build_media(parse_mode=ParseMode.HTML, med_type=media_type), + ) + assert message.caption == test_caption + assert message.caption_entities == test_entities + + # Remove caption to avoid "Message not changed" + message.edit_caption() + + message = default_bot.edit_message_media( + message.chat_id, + message.message_id, + media=build_media(parse_mode=ParseMode.MARKDOWN_V2, med_type=media_type), + ) + assert message.caption == test_caption + assert message.caption_entities == test_entities + + # Remove caption to avoid "Message not changed" + message.edit_caption() + + message = default_bot.edit_message_media( + message.chat_id, + message.message_id, + media=build_media(parse_mode=None, med_type=media_type), + ) + assert message.caption == markdown_caption + assert message.caption_entities == [] From 472868659fbfa8c202fb9e2cdf804bcaa0c09c46 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sun, 7 Feb 2021 22:33:13 +0100 Subject: [PATCH 12/23] Fix cryptography requirement --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f6b17ef2791..13b262c5031 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ certifi -cryptography +cryptography!=3.4 # only telegram.ext: # Keep this line here; used in setup(-raw).py tornado>=5.1 APScheduler==3.6.3 From 96f3e12477ec98b77c727748e25603b05fda0cfc Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sun, 7 Feb 2021 22:49:23 +0100 Subject: [PATCH 13/23] drop debug prints --- tests/test_bot.py | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/tests/test_bot.py b/tests/test_bot.py index 07a3760e2aa..73c98dfe7e0 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -707,31 +707,6 @@ def test(url, data, *args, **kwargs): @pytest.mark.parametrize('default_bot', [{'parse_mode': 'Markdown'}], indirect=True) def test_answer_inline_query_default_parse_mode(self, monkeypatch, default_bot): def test(url, data, *args, **kwargs): - print() - print(data) - print( - { - 'cache_time': 300, - 'results': [ - { - 'title': 'test_result', - 'id': '123', - 'type': 'document', - 'document_url': 'https://raw.githubusercontent.com/' - 'python-telegram-bot/logos/master/logo/png/' - 'ptb-logo_240.png', - 'mime_type': 'image/png', - 'caption': 'ptb_logo', - 'parse_mode': 'Markdown', - } - ], - 'next_offset': '42', - 'switch_pm_parameter': 'start_pm', - 'inline_query_id': 1234, - 'is_personal': True, - 'switch_pm_text': 'switch pm', - } - ) return data == { 'cache_time': 300, 'results': [ From 45b8e17535e4739c527b26ff444f1792a5809e3b Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Tue, 9 Feb 2021 22:27:23 +0100 Subject: [PATCH 14/23] Remove debug prints --- tests/test_animation.py | 1 - tests/test_error.py | 1 - 2 files changed, 2 deletions(-) diff --git a/tests/test_animation.py b/tests/test_animation.py index 1fd697400bd..279f4c9012e 100644 --- a/tests/test_animation.py +++ b/tests/test_animation.py @@ -199,7 +199,6 @@ def test_send_animation_local_files(self, monkeypatch, bot, chat_id): def make_assertion(_, data, *args, **kwargs): nonlocal test_flag - print(data.get('animation'), expected) test_flag = data.get('animation') == expected and data.get('thumb') == expected monkeypatch.setattr(bot, '_post', make_assertion) diff --git a/tests/test_error.py b/tests/test_error.py index 7a0c2eab477..02273e519af 100644 --- a/tests/test_error.py +++ b/tests/test_error.py @@ -115,7 +115,6 @@ def test_conflict(self): ], ) def test_errors_pickling(self, exception, attributes): - print(exception) pickled = pickle.dumps(exception) unpickled = pickle.loads(pickled) assert type(unpickled) is type(exception) From f62ac4cefa0707934070de80f2f88055c2ea042e Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Wed, 10 Feb 2021 22:52:55 +0100 Subject: [PATCH 15/23] Another try --- .github/workflows/test.yml | 11 +++++++- tests/test_helpers.py | 51 ++++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e516f8ea165..9b6c5e70d79 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,12 +40,21 @@ jobs: python -W ignore -m pip install -r requirements-dev.txt - name: Test with pytest + # We run three different suites here + # 1. Test just the build process + # 2. Test everything else + # 3. Test just utils.helpers.py without pytz being installed + # The last one is achieved by mocking the pytz import, see test_helpers.py for details run: | pytest -v -m nocoverage nocov_exit=$? pytest -v -m "not nocoverage" --cov cov_exit=$? - global_exit=$(( nocov_exit > cov_exit ? nocov_exit : cov_exit )) + echo "TEST_NO_PYTEST=True" >> $GITHUB_ENV + pytest -v -m "not nocoverage" --cov -k test_helpers.py + no_pytz_exit=$? + pytz_exit=$(( nocov_exit > cov_exit ? nocov_exit : cov_exit )) + global_exit=$(( pytz_exit > no_pytz_exit ? pytz_exit : no_pytz_exit )) exit ${global_exit} env: JOB_INDEX: ${{ strategy.job-index }} diff --git a/tests/test_helpers.py b/tests/test_helpers.py index a736bb24a6a..4d20a83f218 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -17,12 +17,11 @@ # You should have received a copy of the GNU Lesser Public License # along with this program. If not, see [http://www.gnu.org/licenses/]. import os -import subprocess -import sys import time import datetime as dtm from importlib import reload from pathlib import Path +from unittest import mock import pytest @@ -49,24 +48,28 @@ RELATIVE_TIME_SPECS = DELTA_TIME_SPECS + TIME_OF_DAY_TIME_SPECS TIME_SPECS = ABSOLUTE_TIME_SPECS + RELATIVE_TIME_SPECS +""" +This part is here for ptb-raw, where we don't have pytz (unless the user installs it) +Because imports in pytest are intricate, we just run -# This is here for ptb-raw, where we don't have pytz (unless the user installs it) -@pytest.fixture(scope='function', params=[True, False]) -def pytz_install(request): - skip = not os.getenv('GITHUB_ACTIONS', False) - reason = 'Un/installing pytz slows tests down, so we just do that in CI' + pytest -k test_helpers.py - if not request.param: - if skip: - pytest.skip(reason) - subprocess.check_call([sys.executable, "-m", "pip", "uninstall", "pytz", "-y"]) - del sys.modules['pytz'] - reload(helpers) - yield - if not request.param: - if skip: - pytest.skip(reason) - subprocess.check_call([sys.executable, "-m", "pip", "install", "pytz"]) +with the TEST_NO_PYTZ environment variable set in addition to the regular test suite. +Because actually uninstalling pytz would lead to errors in the test suite we just mock the +import to raise the expected exception. + +Note that a fixture that just does this for every test that needs it is a nice idea, but for some +reason makes test_updater.py hang indefinitely on GitHub Actions (at least when Hinrich tried that) +""" +if os.getenv('TEST_NO_PYTZ', False): + orig_import = __import__ + + def import_mock(module_name, *args, **kwargs): + if module_name == 'pytz': + raise ModuleNotFoundError('We are testing without pytz here') + return orig_import(module_name, *args, **kwargs) + + with mock.patch('builtins.__import__', side_effect=import_mock): reload(helpers) @@ -108,14 +111,14 @@ def test_markdown_invalid_version(self): with pytest.raises(ValueError): helpers.escape_markdown('abc', version=-1) - def test_to_float_timestamp_absolute_naive(self, pytz_install): + def test_to_float_timestamp_absolute_naive(self): """Conversion from timezone-naive datetime to timestamp. Naive datetimes should be assumed to be in UTC. """ datetime = dtm.datetime(2019, 11, 11, 0, 26, 16, 10 ** 5) assert helpers.to_float_timestamp(datetime) == 1573431976.1 - def test_to_float_timestamp_absolute_naive_no_pytz(self, monkeypatch, pytz_install): + def test_to_float_timestamp_absolute_naive_no_pytz(self, monkeypatch): """Conversion from timezone-naive datetime to timestamp. Naive datetimes should be assumed to be in UTC. """ @@ -146,7 +149,7 @@ def test_to_float_timestamp_delta(self, time_spec): delta = time_spec.total_seconds() if hasattr(time_spec, 'total_seconds') else time_spec assert helpers.to_float_timestamp(time_spec, reference_t) == reference_t + delta - def test_to_float_timestamp_time_of_day(self, pytz_install): + def test_to_float_timestamp_time_of_day(self): """Conversion from time-of-day specification to timestamp""" hour, hour_delta = 12, 1 ref_t = _datetime_to_float_timestamp(dtm.datetime(1970, 1, 1, hour=hour)) @@ -173,7 +176,7 @@ def test_to_float_timestamp_time_of_day_timezone(self, timezone): ) @pytest.mark.parametrize('time_spec', RELATIVE_TIME_SPECS, ids=str) - def test_to_float_timestamp_default_reference(self, time_spec, pytz_install): + def test_to_float_timestamp_default_reference(self, time_spec): """The reference timestamp for relative time specifications should default to now""" now = time.time() assert helpers.to_float_timestamp(time_spec) == pytest.approx( @@ -185,7 +188,7 @@ def test_to_float_timestamp_error(self): helpers.to_float_timestamp(Defaults()) @pytest.mark.parametrize('time_spec', TIME_SPECS, ids=str) - def test_to_timestamp(self, time_spec, pytz_install): + def test_to_timestamp(self, time_spec): # delegate tests to `to_float_timestamp` assert helpers.to_timestamp(time_spec) == int(helpers.to_float_timestamp(time_spec)) @@ -196,7 +199,7 @@ def test_to_timestamp_none(self): def test_from_timestamp_none(self): assert helpers.from_timestamp(None) is None - def test_from_timestamp_naive(self, pytz_install): + def test_from_timestamp_naive(self): datetime = dtm.datetime(2019, 11, 11, 0, 26, 16, tzinfo=None) assert helpers.from_timestamp(1573431976, tzinfo=None) == datetime From 57d62b1e3960dbd7f5e89cc488eefe962914ccf1 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Thu, 11 Feb 2021 08:06:18 +0100 Subject: [PATCH 16/23] Try to fix coverage & logs --- .github/workflows/test.yml | 5 ++++- tests/test_helpers.py | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9b6c5e70d79..f931edcbfa5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -48,11 +48,14 @@ jobs: run: | pytest -v -m nocoverage nocov_exit=$? + echo "Testing build finished with exit status $nocov_exit" pytest -v -m "not nocoverage" --cov cov_exit=$? + echo "Testing everything except build finished with exit status cov_exit" echo "TEST_NO_PYTEST=True" >> $GITHUB_ENV - pytest -v -m "not nocoverage" --cov -k test_helpers.py + pytest -v -m "not nocoverage" --cov-append -k test_helpers.py no_pytz_exit=$? + echo "Testing helpers without pytz finished with exit status cov_exit" pytz_exit=$(( nocov_exit > cov_exit ? nocov_exit : cov_exit )) global_exit=$(( pytz_exit > no_pytz_exit ? pytz_exit : no_pytz_exit )) exit ${global_exit} diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 4d20a83f218..22730a53af3 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -74,6 +74,13 @@ def import_mock(module_name, *args, **kwargs): class TestHelpers: + def test_helpers_utc(self): + # Here we just test, that we got the correct UTC variant + if os.getenv('TEST_NO_PYTZ', False): + assert helpers.UTC is helpers.DTM_UTC + else: + assert helpers.UTC is not helpers.DTM_UTC + def test_escape_markdown(self): test_str = '*bold*, _italic_, `code`, [text_link](http://github.com/)' expected_str = r'\*bold\*, \_italic\_, \`code\`, \[text\_link](http://github.com/)' From 6ea4e4af98dd8a974b50e5909557af41d63eb110 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Thu, 11 Feb 2021 08:18:05 +0100 Subject: [PATCH 17/23] Rearrange test order --- .github/workflows/test.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f931edcbfa5..9604910dc67 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,20 +42,17 @@ jobs: - name: Test with pytest # We run three different suites here # 1. Test just the build process - # 2. Test everything else - # 3. Test just utils.helpers.py without pytz being installed - # The last one is achieved by mocking the pytz import, see test_helpers.py for details + # 2. Test just utils.helpers.py without pytz being installed + # 3. Test everything else + # The second one is achieved by mocking the pytz import, see test_helpers.py for details run: | pytest -v -m nocoverage nocov_exit=$? - echo "Testing build finished with exit status $nocov_exit" - pytest -v -m "not nocoverage" --cov - cov_exit=$? - echo "Testing everything except build finished with exit status cov_exit" - echo "TEST_NO_PYTEST=True" >> $GITHUB_ENV - pytest -v -m "not nocoverage" --cov-append -k test_helpers.py + pytest -v -m "not nocoverage" --cov -k test_helpers.py no_pytz_exit=$? - echo "Testing helpers without pytz finished with exit status cov_exit" + echo "TEST_NO_PYTEST=False" >> $GITHUB_ENV + pytest -v -m "not nocoverage" --cov-append + cov_exit=$? pytz_exit=$(( nocov_exit > cov_exit ? nocov_exit : cov_exit )) global_exit=$(( pytz_exit > no_pytz_exit ? pytz_exit : no_pytz_exit )) exit ${global_exit} @@ -64,6 +61,7 @@ jobs: BOTS: W3sidG9rZW4iOiAiNjk2MTg4NzMyOkFBR1Z3RUtmSEhsTmpzY3hFRE5LQXdraEdzdFpfa28xbUMwIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6WldGaU1UUmxNbVF5TnpNeSIsICJib3RfbmFtZSI6ICJQVEIgdGVzdHMgb24gVHJhdmlzIHVzaW5nIENQeXRob24gMi43IiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxMzkwOTgzOTk3IiwgImJvdF91c2VybmFtZSI6ICJAcHRiX3RyYXZpc19jcHl0aG9uXzI3X2JvdCJ9LCB7InRva2VuIjogIjY3MTQ2ODg4NjpBQUdQR2ZjaVJJQlVORmU4MjR1SVZkcTdKZTNfWW5BVE5HdyIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOlpHWXdPVGxrTXpNeE4yWTIiLCAiYm90X25hbWUiOiAiUFRCIHRlc3RzIG9uIFRyYXZpcyB1c2luZyBDUHl0aG9uIDMuNCIsICJzdXBlcl9ncm91cF9pZCI6ICItMTAwMTQ0NjAyMjUyMiIsICJib3RfdXNlcm5hbWUiOiAiQHB0Yl90cmF2aXNfY3B5dGhvbl8zNF9ib3QifSwgeyJ0b2tlbiI6ICI2MjkzMjY1Mzg6QUFGUnJaSnJCN29CM211ekdzR0pYVXZHRTVDUXpNNUNVNG8iLCAicGF5bWVudF9wcm92aWRlcl90b2tlbiI6ICIyODQ2ODUwNjM6VEVTVDpNbU01WVdKaFl6a3hNMlUxIiwgImJvdF9uYW1lIjogIlBUQiB0ZXN0cyBvbiBUcmF2aXMgdXNpbmcgQ1B5dGhvbiAzLjUiLCAic3VwZXJfZ3JvdXBfaWQiOiAiLTEwMDE0OTY5MTc3NTAiLCAiYm90X3VzZXJuYW1lIjogIkBwdGJfdHJhdmlzX2NweXRob25fMzVfYm90In0sIHsidG9rZW4iOiAiNjQwMjA4OTQzOkFBRmhCalFwOXFtM1JUeFN6VXBZekJRakNsZS1Kano1aGNrIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6WXpoa1pUZzFOamMxWXpWbCIsICJib3RfbmFtZSI6ICJQVEIgdGVzdHMgb24gVHJhdmlzIHVzaW5nIENQeXRob24gMy42IiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxMzMzODcxNDYxIiwgImJvdF91c2VybmFtZSI6ICJAcHRiX3RyYXZpc19jcHl0aG9uXzM2X2JvdCJ9LCB7InRva2VuIjogIjY5NTEwNDA4ODpBQUhmenlsSU9qU0lJUy1lT25JMjB5MkUyMEhvZEhzZnotMCIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOk9HUTFNRGd3WmpJd1pqRmwiLCAiYm90X25hbWUiOiAiUFRCIHRlc3RzIG9uIFRyYXZpcyB1c2luZyBDUHl0aG9uIDMuNyIsICJzdXBlcl9ncm91cF9pZCI6ICItMTAwMTQ3ODI5MzcxNCIsICJib3RfdXNlcm5hbWUiOiAiQHB0Yl90cmF2aXNfY3B5dGhvbl8zN19ib3QifSwgeyJ0b2tlbiI6ICI2OTE0MjM1NTQ6QUFGOFdrakNaYm5IcVBfaTZHaFRZaXJGRWxackdhWU9oWDAiLCAicGF5bWVudF9wcm92aWRlcl90b2tlbiI6ICIyODQ2ODUwNjM6VEVTVDpZamM1TlRoaU1tUXlNV1ZoIiwgImJvdF9uYW1lIjogIlBUQiB0ZXN0cyBvbiBUcmF2aXMgdXNpbmcgUHlQeSAyLjciLCAic3VwZXJfZ3JvdXBfaWQiOiAiLTEwMDEzNjM5MzI1NzMiLCAiYm90X3VzZXJuYW1lIjogIkBwdGJfdHJhdmlzX3B5cHlfMjdfYm90In0sIHsidG9rZW4iOiAiNjg0MzM5OTg0OkFBRk1nRUVqcDAxcjVyQjAwN3lDZFZOc2c4QWxOc2FVLWNjIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6TVRBek1UWTNNR1V5TmpnMCIsICJib3RfbmFtZSI6ICJQVEIgdGVzdHMgb24gVHJhdmlzIHVzaW5nIFB5UHkgMy41IiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxNDA3ODM2NjA1IiwgImJvdF91c2VybmFtZSI6ICJAcHRiX3RyYXZpc19weXB5XzM1X2JvdCJ9LCB7InRva2VuIjogIjY5MDA5MTM0NzpBQUZMbVI1cEFCNVljcGVfbU9oN3pNNEpGQk9oMHozVDBUbyIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOlpEaGxOekU1TURrd1lXSmkiLCAiYm90X25hbWUiOiAiUFRCIHRlc3RzIG9uIEFwcFZleW9yIHVzaW5nIENQeXRob24gMy40IiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxMjc5NjAwMDI2IiwgImJvdF91c2VybmFtZSI6ICJAcHRiX2FwcHZleW9yX2NweXRob25fMzRfYm90In0sIHsidG9rZW4iOiAiNjk0MzA4MDUyOkFBRUIyX3NvbkNrNTVMWTlCRzlBTy1IOGp4aVBTNTVvb0JBIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6WW1aaVlXWm1NakpoWkdNeSIsICJib3RfbmFtZSI6ICJQVEIgdGVzdHMgb24gQXBwVmV5b3IgdXNpbmcgQ1B5dGhvbiAyLjciLCAic3VwZXJfZ3JvdXBfaWQiOiAiLTEwMDEyOTMwNzkxNjUiLCAiYm90X3VzZXJuYW1lIjogIkBwdGJfYXBwdmV5b3JfY3B5dGhvbl8yN19ib3QifSwgeyJ0b2tlbiI6ICIxMDU1Mzk3NDcxOkFBRzE4bkJfUzJXQXd1SjNnN29oS0JWZ1hYY2VNbklPeVNjIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6TmpBd056QXpZalZpTkdOayIsICJuYW1lIjogIlBUQiB0ZXN0cyBbMF0iLCAic3VwZXJfZ3JvdXBfaWQiOiAiLTEwMDExODU1MDk2MzYiLCAidXNlcm5hbWUiOiAicHRiXzBfYm90In0sIHsidG9rZW4iOiAiMTA0NzMyNjc3MTpBQUY4bk90ODFGcFg4bGJidno4VWV3UVF2UmZUYkZmQnZ1SSIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOllUVTFOVEk0WkdSallqbGkiLCAibmFtZSI6ICJQVEIgdGVzdHMgWzFdIiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxNDg0Nzk3NjEyIiwgInVzZXJuYW1lIjogInB0Yl8xX2JvdCJ9LCB7InRva2VuIjogIjk3MTk5Mjc0NTpBQUdPa09hVzBOSGpnSXY1LTlqUWJPajR2R3FkaFNGLVV1cyIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOk5XWmtNV1ZoWWpsallqVTUiLCAibmFtZSI6ICJQVEIgdGVzdHMgWzJdIiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxNDAyMjU1MDcwIiwgInVzZXJuYW1lIjogInB0Yl8yX2JvdCJ9XQ== TEST_BUILD: ${{ matrix.test-build }} TEST_PRE_COMMIT: ${{ matrix.test-pre-commit }} + TEST_NO_PYTEST : True shell: bash --noprofile --norc {0} - name: Submit coverage From 753eec3e68db93925a4045196786daceaee6a4c6 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Thu, 11 Feb 2021 08:29:30 +0100 Subject: [PATCH 18/23] increase coverage --- tests/test_callbackcontext.py | 2 +- tests/test_defaults.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_callbackcontext.py b/tests/test_callbackcontext.py index 3b2cec90ad8..8018b0ce0d4 100644 --- a/tests/test_callbackcontext.py +++ b/tests/test_callbackcontext.py @@ -143,7 +143,7 @@ def test_data_assignment(self, cdp): callback_context = CallbackContext.from_update(update, cdp) with pytest.raises(AttributeError): - callback_context.chat_data = {"test": 123} + callback_context.bot_data = {"test": 123} with pytest.raises(AttributeError): callback_context.user_data = {} with pytest.raises(AttributeError): diff --git a/tests/test_defaults.py b/tests/test_defaults.py index 9ff81a00cb9..b12029cc8b1 100644 --- a/tests/test_defaults.py +++ b/tests/test_defaults.py @@ -29,6 +29,8 @@ def test_data_assignment(self, cdp): with pytest.raises(AttributeError): defaults.parse_mode = True + with pytest.raises(AttributeError): + defaults.explanation_parse_mode = True with pytest.raises(AttributeError): defaults.disable_notification = True with pytest.raises(AttributeError): From 86aaec64905b4129c23d021133b9ab212825d039 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Thu, 11 Feb 2021 08:51:25 +0100 Subject: [PATCH 19/23] Try to fix coverage reports --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9604910dc67..44146c153cf 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: pytest -v -m "not nocoverage" --cov -k test_helpers.py no_pytz_exit=$? echo "TEST_NO_PYTEST=False" >> $GITHUB_ENV - pytest -v -m "not nocoverage" --cov-append + pytest -v -m "not nocoverage" --cov --cov-append cov_exit=$? pytz_exit=$(( nocov_exit > cov_exit ? nocov_exit : cov_exit )) global_exit=$(( pytz_exit > no_pytz_exit ? pytz_exit : no_pytz_exit )) From 2c81653f14caa23e2885876ca0be312316a56e63 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Fri, 12 Feb 2021 18:57:58 +0100 Subject: [PATCH 20/23] address review --- telegram/bot.py | 27 +++++++++++++++------------ telegram/ext/callbackcontext.py | 6 +++--- tests/conftest.py | 4 ++-- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/telegram/bot.py b/telegram/bot.py index 7e7e856c203..6e0b089542a 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -34,7 +34,6 @@ Union, no_type_check, Dict, - Any, cast, ) @@ -184,12 +183,14 @@ def __init__( private_key, password=private_key_password, backend=default_backend() ) - def _insert_defaults(self, data: Dict[str, Any], timeout: ODVInput[float]) -> Optional[float]: + def _insert_defaults( + self, data: Dict[str, object], timeout: ODVInput[float] + ) -> Optional[float]: """ Inserts the defaults values for optional kwargs for which tg.ext.Defaults provides convenience functionality, i.e. the kwargs with a tg.utils.helpers.DefaultValue default - data is edited in-place. As timeout as not passed via the kwargs, it needs to be passed + data is edited in-place. As timeout is not passed via the kwargs, it needs to be passed separately and gets returned. This can only work, if all kwargs that may have defaults are passed in data! @@ -204,9 +205,9 @@ def _insert_defaults(self, data: Dict[str, Any], timeout: ODVInput[float]) -> Op # if we have Defaults, we replace all DefaultValue instances with the relevant # Defaults value. If there is none, we fall back to the default value of the bot method - for key in data: - if isinstance(data[key], DefaultValue): - data[key] = self.defaults.api_defaults.get(key, data[key].value) + for key, val in data.items(): + if isinstance(val, DefaultValue): + data[key] = self.defaults.api_defaults.get(key, val.value) if isinstance(timeout, DefaultValue): # If we get here, we use Defaults.timeout, unless that's not set, which is the @@ -275,7 +276,7 @@ def _message( if data.get('media') and (data['media'].parse_mode == DEFAULT_NONE): if self.defaults: - data['media'].parse_mode = self.defaults.parse_mode + data['media'].parse_mode = DefaultValue.get_value(self.defaults.parse_mode) else: data['media'].parse_mode = None @@ -2060,7 +2061,9 @@ def _set_defaults(res): and res.input_message_content.parse_mode == DEFAULT_NONE ): if self.defaults: - res.input_message_content.parse_mode = self.defaults.parse_mode + res.input_message_content.parse_mode = DefaultValue.get_value( + self.defaults.parse_mode + ) else: res.input_message_content.parse_mode = None if ( @@ -2069,7 +2072,7 @@ def _set_defaults(res): ): if self.defaults: res.input_message_content.disable_web_page_preview = ( - self.defaults.disable_web_page_preview + DefaultValue.get_value(self.defaults.disable_web_page_preview) ) else: res.input_message_content.disable_web_page_preview = None @@ -2689,9 +2692,9 @@ def get_updates( timeout (:obj:`int`, optional): Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling. Should be positive, short polling should be used for testing purposes only. - read_latency (Optional[float|int]): Grace time in seconds for receiving the reply from - server. Will be added to the ``timeout`` value and used as the read timeout from - server. Defaults to ``2``. + read_latency (:obj:`float`| :obj:`int`, optional): Grace time in seconds for receiving + the reply from server. Will be added to the ``timeout`` value and used as the read + timeout from server. Defaults to ``2``. allowed_updates (List[:obj:`str`]), optional): A JSON-serialized list the types of updates you want your bot to receive. For example, specify ["message", "edited_channel_post", "callback_query"] to only receive updates of these types. diff --git a/telegram/ext/callbackcontext.py b/telegram/ext/callbackcontext.py index e42db3890a7..388ff68a20d 100644 --- a/telegram/ext/callbackcontext.py +++ b/telegram/ext/callbackcontext.py @@ -118,7 +118,7 @@ def bot_data(self) -> Dict: @bot_data.setter def bot_data(self, value: object) -> NoReturn: raise AttributeError( - "You can not assign a new value to bot_data, see https://git.io/fjxKe" + "You can not assign a new value to bot_data, see https://git.io/Jt6ic" ) @property @@ -128,7 +128,7 @@ def chat_data(self) -> Optional[Dict]: @chat_data.setter def chat_data(self, value: object) -> NoReturn: raise AttributeError( - "You can not assign a new value to chat_data, see https://git.io/fjxKe" + "You can not assign a new value to chat_data, see https://git.io/Jt6ic" ) @property @@ -138,7 +138,7 @@ def user_data(self) -> Optional[Dict]: @user_data.setter def user_data(self, value: object) -> NoReturn: raise AttributeError( - "You can not assign a new value to user_data, see https://git.io/fjxKe" + "You can not assign a new value to user_data, see https://git.io/Jt6ic" ) @classmethod diff --git a/tests/conftest.py b/tests/conftest.py index ff79af853bf..7ed3b31f144 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -437,7 +437,7 @@ def check_shortcut_call( orig_bot_method = getattr(bot, bot_method_name) bot_signature = inspect.signature(orig_bot_method) - expected_args = set(bot_signature.parameters.keys()).difference(['self']) - set(skip_params) + expected_args = set(bot_signature.parameters.keys()) - {'self'} - set(skip_params) positional_args = { name for name, param in bot_signature.parameters.items() if param.default == param.empty } @@ -489,7 +489,7 @@ def check_defaults_handling( method: The shortcut/bot_method bot: The bot return_value: Optional. The return value of Bot._post that the method expects. Defaults to - None. get_file is automatically handled. + None. get_file is automatically handled. """ From cd764ccb70d23f5a3addaf8b56332800886321f3 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sat, 13 Feb 2021 20:51:13 +0100 Subject: [PATCH 21/23] Adapt tests like in #2386 --- .github/workflows/test.yml | 4 ++-- tests/conftest.py | 8 ++++++++ tests/test_helpers.py | 4 +++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 44146c153cf..2f84d12902f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,7 +50,7 @@ jobs: nocov_exit=$? pytest -v -m "not nocoverage" --cov -k test_helpers.py no_pytz_exit=$? - echo "TEST_NO_PYTEST=False" >> $GITHUB_ENV + export TEST_NO_PYTEST='false' pytest -v -m "not nocoverage" --cov --cov-append cov_exit=$? pytz_exit=$(( nocov_exit > cov_exit ? nocov_exit : cov_exit )) @@ -61,7 +61,7 @@ jobs: BOTS: W3sidG9rZW4iOiAiNjk2MTg4NzMyOkFBR1Z3RUtmSEhsTmpzY3hFRE5LQXdraEdzdFpfa28xbUMwIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6WldGaU1UUmxNbVF5TnpNeSIsICJib3RfbmFtZSI6ICJQVEIgdGVzdHMgb24gVHJhdmlzIHVzaW5nIENQeXRob24gMi43IiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxMzkwOTgzOTk3IiwgImJvdF91c2VybmFtZSI6ICJAcHRiX3RyYXZpc19jcHl0aG9uXzI3X2JvdCJ9LCB7InRva2VuIjogIjY3MTQ2ODg4NjpBQUdQR2ZjaVJJQlVORmU4MjR1SVZkcTdKZTNfWW5BVE5HdyIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOlpHWXdPVGxrTXpNeE4yWTIiLCAiYm90X25hbWUiOiAiUFRCIHRlc3RzIG9uIFRyYXZpcyB1c2luZyBDUHl0aG9uIDMuNCIsICJzdXBlcl9ncm91cF9pZCI6ICItMTAwMTQ0NjAyMjUyMiIsICJib3RfdXNlcm5hbWUiOiAiQHB0Yl90cmF2aXNfY3B5dGhvbl8zNF9ib3QifSwgeyJ0b2tlbiI6ICI2MjkzMjY1Mzg6QUFGUnJaSnJCN29CM211ekdzR0pYVXZHRTVDUXpNNUNVNG8iLCAicGF5bWVudF9wcm92aWRlcl90b2tlbiI6ICIyODQ2ODUwNjM6VEVTVDpNbU01WVdKaFl6a3hNMlUxIiwgImJvdF9uYW1lIjogIlBUQiB0ZXN0cyBvbiBUcmF2aXMgdXNpbmcgQ1B5dGhvbiAzLjUiLCAic3VwZXJfZ3JvdXBfaWQiOiAiLTEwMDE0OTY5MTc3NTAiLCAiYm90X3VzZXJuYW1lIjogIkBwdGJfdHJhdmlzX2NweXRob25fMzVfYm90In0sIHsidG9rZW4iOiAiNjQwMjA4OTQzOkFBRmhCalFwOXFtM1JUeFN6VXBZekJRakNsZS1Kano1aGNrIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6WXpoa1pUZzFOamMxWXpWbCIsICJib3RfbmFtZSI6ICJQVEIgdGVzdHMgb24gVHJhdmlzIHVzaW5nIENQeXRob24gMy42IiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxMzMzODcxNDYxIiwgImJvdF91c2VybmFtZSI6ICJAcHRiX3RyYXZpc19jcHl0aG9uXzM2X2JvdCJ9LCB7InRva2VuIjogIjY5NTEwNDA4ODpBQUhmenlsSU9qU0lJUy1lT25JMjB5MkUyMEhvZEhzZnotMCIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOk9HUTFNRGd3WmpJd1pqRmwiLCAiYm90X25hbWUiOiAiUFRCIHRlc3RzIG9uIFRyYXZpcyB1c2luZyBDUHl0aG9uIDMuNyIsICJzdXBlcl9ncm91cF9pZCI6ICItMTAwMTQ3ODI5MzcxNCIsICJib3RfdXNlcm5hbWUiOiAiQHB0Yl90cmF2aXNfY3B5dGhvbl8zN19ib3QifSwgeyJ0b2tlbiI6ICI2OTE0MjM1NTQ6QUFGOFdrakNaYm5IcVBfaTZHaFRZaXJGRWxackdhWU9oWDAiLCAicGF5bWVudF9wcm92aWRlcl90b2tlbiI6ICIyODQ2ODUwNjM6VEVTVDpZamM1TlRoaU1tUXlNV1ZoIiwgImJvdF9uYW1lIjogIlBUQiB0ZXN0cyBvbiBUcmF2aXMgdXNpbmcgUHlQeSAyLjciLCAic3VwZXJfZ3JvdXBfaWQiOiAiLTEwMDEzNjM5MzI1NzMiLCAiYm90X3VzZXJuYW1lIjogIkBwdGJfdHJhdmlzX3B5cHlfMjdfYm90In0sIHsidG9rZW4iOiAiNjg0MzM5OTg0OkFBRk1nRUVqcDAxcjVyQjAwN3lDZFZOc2c4QWxOc2FVLWNjIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6TVRBek1UWTNNR1V5TmpnMCIsICJib3RfbmFtZSI6ICJQVEIgdGVzdHMgb24gVHJhdmlzIHVzaW5nIFB5UHkgMy41IiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxNDA3ODM2NjA1IiwgImJvdF91c2VybmFtZSI6ICJAcHRiX3RyYXZpc19weXB5XzM1X2JvdCJ9LCB7InRva2VuIjogIjY5MDA5MTM0NzpBQUZMbVI1cEFCNVljcGVfbU9oN3pNNEpGQk9oMHozVDBUbyIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOlpEaGxOekU1TURrd1lXSmkiLCAiYm90X25hbWUiOiAiUFRCIHRlc3RzIG9uIEFwcFZleW9yIHVzaW5nIENQeXRob24gMy40IiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxMjc5NjAwMDI2IiwgImJvdF91c2VybmFtZSI6ICJAcHRiX2FwcHZleW9yX2NweXRob25fMzRfYm90In0sIHsidG9rZW4iOiAiNjk0MzA4MDUyOkFBRUIyX3NvbkNrNTVMWTlCRzlBTy1IOGp4aVBTNTVvb0JBIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6WW1aaVlXWm1NakpoWkdNeSIsICJib3RfbmFtZSI6ICJQVEIgdGVzdHMgb24gQXBwVmV5b3IgdXNpbmcgQ1B5dGhvbiAyLjciLCAic3VwZXJfZ3JvdXBfaWQiOiAiLTEwMDEyOTMwNzkxNjUiLCAiYm90X3VzZXJuYW1lIjogIkBwdGJfYXBwdmV5b3JfY3B5dGhvbl8yN19ib3QifSwgeyJ0b2tlbiI6ICIxMDU1Mzk3NDcxOkFBRzE4bkJfUzJXQXd1SjNnN29oS0JWZ1hYY2VNbklPeVNjIiwgInBheW1lbnRfcHJvdmlkZXJfdG9rZW4iOiAiMjg0Njg1MDYzOlRFU1Q6TmpBd056QXpZalZpTkdOayIsICJuYW1lIjogIlBUQiB0ZXN0cyBbMF0iLCAic3VwZXJfZ3JvdXBfaWQiOiAiLTEwMDExODU1MDk2MzYiLCAidXNlcm5hbWUiOiAicHRiXzBfYm90In0sIHsidG9rZW4iOiAiMTA0NzMyNjc3MTpBQUY4bk90ODFGcFg4bGJidno4VWV3UVF2UmZUYkZmQnZ1SSIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOllUVTFOVEk0WkdSallqbGkiLCAibmFtZSI6ICJQVEIgdGVzdHMgWzFdIiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxNDg0Nzk3NjEyIiwgInVzZXJuYW1lIjogInB0Yl8xX2JvdCJ9LCB7InRva2VuIjogIjk3MTk5Mjc0NTpBQUdPa09hVzBOSGpnSXY1LTlqUWJPajR2R3FkaFNGLVV1cyIsICJwYXltZW50X3Byb3ZpZGVyX3Rva2VuIjogIjI4NDY4NTA2MzpURVNUOk5XWmtNV1ZoWWpsallqVTUiLCAibmFtZSI6ICJQVEIgdGVzdHMgWzJdIiwgInN1cGVyX2dyb3VwX2lkIjogIi0xMDAxNDAyMjU1MDcwIiwgInVzZXJuYW1lIjogInB0Yl8yX2JvdCJ9XQ== TEST_BUILD: ${{ matrix.test-build }} TEST_PRE_COMMIT: ${{ matrix.test-pre-commit }} - TEST_NO_PYTEST : True + TEST_NO_PYTEST : 'true' shell: bash --noprofile --norc {0} - name: Submit coverage diff --git a/tests/conftest.py b/tests/conftest.py index 7ed3b31f144..dab85347b5f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -60,6 +60,14 @@ PRIVATE_KEY = b"-----BEGIN RSA PRIVATE KEY-----\r\nMIIEowIBAAKCAQEA0AvEbNaOnfIL3GjB8VI4M5IaWe+GcK8eSPHkLkXREIsaddum\r\nwPBm/+w8lFYdnY+O06OEJrsaDtwGdU//8cbGJ/H/9cJH3dh0tNbfszP7nTrQD+88\r\nydlcYHzClaG8G+oTe9uEZSVdDXj5IUqR0y6rDXXb9tC9l+oSz+ShYg6+C4grAb3E\r\nSTv5khZ9Zsi/JEPWStqNdpoNuRh7qEYc3t4B/a5BH7bsQENyJSc8AWrfv+drPAEe\r\njQ8xm1ygzWvJp8yZPwOIYuL+obtANcoVT2G2150Wy6qLC0bD88Bm40GqLbSazueC\r\nRHZRug0B9rMUKvKc4FhG4AlNzBCaKgIcCWEqKwIDAQABAoIBACcIjin9d3Sa3S7V\r\nWM32JyVF3DvTfN3XfU8iUzV7U+ZOswA53eeFM04A/Ly4C4ZsUNfUbg72O8Vd8rg/\r\n8j1ilfsYpHVvphwxaHQlfIMa1bKCPlc/A6C7b2GLBtccKTbzjARJA2YWxIaqk9Nz\r\nMjj1IJK98i80qt29xRnMQ5sqOO3gn2SxTErvNchtBiwOH8NirqERXig8VCY6fr3n\r\nz7ZImPU3G/4qpD0+9ULrt9x/VkjqVvNdK1l7CyAuve3D7ha3jPMfVHFtVH5gqbyp\r\nKotyIHAyD+Ex3FQ1JV+H7DkP0cPctQiss7OiO9Zd9C1G2OrfQz9el7ewAPqOmZtC\r\nKjB3hUECgYEA/4MfKa1cvaCqzd3yUprp1JhvssVkhM1HyucIxB5xmBcVLX2/Kdhn\r\nhiDApZXARK0O9IRpFF6QVeMEX7TzFwB6dfkyIePsGxputA5SPbtBlHOvjZa8omMl\r\nEYfNa8x/mJkvSEpzvkWPascuHJWv1cEypqphu/70DxubWB5UKo/8o6cCgYEA0HFy\r\ncgwPMB//nltHGrmaQZPFT7/Qgl9ErZT3G9S8teWY4o4CXnkdU75tBoKAaJnpSfX3\r\nq8VuRerF45AFhqCKhlG4l51oW7TUH50qE3GM+4ivaH5YZB3biwQ9Wqw+QyNLAh/Q\r\nnS4/Wwb8qC9QuyEgcCju5lsCaPEXZiZqtPVxZd0CgYEAshBG31yZjO0zG1TZUwfy\r\nfN3euc8mRgZpSdXIHiS5NSyg7Zr8ZcUSID8jAkJiQ3n3OiAsuq1MGQ6kNa582kLT\r\nFPQdI9Ea8ahyDbkNR0gAY9xbM2kg/Gnro1PorH9PTKE0ekSodKk1UUyNrg4DBAwn\r\nqE6E3ebHXt/2WmqIbUD653ECgYBQCC8EAQNX3AFegPd1GGxU33Lz4tchJ4kMCNU0\r\nN2NZh9VCr3nTYjdTbxsXU8YP44CCKFG2/zAO4kymyiaFAWEOn5P7irGF/JExrjt4\r\nibGy5lFLEq/HiPtBjhgsl1O0nXlwUFzd7OLghXc+8CPUJaz5w42unqT3PBJa40c3\r\nQcIPdQKBgBnSb7BcDAAQ/Qx9juo/RKpvhyeqlnp0GzPSQjvtWi9dQRIu9Pe7luHc\r\nm1Img1EO1OyE3dis/rLaDsAa2AKu1Yx6h85EmNjavBqP9wqmFa0NIQQH8fvzKY3/\r\nP8IHY6009aoamLqYaexvrkHVq7fFKiI6k8myMJ6qblVNFv14+KXU\r\n-----END RSA PRIVATE KEY-----" # noqa: E501 +def env_var_2_bool(env_var: object) -> bool: + if isinstance(env_var, bool): + return env_var + if not isinstance(env_var, str): + return False + return env_var.lower().strip() == 'true' + + @pytest.fixture(scope='session') def bot_info(): return get_bot() diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 22730a53af3..15ec2ea52ea 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -36,6 +36,8 @@ # sample time specification values categorised into absolute / delta / time-of-day +from tests.conftest import env_var_2_bool + ABSOLUTE_TIME_SPECS = [ dtm.datetime.now(tz=dtm.timezone(dtm.timedelta(hours=-7))), dtm.datetime.utcnow(), @@ -61,7 +63,7 @@ Note that a fixture that just does this for every test that needs it is a nice idea, but for some reason makes test_updater.py hang indefinitely on GitHub Actions (at least when Hinrich tried that) """ -if os.getenv('TEST_NO_PYTZ', False): +if env_var_2_bool(os.getenv('TEST_NO_PYTZ', False)): orig_import = __import__ def import_mock(module_name, *args, **kwargs): From b74935372d55cf23e64b966671bcdbd8f7b9c0b2 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sat, 13 Feb 2021 22:33:59 +0100 Subject: [PATCH 22/23] fix CI --- tests/test_helpers.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 15ec2ea52ea..607d105cbf0 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -63,7 +63,9 @@ Note that a fixture that just does this for every test that needs it is a nice idea, but for some reason makes test_updater.py hang indefinitely on GitHub Actions (at least when Hinrich tried that) """ -if env_var_2_bool(os.getenv('TEST_NO_PYTZ', False)): + +TEST_NO_PYTZ = env_var_2_bool(os.getenv('TEST_NO_PYTZ', False)) +if TEST_NO_PYTZ: orig_import = __import__ def import_mock(module_name, *args, **kwargs): @@ -78,7 +80,7 @@ def import_mock(module_name, *args, **kwargs): class TestHelpers: def test_helpers_utc(self): # Here we just test, that we got the correct UTC variant - if os.getenv('TEST_NO_PYTZ', False): + if TEST_NO_PYTZ: assert helpers.UTC is helpers.DTM_UTC else: assert helpers.UTC is not helpers.DTM_UTC From de96ecb2af3b2df3ba3f82d004f3bb423ed900fa Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sat, 13 Feb 2021 22:34:14 +0100 Subject: [PATCH 23/23] fix CI --- tests/test_helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 607d105cbf0..b95588ab27f 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -63,8 +63,8 @@ Note that a fixture that just does this for every test that needs it is a nice idea, but for some reason makes test_updater.py hang indefinitely on GitHub Actions (at least when Hinrich tried that) """ - TEST_NO_PYTZ = env_var_2_bool(os.getenv('TEST_NO_PYTZ', False)) + if TEST_NO_PYTZ: orig_import = __import__