Files
MoviePilot/tests/test_agent_telegram_rich_message.py
T

83 lines
3.0 KiB
Python

"""Agent Telegram Rich Message 契约测试。"""
import asyncio
from unittest.mock import AsyncMock, patch
from app.agent.orchestrator import MoviePilotAgent
from app.agent.prompt import prompt_manager
from app.agent.tools.impl.send_message import SendMessageInput, SendMessageTool
from app.chain.agent import AgentChain
from app.schemas.types import NotificationChannel
def test_send_message_input_accepts_rich_message_only() -> None:
"""Rich Message 本身应能构成完整的工具载荷。"""
payload = SendMessageInput(rich_message="# 结果\n\n- 成功")
assert payload.message is None
assert payload.rich_message == "# 结果\n\n- 成功"
def test_send_message_tool_keeps_plain_fallback_for_rich_message() -> None:
"""工具应同时保留跨渠道文本回退和 Telegram Rich Markdown。"""
async def _run():
tool = SendMessageTool(session_id="session-1", user_id="10001")
tool.set_message_attr(
channel=NotificationChannel.Telegram.value,
source="telegram-test",
username="tester",
)
tool.set_agent_context(agent_context={})
with patch(
"app.agent.tools.base.ToolChain.async_post_message",
new_callable=AsyncMock,
) as async_post_message:
result = await tool.run(rich_message="# 结果\n\n- **成功**")
return result, async_post_message
result, async_post_message = asyncio.run(_run())
message = async_post_message.await_args.args[0]
assert result == "消息已发送"
assert message.text == "# 结果\n\n- **成功**"
assert message.rich_message == "# 结果\n\n- **成功**"
assert message.save_history is False
def test_agent_prompt_prefers_rich_message_only_for_telegram() -> None:
"""仅 Telegram 会话应收到 Rich Message 优先提示。"""
telegram_prompt = prompt_manager.get_agent_prompt(
channel=NotificationChannel.Telegram.value
)
wechat_prompt = prompt_manager.get_agent_prompt(
channel=NotificationChannel.Wechat.value
)
assert "`rich_message` argument" in telegram_prompt
assert "GitHub-style Markdown" in telegram_prompt
assert "`rich_message` argument" not in wechat_prompt
def test_agent_direct_telegram_reply_uses_rich_message() -> None:
"""Agent 常规 Telegram 回复也应自动携带 Rich Markdown。"""
async def _run():
agent = MoviePilotAgent(session_id="telegram-session", user_id="10001")
agent.channel = NotificationChannel.Telegram.value
agent.source = "telegram-test"
agent.username = "tester"
with patch.object(
AgentChain,
"async_post_message",
new_callable=AsyncMock,
) as async_post_message:
await agent.send_agent_message("# 结果\n\n- **完成**")
return async_post_message
async_post_message = asyncio.run(_run())
message = async_post_message.await_args.args[0]
assert message.text == "# 结果\n\n- **完成**"
assert message.rich_message == "# 结果\n\n- **完成**"