feat: add generic send_message method to TelegramClient (issue #59)
Some checks failed
CI / test (pull_request) Has been cancelled

Add send_message(text, parse_mode) method that can be used for both
notifications and command responses. Refactor _send_notification to
use the new method.

Changes:
- Add send_message() method with return value for success/failure
- Refactor _send_notification() to call send_message()
- Add comprehensive tests for send_message()
- Coverage: 93% for telegram_client.py

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
agentson
2026-02-05 13:39:09 +09:00
parent 0057de4d12
commit 259f9d2e24
2 changed files with 99 additions and 13 deletions

View File

@@ -39,6 +39,76 @@ class TestTelegramClientInit:
class TestNotificationSending:
"""Test notification sending behavior."""
@pytest.mark.asyncio
async def test_send_message_success(self) -> None:
"""send_message returns True on successful send."""
client = TelegramClient(
bot_token="123:abc", chat_id="456", enabled=True
)
mock_resp = AsyncMock()
mock_resp.status = 200
mock_resp.__aenter__ = AsyncMock(return_value=mock_resp)
mock_resp.__aexit__ = AsyncMock(return_value=False)
with patch("aiohttp.ClientSession.post", return_value=mock_resp) as mock_post:
result = await client.send_message("Test message")
assert result is True
assert mock_post.call_count == 1
payload = mock_post.call_args.kwargs["json"]
assert payload["chat_id"] == "456"
assert payload["text"] == "Test message"
assert payload["parse_mode"] == "HTML"
@pytest.mark.asyncio
async def test_send_message_disabled_client(self) -> None:
"""send_message returns False when client disabled."""
client = TelegramClient(enabled=False)
with patch("aiohttp.ClientSession.post") as mock_post:
result = await client.send_message("Test message")
assert result is False
mock_post.assert_not_called()
@pytest.mark.asyncio
async def test_send_message_api_error(self) -> None:
"""send_message returns False on API error."""
client = TelegramClient(
bot_token="123:abc", chat_id="456", enabled=True
)
mock_resp = AsyncMock()
mock_resp.status = 400
mock_resp.text = AsyncMock(return_value="Bad Request")
mock_resp.__aenter__ = AsyncMock(return_value=mock_resp)
mock_resp.__aexit__ = AsyncMock(return_value=False)
with patch("aiohttp.ClientSession.post", return_value=mock_resp):
result = await client.send_message("Test message")
assert result is False
@pytest.mark.asyncio
async def test_send_message_with_markdown(self) -> None:
"""send_message supports different parse modes."""
client = TelegramClient(
bot_token="123:abc", chat_id="456", enabled=True
)
mock_resp = AsyncMock()
mock_resp.status = 200
mock_resp.__aenter__ = AsyncMock(return_value=mock_resp)
mock_resp.__aexit__ = AsyncMock(return_value=False)
with patch("aiohttp.ClientSession.post", return_value=mock_resp) as mock_post:
result = await client.send_message("*bold*", parse_mode="Markdown")
assert result is True
payload = mock_post.call_args.kwargs["json"]
assert payload["parse_mode"] == "Markdown"
@pytest.mark.asyncio
async def test_no_send_when_disabled(self) -> None:
"""Notifications not sent when client disabled."""