108 lines
3.6 KiB
Python
108 lines
3.6 KiB
Python
from django.urls import reverse
|
||
|
||
from agent_core.results import AgentResult
|
||
from apps.audit.models import AgentAuditLog
|
||
from apps.documents.models import UploadedDocument
|
||
|
||
|
||
def test_chat_post_returns_agent_result_and_audit_log(client, db):
|
||
response = client.post(
|
||
reverse("chat:index", args=["knowledge_qa"]),
|
||
{"message": "如何处理异常?"},
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
content = response.content.decode("utf-8")
|
||
assert "mock-model" in content
|
||
assert "模拟回答" in content
|
||
assert AgentAuditLog.objects.count() == 1
|
||
|
||
|
||
def test_chat_rejects_empty_message(client, db):
|
||
response = client.post(reverse("chat:index", args=["knowledge_qa"]), {"message": ""})
|
||
|
||
assert response.status_code == 200
|
||
assert AgentAuditLog.objects.count() == 0
|
||
assert "请输入要咨询的问题" in response.content.decode("utf-8")
|
||
|
||
|
||
def test_chat_passes_selected_document_ids_to_agent_core(client, db, monkeypatch):
|
||
selected = UploadedDocument.objects.create(
|
||
scenario_id="knowledge_qa",
|
||
original_name="selected.md",
|
||
file_type="md",
|
||
size=1,
|
||
status=UploadedDocument.STATUS_INDEXED,
|
||
)
|
||
other = UploadedDocument.objects.create(
|
||
scenario_id="knowledge_qa",
|
||
original_name="other.md",
|
||
file_type="md",
|
||
size=1,
|
||
status=UploadedDocument.STATUS_INDEXED,
|
||
)
|
||
captured = {}
|
||
|
||
def fake_run_agent(scenario_config, user_input, options=None):
|
||
captured["options"] = options or {}
|
||
from agent_core.results import AgentResult
|
||
|
||
return AgentResult(answer="ok", status="success")
|
||
|
||
monkeypatch.setattr("apps.chat.views.run_agent", fake_run_agent)
|
||
|
||
response = client.post(
|
||
reverse("chat:index", args=["knowledge_qa"]),
|
||
{"message": "只查选中文档", "document_ids": [str(selected.id)]},
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
assert captured["options"]["document_ids"] == [selected.id]
|
||
assert other.id not in captured["options"]["document_ids"]
|
||
|
||
|
||
def test_chat_renders_structured_output_references_and_tool_calls(client, db, monkeypatch):
|
||
def fake_run_agent(scenario_config, user_input, options=None):
|
||
return AgentResult(
|
||
answer="建议先隔离现场。",
|
||
structured_output={
|
||
"output_type": "quality_report",
|
||
"summary": "发现异常批次需要立即处置。",
|
||
"risk_level": "high",
|
||
"suggested_actions": ["隔离现场", "通知负责人"],
|
||
},
|
||
references=[
|
||
{
|
||
"source": "sop.md",
|
||
"content": "异常处理 SOP:先隔离现场,再通知负责人。",
|
||
}
|
||
],
|
||
tool_calls=[
|
||
{
|
||
"tool_name": "query_demo_records",
|
||
"success": True,
|
||
"result": {"records": [{"title": "A线缺陷"}]},
|
||
"error": "",
|
||
}
|
||
],
|
||
model_name="mock-model",
|
||
status="success",
|
||
)
|
||
|
||
monkeypatch.setattr("apps.chat.views.run_agent", fake_run_agent)
|
||
|
||
response = client.post(
|
||
reverse("chat:index", args=["quality_analysis"]),
|
||
{"message": "分析 A 线异常"},
|
||
)
|
||
|
||
content = response.content.decode("utf-8")
|
||
assert response.status_code == 200
|
||
assert "结构化结果" in content
|
||
assert "发现异常批次需要立即处置" in content
|
||
assert "引用片段" in content
|
||
assert "sop.md" in content
|
||
assert "工具调用" in content
|
||
assert "query_demo_records" in content
|
||
assert "查看本次审计日志" in content
|