mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-29 03:56:43 +08:00
83 lines
3.0 KiB
Python
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- **完成**"
|