| from pathlib import Path | |
| def test_activity_feed_merges_events_instead_of_replacing_with_short_poll(): | |
| js = Path("web/static/progress.js").read_text(encoding="utf-8") | |
| assert "function mergeStableEvents" in js | |
| assert "[...activityFeedState.lastItems,...incoming]" in js | |
| assert "activityFeedState.runId!==runId" in js | |
| assert "const list=mergeStableEvents" in js | |
| def test_activity_feed_resets_when_active_run_resets(): | |
| app = Path("web/static/app.js").read_text(encoding="utf-8") | |
| assert "activityFeedState.runId=null" in app | |
| assert "activityFeedState.lastItems=[]" in app | |
| def test_timeline_auto_centers_on_active_step(): | |
| js = Path("web/static/progress.js").read_text(encoding="utf-8") | |
| css = Path("web/static/app.css").read_text(encoding="utf-8") | |
| assert "function activeTimelineStepKey" in js | |
| assert "function ensureTimelineStepVisible" in js | |
| assert "root.dataset.visibleStep" in js | |
| assert "root.scrollTo" in js | |
| assert "scroll-behavior:smooth" in css | |
| def test_timeline_centers_even_when_signature_is_unchanged(): | |
| js = Path("web/static/progress.js").read_text(encoding="utf-8") | |
| assert "if(root.dataset.signature===signature){ensureTimelineStepVisible(currentKey);return;}" in js | |
| def test_app_version_v68(): | |
| assert '"version": "v70-progress-resume-events-latency"' in Path("app.py").read_text(encoding="utf-8") | |