refactor(workflow): enforce typed query boundary

This commit is contained in:
jxxghp
2026-08-28 01:16:08 +08:00
parent 2f41780893
commit b4f8736541
35 changed files with 733 additions and 223 deletions
+41 -31
View File
@@ -1,39 +1,49 @@
import asyncio
import json
import unittest
from types import SimpleNamespace
from unittest.mock import AsyncMock, MagicMock, patch
from unittest.mock import AsyncMock, MagicMock
from app.agent.tools.impl.query_workflows import QueryWorkflowsTool
from app.application.workflow import WorkflowSnapshot
class TestQueryWorkflowsTool(unittest.TestCase):
def test_query_workflows_omits_large_result_field(self):
tool = QueryWorkflowsTool(session_id="session-1", user_id="10001")
workflow = SimpleNamespace(
id=1,
name="demo",
description="demo workflow",
state="S",
trigger_type="manual",
run_count=1,
timer=None,
event_type=None,
add_time="2026-05-08 10:00:00",
last_time="2026-05-08 10:01:00",
current_action=None,
result="x" * 10000,
)
workflow_oper = MagicMock()
workflow_oper.async_list = AsyncMock(return_value=[workflow])
def _workflow() -> WorkflowSnapshot:
"""构造 Agent 查询使用的真实工作流快照。"""
return WorkflowSnapshot(
id=1,
name="demo",
description="demo workflow",
timer=None,
trigger_type="manual",
event_type=None,
event_conditions={},
state="S",
current_action=None,
result="x" * 10000,
run_count=1,
actions=(),
flows=(),
context={},
execution_config={},
execution_state={},
add_time="2026-05-08 10:00:00",
last_time="2026-05-08 10:01:00",
)
with patch(
"app.agent.tools.impl.query_workflows.get_agent_workflow_port",
return_value=workflow_oper,
):
result = asyncio.run(tool.run())
payload = json.loads(result)
self.assertEqual(len(payload), 1)
self.assertEqual(payload[0]["name"], "demo")
self.assertNotIn("result", payload[0])
def test_query_workflows_omits_large_result_field(monkeypatch) -> None:
"""Agent 列表查询使用统一快照服务且不返回大结果字段。"""
tool = QueryWorkflowsTool(session_id="session-1", user_id="10001")
query = MagicMock()
query.list = AsyncMock(return_value=[_workflow()])
monkeypatch.setattr(
"app.agent.tools.impl.query_workflows.get_configured_workflow_query",
lambda: query,
)
result = asyncio.run(tool.run())
payload = json.loads(result)
assert len(payload) == 1
assert payload[0]["name"] == "demo"
assert "result" not in payload[0]
query.list.assert_awaited_once_with()