"""runs 的快照收尾:`finish_snapshot` 只新建 finished.json,不改开跑时写的快照,也不收两次尾。""" import json from datetime import datetime from pathlib import Path import pytest from cadx.runs import GitState, finish_snapshot, write_snapshot _GIT = GitState(commit="a" * 40, short_commit="aaaaaaa", clean=True, diff_sha256="b" * 64) def _snapshot(tmp_path: Path) -> Path: lock = tmp_path / "uv.lock" lock.write_text("lock", encoding="utf-8") config = tmp_path / "x.yaml" config.write_text("a: 1\n", encoding="utf-8") snapshot_dir = tmp_path / "snapshot" started = datetime(2026, 10, 16, 9, 0, 0).astimezone() write_snapshot(snapshot_dir, "run-1", _GIT, started, lock, {"x.yaml": config}) return snapshot_dir def test_finish_writes_separate_file_and_keeps_snapshot(tmp_path: Path) -> None: snapshot_dir = _snapshot(tmp_path) before = (snapshot_dir / "snapshot.json").read_bytes() finished = datetime(2026, 10, 16, 10, 0, 0).astimezone() finish_snapshot(snapshot_dir, finished, {"segment_cache_hits": 3}) assert (snapshot_dir / "snapshot.json").read_bytes() == before record = json.loads((snapshot_dir / "finished.json").read_text(encoding="utf-8")) assert record == {"finished_at": finished.isoformat(), "segment_cache_hits": 3} def test_finish_twice_or_with_finished_at_in_record_raises(tmp_path: Path) -> None: snapshot_dir = _snapshot(tmp_path) now = datetime(2026, 10, 16, 10, 0, 0).astimezone() with pytest.raises(ValueError, match="finished_at"): finish_snapshot(snapshot_dir, now, {"finished_at": "x"}) assert not (snapshot_dir / "finished.json").exists() finish_snapshot(snapshot_dir, now, {}) first = (snapshot_dir / "finished.json").read_bytes() with pytest.raises(FileExistsError): finish_snapshot(snapshot_dir, now, {"segment_cache_hits": 1}) assert (snapshot_dir / "finished.json").read_bytes() == first