journal-bot/tests/test_telegram_client.py

72 lines
2.4 KiB
Python

import respx
import httpx
import pytest
from journal_bot.telegram_client import TelegramClient, ParsedUpdate
@pytest.fixture
def client(tmp_path):
return TelegramClient(token="TKN", allowed_user_id=42, download_dir=tmp_path)
@respx.mock
async def test_get_updates_returns_parsed(client):
respx.get("https://api.telegram.org/botTKN/getUpdates").mock(
return_value=httpx.Response(200, json={"ok": True, "result": [
{"update_id": 100, "message": {
"message_id": 1,
"date": 1718374337,
"from": {"id": 42},
"chat": {"id": 42},
"text": "Hallo",
}},
]})
)
updates = await client.get_updates(offset=0)
assert len(updates) == 1
assert updates[0].update_id == 100
assert updates[0].text == "Hallo"
assert updates[0].kind == "text"
@respx.mock
async def test_get_updates_filters_by_allowlist(client):
respx.get("https://api.telegram.org/botTKN/getUpdates").mock(
return_value=httpx.Response(200, json={"ok": True, "result": [
{"update_id": 100, "message": {
"message_id": 1, "date": 1718374337,
"from": {"id": 999}, "chat": {"id": 999}, "text": "fremd"}},
{"update_id": 101, "message": {
"message_id": 2, "date": 1718374338,
"from": {"id": 42}, "chat": {"id": 42}, "text": "ok"}},
]})
)
updates = await client.get_updates(offset=0)
assert len(updates) == 1
assert updates[0].update_id == 101
@respx.mock
async def test_get_updates_parses_voice(client):
respx.get("https://api.telegram.org/botTKN/getUpdates").mock(
return_value=httpx.Response(200, json={"ok": True, "result": [
{"update_id": 200, "message": {
"message_id": 3, "date": 1718374400,
"from": {"id": 42}, "chat": {"id": 42},
"voice": {"file_id": "VOICE123", "duration": 5, "mime_type": "audio/ogg"},
}},
]})
)
updates = await client.get_updates(offset=0)
assert updates[0].kind == "voice"
assert updates[0].voice_file_id == "VOICE123"
@respx.mock
async def test_react_with_check(client):
route = respx.post("https://api.telegram.org/botTKN/setMessageReaction").mock(
return_value=httpx.Response(200, json={"ok": True, "result": True})
)
await client.react_ok(chat_id=42, message_id=1)
assert route.called