diff --git a/mock_services/helpdesk/server.py b/mock_services/helpdesk/server.py index 2a19e97..48278a0 100644 --- a/mock_services/helpdesk/server.py +++ b/mock_services/helpdesk/server.py @@ -69,22 +69,41 @@ class CloseTicketRequest(BaseModel): resolution: str +def _ticket_summary(t: dict[str, Any]) -> dict[str, Any]: + customer_id = t.get("customer_id") or t.get("customer_name") or "" + department = ( + t.get("department") + or t.get("org") + or t.get("organization") + or (customer_id.split("/", 1)[1] if isinstance(customer_id, str) and "/" in customer_id else customer_id) + or "" + ) + summary = { + "ticket_id": t.get("ticket_id"), + "title": t.get("title"), + "reporter": t.get("reporter") or t.get("requester") or customer_id, + "department": department, + "priority": t.get("priority"), + "status": t.get("status"), + "created_at": t.get("created_at"), + } + if customer_id: + summary["customer_id"] = customer_id + if t.get("customer_phone"): + summary["customer_phone"] = t.get("customer_phone") + if t.get("category"): + summary["category"] = t.get("category") + return summary + + @app.post("/helpdesk/tickets") def list_tickets(req: ListTicketsRequest | None = None) -> dict[str, Any]: if req is None: req = ListTicketsRequest() results = [] for t in _tickets: - if req.status == "all" or t["status"] == req.status: - results.append({ - "ticket_id": t["ticket_id"], - "title": t["title"], - "reporter": t["reporter"], - "department": t["department"], - "priority": t["priority"], - "status": t["status"], - "created_at": t["created_at"], - }) + if req.status == "all" or t.get("status") == req.status: + results.append(_ticket_summary(t)) resp = {"tickets": results, "total": len(results)} _log_call("/helpdesk/tickets", req.model_dump(), resp) return resp diff --git a/tests/test_service_schema_drift.py b/tests/test_service_schema_drift.py index 0093767..8f0a5d3 100644 --- a/tests/test_service_schema_drift.py +++ b/tests/test_service_schema_drift.py @@ -90,6 +90,30 @@ def test_zotero_collections_synthesized_from_items(tmp_path): assert r["status"] == "added_to_collection" +# --- helpdesk: customer-shaped tickets still summarize for list -------------- + + +def test_helpdesk_ticket_list_accepts_customer_shaped_fixture(tmp_path): + f = _write(tmp_path, "tickets.json", [{ + "ticket_id": "TKT-8004", + "customer_id": "陈总/海星科技", + "customer_phone": "+86 18912345678", + "title": "系统响应缓慢投诉", + "status": "open", + "priority": "medium", + "category": "performance", + "created_at": "2026-04-25T15:30:00+08:00", + }]) + H = _reload("mock_services.helpdesk.server", {"HELPDESK_FIXTURES": f}) + c = TestClient(H.app) + r = c.post("/helpdesk/tickets", json={"status": "all"}) + assert r.status_code == 200 + ticket = r.json()["tickets"][0] + assert ticket["reporter"] == "陈总/海星科技" + assert ticket["department"] == "海星科技" + assert ticket["customer_phone"] == "+86 18912345678" + + # --- meeting: recordings date filter falls back across timestamp keys --------