Update subentry description for Telegram bot (#164642)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
hanwg
2026-03-04 14:24:55 +00:00
committed by Franck Nijhof
co-authored by Copilot
parent 818d9f774e
commit 80412e4973
6 changed files with 42 additions and 67 deletions
@@ -62,8 +62,8 @@ _LOGGER = logging.getLogger(__name__)
DESCRIPTION_PLACEHOLDERS: dict[str, str] = {
"botfather_username": "@BotFather",
"botfather_url": "https://t.me/botfather",
"getidsbot_username": "@GetIDs Bot",
"getidsbot_url": "https://t.me/getidsbot",
"id_bot_username": "@id_bot",
"id_bot_url": "https://t.me/id_bot",
"socks_url": "socks5://username:password@proxy_ip:proxy_port",
# used in advanced settings section
"default_api_endpoint": DEFAULT_API_ENDPOINT,
@@ -611,10 +611,15 @@ class AllowedChatIdsSubEntryFlowHandler(ConfigSubentryFlow):
errors["base"] = "chat_not_found"
service: TelegramNotificationService = self._get_entry().runtime_data
description_placeholders = DESCRIPTION_PLACEHOLDERS.copy()
description_placeholders["bot_username"] = f"@{service.bot.username}"
description_placeholders["bot_url"] = f"https://t.me/{service.bot.username}"
return self.async_show_form(
step_id="user",
data_schema=vol.Schema({vol.Required(CONF_CHAT_ID): vol.Coerce(int)}),
description_placeholders=DESCRIPTION_PLACEHOLDERS,
description_placeholders=description_placeholders,
errors=errors,
)
@@ -105,7 +105,7 @@
"data_description": {
"chat_id": "ID representing the user or group chat to which messages can be sent."
},
"description": "To get your chat ID, follow these steps:\n\n1. Open Telegram and start a chat with [{getidsbot_username}]({getidsbot_url}).\n1. Send any message to the bot.\n1. Your chat ID is in the `id` field of the bot's response.",
"description": "Before you proceed, send any message to your bot: [{bot_username}]({bot_url}). This is required because Telegram prevents bots from initiating chats with users.\n\nThen follow these steps to get your chat ID:\n\n1. Open Telegram and start a chat with [{id_bot_username}]({id_bot_url}).\n1. Send any message to the bot.\n1. Your chat ID is in the `ID` field of the bot's response.",
"title": "Add chat"
}
}
+1 -1
View File
@@ -106,7 +106,7 @@ def mock_external_calls() -> Generator[None]:
accent_color_id=0,
accepted_gift_types=AcceptedGiftTypes(True, True, True, True),
)
test_user = User(123456, "Testbot", True, "mock last name", "mock username")
test_user = User(123456, "Testbot", True, "mock last name", "mock_bot")
message = Message(
message_id=12345,
date=datetime.now(),
@@ -5,7 +5,7 @@
'first_name': 'Testbot',
'id': 123456,
'last_name': 'mock last name',
'username': 'mock username',
'username': 'mock_bot',
}),
'chat_id': 123456,
'event_type': 'telegram_sent',
@@ -2,8 +2,7 @@
from unittest.mock import AsyncMock, patch
from telegram import AcceptedGiftTypes, ChatFullInfo, User
from telegram.constants import AccentColor
from telegram import User
from telegram.error import BadRequest, InvalidToken, NetworkError
from homeassistant.components.telegram_bot.config_flow import DESCRIPTION_PLACEHOLDERS
@@ -435,19 +434,15 @@ async def test_reauth_flow(
async def test_subentry_flow(
hass: HomeAssistant, mock_broadcast_config_entry: MockConfigEntry
hass: HomeAssistant,
mock_broadcast_config_entry: MockConfigEntry,
mock_external_calls: None,
) -> None:
"""Test subentry flow."""
mock_broadcast_config_entry.add_to_hass(hass)
with patch(
"homeassistant.components.telegram_bot.config_flow.Bot.get_me",
return_value=User(123456, "Testbot", True),
):
assert await hass.config_entries.async_setup(
mock_broadcast_config_entry.entry_id
)
await hass.async_block_till_done()
assert await hass.config_entries.async_setup(mock_broadcast_config_entry.entry_id)
await hass.async_block_till_done()
result = await hass.config_entries.subentries.async_init(
(mock_broadcast_config_entry.entry_id, SUBENTRY_TYPE_ALLOWED_CHAT_IDS),
@@ -455,24 +450,17 @@ async def test_subentry_flow(
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "user"
assert result["description_placeholders"] == {
**DESCRIPTION_PLACEHOLDERS,
"bot_username": "@mock_bot",
"bot_url": "https://t.me/mock_bot",
}
with patch(
"homeassistant.components.telegram_bot.config_flow.Bot.get_chat",
return_value=ChatFullInfo(
id=987654321,
title="mock title",
first_name="mock first_name",
type="PRIVATE",
max_reaction_count=100,
accent_color_id=AccentColor.COLOR_000,
accepted_gift_types=AcceptedGiftTypes(True, True, True, True),
),
):
result = await hass.config_entries.subentries.async_configure(
result["flow_id"],
user_input={CONF_CHAT_ID: 987654321},
)
await hass.async_block_till_done()
result = await hass.config_entries.subentries.async_configure(
result["flow_id"],
user_input={CONF_CHAT_ID: 987654321},
)
await hass.async_block_till_done()
subentry_id = list(mock_broadcast_config_entry.subentries)[-1]
subentry: ConfigSubentry = mock_broadcast_config_entry.subentries[subentry_id]
@@ -501,19 +489,15 @@ async def test_subentry_flow_config_not_ready(
async def test_subentry_flow_chat_error(
hass: HomeAssistant, mock_broadcast_config_entry: MockConfigEntry
hass: HomeAssistant,
mock_broadcast_config_entry: MockConfigEntry,
mock_external_calls: None,
) -> None:
"""Test subentry flow."""
mock_broadcast_config_entry.add_to_hass(hass)
with patch(
"homeassistant.components.telegram_bot.config_flow.Bot.get_me",
return_value=User(123456, "Testbot", True),
):
assert await hass.config_entries.async_setup(
mock_broadcast_config_entry.entry_id
)
await hass.async_block_till_done()
assert await hass.config_entries.async_setup(mock_broadcast_config_entry.entry_id)
await hass.async_block_till_done()
result = await hass.config_entries.subentries.async_init(
(mock_broadcast_config_entry.entry_id, SUBENTRY_TYPE_ALLOWED_CHAT_IDS),
@@ -524,9 +508,7 @@ async def test_subentry_flow_chat_error(
# test: chat not found
with patch(
"homeassistant.components.telegram_bot.config_flow.Bot.get_chat"
) as mock_bot:
with patch("homeassistant.components.telegram_bot.bot.Bot.get_chat") as mock_bot:
mock_bot.side_effect = BadRequest("mock chat not found")
result = await hass.config_entries.subentries.async_configure(
@@ -541,23 +523,11 @@ async def test_subentry_flow_chat_error(
# test: chat id already configured
with patch(
"homeassistant.components.telegram_bot.config_flow.Bot.get_chat",
return_value=ChatFullInfo(
id=123456,
title="mock title",
first_name="mock first_name",
type="PRIVATE",
max_reaction_count=100,
accent_color_id=AccentColor.COLOR_000,
accepted_gift_types=AcceptedGiftTypes(True, True, True, True),
),
):
result = await hass.config_entries.subentries.async_configure(
result["flow_id"],
user_input={CONF_CHAT_ID: 123456},
)
await hass.async_block_till_done()
result = await hass.config_entries.subentries.async_configure(
result["flow_id"],
user_input={CONF_CHAT_ID: 123456},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "already_configured"
@@ -203,7 +203,7 @@ async def test_send_message(
assert events[0].data["bot"]["id"] == 123456
assert events[0].data["bot"]["first_name"] == "Testbot"
assert events[0].data["bot"]["last_name"] == "mock last name"
assert events[0].data["bot"]["username"] == "mock username"
assert events[0].data["bot"]["username"] == "mock_bot"
assert response == {
"chats": [
@@ -811,7 +811,7 @@ async def test_polling_platform_message_text_update(
assert events[0].data["bot"]["id"] == 123456
assert events[0].data["bot"]["first_name"] == "Testbot"
assert events[0].data["bot"]["last_name"] == "mock last name"
assert events[0].data["bot"]["username"] == "mock username"
assert events[0].data["bot"]["username"] == "mock_bot"
assert isinstance(events[0].context, Context)
@@ -1495,7 +1495,7 @@ async def test_send_video(
{
ATTR_URL: "https://mock",
ATTR_AUTHENTICATION: HTTP_BASIC_AUTHENTICATION,
ATTR_USERNAME: "mock username",
ATTR_USERNAME: "mock_bot",
ATTR_PASSWORD: "mock password",
},
blocking=True,
@@ -1597,7 +1597,7 @@ async def test_send_video(
{
ATTR_URL: "https://mock",
ATTR_AUTHENTICATION: HTTP_DIGEST_AUTHENTICATION,
ATTR_USERNAME: "mock username",
ATTR_USERNAME: "mock_bot",
ATTR_PASSWORD: "mock password",
},
blocking=True,