Skip to content

Commit

Permalink
Fix Bugs in Bot.answer_web_app_query (#3364)
Browse files Browse the repository at this point in the history
  • Loading branch information
Bibo-Joshi committed Nov 18, 2022
1 parent b818dad commit 01167c8
Show file tree
Hide file tree
Showing 6 changed files with 142 additions and 36 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Expand Up @@ -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$
Expand Down
2 changes: 1 addition & 1 deletion requirements-dev.txt
Expand Up @@ -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

Expand Down
65 changes: 33 additions & 32 deletions telegram/bot.py
Expand Up @@ -2200,6 +2200,36 @@ def _effective_inline_results( # pylint: disable=R0201

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,
Expand Down Expand Up @@ -2274,43 +2304,13 @@ def answer_inline_query(
"""

@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]

Expand Down Expand Up @@ -3939,7 +3939,8 @@ def answer_web_app_query(
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',
Expand Down
8 changes: 8 additions & 0 deletions tests/conftest.py
Expand Up @@ -44,6 +44,8 @@
ChosenInlineResult,
File,
ChatPermissions,
InlineQueryResultArticle,
InputTextMessageContent,
)
from telegram.ext import (
Dispatcher,
Expand Down Expand Up @@ -547,6 +549,12 @@ def build_kwargs(signature: inspect.Signature, default_kwargs, dfv: Any = DEFAUL
# 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':
Expand Down
99 changes: 98 additions & 1 deletion tests/test_bot.py
Expand Up @@ -769,7 +769,14 @@ def make_assertion(url, data, *args, **kwargs):
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
Expand Down Expand Up @@ -825,6 +832,96 @@ def test(url, data, *args, **kwargs):
)
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 == {
Expand Down
2 changes: 1 addition & 1 deletion tests/test_constants.py
Expand Up @@ -44,6 +44,6 @@ def test_max_caption_length(self, bot, chat_id):
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)

0 comments on commit 01167c8

Please sign in to comment.