from pathlib import Path def test_delete_selected_run_resets_active_run_every_time(): runs = Path("web/static/runs.js").read_text(encoding="utf-8") assert "async function deleteSelectedRun" in runs assert "resetRunDetails();" in runs assert "state.selectedRunDetail=null" in runs assert "state.activeLinks={}" in runs assert "document.querySelectorAll('.run-row')" in runs def test_reset_run_details_clears_active_run_panels(): app = Path("web/static/app.js").read_text(encoding="utf-8") reset = app.split("function resetRunDetails()", 1)[1].split("function prepareNewBuild()", 1)[0] for token in [ "progressTitle", "progressStatus", "currentStep", "lastEvent", "progressPercent", "activityFeed", "artifactList", "deleteSelectedRun", "renderTimeline(DEFAULT_TIMELINE,'idle')", ]: assert token in reset def test_events_are_compact_by_default_and_expand_in_same_list(): html = Path("web/index.html").read_text(encoding="utf-8") js = Path("web/static/progress.js").read_text(encoding="utf-8") css = Path("web/static/app.css").read_text(encoding="utf-8") assert "allEventsPanel" not in html assert "eventsPanel" not in html.split("latest-events-card", 1)[1].split("report-card", 1)[0] assert "activityFeedState={lastItems:[]" in js assert "const visible=[...list].reverse()" in js assert "toggleAllEvents" not in js assert "max-height:184px" in css def test_timeline_has_stopped_state_without_running_animation_confusion(): js = Path("web/static/progress.js").read_text(encoding="utf-8") css = Path("web/static/app.css").read_text(encoding="utf-8") assert "status-stopped" in js assert "status-muted" in js assert "PROGRESS_TERMINAL_STATUSES.has(overall)" in js assert ".step.status-stopped .step-dot" in css assert "animation:none!important" in css def test_app_version_v64(): assert '"version": "v70-progress-resume-events-latency"' in Path("app.py").read_text(encoding="utf-8")