| from pathlib import Path | |
| def test_current_step_uses_stabilized_timeline_not_view_header(): | |
| js = Path("web/static/progress.js").read_text(encoding="utf-8") | |
| render = js.split("function renderRunViewModel", 1)[1].split("function renderProgress", 1)[0] | |
| assert "const stable=stabilizeProgressPayload(p,view)" in render | |
| assert "setText('currentStep',stable.currentStepLabel" in render | |
| assert "header.current_phase_label" not in render | |
| assert "animateProgressBar(progress,runStatus,stable.currentStep)" in render | |
| def test_events_and_last_event_use_same_stable_event_source(): | |
| js = Path("web/static/progress.js").read_text(encoding="utf-8") | |
| render = js.split("function renderRunViewModel", 1)[1].split("function renderProgress", 1)[0] | |
| assert "const stableEvents=mergeStableEvents" in render | |
| assert "const latestEvent=stableEvents[stableEvents.length-1]" in render | |
| assert "renderActivityFeed(stableEvents)" in render | |
| assert "view.activity||[]" not in render | |
| def test_stabilized_payload_returns_current_step_label(): | |
| js = Path("web/static/progress.js").read_text(encoding="utf-8") | |
| assert "function activeTimelineItem" in js | |
| assert "currentStepLabel:activeItem?.label" in js | |
| assert "progressStability.currentStep" in js | |
| def test_timeline_centering_css_escape_is_safe(): | |
| js = Path("web/static/progress.js").read_text(encoding="utf-8") | |
| assert "typeof CSS!=='undefined'" in js | |
| assert "const safeStep=" in js | |
| def test_app_version_v69(): | |
| assert '"version": "v70-progress-resume-events-latency"' in Path("app.py").read_text(encoding="utf-8") | |