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