from pathlib import Path def test_timeline_has_intermediate_groups_not_too_coarse(): js = Path("web/static/progress.js").read_text(encoding="utf-8") groups = js.split("const COMPACT_TIMELINE_GROUPS=[", 1)[1].split("];", 1)[0] for label in [ "Bootstrap", "Dependencies", "Auth + model", "Workspace/node", "Pi setup", "Pi run", "Pi verify", "Hardware", "Create Space", "Upload/runtime", "Validation", "Report", ]: assert label in groups assert groups.count("id:") == 12 def test_grouped_timeline_computes_substep_progress(): js = Path("web/static/progress.js").read_text(encoding="utf-8") assert "done_count:doneCount" in js assert "total_count:group.steps.length" in js assert "percent:" in js assert "active_substep:activeSubstep" in js assert "--step-progress:${percent}%" in js assert "x.done_count||0" in js def test_timeline_dots_use_conic_gradient_ring(): css = Path("web/static/app.css").read_text(encoding="utf-8") assert "v74: grouped timeline dots" in css assert "conic-gradient(var(--blue)" in css assert "var(--step-progress,0%)" in css assert "repeat(12,minmax(90px,1fr))" in css def test_app_version_v74(): assert '"version": "v81-robust-timeline-color-feedback"' in Path("app.py").read_text(encoding="utf-8")