"""Unit tests for the new Schedule-tab UI handlers (start over, share trace, screenshot status). Run in stub mode; no network/model needed.""" import os os.environ.setdefault("USE_STUB_EXTRACTOR", "1") from ui import blocks # noqa: E402 def test_start_over_clears_everything(): out = blocks._on_start_over() # conversation, images_in, existing_cal, results(update), status, shot, trace assert len(out) == 7 assert out[0] == "" # conversation cleared assert out[1] is None # images cleared assert out[2] is None # ics cleared assert out[4] == "" # status cleared assert out[5] == "" and out[6] == "" # shot + trace cleared def test_screenshot_status_none_and_some(): assert blocks._screenshot_status(None) == "" assert blocks._screenshot_status([]) == "" one = blocks._screenshot_status(["/tmp/a.png"]) assert "1 screenshot" in one and "attached" in one two = blocks._screenshot_status(["/tmp/a.png", "/tmp/b.png"]) assert "2 screenshots" in two def test_share_trace_unchecked_is_noop(): assert blocks._on_share_trace(False, [["Picture Day", "2026-06-12T09:00", "", "", 30]]) == "" def test_share_trace_checked_records_and_reports(tmp_path, monkeypatch): monkeypatch.setenv("TRACE_PATH", str(tmp_path / "traces.jsonl")) rows = [["Picture Day", "2026-06-12T09:00", "", "Lincoln", 30]] msg = blocks._on_share_trace(True, rows) assert "Privacy-safe trace recorded" in msg # a redacted line was written (events only) written = (tmp_path / "traces.jsonl").read_text(encoding="utf-8") assert "Picture Day" in written and "n_events" in written