test(backend): update service tests
- test_ontology_service.py: update ontology service tests - test_orchestrator_service.py: update orchestrator service tests - test_user_agent_service.py: update user agent service tests
This commit is contained in:
@@ -295,6 +295,44 @@ def test_semantic_ontology_service_prefers_expense_for_customer_entertainment_na
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_semantic_ontology_service_uses_client_local_date_for_relative_time() -> None:
|
||||||
|
session_factory = build_session_factory()
|
||||||
|
with session_factory() as db:
|
||||||
|
result = SemanticOntologyService(db).parse(
|
||||||
|
OntologyParseRequest(
|
||||||
|
query="我昨天请客户吃饭花了200元",
|
||||||
|
user_id="pytest",
|
||||||
|
context_json={
|
||||||
|
"client_now_iso": "2026-05-12T16:30:00.000Z",
|
||||||
|
"client_timezone_offset_minutes": -480,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.time_range.raw == "昨天"
|
||||||
|
assert result.time_range.start_date == "2026-05-12"
|
||||||
|
assert result.time_range.end_date == "2026-05-12"
|
||||||
|
|
||||||
|
|
||||||
|
def test_semantic_ontology_service_extracts_day_before_yesterday_from_client_local_date() -> None:
|
||||||
|
session_factory = build_session_factory()
|
||||||
|
with session_factory() as db:
|
||||||
|
result = SemanticOntologyService(db).parse(
|
||||||
|
OntologyParseRequest(
|
||||||
|
query="我前天请客户吃饭花了200元",
|
||||||
|
user_id="pytest",
|
||||||
|
context_json={
|
||||||
|
"client_now_iso": "2026-05-12T16:30:00.000Z",
|
||||||
|
"client_timezone_offset_minutes": -480,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.time_range.raw == "前天"
|
||||||
|
assert result.time_range.start_date == "2026-05-11"
|
||||||
|
assert result.time_range.end_date == "2026-05-11"
|
||||||
|
|
||||||
|
|
||||||
def test_semantic_ontology_service_uses_model_parse_when_available(monkeypatch) -> None:
|
def test_semantic_ontology_service_uses_model_parse_when_available(monkeypatch) -> None:
|
||||||
session_factory = build_session_factory()
|
session_factory = build_session_factory()
|
||||||
with session_factory() as db:
|
with session_factory() as db:
|
||||||
|
|||||||
@@ -382,11 +382,12 @@ def test_orchestrator_treats_expense_narrative_as_draft_instead_of_ar_query() ->
|
|||||||
assert payload["trace_summary"]["intent"] == "draft"
|
assert payload["trace_summary"]["intent"] == "draft"
|
||||||
assert payload["trace_summary"]["tool_count"] == 0
|
assert payload["trace_summary"]["tool_count"] == 0
|
||||||
assert "应收场景数据" not in payload["result"]["message"]
|
assert "应收场景数据" not in payload["result"]["message"]
|
||||||
assert payload["result"]["message"] == "相关识别信息已在右侧展示,请核对。当前信息还未补齐,可点击“修改”继续补充,或先“保存草稿”。"
|
assert payload["result"]["message"].startswith("我先根据你当前提供的信息完成了初步识别")
|
||||||
review_payload = payload["result"]["review_payload"]
|
review_payload = payload["result"]["review_payload"]
|
||||||
assert review_payload["intent_summary"].startswith("系统识别出您想要报销业务招待费。")
|
assert review_payload["intent_summary"].startswith("我理解你这次想报销业务招待费。")
|
||||||
assert review_payload["missing_slots"] == ["客户名称", "参与人员", "票据附件"]
|
assert review_payload["missing_slots"] == ["客户名称", "参与人员", "票据附件"]
|
||||||
slot_map = {item["key"]: item for item in review_payload["slot_cards"]}
|
slot_map = {item["key"]: item for item in review_payload["slot_cards"]}
|
||||||
|
assert slot_map["time_range"]["raw_value"] == "今天"
|
||||||
assert slot_map["location"]["value"] == "客户现场"
|
assert slot_map["location"]["value"] == "客户现场"
|
||||||
assert slot_map["amount"]["value"] == "1000.00元"
|
assert slot_map["amount"]["value"] == "1000.00元"
|
||||||
|
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ def test_user_agent_guides_implicit_expense_draft_request() -> None:
|
|||||||
|
|
||||||
assert response.review_payload is not None
|
assert response.review_payload is not None
|
||||||
assert response.answer == response.review_payload.body_message
|
assert response.answer == response.review_payload.body_message
|
||||||
assert response.review_payload.intent_summary.startswith("系统识别出您想要报销业务招待费。")
|
assert response.review_payload.intent_summary.startswith("我理解你这次想报销业务招待费。")
|
||||||
assert response.review_payload.missing_slots == ["客户名称", "参与人员", "票据附件"]
|
assert response.review_payload.missing_slots == ["客户名称", "参与人员", "票据附件"]
|
||||||
assert [item.action_type for item in response.review_payload.confirmation_actions] == [
|
assert [item.action_type for item in response.review_payload.confirmation_actions] == [
|
||||||
"cancel_review",
|
"cancel_review",
|
||||||
@@ -154,11 +154,42 @@ def test_user_agent_guides_implicit_expense_draft_request() -> None:
|
|||||||
|
|
||||||
slot_map = {item.key: item for item in response.review_payload.slot_cards}
|
slot_map = {item.key: item for item in response.review_payload.slot_cards}
|
||||||
assert slot_map["expense_type"].value == "业务招待费"
|
assert slot_map["expense_type"].value == "业务招待费"
|
||||||
assert slot_map["time_range"].value == f"{today}(原文:今天)"
|
assert slot_map["time_range"].value == today
|
||||||
|
assert slot_map["time_range"].raw_value == "今天"
|
||||||
assert slot_map["location"].value == "客户现场"
|
assert slot_map["location"].value == "客户现场"
|
||||||
assert slot_map["amount"].value == "1000.00元"
|
assert slot_map["amount"].value == "1000.00元"
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_agent_guides_narrative_with_day_before_yesterday() -> None:
|
||||||
|
session_factory = build_session_factory()
|
||||||
|
with session_factory() as db:
|
||||||
|
ontology = SemanticOntologyService(db).parse(
|
||||||
|
OntologyParseRequest(
|
||||||
|
query="我前天请客户吃饭花了200元",
|
||||||
|
user_id="pytest",
|
||||||
|
context_json={
|
||||||
|
"client_now_iso": "2026-05-12T16:30:00.000Z",
|
||||||
|
"client_timezone_offset_minutes": -480,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
response = UserAgentService(db).respond(
|
||||||
|
UserAgentRequest(
|
||||||
|
run_id=ontology.run_id,
|
||||||
|
user_id="pytest",
|
||||||
|
message="我前天请客户吃饭花了200元",
|
||||||
|
ontology=ontology,
|
||||||
|
tool_payload={"draft_only": True},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
assert response.review_payload is not None
|
||||||
|
slot_map = {item.key: item for item in response.review_payload.slot_cards}
|
||||||
|
assert slot_map["time_range"].raw_value == "前天"
|
||||||
|
assert slot_map["time_range"].value == "2026-05-11"
|
||||||
|
assert "时间:2026-05-11" in response.review_payload.intent_summary
|
||||||
|
|
||||||
|
|
||||||
def test_user_agent_risk_response_includes_rule_citations() -> None:
|
def test_user_agent_risk_response_includes_rule_citations() -> None:
|
||||||
session_factory = build_session_factory()
|
session_factory = build_session_factory()
|
||||||
with session_factory() as db:
|
with session_factory() as db:
|
||||||
@@ -286,5 +317,7 @@ def test_user_agent_builds_review_payload_for_multi_document_expense_flow() -> N
|
|||||||
"save_draft",
|
"save_draft",
|
||||||
]
|
]
|
||||||
assert any(item.scene_label == "业务招待费" for item in response.review_payload.document_cards)
|
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
|
||||||
assert f"{yesterday}(原文:昨天)" in response.review_payload.intent_summary
|
slot_map = {item.key: item for item in response.review_payload.slot_cards}
|
||||||
|
assert slot_map["time_range"].value == yesterday
|
||||||
|
assert slot_map["time_range"].raw_value == "昨天"
|
||||||
|
|||||||
Reference in New Issue
Block a user