feat(platform): close AI expense value loop
Add tenant-safe value, telemetry, connector, commercial, and production-readiness foundations.
This commit is contained in:
@@ -275,6 +275,32 @@ def test_server_preview_decision_detects_field_added_after_issuance() -> None:
|
||||
assert {item["field_key"] for item in feedback.changed_fields_json} >= {"transport_mode"}
|
||||
|
||||
|
||||
def test_server_preview_decision_records_cleared_suggestion_as_rejected() -> None:
|
||||
client, session_factory = build_client()
|
||||
with session_factory() as db:
|
||||
seed_employee(db)
|
||||
|
||||
issued = issue_preview(client, request_id="issue-preview-rejected-field")
|
||||
payload = build_action_payload(issued)
|
||||
payload["message"] = payload["message"].replace("出行方式:飞机\n", "")
|
||||
payload["context_json"]["application_preview"]["fields"]["transportMode"] = ""
|
||||
response = client.post(
|
||||
"/api/v1/reimbursements/application-preview-action",
|
||||
headers=auth_headers(),
|
||||
json=payload,
|
||||
)
|
||||
|
||||
assert response.status_code == 200, response.text
|
||||
with session_factory() as db:
|
||||
feedback = db.scalar(select(AIDecisionFeedback))
|
||||
assert feedback is not None
|
||||
assert feedback.feedback_type == "rejected"
|
||||
assert feedback.verification_status == "server_verified"
|
||||
assert {item["field_key"] for item in feedback.changed_fields_json} == {
|
||||
"transport_mode"
|
||||
}
|
||||
|
||||
|
||||
def test_server_preview_decision_rejects_cross_session_replay_without_writes() -> None:
|
||||
client, session_factory = build_client()
|
||||
with session_factory() as db:
|
||||
|
||||
Reference in New Issue
Block a user