import os, sys, tempfile from pathlib import Path sys.path.insert(0, r"D:\ad-hoc\kei\design_agent\scripts") import generate_frame_previews as m with tempfile.TemporaryDirectory() as td: bd = Path(td) / "blocks" fd = bd / "FRAME_X" fd.mkdir(parents=True) idx = fd / "index.html" png = fd / "preview.png" idx.write_text("
", encoding="utf-8") png.write_bytes(b"FAKEPNG") rows = m.discover(bd) assert len(rows) == 1 r = rows[0] assert r.has_index and r.has_preview assert m.is_unchanged(r, None) is False, "None last_entry must yield False" sha = m._sha256_file(idx) t = idx.stat().st_mtime + 1 os.utime(png, (t, t)) assert m.is_unchanged(r, {"index_sha256": sha}) is True, "matching sha+newer png must yield True" older = idx.stat().st_mtime - 10 os.utime(png, (older, older)) assert m.is_unchanged(r, {"index_sha256": sha}) is False, "stale png must yield False" os.utime(png, (t, t)) assert m.is_unchanged(r, {"index_sha256": "deadbeef"}) is False, "mismatched sha must yield False" assert m.is_unchanged(r, {}) is False, "missing recorded sha must yield False" idx.unlink() rows2 = m.discover(bd) r2 = rows2[0] assert not r2.has_index assert m.is_unchanged(r2, {"index_sha256": sha}) is False, "missing index must yield False" print("u4_predicate_ok")