|
|
@@ -6,7 +6,9 @@ from stt_daemon.tui.state import (
|
|
|
MAX_TRANSCRIPTS,
|
|
|
SPEAKER_NAMED_STYLE,
|
|
|
SPEAKER_UNKNOWN_STYLE,
|
|
|
+ TIME_STYLE,
|
|
|
ViewState,
|
|
|
+ _fmt_clock,
|
|
|
)
|
|
|
|
|
|
|
|
|
@@ -654,3 +656,90 @@ def test_cleared_event_after_lone_signals_leaves_state_usable():
|
|
|
state.ingest({"type": "triage", "stage": "cleared"})
|
|
|
assert state.triage is None
|
|
|
assert state.triage_lines() == ["triage: unavailable — no data"]
|
|
|
+
|
|
|
+
|
|
|
+def test_triage_event_with_ts_records_last_triage_time():
|
|
|
+ state = ViewState()
|
|
|
+ state.ingest(
|
|
|
+ {"type": "triage", "stage": "signals", "triage": _signals_triage(), "ts": 1759073916.19}
|
|
|
+ )
|
|
|
+ assert state.triage_ts == 1759073916.19
|
|
|
+
|
|
|
+
|
|
|
+def test_triage_event_without_ts_keeps_previous_time():
|
|
|
+ state = ViewState()
|
|
|
+ state.ingest(
|
|
|
+ {"type": "triage", "stage": "signals", "triage": _signals_triage(), "ts": 1759073916.19}
|
|
|
+ )
|
|
|
+ state.ingest(
|
|
|
+ {
|
|
|
+ "type": "triage",
|
|
|
+ "stage": "content",
|
|
|
+ "triage": {**_signals_triage(), "content": {"summary": "s"}},
|
|
|
+ }
|
|
|
+ )
|
|
|
+ assert state.triage_ts == 1759073916.19
|
|
|
+
|
|
|
+
|
|
|
+def test_triage_renderables_prepends_clock_in_transcript_time_style():
|
|
|
+ ts = 1759073916.19
|
|
|
+ state = ViewState()
|
|
|
+ state.ingest({"type": "triage", "stage": "signals", "triage": _signals_triage(), "ts": ts})
|
|
|
+
|
|
|
+ renderables = state.triage_renderables()
|
|
|
+
|
|
|
+ assert renderables[0].plain == _fmt_clock(ts)
|
|
|
+ assert str(renderables[0].spans[0].style) == TIME_STYLE
|
|
|
+ assert [item.plain for item in renderables[1:]] == state.triage_lines()
|
|
|
+
|
|
|
+
|
|
|
+def test_triage_cleared_event_and_clear_output_drop_the_clock():
|
|
|
+ ts = 1759073916.19
|
|
|
+ state = ViewState()
|
|
|
+ state.ingest({"type": "triage", "stage": "signals", "triage": _signals_triage(), "ts": ts})
|
|
|
+
|
|
|
+ state.ingest({"type": "triage", "stage": "cleared"})
|
|
|
+
|
|
|
+ assert state.triage_ts is None
|
|
|
+ assert all(item.plain != _fmt_clock(ts) for item in state.triage_renderables())
|
|
|
+
|
|
|
+ state.ingest({"type": "triage", "stage": "signals", "triage": _signals_triage(), "ts": ts})
|
|
|
+ state.clear_output()
|
|
|
+
|
|
|
+ assert state.triage_ts is None
|
|
|
+ assert all(item.plain != _fmt_clock(ts) for item in state.triage_renderables())
|
|
|
+
|
|
|
+
|
|
|
+def test_triage_renderables_clock_only_for_ok_dict_triage():
|
|
|
+ ts = 1759073916.19
|
|
|
+ clock = _fmt_clock(ts)
|
|
|
+ state = ViewState()
|
|
|
+ state.ingest({"type": "triage", "stage": "signals", "triage": _signals_triage(), "ts": ts})
|
|
|
+
|
|
|
+ state.triage_state = "loading"
|
|
|
+ state.triage_reason = "warming up"
|
|
|
+ assert state.triage_renderables()[0].plain == "triage: unavailable — warming up"
|
|
|
+ assert all(item.plain != clock for item in state.triage_renderables())
|
|
|
+
|
|
|
+ state.triage_state = "ok"
|
|
|
+ state.triage = None
|
|
|
+ assert state.triage_renderables()[0].plain == "triage: unavailable — no data"
|
|
|
+ assert all(item.plain != clock for item in state.triage_renderables())
|
|
|
+
|
|
|
+
|
|
|
+def test_status_adoption_preserves_last_triage_time():
|
|
|
+ ts = 1759073916.19
|
|
|
+ state = ViewState()
|
|
|
+ state.ingest({"type": "triage", "stage": "signals", "triage": _signals_triage(), "ts": ts})
|
|
|
+
|
|
|
+ state.ingest(
|
|
|
+ {
|
|
|
+ "type": "status",
|
|
|
+ "triage": _signals_triage(),
|
|
|
+ "triage_state": "ok",
|
|
|
+ "triage_reason": "",
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ assert state.triage_ts == ts
|
|
|
+ assert state.triage_renderables()[0].plain == _fmt_clock(ts)
|