Отправка без кнопок больше не падает на reply_markup
При пустом списке кнопок в Bot API уходило поле reply_markup: null, а Telegram ждёт объект или отсутствие поля. Теперь поле не передаётся, если кнопок нет — и для текста, и для фото.
This commit is contained in:
parent
5c6c49685a
commit
299a1e9893
|
|
@ -171,7 +171,7 @@ make backup E=test # на домашнем сервере: ./scripts/clickho
|
|||
|
||||
## Версионирование
|
||||
|
||||
- Единый источник версии — `common/version.py` (`__version__`), текущая — `0.6.2`.
|
||||
- Единый источник версии — `common/version.py` (`__version__`), текущая — `0.6.3`.
|
||||
- Схема — SemVer-подобная (`MAJOR.MINOR.PATCH`); git-тег = `v` + версия (`v0.1`).
|
||||
- Docker-образы тегируются версией (Блок 2), события ClickHouse получают `bot_version` (Блок 3).
|
||||
- Выпуск: изменить `common/version.py` → коммит → аннотированный тег `vX.Y` → `git push --tags`.
|
||||
|
|
|
|||
|
|
@ -123,16 +123,14 @@ async def send_to_chat(
|
|||
markup = {"inline_keyboard": rows} if rows else None
|
||||
|
||||
if photo is None:
|
||||
await _call(
|
||||
settings,
|
||||
"sendMessage",
|
||||
{
|
||||
payload = {
|
||||
"chat_id": settings.chat_id,
|
||||
"text": text,
|
||||
"parse_mode": "HTML",
|
||||
"reply_markup": markup,
|
||||
},
|
||||
)
|
||||
}
|
||||
if markup:
|
||||
payload["reply_markup"] = markup
|
||||
await _call(settings, "sendMessage", payload)
|
||||
return
|
||||
|
||||
data, mime, filename = photo
|
||||
|
|
@ -146,13 +144,11 @@ async def send_to_chat(
|
|||
await _call_multipart(settings, "sendPhoto", fields, {"photo": (filename, data, mime)})
|
||||
|
||||
if text and not caption:
|
||||
await _call(
|
||||
settings,
|
||||
"sendMessage",
|
||||
{
|
||||
payload = {
|
||||
"chat_id": settings.chat_id,
|
||||
"text": text,
|
||||
"parse_mode": "HTML",
|
||||
"reply_markup": markup,
|
||||
},
|
||||
)
|
||||
}
|
||||
if markup:
|
||||
payload["reply_markup"] = markup
|
||||
await _call(settings, "sendMessage", payload)
|
||||
|
|
|
|||
|
|
@ -7,4 +7,4 @@
|
|||
|
||||
from __future__ import annotations
|
||||
|
||||
__version__ = "0.6.2"
|
||||
__version__ = "0.6.3"
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import pytest
|
|||
from fastapi.testclient import TestClient
|
||||
|
||||
from admin import telegram
|
||||
from common.config import AdminSettings
|
||||
from common.repositories import admin_messages_repo
|
||||
|
||||
|
||||
|
|
@ -116,3 +117,50 @@ def test_send_telegram_error(
|
|||
assert "chat not found" in response.text
|
||||
assert fake_send["audit"]["success"] is False
|
||||
assert fake_send["audit"]["error"] == "chat not found"
|
||||
|
||||
|
||||
async def test_telegram_omits_reply_markup_without_buttons(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
calls: list[dict[str, Any]] = []
|
||||
|
||||
async def fake_call(settings: Any, method: str, payload: dict[str, Any]) -> None:
|
||||
calls.append(payload)
|
||||
|
||||
monkeypatch.setattr(telegram, "_call", fake_call)
|
||||
settings = AdminSettings(_env_file=None, bot_token="1:a", chat_id=-100)
|
||||
|
||||
await telegram.send_to_chat(settings, text="Привет", buttons=[], photo=None)
|
||||
|
||||
assert "reply_markup" not in calls[0]
|
||||
|
||||
|
||||
async def test_telegram_adds_reply_markup_with_buttons(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
calls: list[dict[str, Any]] = []
|
||||
|
||||
async def fake_call(settings: Any, method: str, payload: dict[str, Any]) -> None:
|
||||
calls.append(payload)
|
||||
|
||||
monkeypatch.setattr(telegram, "_call", fake_call)
|
||||
settings = AdminSettings(_env_file=None, bot_token="1:a", chat_id=-100)
|
||||
|
||||
await telegram.send_to_chat(settings, text="Привет", buttons=[("Канал", "https://t.me/x")], photo=None)
|
||||
|
||||
assert calls[0]["reply_markup"]["inline_keyboard"][0][0]["url"] == "https://t.me/x"
|
||||
|
||||
|
||||
async def test_telegram_photo_omits_reply_markup_without_buttons(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
fields: list[dict[str, str]] = []
|
||||
|
||||
async def fake_multipart(settings: Any, method: str, data: dict[str, str], files: dict[str, Any]) -> None:
|
||||
fields.append(data)
|
||||
|
||||
monkeypatch.setattr(telegram, "_call_multipart", fake_multipart)
|
||||
settings = AdminSettings(_env_file=None, bot_token="1:a", chat_id=-100)
|
||||
|
||||
await telegram.send_to_chat(
|
||||
settings,
|
||||
text="Подпись",
|
||||
buttons=[],
|
||||
photo=(b"data", "image/png", "pic.png"),
|
||||
)
|
||||
|
||||
assert "reply_markup" not in fields[0]
|
||||
|
|
|
|||
|
|
@ -7,4 +7,4 @@ from common import __version__
|
|||
|
||||
def test_version_is_set():
|
||||
assert __version__
|
||||
assert __version__ == "0.6.2"
|
||||
assert __version__ == "0.6.3"
|
||||
|
|
|
|||
Loading…
Reference in New Issue