From c5fb2bd56633161031e5016b36ce670a22cb3def Mon Sep 17 00:00:00 2001 From: hanwg Date: Sun, 1 Feb 2026 15:37:23 +0800 Subject: [PATCH] Fix parse_mode for Telegram bot actions (#162006) --- .../components/telegram_bot/__init__.py | 15 ++++++- homeassistant/components/telegram_bot/bot.py | 2 + .../telegram_bot/test_telegram_bot.py | 44 ++++++++++++++++--- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/telegram_bot/__init__.py b/homeassistant/components/telegram_bot/__init__.py index 5e5cff05949..2f962bc0167 100644 --- a/homeassistant/components/telegram_bot/__init__.py +++ b/homeassistant/components/telegram_bot/__init__.py @@ -91,6 +91,10 @@ from .const import ( CONF_CONFIG_ENTRY_ID, DEFAULT_API_ENDPOINT, DOMAIN, + PARSER_HTML, + PARSER_MD, + PARSER_MD2, + PARSER_PLAIN_TEXT, PLATFORM_BROADCAST, PLATFORM_POLLING, PLATFORM_WEBHOOKS, @@ -119,11 +123,16 @@ _LOGGER = logging.getLogger(__name__) CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) +ATTR_PARSER_SCHEMA = vol.All( + cv.string, + vol.In([PARSER_HTML, PARSER_MD, PARSER_MD2, PARSER_PLAIN_TEXT]), +) + BASE_SERVICE_SCHEMA = vol.Schema( { vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(ATTR_PARSER): cv.string, + vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, vol.Optional(ATTR_DISABLE_NOTIF): cv.boolean, vol.Optional(ATTR_DISABLE_WEB_PREV): cv.boolean, vol.Optional(ATTR_RESIZE_KEYBOARD): cv.boolean, @@ -236,7 +245,7 @@ SERVICE_SCHEMA_EDIT_MESSAGE = vol.All( cv.positive_int, vol.All(cv.string, "last") ), vol.Required(ATTR_CHAT_ID): vol.Coerce(int), - vol.Optional(ATTR_PARSER): cv.string, + vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, vol.Optional(ATTR_DISABLE_WEB_PREV): cv.boolean, } @@ -253,6 +262,7 @@ SERVICE_SCHEMA_EDIT_MESSAGE_MEDIA = vol.All( ), vol.Required(ATTR_CHAT_ID): vol.Coerce(int), vol.Optional(ATTR_CAPTION): cv.string, + vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, vol.Required(ATTR_MEDIA_TYPE): vol.In( ( str(InputMediaType.ANIMATION), @@ -279,6 +289,7 @@ SERVICE_SCHEMA_EDIT_CAPTION = vol.Schema( vol.Required(ATTR_MESSAGEID): vol.Any( cv.positive_int, vol.All(cv.string, "last") ), + vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, vol.Required(ATTR_CHAT_ID): vol.Coerce(int), vol.Required(ATTR_CAPTION): cv.string, vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, diff --git a/homeassistant/components/telegram_bot/bot.py b/homeassistant/components/telegram_bot/bot.py index 84b59d261b7..6b016c5eeda 100644 --- a/homeassistant/components/telegram_bot/bot.py +++ b/homeassistant/components/telegram_bot/bot.py @@ -674,6 +674,8 @@ class TelegramNotificationService: "Error editing message media", params[ATTR_MESSAGE_TAG], media=media, + caption=kwargs.get(ATTR_CAPTION), + parse_mode=params[ATTR_PARSER], chat_id=chat_id, message_id=message_id, inline_message_id=inline_message_id, diff --git a/tests/components/telegram_bot/test_telegram_bot.py b/tests/components/telegram_bot/test_telegram_bot.py index 088856b3d09..c454f6da85c 100644 --- a/tests/components/telegram_bot/test_telegram_bot.py +++ b/tests/components/telegram_bot/test_telegram_bot.py @@ -18,7 +18,7 @@ from telegram import ( Message, Update, ) -from telegram.constants import ChatType, InputMediaType, ParseMode +from telegram.constants import ChatType, InputMediaType from telegram.error import ( InvalidToken, NetworkError, @@ -65,6 +65,9 @@ from homeassistant.components.telegram_bot.const import ( CHAT_ACTION_TYPING, CONF_CONFIG_ENTRY_ID, DOMAIN, + PARSER_HTML, + PARSER_MD, + PARSER_MD2, PARSER_PLAIN_TEXT, PLATFORM_BROADCAST, SECTION_ADVANCED_SETTINGS, @@ -139,7 +142,7 @@ async def test_polling_platform_init( { ATTR_KEYBOARD: ["/command1, /command2", "/command3"], ATTR_MESSAGE: "test_message", - ATTR_PARSER: ParseMode.HTML, + ATTR_PARSER: PARSER_HTML, ATTR_DISABLE_NOTIF: True, ATTR_DISABLE_WEB_PREV: True, ATTR_MESSAGE_TAG: "mock_tag", @@ -1151,6 +1154,7 @@ async def test_edit_message_media( ATTR_MESSAGEID: 12345, ATTR_CHAT_ID: 123456, ATTR_KEYBOARD_INLINE: "/mock", + ATTR_PARSER: PARSER_MD, }, blocking=True, ) @@ -1159,6 +1163,7 @@ async def test_edit_message_media( mock.assert_called_once() assert mock.call_args[1]["media"].__class__.__name__ == expected_media_class assert mock.call_args[1]["media"].caption == "mock caption" + assert mock.call_args[1]["parse_mode"] == PARSER_MD assert mock.call_args[1]["chat_id"] == 123456 assert mock.call_args[1]["message_id"] == 12345 assert mock.call_args[1]["reply_markup"] == InlineKeyboardMarkup( @@ -1183,12 +1188,26 @@ async def test_edit_message( await hass.services.async_call( DOMAIN, SERVICE_EDIT_MESSAGE, - {ATTR_MESSAGE: "mock message", ATTR_CHAT_ID: 123456, ATTR_MESSAGEID: 12345}, + { + ATTR_MESSAGE: "mock message", + ATTR_CHAT_ID: 123456, + ATTR_MESSAGEID: 12345, + ATTR_PARSER: PARSER_PLAIN_TEXT, + }, blocking=True, ) await hass.async_block_till_done() - mock.assert_called_once() + mock.assert_called_once_with( + "mock message", + chat_id=123456, + message_id=12345, + inline_message_id=None, + parse_mode=None, + disable_web_page_preview=None, + reply_markup=None, + read_timeout=None, + ) with patch( "homeassistant.components.telegram_bot.bot.Bot.edit_message_caption", @@ -1197,12 +1216,25 @@ async def test_edit_message( await hass.services.async_call( DOMAIN, SERVICE_EDIT_CAPTION, - {ATTR_CAPTION: "mock caption", ATTR_CHAT_ID: 123456, ATTR_MESSAGEID: 12345}, + { + ATTR_CAPTION: "mock caption", + ATTR_CHAT_ID: 123456, + ATTR_MESSAGEID: 12345, + ATTR_PARSER: PARSER_MD2, + }, blocking=True, ) await hass.async_block_till_done() - mock.assert_called_once() + mock.assert_called_once_with( + chat_id=123456, + message_id=12345, + inline_message_id=None, + caption="mock caption", + reply_markup=None, + read_timeout=None, + parse_mode=PARSER_MD2, + ) with patch( "homeassistant.components.telegram_bot.bot.Bot.edit_message_reply_markup",