2016-09-07 08:49:09 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
#
|
|
|
|
# A library that provides a Python interface to the Telegram Bot API
|
2018-01-04 16:16:06 +01:00
|
|
|
# Copyright (C) 2015-2018
|
2016-09-07 08:49:09 +02:00
|
|
|
# Leandro Toledo de Souza <devs@python-telegram-bot.org>
|
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
2017-08-11 23:58:41 +02:00
|
|
|
# it under the terms of the GNU Lesser Public License as published by
|
2016-09-07 08:49:09 +02:00
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2017-08-11 23:58:41 +02:00
|
|
|
# GNU Lesser Public License for more details.
|
2016-09-07 08:49:09 +02:00
|
|
|
#
|
2017-08-11 23:58:41 +02:00
|
|
|
# You should have received a copy of the GNU Lesser Public License
|
2016-09-07 08:49:09 +02:00
|
|
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
2017-08-11 23:58:41 +02:00
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
2018-02-12 14:39:46 +01:00
|
|
|
from telegram import ParseMode
|
Bot API 4.0 (#1168)
Telegram Passport (#1174):
- Add full support for telegram passport.
- New types: PassportData, PassportFile, EncryptedPassportElement, EncryptedCredentials, PassportElementError, PassportElementErrorDataField, PassportElementErrorFrontSide, PassportElementErrorReverseSide, PassportElementErrorSelfie, PassportElementErrorFile and PassportElementErrorFiles.
- New bot method: set_passport_data_errors
- New filter: Filters.passport_data
- Field passport_data field on Message
- PassportData is automagically decrypted when you specify your private key when creating Updater or Bot.
- PassportFiles is also automagically decrypted as you download/retrieve them.
- See new passportbot.py example for details on how to use, or go to our telegram passport wiki page for more info
- NOTE: Passport decryption requires new dependency `cryptography`.
Inputfile rework (#1184):
- Change how Inputfile is handled internally
- This allows support for specifying the thumbnails of photos and videos using the thumb= argument in the different send_ methods.
- Also allows Bot.send_media_group to actually finally send more than one media.
- Add thumb to Audio, Video and Videonote
- Add Bot.edit_message_media together with InputMediaAnimation, InputMediaAudio, and inputMediaDocument.
Other Bot API 4.0 changes:
- Add forusquare_type to Venue, InlineQueryResultVenue, InputVenueMessageContent, and Bot.send_venue. (#1170)
- Add vCard support by adding vcard field to Contact, InlineQueryResultContact, InputContactMessageContent, and Bot.send_contact. (#1166)
- Support new message entities: CASHTAG and PHONE_NUMBER. (#1179)
- Cashtag seems to be things like $USD and $GBP, but it seems telegram doesn't currently send them to bots.
- Phone number also seems to have limited support for now
- Add Bot.send_animation, add width, height, and duration to Animation, and add Filters.animation. (#1172)
Co-authored-by: Jasmin Bom <jsmnbom@gmail.com>
Co-authored-by: code1mountain <32801117+code1mountain@users.noreply.github.com>
Co-authored-by: Eldinnie <pieter.schutz+github@gmail.com>
Co-authored-by: mathefreak1 <mathefreak@hi2.in>
2018-08-29 14:18:58 +02:00
|
|
|
from telegram import (Update, Message, User, MessageEntity, Chat, Audio, Document, Animation,
|
2017-08-11 23:58:41 +02:00
|
|
|
Game, PhotoSize, Sticker, Video, Voice, VideoNote, Contact, Location, Venue,
|
Bot API 4.0 (#1168)
Telegram Passport (#1174):
- Add full support for telegram passport.
- New types: PassportData, PassportFile, EncryptedPassportElement, EncryptedCredentials, PassportElementError, PassportElementErrorDataField, PassportElementErrorFrontSide, PassportElementErrorReverseSide, PassportElementErrorSelfie, PassportElementErrorFile and PassportElementErrorFiles.
- New bot method: set_passport_data_errors
- New filter: Filters.passport_data
- Field passport_data field on Message
- PassportData is automagically decrypted when you specify your private key when creating Updater or Bot.
- PassportFiles is also automagically decrypted as you download/retrieve them.
- See new passportbot.py example for details on how to use, or go to our telegram passport wiki page for more info
- NOTE: Passport decryption requires new dependency `cryptography`.
Inputfile rework (#1184):
- Change how Inputfile is handled internally
- This allows support for specifying the thumbnails of photos and videos using the thumb= argument in the different send_ methods.
- Also allows Bot.send_media_group to actually finally send more than one media.
- Add thumb to Audio, Video and Videonote
- Add Bot.edit_message_media together with InputMediaAnimation, InputMediaAudio, and inputMediaDocument.
Other Bot API 4.0 changes:
- Add forusquare_type to Venue, InlineQueryResultVenue, InputVenueMessageContent, and Bot.send_venue. (#1170)
- Add vCard support by adding vcard field to Contact, InlineQueryResultContact, InputContactMessageContent, and Bot.send_contact. (#1166)
- Support new message entities: CASHTAG and PHONE_NUMBER. (#1179)
- Cashtag seems to be things like $USD and $GBP, but it seems telegram doesn't currently send them to bots.
- Phone number also seems to have limited support for now
- Add Bot.send_animation, add width, height, and duration to Animation, and add Filters.animation. (#1172)
Co-authored-by: Jasmin Bom <jsmnbom@gmail.com>
Co-authored-by: code1mountain <32801117+code1mountain@users.noreply.github.com>
Co-authored-by: Eldinnie <pieter.schutz+github@gmail.com>
Co-authored-by: mathefreak1 <mathefreak@hi2.in>
2018-08-29 14:18:58 +02:00
|
|
|
Invoice, SuccessfulPayment, PassportData)
|
|
|
|
from tests.test_passport import RAW_PASSPORT_DATA
|
2017-08-11 23:58:41 +02:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='class')
|
|
|
|
def message(bot):
|
|
|
|
return Message(TestMessage.id, TestMessage.from_user, TestMessage.date, TestMessage.chat,
|
|
|
|
bot=bot)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='function',
|
|
|
|
params=[
|
2017-09-01 08:40:05 +02:00
|
|
|
{'forward_from': User(99, 'forward_user', False),
|
2017-08-11 23:58:41 +02:00
|
|
|
'forward_date': datetime.now()},
|
|
|
|
{'forward_from_chat': Chat(-23, 'channel'),
|
|
|
|
'forward_from_message_id': 101,
|
|
|
|
'forward_date': datetime.now()},
|
|
|
|
{'reply_to_message': Message(50, None, None, None)},
|
|
|
|
{'edit_date': datetime.now()},
|
2017-10-14 20:03:02 +02:00
|
|
|
{'text': 'a text message',
|
2017-08-11 23:58:41 +02:00
|
|
|
'enitites': [MessageEntity('bold', 10, 4),
|
|
|
|
MessageEntity('italic', 16, 7)]},
|
2017-10-14 20:03:02 +02:00
|
|
|
{'caption': 'A message caption',
|
|
|
|
'caption_entities': [MessageEntity('bold', 1, 1),
|
|
|
|
MessageEntity('text_link', 4, 3)]},
|
2017-08-11 23:58:41 +02:00
|
|
|
{'audio': Audio('audio_id', 12),
|
|
|
|
'caption': 'audio_file'},
|
|
|
|
{'document': Document('document_id'),
|
|
|
|
'caption': 'document_file'},
|
Bot API 4.0 (#1168)
Telegram Passport (#1174):
- Add full support for telegram passport.
- New types: PassportData, PassportFile, EncryptedPassportElement, EncryptedCredentials, PassportElementError, PassportElementErrorDataField, PassportElementErrorFrontSide, PassportElementErrorReverseSide, PassportElementErrorSelfie, PassportElementErrorFile and PassportElementErrorFiles.
- New bot method: set_passport_data_errors
- New filter: Filters.passport_data
- Field passport_data field on Message
- PassportData is automagically decrypted when you specify your private key when creating Updater or Bot.
- PassportFiles is also automagically decrypted as you download/retrieve them.
- See new passportbot.py example for details on how to use, or go to our telegram passport wiki page for more info
- NOTE: Passport decryption requires new dependency `cryptography`.
Inputfile rework (#1184):
- Change how Inputfile is handled internally
- This allows support for specifying the thumbnails of photos and videos using the thumb= argument in the different send_ methods.
- Also allows Bot.send_media_group to actually finally send more than one media.
- Add thumb to Audio, Video and Videonote
- Add Bot.edit_message_media together with InputMediaAnimation, InputMediaAudio, and inputMediaDocument.
Other Bot API 4.0 changes:
- Add forusquare_type to Venue, InlineQueryResultVenue, InputVenueMessageContent, and Bot.send_venue. (#1170)
- Add vCard support by adding vcard field to Contact, InlineQueryResultContact, InputContactMessageContent, and Bot.send_contact. (#1166)
- Support new message entities: CASHTAG and PHONE_NUMBER. (#1179)
- Cashtag seems to be things like $USD and $GBP, but it seems telegram doesn't currently send them to bots.
- Phone number also seems to have limited support for now
- Add Bot.send_animation, add width, height, and duration to Animation, and add Filters.animation. (#1172)
Co-authored-by: Jasmin Bom <jsmnbom@gmail.com>
Co-authored-by: code1mountain <32801117+code1mountain@users.noreply.github.com>
Co-authored-by: Eldinnie <pieter.schutz+github@gmail.com>
Co-authored-by: mathefreak1 <mathefreak@hi2.in>
2018-08-29 14:18:58 +02:00
|
|
|
{'animation': Animation('animation_id', 30, 30, 1),
|
|
|
|
'caption': 'animation_file'},
|
2017-08-11 23:58:41 +02:00
|
|
|
{'game': Game('my_game', 'just my game',
|
|
|
|
[PhotoSize('game_photo_id', 30, 30), ])},
|
|
|
|
{'photo': [PhotoSize('photo_id', 50, 50)],
|
|
|
|
'caption': 'photo_file'},
|
|
|
|
{'sticker': Sticker('sticker_id', 50, 50)},
|
|
|
|
{'video': Video('video_id', 12, 12, 12),
|
|
|
|
'caption': 'video_file'},
|
|
|
|
{'voice': Voice('voice_id', 5)},
|
|
|
|
{'video_note': VideoNote('video_note_id', 20, 12)},
|
2017-09-01 08:40:05 +02:00
|
|
|
{'new_chat_members': [User(55, 'new_user', False)]},
|
2017-08-11 23:58:41 +02:00
|
|
|
{'contact': Contact('phone_numner', 'contact_name')},
|
|
|
|
{'location': Location(-23.691288, 46.788279)},
|
|
|
|
{'venue': Venue(Location(-23.691288, 46.788279),
|
|
|
|
'some place', 'right here')},
|
2017-09-01 08:40:05 +02:00
|
|
|
{'left_chat_member': User(33, 'kicked', False)},
|
2017-08-11 23:58:41 +02:00
|
|
|
{'new_chat_title': 'new title'},
|
|
|
|
{'new_chat_photo': [PhotoSize('photo_id', 50, 50)]},
|
|
|
|
{'delete_chat_photo': True},
|
|
|
|
{'group_chat_created': True},
|
|
|
|
{'supergroup_chat_created': True},
|
|
|
|
{'channel_chat_created': True},
|
|
|
|
{'migrate_to_chat_id': -12345},
|
|
|
|
{'migrate_from_chat_id': -54321},
|
|
|
|
{'pinned_message': Message(7, None, None, None)},
|
|
|
|
{'invoice': Invoice('my invoice', 'invoice', 'start', 'EUR', 243)},
|
|
|
|
{'successful_payment': SuccessfulPayment('EUR', 243, 'payload',
|
|
|
|
'charge_id', 'provider_id',
|
2017-09-01 08:40:05 +02:00
|
|
|
order_info={})},
|
2018-02-18 16:11:04 +01:00
|
|
|
{'connected_website': 'http://example.com/'},
|
2017-09-01 08:40:05 +02:00
|
|
|
{'forward_signature': 'some_forward_sign'},
|
2017-12-08 22:38:59 +01:00
|
|
|
{'author_signature': 'some_author_sign'},
|
|
|
|
{'photo': [PhotoSize('photo_id', 50, 50)],
|
|
|
|
'caption': 'photo_file',
|
Bot API 4.0 (#1168)
Telegram Passport (#1174):
- Add full support for telegram passport.
- New types: PassportData, PassportFile, EncryptedPassportElement, EncryptedCredentials, PassportElementError, PassportElementErrorDataField, PassportElementErrorFrontSide, PassportElementErrorReverseSide, PassportElementErrorSelfie, PassportElementErrorFile and PassportElementErrorFiles.
- New bot method: set_passport_data_errors
- New filter: Filters.passport_data
- Field passport_data field on Message
- PassportData is automagically decrypted when you specify your private key when creating Updater or Bot.
- PassportFiles is also automagically decrypted as you download/retrieve them.
- See new passportbot.py example for details on how to use, or go to our telegram passport wiki page for more info
- NOTE: Passport decryption requires new dependency `cryptography`.
Inputfile rework (#1184):
- Change how Inputfile is handled internally
- This allows support for specifying the thumbnails of photos and videos using the thumb= argument in the different send_ methods.
- Also allows Bot.send_media_group to actually finally send more than one media.
- Add thumb to Audio, Video and Videonote
- Add Bot.edit_message_media together with InputMediaAnimation, InputMediaAudio, and inputMediaDocument.
Other Bot API 4.0 changes:
- Add forusquare_type to Venue, InlineQueryResultVenue, InputVenueMessageContent, and Bot.send_venue. (#1170)
- Add vCard support by adding vcard field to Contact, InlineQueryResultContact, InputContactMessageContent, and Bot.send_contact. (#1166)
- Support new message entities: CASHTAG and PHONE_NUMBER. (#1179)
- Cashtag seems to be things like $USD and $GBP, but it seems telegram doesn't currently send them to bots.
- Phone number also seems to have limited support for now
- Add Bot.send_animation, add width, height, and duration to Animation, and add Filters.animation. (#1172)
Co-authored-by: Jasmin Bom <jsmnbom@gmail.com>
Co-authored-by: code1mountain <32801117+code1mountain@users.noreply.github.com>
Co-authored-by: Eldinnie <pieter.schutz+github@gmail.com>
Co-authored-by: mathefreak1 <mathefreak@hi2.in>
2018-08-29 14:18:58 +02:00
|
|
|
'media_group_id': 1234443322222},
|
|
|
|
{'passport_data': PassportData.de_json(RAW_PASSPORT_DATA, None)}
|
2017-08-11 23:58:41 +02:00
|
|
|
],
|
2017-10-14 20:03:02 +02:00
|
|
|
ids=['forwarded_user', 'forwarded_channel', 'reply', 'edited', 'text',
|
Bot API 4.0 (#1168)
Telegram Passport (#1174):
- Add full support for telegram passport.
- New types: PassportData, PassportFile, EncryptedPassportElement, EncryptedCredentials, PassportElementError, PassportElementErrorDataField, PassportElementErrorFrontSide, PassportElementErrorReverseSide, PassportElementErrorSelfie, PassportElementErrorFile and PassportElementErrorFiles.
- New bot method: set_passport_data_errors
- New filter: Filters.passport_data
- Field passport_data field on Message
- PassportData is automagically decrypted when you specify your private key when creating Updater or Bot.
- PassportFiles is also automagically decrypted as you download/retrieve them.
- See new passportbot.py example for details on how to use, or go to our telegram passport wiki page for more info
- NOTE: Passport decryption requires new dependency `cryptography`.
Inputfile rework (#1184):
- Change how Inputfile is handled internally
- This allows support for specifying the thumbnails of photos and videos using the thumb= argument in the different send_ methods.
- Also allows Bot.send_media_group to actually finally send more than one media.
- Add thumb to Audio, Video and Videonote
- Add Bot.edit_message_media together with InputMediaAnimation, InputMediaAudio, and inputMediaDocument.
Other Bot API 4.0 changes:
- Add forusquare_type to Venue, InlineQueryResultVenue, InputVenueMessageContent, and Bot.send_venue. (#1170)
- Add vCard support by adding vcard field to Contact, InlineQueryResultContact, InputContactMessageContent, and Bot.send_contact. (#1166)
- Support new message entities: CASHTAG and PHONE_NUMBER. (#1179)
- Cashtag seems to be things like $USD and $GBP, but it seems telegram doesn't currently send them to bots.
- Phone number also seems to have limited support for now
- Add Bot.send_animation, add width, height, and duration to Animation, and add Filters.animation. (#1172)
Co-authored-by: Jasmin Bom <jsmnbom@gmail.com>
Co-authored-by: code1mountain <32801117+code1mountain@users.noreply.github.com>
Co-authored-by: Eldinnie <pieter.schutz+github@gmail.com>
Co-authored-by: mathefreak1 <mathefreak@hi2.in>
2018-08-29 14:18:58 +02:00
|
|
|
'caption_entities', 'audio', 'document', 'animation', 'game', 'photo',
|
|
|
|
'sticker', 'video', 'voice', 'video_note', 'new_members', 'contact',
|
|
|
|
'location', 'venue', 'left_member', 'new_title', 'new_photo', 'delete_photo',
|
|
|
|
'group_created', 'supergroup_created', 'channel_created', 'migrated_to',
|
|
|
|
'migrated_from', 'pinned', 'invoice', 'successful_payment',
|
|
|
|
'connected_website', 'forward_signature', 'author_signature',
|
|
|
|
'photo_from_media_group', 'passport_data'])
|
2017-08-11 23:58:41 +02:00
|
|
|
def message_params(bot, request):
|
|
|
|
return Message(message_id=TestMessage.id,
|
|
|
|
from_user=TestMessage.from_user,
|
|
|
|
date=TestMessage.date,
|
|
|
|
chat=TestMessage.chat, bot=bot, **request.param)
|
|
|
|
|
|
|
|
|
|
|
|
class TestMessage(object):
|
|
|
|
id = 1
|
2017-09-01 08:40:05 +02:00
|
|
|
from_user = User(2, 'testuser', False)
|
2017-08-11 23:58:41 +02:00
|
|
|
date = datetime.now()
|
|
|
|
chat = Chat(3, 'private')
|
|
|
|
test_entities = [{'length': 4, 'offset': 10, 'type': 'bold'},
|
|
|
|
{'length': 7, 'offset': 16, 'type': 'italic'},
|
|
|
|
{'length': 4, 'offset': 25, 'type': 'code'},
|
|
|
|
{'length': 5, 'offset': 31, 'type': 'text_link', 'url': 'http://github.com/'},
|
|
|
|
{'length': 3, 'offset': 41, 'type': 'pre'},
|
|
|
|
{'length': 17, 'offset': 46, 'type': 'url'}]
|
|
|
|
test_text = 'Test for <bold, ita_lic, code, links and pre. http://google.com'
|
|
|
|
test_message = Message(message_id=1,
|
|
|
|
from_user=None,
|
|
|
|
date=None,
|
|
|
|
chat=None,
|
|
|
|
text=test_text,
|
2018-02-22 16:38:54 +01:00
|
|
|
entities=[MessageEntity(**e) for e in test_entities],
|
|
|
|
caption=test_text,
|
|
|
|
caption_entities=[MessageEntity(**e) for e in test_entities])
|
2017-08-11 23:58:41 +02:00
|
|
|
|
|
|
|
def test_all_posibilities_de_json_and_to_dict(self, bot, message_params):
|
|
|
|
new = Message.de_json(message_params.to_dict(), bot)
|
|
|
|
|
|
|
|
assert new.to_dict() == message_params.to_dict()
|
|
|
|
|
|
|
|
def test_dict_approach(self, message):
|
|
|
|
assert message['date'] == message.date
|
|
|
|
assert message['chat_id'] == message.chat_id
|
|
|
|
assert message['no_key'] is None
|
2017-01-20 20:13:58 +01:00
|
|
|
|
2016-09-07 08:49:09 +02:00
|
|
|
def test_parse_entity(self):
|
|
|
|
text = (b'\\U0001f469\\u200d\\U0001f469\\u200d\\U0001f467'
|
|
|
|
b'\\u200d\\U0001f467\\U0001f431http://google.com').decode('unicode-escape')
|
2017-08-11 23:58:41 +02:00
|
|
|
entity = MessageEntity(type=MessageEntity.URL, offset=13, length=17)
|
|
|
|
message = Message(1, self.from_user, self.date, self.chat, text=text, entities=[entity])
|
|
|
|
assert message.parse_entity(entity) == 'http://google.com'
|
2016-09-07 08:49:09 +02:00
|
|
|
|
2017-10-14 20:03:02 +02:00
|
|
|
def test_parse_caption_entity(self):
|
|
|
|
caption = (b'\\U0001f469\\u200d\\U0001f469\\u200d\\U0001f467'
|
|
|
|
b'\\u200d\\U0001f467\\U0001f431http://google.com').decode('unicode-escape')
|
|
|
|
entity = MessageEntity(type=MessageEntity.URL, offset=13, length=17)
|
|
|
|
message = Message(1, self.from_user, self.date, self.chat, caption=caption,
|
|
|
|
caption_entities=[entity])
|
|
|
|
assert message.parse_caption_entity(entity) == 'http://google.com'
|
|
|
|
|
2016-09-07 08:49:09 +02:00
|
|
|
def test_parse_entities(self):
|
|
|
|
text = (b'\\U0001f469\\u200d\\U0001f469\\u200d\\U0001f467'
|
|
|
|
b'\\u200d\\U0001f467\\U0001f431http://google.com').decode('unicode-escape')
|
2017-08-11 23:58:41 +02:00
|
|
|
entity = MessageEntity(type=MessageEntity.URL, offset=13, length=17)
|
|
|
|
entity_2 = MessageEntity(type=MessageEntity.BOLD, offset=13, length=1)
|
|
|
|
message = Message(1, self.from_user, self.date, self.chat,
|
|
|
|
text=text, entities=[entity_2, entity])
|
|
|
|
assert message.parse_entities(MessageEntity.URL) == {entity: 'http://google.com'}
|
|
|
|
assert message.parse_entities() == {entity: 'http://google.com', entity_2: 'h'}
|
2016-09-07 08:49:09 +02:00
|
|
|
|
2017-10-14 20:03:02 +02:00
|
|
|
def test_parse_caption_entities(self):
|
|
|
|
text = (b'\\U0001f469\\u200d\\U0001f469\\u200d\\U0001f467'
|
|
|
|
b'\\u200d\\U0001f467\\U0001f431http://google.com').decode('unicode-escape')
|
|
|
|
entity = MessageEntity(type=MessageEntity.URL, offset=13, length=17)
|
|
|
|
entity_2 = MessageEntity(type=MessageEntity.BOLD, offset=13, length=1)
|
|
|
|
message = Message(1, self.from_user, self.date, self.chat,
|
|
|
|
caption=text, caption_entities=[entity_2, entity])
|
|
|
|
assert message.parse_caption_entities(MessageEntity.URL) == {entity: 'http://google.com'}
|
|
|
|
assert message.parse_caption_entities() == {entity: 'http://google.com', entity_2: 'h'}
|
|
|
|
|
2017-05-21 14:00:07 +02:00
|
|
|
def test_text_html_simple(self):
|
2017-08-11 23:58:41 +02:00
|
|
|
test_html_string = ('Test for <<b>bold</b>, <i>ita_lic</i>, <code>code</code>, '
|
|
|
|
'<a href="http://github.com/">links</a> and <pre>pre</pre>. '
|
|
|
|
'http://google.com')
|
2017-01-20 20:13:58 +01:00
|
|
|
text_html = self.test_message.text_html
|
2017-08-11 23:58:41 +02:00
|
|
|
assert text_html == test_html_string
|
|
|
|
|
2018-03-16 21:42:39 +01:00
|
|
|
def test_text_html_empty(self, message):
|
|
|
|
message.text = None
|
|
|
|
message.caption = "test"
|
|
|
|
assert message.text_html is None
|
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
def test_text_html_urled(self):
|
|
|
|
test_html_string = ('Test for <<b>bold</b>, <i>ita_lic</i>, <code>code</code>, '
|
|
|
|
'<a href="http://github.com/">links</a> and <pre>pre</pre>. '
|
|
|
|
'<a href="http://google.com">http://google.com</a>')
|
|
|
|
text_html = self.test_message.text_html_urled
|
|
|
|
assert text_html == test_html_string
|
2017-01-20 20:13:58 +01:00
|
|
|
|
2017-05-21 14:00:07 +02:00
|
|
|
def test_text_markdown_simple(self):
|
2017-08-11 23:58:41 +02:00
|
|
|
test_md_string = ('Test for <*bold*, _ita\_lic_, `code`, [links](http://github.com/) and '
|
|
|
|
'```pre```. http://google.com')
|
2017-01-20 20:13:58 +01:00
|
|
|
text_markdown = self.test_message.text_markdown
|
2017-08-11 23:58:41 +02:00
|
|
|
assert text_markdown == test_md_string
|
|
|
|
|
2018-03-16 21:42:39 +01:00
|
|
|
def test_text_markdown_empty(self, message):
|
|
|
|
message.text = None
|
|
|
|
message.caption = "test"
|
|
|
|
assert message.text_markdown is None
|
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
def test_text_markdown_urled(self):
|
|
|
|
test_md_string = ('Test for <*bold*, _ita\_lic_, `code`, [links](http://github.com/) and '
|
|
|
|
'```pre```. [http://google.com](http://google.com)')
|
|
|
|
text_markdown = self.test_message.text_markdown_urled
|
|
|
|
assert text_markdown == test_md_string
|
2017-01-20 20:13:58 +01:00
|
|
|
|
2017-05-21 14:00:07 +02:00
|
|
|
def test_text_html_emoji(self):
|
2017-08-11 23:58:41 +02:00
|
|
|
text = b'\\U0001f469\\u200d\\U0001f469\\u200d ABC'.decode('unicode-escape')
|
|
|
|
expected = b'\\U0001f469\\u200d\\U0001f469\\u200d <b>ABC</b>'.decode('unicode-escape')
|
|
|
|
bold_entity = MessageEntity(type=MessageEntity.BOLD, offset=7, length=3)
|
|
|
|
message = Message(1, self.from_user, self.date, self.chat,
|
|
|
|
text=text, entities=[bold_entity])
|
|
|
|
assert expected == message.text_html
|
2017-05-21 14:00:07 +02:00
|
|
|
|
|
|
|
def test_text_markdown_emoji(self):
|
2017-08-11 23:58:41 +02:00
|
|
|
text = b'\\U0001f469\\u200d\\U0001f469\\u200d ABC'.decode('unicode-escape')
|
|
|
|
expected = b'\\U0001f469\\u200d\\U0001f469\\u200d *ABC*'.decode('unicode-escape')
|
|
|
|
bold_entity = MessageEntity(type=MessageEntity.BOLD, offset=7, length=3)
|
|
|
|
message = Message(1, self.from_user, self.date, self.chat,
|
|
|
|
text=text, entities=[bold_entity])
|
|
|
|
assert expected == message.text_markdown
|
2017-05-21 14:00:07 +02:00
|
|
|
|
2018-02-22 16:38:54 +01:00
|
|
|
def test_caption_html_simple(self):
|
|
|
|
test_html_string = ('Test for <<b>bold</b>, <i>ita_lic</i>, <code>code</code>, '
|
|
|
|
'<a href="http://github.com/">links</a> and <pre>pre</pre>. '
|
|
|
|
'http://google.com')
|
|
|
|
caption_html = self.test_message.caption_html
|
|
|
|
assert caption_html == test_html_string
|
|
|
|
|
2018-03-16 21:42:39 +01:00
|
|
|
def test_caption_html_empty(self, message):
|
|
|
|
message.text = "test"
|
|
|
|
message.caption = None
|
|
|
|
assert message.caption_html is None
|
|
|
|
|
2018-02-22 16:38:54 +01:00
|
|
|
def test_caption_html_urled(self):
|
|
|
|
test_html_string = ('Test for <<b>bold</b>, <i>ita_lic</i>, <code>code</code>, '
|
|
|
|
'<a href="http://github.com/">links</a> and <pre>pre</pre>. '
|
|
|
|
'<a href="http://google.com">http://google.com</a>')
|
|
|
|
caption_html = self.test_message.caption_html_urled
|
|
|
|
assert caption_html == test_html_string
|
|
|
|
|
|
|
|
def test_caption_markdown_simple(self):
|
|
|
|
test_md_string = ('Test for <*bold*, _ita\_lic_, `code`, [links](http://github.com/) and '
|
|
|
|
'```pre```. http://google.com')
|
|
|
|
caption_markdown = self.test_message.caption_markdown
|
|
|
|
assert caption_markdown == test_md_string
|
|
|
|
|
2018-03-16 21:42:39 +01:00
|
|
|
def test_caption_markdown_empty(self, message):
|
|
|
|
message.text = "test"
|
|
|
|
message.caption = None
|
|
|
|
assert message.caption_markdown is None
|
|
|
|
|
2018-02-22 16:38:54 +01:00
|
|
|
def test_caption_markdown_urled(self):
|
|
|
|
test_md_string = ('Test for <*bold*, _ita\_lic_, `code`, [links](http://github.com/) and '
|
|
|
|
'```pre```. [http://google.com](http://google.com)')
|
|
|
|
caption_markdown = self.test_message.caption_markdown_urled
|
|
|
|
assert caption_markdown == test_md_string
|
|
|
|
|
|
|
|
def test_caption_html_emoji(self):
|
|
|
|
caption = b'\\U0001f469\\u200d\\U0001f469\\u200d ABC'.decode('unicode-escape')
|
|
|
|
expected = b'\\U0001f469\\u200d\\U0001f469\\u200d <b>ABC</b>'.decode('unicode-escape')
|
|
|
|
bold_entity = MessageEntity(type=MessageEntity.BOLD, offset=7, length=3)
|
|
|
|
message = Message(1, self.from_user, self.date, self.chat,
|
|
|
|
caption=caption, caption_entities=[bold_entity])
|
|
|
|
assert expected == message.caption_html
|
|
|
|
|
|
|
|
def test_caption_markdown_emoji(self):
|
|
|
|
caption = b'\\U0001f469\\u200d\\U0001f469\\u200d ABC'.decode('unicode-escape')
|
|
|
|
expected = b'\\U0001f469\\u200d\\U0001f469\\u200d *ABC*'.decode('unicode-escape')
|
|
|
|
bold_entity = MessageEntity(type=MessageEntity.BOLD, offset=7, length=3)
|
|
|
|
message = Message(1, self.from_user, self.date, self.chat,
|
|
|
|
caption=caption, caption_entities=[bold_entity])
|
|
|
|
assert expected == message.caption_markdown
|
|
|
|
|
2017-05-21 14:00:07 +02:00
|
|
|
def test_parse_entities_url_emoji(self):
|
|
|
|
url = b'http://github.com/?unicode=\\u2713\\U0001f469'.decode('unicode-escape')
|
|
|
|
text = 'some url'
|
2017-08-11 23:58:41 +02:00
|
|
|
link_entity = MessageEntity(type=MessageEntity.URL, offset=0, length=8, url=url)
|
|
|
|
message = Message(1, self.from_user, self.date, self.chat,
|
|
|
|
text=text, entities=[link_entity])
|
|
|
|
assert message.parse_entities() == {link_entity: text}
|
|
|
|
assert next(iter(message.parse_entities())).url == url
|
2017-05-14 23:29:31 +02:00
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
def test_chat_id(self, message):
|
|
|
|
assert message.chat_id == message.chat.id
|
2017-05-14 23:29:31 +02:00
|
|
|
|
2018-05-09 11:42:12 +02:00
|
|
|
def test_link(self, message):
|
|
|
|
assert message.link is None
|
|
|
|
message.chat.username = 'username'
|
|
|
|
message.chat.type = 'supergroup'
|
|
|
|
assert message.link == 'https://t.me/{}/{}'.format(message.chat.username,
|
|
|
|
message.message_id)
|
|
|
|
message.chat.type = 'channel'
|
|
|
|
assert message.link == 'https://t.me/{}/{}'.format(message.chat.username,
|
|
|
|
message.message_id)
|
|
|
|
message.chat.type = 'private'
|
|
|
|
assert message.link is None
|
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
def test_effective_attachment(self, message_params):
|
Bot API 4.0 (#1168)
Telegram Passport (#1174):
- Add full support for telegram passport.
- New types: PassportData, PassportFile, EncryptedPassportElement, EncryptedCredentials, PassportElementError, PassportElementErrorDataField, PassportElementErrorFrontSide, PassportElementErrorReverseSide, PassportElementErrorSelfie, PassportElementErrorFile and PassportElementErrorFiles.
- New bot method: set_passport_data_errors
- New filter: Filters.passport_data
- Field passport_data field on Message
- PassportData is automagically decrypted when you specify your private key when creating Updater or Bot.
- PassportFiles is also automagically decrypted as you download/retrieve them.
- See new passportbot.py example for details on how to use, or go to our telegram passport wiki page for more info
- NOTE: Passport decryption requires new dependency `cryptography`.
Inputfile rework (#1184):
- Change how Inputfile is handled internally
- This allows support for specifying the thumbnails of photos and videos using the thumb= argument in the different send_ methods.
- Also allows Bot.send_media_group to actually finally send more than one media.
- Add thumb to Audio, Video and Videonote
- Add Bot.edit_message_media together with InputMediaAnimation, InputMediaAudio, and inputMediaDocument.
Other Bot API 4.0 changes:
- Add forusquare_type to Venue, InlineQueryResultVenue, InputVenueMessageContent, and Bot.send_venue. (#1170)
- Add vCard support by adding vcard field to Contact, InlineQueryResultContact, InputContactMessageContent, and Bot.send_contact. (#1166)
- Support new message entities: CASHTAG and PHONE_NUMBER. (#1179)
- Cashtag seems to be things like $USD and $GBP, but it seems telegram doesn't currently send them to bots.
- Phone number also seems to have limited support for now
- Add Bot.send_animation, add width, height, and duration to Animation, and add Filters.animation. (#1172)
Co-authored-by: Jasmin Bom <jsmnbom@gmail.com>
Co-authored-by: code1mountain <32801117+code1mountain@users.noreply.github.com>
Co-authored-by: Eldinnie <pieter.schutz+github@gmail.com>
Co-authored-by: mathefreak1 <mathefreak@hi2.in>
2018-08-29 14:18:58 +02:00
|
|
|
for i in ('audio', 'game', 'document', 'animation', 'photo', 'sticker', 'video', 'voice',
|
|
|
|
'video_note', 'contact', 'location', 'venue', 'invoice', 'invoice',
|
|
|
|
'successful_payment'):
|
2017-08-11 23:58:41 +02:00
|
|
|
item = getattr(message_params, i, None)
|
|
|
|
if item:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
item = None
|
|
|
|
assert message_params.effective_attachment == item
|
|
|
|
|
|
|
|
def test_reply_text(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
text = args[2] == 'test'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and text and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_message', test)
|
|
|
|
assert message.reply_text('test')
|
|
|
|
assert message.reply_text('test', quote=True)
|
|
|
|
assert message.reply_text('test', reply_to_message_id=message.message_id, quote=True)
|
|
|
|
|
2018-02-12 14:39:46 +01:00
|
|
|
def test_reply_markdown(self, monkeypatch, message):
|
|
|
|
test_md_string = ('Test for <*bold*, _ita\_lic_, `code`, [links](http://github.com/) and '
|
|
|
|
'```pre```. http://google.com')
|
|
|
|
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
cid = args[1] == message.chat_id
|
|
|
|
markdown_text = args[2] == test_md_string
|
|
|
|
markdown_enabled = kwargs['parse_mode'] == ParseMode.MARKDOWN
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return all([cid, markdown_text, reply, markdown_enabled])
|
|
|
|
|
|
|
|
text_markdown = self.test_message.text_markdown
|
|
|
|
assert text_markdown == test_md_string
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_message', test)
|
|
|
|
assert message.reply_markdown(self.test_message.text_markdown)
|
|
|
|
assert message.reply_markdown(self.test_message.text_markdown, quote=True)
|
|
|
|
assert message.reply_markdown(self.test_message.text_markdown,
|
|
|
|
reply_to_message_id=message.message_id,
|
|
|
|
quote=True)
|
|
|
|
|
|
|
|
def test_reply_html(self, monkeypatch, message):
|
|
|
|
test_html_string = ('Test for <<b>bold</b>, <i>ita_lic</i>, <code>code</code>, '
|
|
|
|
'<a href="http://github.com/">links</a> and <pre>pre</pre>. '
|
|
|
|
'http://google.com')
|
|
|
|
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
cid = args[1] == message.chat_id
|
|
|
|
html_text = args[2] == test_html_string
|
|
|
|
html_enabled = kwargs['parse_mode'] == ParseMode.HTML
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return all([cid, html_text, reply, html_enabled])
|
|
|
|
|
|
|
|
text_html = self.test_message.text_html
|
|
|
|
assert text_html == test_html_string
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_message', test)
|
|
|
|
assert message.reply_html(self.test_message.text_html)
|
|
|
|
assert message.reply_html(self.test_message.text_html, quote=True)
|
|
|
|
assert message.reply_html(self.test_message.text_html,
|
|
|
|
reply_to_message_id=message.message_id,
|
|
|
|
quote=True)
|
|
|
|
|
2018-02-12 14:51:18 +01:00
|
|
|
def test_reply_media_group(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
media = kwargs['media'] == 'reply_media_group'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and media and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_media_group', test)
|
|
|
|
assert message.reply_media_group(media='reply_media_group')
|
|
|
|
assert message.reply_media_group(media='reply_media_group', quote=True)
|
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
def test_reply_photo(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
photo = kwargs['photo'] == 'test_photo'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and photo and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_photo', test)
|
|
|
|
assert message.reply_photo(photo='test_photo')
|
|
|
|
assert message.reply_photo(photo='test_photo', quote=True)
|
|
|
|
|
|
|
|
def test_reply_audio(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
audio = kwargs['audio'] == 'test_audio'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and audio and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_audio', test)
|
|
|
|
assert message.reply_audio(audio='test_audio')
|
|
|
|
assert message.reply_audio(audio='test_audio', quote=True)
|
|
|
|
|
|
|
|
def test_reply_document(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
document = kwargs['document'] == 'test_document'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and document and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_document', test)
|
|
|
|
assert message.reply_document(document='test_document')
|
|
|
|
assert message.reply_document(document='test_document', quote=True)
|
|
|
|
|
Bot API 4.0 (#1168)
Telegram Passport (#1174):
- Add full support for telegram passport.
- New types: PassportData, PassportFile, EncryptedPassportElement, EncryptedCredentials, PassportElementError, PassportElementErrorDataField, PassportElementErrorFrontSide, PassportElementErrorReverseSide, PassportElementErrorSelfie, PassportElementErrorFile and PassportElementErrorFiles.
- New bot method: set_passport_data_errors
- New filter: Filters.passport_data
- Field passport_data field on Message
- PassportData is automagically decrypted when you specify your private key when creating Updater or Bot.
- PassportFiles is also automagically decrypted as you download/retrieve them.
- See new passportbot.py example for details on how to use, or go to our telegram passport wiki page for more info
- NOTE: Passport decryption requires new dependency `cryptography`.
Inputfile rework (#1184):
- Change how Inputfile is handled internally
- This allows support for specifying the thumbnails of photos and videos using the thumb= argument in the different send_ methods.
- Also allows Bot.send_media_group to actually finally send more than one media.
- Add thumb to Audio, Video and Videonote
- Add Bot.edit_message_media together with InputMediaAnimation, InputMediaAudio, and inputMediaDocument.
Other Bot API 4.0 changes:
- Add forusquare_type to Venue, InlineQueryResultVenue, InputVenueMessageContent, and Bot.send_venue. (#1170)
- Add vCard support by adding vcard field to Contact, InlineQueryResultContact, InputContactMessageContent, and Bot.send_contact. (#1166)
- Support new message entities: CASHTAG and PHONE_NUMBER. (#1179)
- Cashtag seems to be things like $USD and $GBP, but it seems telegram doesn't currently send them to bots.
- Phone number also seems to have limited support for now
- Add Bot.send_animation, add width, height, and duration to Animation, and add Filters.animation. (#1172)
Co-authored-by: Jasmin Bom <jsmnbom@gmail.com>
Co-authored-by: code1mountain <32801117+code1mountain@users.noreply.github.com>
Co-authored-by: Eldinnie <pieter.schutz+github@gmail.com>
Co-authored-by: mathefreak1 <mathefreak@hi2.in>
2018-08-29 14:18:58 +02:00
|
|
|
def test_reply_animation(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
animation = kwargs['animation'] == 'test_animation'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and animation and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_animation', test)
|
|
|
|
assert message.reply_animation(animation='test_animation')
|
|
|
|
assert message.reply_animation(animation='test_animation', quote=True)
|
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
def test_reply_sticker(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
sticker = kwargs['sticker'] == 'test_sticker'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and sticker and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_sticker', test)
|
|
|
|
assert message.reply_sticker(sticker='test_sticker')
|
|
|
|
assert message.reply_sticker(sticker='test_sticker', quote=True)
|
|
|
|
|
|
|
|
def test_reply_video(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
video = kwargs['video'] == 'test_video'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and video and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_video', test)
|
|
|
|
assert message.reply_video(video='test_video')
|
|
|
|
assert message.reply_video(video='test_video', quote=True)
|
|
|
|
|
|
|
|
def test_reply_video_note(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
video_note = kwargs['video_note'] == 'test_video_note'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and video_note and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_video_note', test)
|
|
|
|
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):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
voice = kwargs['voice'] == 'test_voice'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and voice and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_voice', test)
|
|
|
|
assert message.reply_voice(voice='test_voice')
|
|
|
|
assert message.reply_voice(voice='test_voice', quote=True)
|
|
|
|
|
|
|
|
def test_reply_location(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
location = kwargs['location'] == 'test_location'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and location and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_location', test)
|
|
|
|
assert message.reply_location(location='test_location')
|
|
|
|
assert message.reply_location(location='test_location', quote=True)
|
|
|
|
|
|
|
|
def test_reply_venue(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
venue = kwargs['venue'] == 'test_venue'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and venue and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_venue', test)
|
|
|
|
assert message.reply_venue(venue='test_venue')
|
|
|
|
assert message.reply_venue(venue='test_venue', quote=True)
|
|
|
|
|
|
|
|
def test_reply_contact(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
id = args[1] == message.chat_id
|
|
|
|
contact = kwargs['contact'] == 'test_contact'
|
|
|
|
if kwargs.get('reply_to_message_id'):
|
|
|
|
reply = kwargs['reply_to_message_id'] == message.message_id
|
|
|
|
else:
|
|
|
|
reply = True
|
|
|
|
return id and contact and reply
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.send_contact', test)
|
|
|
|
assert message.reply_contact(contact='test_contact')
|
|
|
|
assert message.reply_contact(contact='test_contact', quote=True)
|
|
|
|
|
|
|
|
def test_forward(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
chat_id = kwargs['chat_id'] == 123456
|
|
|
|
from_chat = kwargs['from_chat_id'] == message.chat_id
|
|
|
|
message_id = kwargs['message_id'] == message.message_id
|
|
|
|
if kwargs.get('disable_notification'):
|
|
|
|
notification = kwargs['disable_notification'] is True
|
|
|
|
else:
|
|
|
|
notification = True
|
|
|
|
return chat_id and from_chat and message_id and notification
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.forward_message', test)
|
|
|
|
assert message.forward(123456)
|
|
|
|
assert message.forward(123456, disable_notification=True)
|
|
|
|
assert not message.forward(635241)
|
|
|
|
|
|
|
|
def test_edit_text(self, monkeypatch, message):
|
|
|
|
def test(*args, **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
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.edit_message_text', test)
|
|
|
|
assert message.edit_text(text='test')
|
|
|
|
|
|
|
|
def test_edit_caption(self, monkeypatch, message):
|
|
|
|
def test(*args, **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
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.edit_message_caption', test)
|
|
|
|
assert message.edit_caption(caption='new caption')
|
|
|
|
|
Bot API 4.0 (#1168)
Telegram Passport (#1174):
- Add full support for telegram passport.
- New types: PassportData, PassportFile, EncryptedPassportElement, EncryptedCredentials, PassportElementError, PassportElementErrorDataField, PassportElementErrorFrontSide, PassportElementErrorReverseSide, PassportElementErrorSelfie, PassportElementErrorFile and PassportElementErrorFiles.
- New bot method: set_passport_data_errors
- New filter: Filters.passport_data
- Field passport_data field on Message
- PassportData is automagically decrypted when you specify your private key when creating Updater or Bot.
- PassportFiles is also automagically decrypted as you download/retrieve them.
- See new passportbot.py example for details on how to use, or go to our telegram passport wiki page for more info
- NOTE: Passport decryption requires new dependency `cryptography`.
Inputfile rework (#1184):
- Change how Inputfile is handled internally
- This allows support for specifying the thumbnails of photos and videos using the thumb= argument in the different send_ methods.
- Also allows Bot.send_media_group to actually finally send more than one media.
- Add thumb to Audio, Video and Videonote
- Add Bot.edit_message_media together with InputMediaAnimation, InputMediaAudio, and inputMediaDocument.
Other Bot API 4.0 changes:
- Add forusquare_type to Venue, InlineQueryResultVenue, InputVenueMessageContent, and Bot.send_venue. (#1170)
- Add vCard support by adding vcard field to Contact, InlineQueryResultContact, InputContactMessageContent, and Bot.send_contact. (#1166)
- Support new message entities: CASHTAG and PHONE_NUMBER. (#1179)
- Cashtag seems to be things like $USD and $GBP, but it seems telegram doesn't currently send them to bots.
- Phone number also seems to have limited support for now
- Add Bot.send_animation, add width, height, and duration to Animation, and add Filters.animation. (#1172)
Co-authored-by: Jasmin Bom <jsmnbom@gmail.com>
Co-authored-by: code1mountain <32801117+code1mountain@users.noreply.github.com>
Co-authored-by: Eldinnie <pieter.schutz+github@gmail.com>
Co-authored-by: mathefreak1 <mathefreak@hi2.in>
2018-08-29 14:18:58 +02:00
|
|
|
def test_edit_media(self, monkeypatch, message):
|
|
|
|
def test(*args, **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
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.edit_message_media', test)
|
|
|
|
assert message.edit_media('my_media')
|
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
def test_edit_reply_markup(self, monkeypatch, message):
|
|
|
|
def test(*args, **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
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.edit_message_reply_markup', test)
|
|
|
|
assert message.edit_reply_markup(reply_markup=[['1', '2']])
|
|
|
|
|
|
|
|
def test_delete(self, monkeypatch, message):
|
|
|
|
def test(*args, **kwargs):
|
|
|
|
chat_id = kwargs['chat_id'] == message.chat_id
|
|
|
|
message_id = kwargs['message_id'] == message.message_id
|
|
|
|
return chat_id and message_id
|
|
|
|
|
|
|
|
monkeypatch.setattr('telegram.Bot.delete_message', test)
|
|
|
|
assert message.delete()
|
|
|
|
|
|
|
|
def test_equality(self):
|
|
|
|
id = 1
|
|
|
|
a = Message(id, self.from_user, self.date, self.chat)
|
|
|
|
b = Message(id, self.from_user, self.date, self.chat)
|
2017-09-01 08:40:05 +02:00
|
|
|
c = Message(id, User(0, '', False), self.date, self.chat)
|
2017-08-11 23:58:41 +02:00
|
|
|
d = Message(0, self.from_user, self.date, self.chat)
|
|
|
|
e = Update(id)
|
|
|
|
|
|
|
|
assert a == b
|
|
|
|
assert hash(a) == hash(b)
|
|
|
|
assert a is not b
|
2017-08-07 23:25:19 +02:00
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
assert a == c
|
|
|
|
assert hash(a) == hash(c)
|
2017-08-07 23:25:19 +02:00
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
assert a != d
|
|
|
|
assert hash(a) != hash(d)
|
2016-09-07 08:49:09 +02:00
|
|
|
|
2017-08-11 23:58:41 +02:00
|
|
|
assert a != e
|
|
|
|
assert hash(a) != hash(e)
|