diff --git a/server/tests/test_orchestrator_service.py b/server/tests/test_orchestrator_service.py index 2109a39..7463075 100644 --- a/server/tests/test_orchestrator_service.py +++ b/server/tests/test_orchestrator_service.py @@ -382,7 +382,13 @@ def test_orchestrator_treats_expense_narrative_as_draft_instead_of_ar_query() -> assert payload["trace_summary"]["intent"] == "draft" assert payload["trace_summary"]["tool_count"] == 0 assert "应收场景数据" not in payload["result"]["message"] - assert "请补充" in payload["result"]["message"] + assert payload["result"]["message"] == "相关识别信息已在右侧展示,请核对。当前信息还未补齐,可点击“修改”继续补充,或先“保存草稿”。" + review_payload = payload["result"]["review_payload"] + assert review_payload["intent_summary"].startswith("系统识别出您想要报销业务招待费。") + assert review_payload["missing_slots"] == ["客户名称", "参与人员", "票据附件"] + slot_map = {item["key"]: item for item in review_payload["slot_cards"]} + assert slot_map["location"]["value"] == "客户现场" + assert slot_map["amount"]["value"] == "1000.00元" def test_orchestrator_can_restore_latest_user_conversation() -> None: diff --git a/server/tests/test_user_agent_service.py b/server/tests/test_user_agent_service.py index 706213e..fb5797d 100644 --- a/server/tests/test_user_agent_service.py +++ b/server/tests/test_user_agent_service.py @@ -1,5 +1,7 @@ from __future__ import annotations +from datetime import UTC, datetime, timedelta + from sqlalchemy import create_engine from sqlalchemy.orm import Session, sessionmaker from sqlalchemy.pool import StaticPool @@ -103,13 +105,27 @@ def test_user_agent_guides_generic_expense_request() -> None: ) ) - assert "补充费用类型" in response.answer - assert "上传票据" in response.answer + assert response.review_payload is not None + assert response.answer == response.review_payload.body_message + assert response.review_payload.can_proceed is False + assert response.review_payload.missing_slots == [ + "报销类型", + "发生时间", + "金额", + "事由说明", + "票据附件", + ] + assert [item.action_type for item in response.review_payload.confirmation_actions] == [ + "cancel_review", + "edit_review", + "save_draft", + ] def test_user_agent_guides_implicit_expense_draft_request() -> None: session_factory = build_session_factory() with session_factory() as db: + today = datetime.now(UTC).date().isoformat() ontology = SemanticOntologyService(db).parse( OntologyParseRequest( query="我今天去客户现场,招待了客户,花销了1000元", @@ -126,9 +142,21 @@ def test_user_agent_guides_implicit_expense_draft_request() -> None: ) ) - assert "1000元" in response.answer - assert "票据附件" in response.answer - assert "报销草稿" in response.answer + assert response.review_payload is not None + assert response.answer == response.review_payload.body_message + assert response.review_payload.intent_summary.startswith("系统识别出您想要报销业务招待费。") + assert response.review_payload.missing_slots == ["客户名称", "参与人员", "票据附件"] + assert [item.action_type for item in response.review_payload.confirmation_actions] == [ + "cancel_review", + "edit_review", + "save_draft", + ] + + slot_map = {item.key: item for item in response.review_payload.slot_cards} + assert slot_map["expense_type"].value == "业务招待费" + assert slot_map["time_range"].value == f"{today}(原文:今天)" + assert slot_map["location"].value == "客户现场" + assert slot_map["amount"].value == "1000.00元" def test_user_agent_risk_response_includes_rule_citations() -> None: @@ -176,12 +204,21 @@ def test_user_agent_draft_returns_structured_payload() -> None: assert response.draft_payload is not None assert response.draft_payload.confirmation_required is True - assert "待人工确认" in response.answer + assert response.review_payload is not None + assert response.review_payload.can_proceed is False + assert response.review_payload.missing_slots == ["金额", "事由说明", "票据附件"] + assert [item.action_type for item in response.review_payload.confirmation_actions] == [ + "cancel_review", + "edit_review", + "save_draft", + ] + assert response.answer == response.review_payload.body_message def test_user_agent_builds_review_payload_for_multi_document_expense_flow() -> None: session_factory = build_session_factory() with session_factory() as db: + yesterday = (datetime.now(UTC).date() - timedelta(days=1)).isoformat() ontology = SemanticOntologyService(db).parse( OntologyParseRequest( query="我昨天去上海出差,还请客户A吃饭,帮我生成报销草稿", @@ -242,7 +279,12 @@ def test_user_agent_builds_review_payload_for_multi_document_expense_flow() -> N assert response.review_payload is not None assert len(response.review_payload.document_cards) == 2 assert len(response.review_payload.claim_groups) == 2 - assert any( - item.action_type == "split_claims" - for item in response.review_payload.confirmation_actions - ) + assert response.review_payload.missing_slots == ["参与人员"] + assert [item.action_type for item in response.review_payload.confirmation_actions] == [ + "cancel_review", + "edit_review", + "save_draft", + ] + assert any(item.scene_label == "业务招待费" for item in response.review_payload.document_cards) + assert "建议拆分为 2 张报销单" in response.review_payload.intent_summary + assert f"{yesterday}(原文:昨天)" in response.review_payload.intent_summary