"""Unit tests for the LatencyObserver (TASK-02-06).""" from __future__ import annotations import pytest from server.latency import LatencyObserver, LatencyRecord def test_latency_record_e2e(): r = LatencyRecord(transcript_ready_ms=100.0, tts_first_audio_ms=650.0) assert r.e2e_asr_to_tts_ms == 550.0 def test_latency_record_missing_segments(): r = LatencyRecord(transcript_ready_ms=100.0) assert r.e2e_asr_to_tts_ms is None r2 = LatencyRecord(tts_first_audio_ms=650.0) assert r2.e2e_asr_to_tts_ms is None def test_latency_record_metric_dict(): r = LatencyRecord( transcript_ready_ms=100.0, llm_first_token_ms=300.0, tts_first_audio_ms=650.0 ) m = r.as_metric() assert m["e2e_latency_ms"] == 550.0 assert m["llm_first_token_ms"] == 300.0 def test_latency_observer_construction(): """The observer constructs cleanly and starts with an empty state.""" obs = LatencyObserver() assert obs.state.records == [] assert obs.state.current.transcript_ready_ms is None def test_latency_observer_state_reset_turn(): """reset_turn archives the current record and starts a fresh one.""" from server.latency import LatencyObserverState state = LatencyObserverState() state.current.transcript_ready_ms = 100.0 state.current.tts_first_audio_ms = 650.0 state.reset_turn() assert len(state.records) == 1 assert state.records[0].e2e_asr_to_tts_ms == 550.0 assert state.current.transcript_ready_ms is None