import asyncio import unittest from unittest.mock import AsyncMock, patch from app.agent.tools.impl.add_subscribe import AddSubscribeTool from app.schemas.types import MessageChannel class TestAgentAddSubscribeTool(unittest.TestCase): def test_tool_message_displays_special_season_zero(self): """Agent 提示必须把显式季 0 显示为特别季,而不是默认第一季。""" tool = AddSubscribeTool(session_id="session-1", user_id="10001") message = tool.get_tool_message(title="测试剧", media_type="tv", season=0) self.assertIn("第0季", message) self.assertNotIn("第1季(默认)", message) def test_tv_subscription_without_season_reports_default_first_season(self): tool = AddSubscribeTool(session_id="session-1", user_id="10001") tool.set_message_attr( channel=MessageChannel.Telegram.value, source="telegram-main", username="tg_display_name", ) with patch( "app.agent.tools.impl.add_subscribe.SubscribeChain.async_add", new=AsyncMock(return_value=(1, "")), ) as async_add, patch( "app.agent.tools.impl.add_subscribe.UserOper.get_name", return_value="moviepilot-user", ): result = asyncio.run( tool.run( title="Breaking Bad", year="2008", media_type="tv", ) ) self.assertEqual(async_add.await_args.kwargs["username"], "moviepilot-user") self.assertIn("第1季", result) self.assertIn("默认按第一季订阅", result) def test_subscription_falls_back_to_channel_username_when_no_binding_exists(self): tool = AddSubscribeTool(session_id="session-1", user_id="10001") tool.set_message_attr( channel=MessageChannel.Telegram.value, source="telegram-main", username="tg_display_name", ) with patch( "app.agent.tools.impl.add_subscribe.SubscribeChain.async_add", new=AsyncMock(return_value=(1, "")), ) as async_add, patch( "app.agent.tools.impl.add_subscribe.UserOper.get_name", return_value=None, ): result = asyncio.run( tool.run( title="The Matrix", year="1999", media_type="movie", ) ) self.assertEqual(async_add.await_args.kwargs["username"], "tg_display_name") self.assertIn("成功添加订阅:The Matrix (1999)", result) def test_feishu_subscription_uses_pre_resolved_username_when_openid_lookup_misses(self): tool = AddSubscribeTool(session_id="session-1", user_id="ou_feishu_user") tool.set_message_attr( channel=MessageChannel.Feishu.value, source="feishu-main", username="moviepilot-user", ) with patch( "app.agent.tools.impl.add_subscribe.SubscribeChain.async_add", new=AsyncMock(return_value=(1, "")), ) as async_add, patch( "app.agent.tools.impl.add_subscribe.UserOper.get_name", return_value=None, ): result = asyncio.run( tool.run( title="The Matrix", year="1999", media_type="movie", ) ) self.assertEqual(async_add.await_args.kwargs["username"], "moviepilot-user") self.assertIn("成功添加订阅:The Matrix (1999)", result)