Three content defects found by a live reviewer:
- Dashboard attention subtext was raw, untranslated evidence.summary text, and for
11 of 15 seeded issues that text was literally "Synthetic deterministic seed
issue". AttentionItem now exposes evidence_signals (stable code + params, same
shape as the issue detail page) instead of a detail string; the frontend renders
them through a shared describeEvidenceSignal() used by both the dashboard and the
issue detail page. Every previously-placeholder seed row now cites a real,
per-rule-type fact (a genuinely crossed service threshold, a genuinely blank
field, or a real pair of booking odometer readings) instead of invented prose.
- 5 of 7 blocked vehicles had no quality issue at all and one had only a resolved
one, so "needs attention" led nowhere. Each now has a real open
missing_required_field issue backed by a genuinely blank field (no schema change,
no migration -- reuses the existing data-quality pipeline).
- Booking odometer fields showing a bare "-" for 25 reserved + 1 active booking now
show a localized explanation ("trip hasn't started yet" / "not yet closed").
MO-024's rented-but-service-overdue contradiction was already caught by the
vehicle-status evaluator (DQ-SCAN, vehicle.manual_review_required) -- added a
regression test rather than new logic.
Also fixed a related bug the above exposed: the vehicle entity_snapshot omitted
registration_number entirely, so the "provide missing fields" form always showed
it blank regardless of the real value.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
47 lines
1.8 KiB
Python
47 lines
1.8 KiB
Python
def test_dashboard_metrics_are_persisted_counts(ops_client):
|
|
response = ops_client.get("/api/v1/dashboard")
|
|
assert response.status_code == 200
|
|
body = response.json()
|
|
metrics = body["metrics"]
|
|
total = (
|
|
metrics["available"]
|
|
+ metrics["rented"]
|
|
+ metrics["cleaning"]
|
|
+ metrics["maintenance"]
|
|
+ metrics["blocked"]
|
|
)
|
|
assert total == 50
|
|
assert metrics["open_quality_issues"] >= 1
|
|
assert metrics["pending_or_failed_workflows"] >= 1
|
|
|
|
|
|
def test_dashboard_attention_items_link_to_records(ops_client):
|
|
response = ops_client.get("/api/v1/dashboard")
|
|
body = response.json()
|
|
assert len(body["attention_items"]) > 0
|
|
for item in body["attention_items"]:
|
|
assert item["link_ref"]
|
|
assert item["severity"] in ("low", "medium", "high")
|
|
|
|
|
|
def test_dashboard_attention_items_expose_localizable_signals_not_raw_text(ops_client):
|
|
"""The dashboard subtext used to be raw, untranslated evidence text (and for most
|
|
seeded issues, the meaningless placeholder 'Synthetic deterministic seed issue').
|
|
The API must never emit prose here -- only stable signal codes + params, exactly
|
|
like the data-quality issue detail page, for the frontend to localize."""
|
|
response = ops_client.get("/api/v1/dashboard")
|
|
body = response.json()
|
|
assert len(body["attention_items"]) > 0
|
|
for item in body["attention_items"]:
|
|
assert "detail" not in item
|
|
assert len(item["evidence_signals"]) > 0
|
|
for signal in item["evidence_signals"]:
|
|
assert signal["code"]
|
|
assert signal["code"] != "Synthetic deterministic seed issue"
|
|
|
|
|
|
def test_dashboard_recent_automation_capped_at_five(ops_client):
|
|
response = ops_client.get("/api/v1/dashboard")
|
|
body = response.json()
|
|
assert len(body["recent_automation"]) == 5
|