from pathlib import Path from app import _events_from_job_logs, _merge_events, _normalize_job_stage def test_progress_endpoint_polls_hf_job_logs_and_extracts_worker_events(): app_py = Path("app.py").read_text(encoding="utf-8") assert "inspect_job_safe(job_id" in app_py assert "fetch_recent_logs_safe(job_id" in app_py assert "_events_from_job_logs(job_logs)" in app_py assert "_merge_events(bundle.get" in app_py assert '"job_logs_polled": bool(include_job_logs)' in app_py assert '"job_log_events_count": len(job_log_events)' in app_py def test_job_log_event_parser_extracts_json_events_from_logs(): logs = """noise {"ts":"2026-06-02T10:00:00+00:00","step":"pi_run","status":"running","message":"Pi is still working"} prefix {"ts":"2026-06-02T10:00:01+00:00","step":"upload_files","status":"success","message":"Uploaded"} not json """ events = _events_from_job_logs(logs) assert [event["step"] for event in events] == ["pi_run", "upload_files"] def test_merge_events_deduplicates_bucket_and_job_log_events(): event = {"ts": "t", "step": "pi_run", "status": "running", "message": "same"} merged = _merge_events([event], [dict(event), {"ts": "t2", "step": "done", "status": "success"}]) assert len(merged) == 2 def test_job_stage_normalization(): assert _normalize_job_stage("JobStage.RUNNING") == "running" assert _normalize_job_stage("COMPLETED") == "success" assert _normalize_job_stage("CANCELLED") == "cancelled" def test_active_run_only_keeps_cancel_button(): html = Path("web/index.html").read_text(encoding="utf-8") active = html.split('id="activeRunPanel"', 1)[1].split('id="runsExplorerPanel"', 1)[0] assert 'id="cancelRun"' in active for removed in ['id="openArtifacts"', 'id="openRunState"', 'id="openRunReport"', 'id="openRunLogs"', 'id="openRunTraces"', 'id="openJob"', 'id="openSpace"', 'id="openSettings"']: assert removed not in active def test_progress_renderer_no_longer_sets_active_run_link_buttons(): js = Path("web/static/progress.js").read_text(encoding="utf-8") assert "renderActiveBucketLinks" not in js assert "openRunState" not in js assert "setLink('openJob'" not in js def test_app_version_v59(): assert '"version": "v70-progress-resume-events-latency"' in Path("app.py").read_text(encoding="utf-8")