mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-07-09 22:43:44 +08:00
refine plugin agent tool responsibilities
This commit is contained in:
@@ -4,9 +4,13 @@ import unittest
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import AsyncMock, MagicMock, patch
|
||||
|
||||
from app.agent.tools.impl.install_plugin import InstallPluginTool
|
||||
from app.agent.tools.impl.query_installed_plugins import QueryInstalledPluginsTool
|
||||
from app.agent.tools.impl.query_market_plugins import QueryMarketPluginsTool
|
||||
from app.agent.tools.impl.query_plugin_config import QueryPluginConfigTool
|
||||
from app.agent.tools.impl.query_plugin_data import QueryPluginDataTool
|
||||
from app.agent.tools.impl.reload_plugin import ReloadPluginTool
|
||||
from app.agent.tools.impl.uninstall_plugin import UninstallPluginTool
|
||||
from app.agent.tools.impl.update_plugin_config import UpdatePluginConfigTool
|
||||
|
||||
|
||||
@@ -20,6 +24,57 @@ class TestAgentPluginTools(unittest.TestCase):
|
||||
"state": state,
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def _market_plugin(plugin_id: str, plugin_name: str, installed: bool = False):
|
||||
return SimpleNamespace(
|
||||
id=plugin_id,
|
||||
plugin_name=plugin_name,
|
||||
plugin_desc=f"{plugin_name} description",
|
||||
plugin_version="1.0.0",
|
||||
plugin_author="author",
|
||||
installed=installed,
|
||||
has_update=False,
|
||||
state=installed,
|
||||
repo_url="https://example.com/market",
|
||||
add_time=1,
|
||||
)
|
||||
|
||||
def test_query_market_plugins_filters_candidates(self):
|
||||
tool = QueryMarketPluginsTool(session_id="session-1", user_id="10001")
|
||||
plugins = [
|
||||
self._market_plugin("DemoPlugin", "Demo Plugin"),
|
||||
self._market_plugin("OtherPlugin", "Other Plugin"),
|
||||
]
|
||||
|
||||
with patch(
|
||||
"app.agent.tools.impl.query_market_plugins.load_market_plugins",
|
||||
new=AsyncMock(return_value=plugins),
|
||||
):
|
||||
result = asyncio.run(tool.run(query="demo"))
|
||||
|
||||
payload = json.loads(result)
|
||||
self.assertTrue(payload["success"])
|
||||
self.assertEqual(payload["match_count"], 1)
|
||||
self.assertEqual(payload["plugins"][0]["id"], "DemoPlugin")
|
||||
|
||||
def test_query_installed_plugins_filters_candidates(self):
|
||||
tool = QueryInstalledPluginsTool(session_id="session-1", user_id="10001")
|
||||
plugins = [
|
||||
self._market_plugin("DemoPlugin", "Demo Plugin", installed=True),
|
||||
self._market_plugin("OtherPlugin", "Other Plugin", installed=True),
|
||||
]
|
||||
|
||||
with patch(
|
||||
"app.agent.tools.impl.query_installed_plugins.list_installed_plugins",
|
||||
return_value=plugins,
|
||||
):
|
||||
result = asyncio.run(tool.run(query="demo"))
|
||||
|
||||
payload = json.loads(result)
|
||||
self.assertTrue(payload["success"])
|
||||
self.assertEqual(payload["match_count"], 1)
|
||||
self.assertEqual(payload["plugins"][0]["id"], "DemoPlugin")
|
||||
|
||||
def test_query_plugin_config_returns_saved_config_and_default_model(self):
|
||||
tool = QueryPluginConfigTool(session_id="session-1", user_id="10001")
|
||||
plugin_manager = MagicMock()
|
||||
@@ -92,6 +147,51 @@ class TestAgentPluginTools(unittest.TestCase):
|
||||
self.assertFalse(payload["state"])
|
||||
reload_plugin_runtime.assert_called_once_with("DemoPlugin")
|
||||
|
||||
def test_install_plugin_installs_market_candidate(self):
|
||||
tool = InstallPluginTool(session_id="session-1", user_id="10001")
|
||||
candidate = self._market_plugin("DemoPlugin", "Demo Plugin")
|
||||
|
||||
with patch(
|
||||
"app.agent.tools.impl.install_plugin.load_market_plugins",
|
||||
new=AsyncMock(return_value=[candidate]),
|
||||
), patch(
|
||||
"app.agent.tools.impl.install_plugin.install_plugin_runtime",
|
||||
new=AsyncMock(return_value=(True, "插件安装完成", False)),
|
||||
) as install_runtime, patch(
|
||||
"app.agent.tools.impl.install_plugin.get_plugin_snapshot",
|
||||
return_value=self._plugin_snapshot(),
|
||||
):
|
||||
result = asyncio.run(tool.run(plugin_id="DemoPlugin"))
|
||||
|
||||
payload = json.loads(result)
|
||||
self.assertTrue(payload["success"])
|
||||
self.assertEqual(payload["plugin"]["id"], "DemoPlugin")
|
||||
install_runtime.assert_awaited_once_with(
|
||||
"DemoPlugin", "https://example.com/market", force=False
|
||||
)
|
||||
|
||||
def test_uninstall_plugin_uninstalls_installed_candidate(self):
|
||||
tool = UninstallPluginTool(session_id="session-1", user_id="10001")
|
||||
installed_plugin = self._market_plugin(
|
||||
"DemoPlugin", "Demo Plugin", installed=True
|
||||
)
|
||||
|
||||
with patch(
|
||||
"app.agent.tools.impl.uninstall_plugin.list_installed_plugins",
|
||||
return_value=[installed_plugin],
|
||||
), patch(
|
||||
"app.agent.tools.impl.uninstall_plugin.uninstall_plugin_runtime",
|
||||
new=AsyncMock(
|
||||
return_value={"was_clone": False, "clone_files_removed": False}
|
||||
),
|
||||
) as uninstall_runtime:
|
||||
result = asyncio.run(tool.run(plugin_id="DemoPlugin"))
|
||||
|
||||
payload = json.loads(result)
|
||||
self.assertTrue(payload["success"])
|
||||
self.assertEqual(payload["plugin"]["id"], "DemoPlugin")
|
||||
uninstall_runtime.assert_awaited_once_with("DemoPlugin")
|
||||
|
||||
def test_query_plugin_data_truncates_large_payload(self):
|
||||
tool = QueryPluginDataTool(session_id="session-1", user_id="10001")
|
||||
plugin_data_oper = MagicMock()
|
||||
|
||||
Reference in New Issue
Block a user