Fix Bugs in Bot.answer_web_app_query (#3364)

This commit is contained in:
Bibo-Joshi
2022-11-18 15:00:13 +01:00
committed by GitHub
parent b818dadbad
commit 01167c805b
6 changed files with 142 additions and 36 deletions
+1 -1
View File
@@ -56,7 +56,7 @@ repos:
- cachetools==4.2.2
- . # this basically does `pip install -e .`
- repo: https://github.com/asottile/pyupgrade
rev: v2.19.1
rev: v3.2.2
hooks:
- id: pyupgrade
files: ^(telegram|examples|tests)/.*\.py$
+1 -1
View File
@@ -7,7 +7,7 @@ black==22.3.0
flake8==3.9.2
pylint==2.8.3
mypy==0.812
pyupgrade==2.19.1
pyupgrade==3.2.2
pytest==6.2.4
+33 -32
View File
@@ -2200,6 +2200,36 @@ class Bot(TelegramObject):
return effective_results, next_offset
@no_type_check
def _set_ilq_result_defaults(self, res):
# pylint: disable=W0212
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 hasattr(res, 'input_message_content') and res.input_message_content:
if (
hasattr(res.input_message_content, 'parse_mode')
and res.input_message_content.parse_mode == DEFAULT_NONE
):
if self.defaults:
res.input_message_content.parse_mode = DefaultValue.get_value(
self.defaults.parse_mode
)
else:
res.input_message_content.parse_mode = None
if (
hasattr(res.input_message_content, 'disable_web_page_preview')
and res.input_message_content.disable_web_page_preview == DEFAULT_NONE
):
if self.defaults:
res.input_message_content.disable_web_page_preview = DefaultValue.get_value(
self.defaults.disable_web_page_preview
)
else:
res.input_message_content.disable_web_page_preview = None
@log
def answer_inline_query(
self,
@@ -2274,43 +2304,13 @@ class Bot(TelegramObject):
"""
@no_type_check
def _set_defaults(res):
# pylint: disable=W0212
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 hasattr(res, 'input_message_content') and res.input_message_content:
if (
hasattr(res.input_message_content, 'parse_mode')
and res.input_message_content.parse_mode == DEFAULT_NONE
):
if self.defaults:
res.input_message_content.parse_mode = DefaultValue.get_value(
self.defaults.parse_mode
)
else:
res.input_message_content.parse_mode = None
if (
hasattr(res.input_message_content, 'disable_web_page_preview')
and res.input_message_content.disable_web_page_preview == DEFAULT_NONE
):
if self.defaults:
res.input_message_content.disable_web_page_preview = (
DefaultValue.get_value(self.defaults.disable_web_page_preview)
)
else:
res.input_message_content.disable_web_page_preview = None
effective_results, next_offset = self._effective_inline_results(
results=results, next_offset=next_offset, current_offset=current_offset
)
# Apply defaults
for result in effective_results:
_set_defaults(result)
self._set_ilq_result_defaults(result)
results_dicts = [res.to_dict() for res in effective_results]
@@ -3939,7 +3939,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.error.TelegramError`
"""
data: JSONDict = {'web_app_query_id': web_app_query_id, 'result': result}
self._set_ilq_result_defaults(result)
data: JSONDict = {'web_app_query_id': web_app_query_id, 'result': result.to_dict()}
api_result = self._post(
'answerWebAppQuery',
+8
View File
@@ -44,6 +44,8 @@ from telegram import (
ChosenInlineResult,
File,
ChatPermissions,
InlineQueryResultArticle,
InputTextMessageContent,
)
from telegram.ext import (
Dispatcher,
@@ -547,6 +549,12 @@ def check_defaults_handling(
# Some special casing
if name == 'permissions':
kws[name] = ChatPermissions()
elif name == 'result':
kws[name] = InlineQueryResultArticle(
id='id',
title='title',
input_message_content=InputTextMessageContent('content'),
)
elif name in ['prices', 'media', 'results', 'commands', 'errors']:
kws[name] = []
elif name == 'ok':
+98 -1
View File
@@ -769,7 +769,14 @@ class TestBot:
nonlocal params
params = data == {
'web_app_query_id': '12345',
'result': result,
'result': {
"title": "title",
"input_message_content": {
"message_text": "text",
},
"type": "article",
"id": "1",
},
}
web_app_msg = SentWebAppMessage('321').to_dict()
return web_app_msg
@@ -825,6 +832,96 @@ class TestBot:
)
monkeypatch.delattr(bot.request, 'post')
@pytest.mark.parametrize(
"default_bot",
[{"parse_mode": "Markdown", "disable_web_page_preview": True}],
indirect=True,
)
@pytest.mark.parametrize(
"ilq_result,expected_params",
[
(
InlineQueryResultArticle("1", "title", InputTextMessageContent("text")),
{
"web_app_query_id": "12345",
"result": {
"title": "title",
"input_message_content": {
"message_text": "text",
"parse_mode": "Markdown",
"disable_web_page_preview": True,
},
"type": "article",
"id": "1",
},
},
),
(
InlineQueryResultArticle(
"1",
"title",
InputTextMessageContent(
"text", parse_mode="HTML", disable_web_page_preview=False
),
),
{
"web_app_query_id": "12345",
"result": {
"title": "title",
"input_message_content": {
"message_text": "text",
"parse_mode": "HTML",
"disable_web_page_preview": False,
},
"type": "article",
"id": "1",
},
},
),
(
InlineQueryResultArticle(
"1",
"title",
InputTextMessageContent(
"text", parse_mode=None, disable_web_page_preview="False"
),
),
{
"web_app_query_id": "12345",
"result": {
"title": "title",
"input_message_content": {
"message_text": "text",
"disable_web_page_preview": "False",
},
"type": "article",
"id": "1",
},
},
),
],
)
def test_answer_web_app_query_defaults(
self, default_bot, ilq_result, expected_params, monkeypatch
):
bot = default_bot
params = False
# For now just test that our internals pass the correct data
def make_assertion(url, data, *args, **kwargs):
nonlocal params
params = data == expected_params
web_app_msg = SentWebAppMessage("321").to_dict()
return web_app_msg
monkeypatch.setattr(bot.request, "post", make_assertion)
web_app_msg = bot.answer_web_app_query("12345", ilq_result)
assert params, "something went wrong with passing arguments to the request"
assert isinstance(web_app_msg, SentWebAppMessage)
assert web_app_msg.inline_message_id == "321"
def test_answer_inline_query_no_default_parse_mode(self, monkeypatch, bot):
def test(url, data, *args, **kwargs):
return data == {
+1 -1
View File
@@ -44,6 +44,6 @@ class TestConstants:
bad_caption = good_caption + 'Z'
with pytest.raises(
BadRequest,
match="Media_caption_too_long",
match="Message caption is too long",
), open('tests/data/telegram.png', 'rb') as f:
bot.send_photo(photo=f, caption=bad_caption, chat_id=chat_id)