Add chart freshness diagnostics
This commit is contained in:
@@ -4,6 +4,7 @@ from fastapi.testclient import TestClient
|
||||
|
||||
from web.app import app
|
||||
from web.routers import sse_router
|
||||
from web.sse_manager import SseManager
|
||||
|
||||
|
||||
def _decode_sse_events(text: str):
|
||||
@@ -15,6 +16,25 @@ def _decode_sse_events(text: str):
|
||||
return events
|
||||
|
||||
|
||||
def test_sse_format_event_stamps_emit_time_for_latency_diagnostics(monkeypatch):
|
||||
monkeypatch.setattr("web.sse_manager.time.time", lambda: 1780750904.5)
|
||||
|
||||
frame = SseManager._format_event(
|
||||
{
|
||||
"type": "city_observation_patch.v1",
|
||||
"revision": 123,
|
||||
"city": "busan",
|
||||
"source": "amos",
|
||||
"ts": 1780750864062,
|
||||
"payload": {"temp": 23.0},
|
||||
}
|
||||
)
|
||||
|
||||
event = _decode_sse_events(frame)[0]
|
||||
assert event["sse_emitted_at_ms"] == 1780750904500
|
||||
assert event["payload"]["temp"] == 23.0
|
||||
|
||||
|
||||
def test_events_endpoint_replays_only_requested_cities(monkeypatch):
|
||||
captured = {}
|
||||
|
||||
|
||||
@@ -1012,6 +1012,13 @@ def test_city_detail_batch_returns_busy_when_global_builder_slot_is_full(monkeyp
|
||||
assert payload["busy"] is True
|
||||
assert payload["details"] == {}
|
||||
assert payload["missing"] == ["paris", "shanghai"]
|
||||
assert payload["diagnostics"]["partial_reason"] == "busy"
|
||||
assert payload["diagnostics"]["response_source"] == "busy"
|
||||
assert payload["diagnostics"]["requested_count"] == 2
|
||||
assert payload["diagnostics"]["completed_count"] == 0
|
||||
assert payload["diagnostics"]["missing_count"] == 2
|
||||
assert payload["diagnostics"]["city_status"]["paris"]["status"] == "busy"
|
||||
assert payload["diagnostics"]["city_status"]["shanghai"]["status"] == "busy"
|
||||
assert build_calls == 0
|
||||
|
||||
|
||||
@@ -1102,6 +1109,17 @@ def test_city_detail_batch_returns_completed_details_when_one_city_is_slow(monke
|
||||
assert payload["partial"] is True
|
||||
assert payload["missing"] == ["slow"]
|
||||
assert payload["errors"] == {}
|
||||
assert payload["diagnostics"]["partial_reason"] == "timeout"
|
||||
assert payload["diagnostics"]["requested_count"] == 3
|
||||
assert payload["diagnostics"]["completed_count"] == 2
|
||||
assert payload["diagnostics"]["missing_count"] == 1
|
||||
assert payload["diagnostics"]["error_count"] == 0
|
||||
assert payload["diagnostics"]["batch_concurrency"] == 2
|
||||
assert payload["diagnostics"]["partial_timeout_ms"] == 20
|
||||
assert payload["diagnostics"]["city_status"]["fast"]["status"] == "ok"
|
||||
assert payload["diagnostics"]["city_status"]["other"]["status"] == "ok"
|
||||
assert payload["diagnostics"]["city_status"]["slow"]["status"] == "timeout"
|
||||
assert isinstance(payload["diagnostics"]["city_status"]["fast"]["duration_ms"], (int, float))
|
||||
assert "slow" not in completed
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user