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