"""Tests for the Variant contract (harness/genome.py) — LOCKED.""" import json from pathlib import Path import pytest from harness.genome import VariantManifest, VideoArtifact, MANIFEST_FILENAME, parse_artifacts REPO_ROOT = Path(__file__).resolve().parent.parent def _write_manifest(tmp_path: Path, data: dict) -> Path: (tmp_path / MANIFEST_FILENAME).write_text(json.dumps(data), encoding="utf-8") return tmp_path def test_manifest_load_roundtrip(tmp_path): d = _write_manifest(tmp_path, {"variant_id": "v9", "parent": "v1", "genome": {"a": 1}}) m = VariantManifest.load(d) assert m.variant_id == "v9" assert m.parent == "v1" assert m.genome == {"a": 1} def test_manifest_defaults_id_to_dirname(tmp_path): d = _write_manifest(tmp_path, {"genome": {}}) m = VariantManifest.load(d) assert m.variant_id == tmp_path.name assert m.parent == "seed" # default def test_genome_hash_is_stable_and_short(): a = VariantManifest(variant_id="x", genome={"b": 2, "a": 1}) b = VariantManifest(variant_id="y", genome={"a": 1, "b": 2}) # key order differs assert a.genome_hash == b.genome_hash # canonical (sorted) hashing assert len(a.genome_hash) == 12 assert int(a.genome_hash, 16) >= 0 # valid hex def test_genome_hash_changes_with_content(): a = VariantManifest(variant_id="x", genome={"a": 1}) b = VariantManifest(variant_id="x", genome={"a": 2}) assert a.genome_hash != b.genome_hash def test_manifest_rejects_non_object(tmp_path): (tmp_path / MANIFEST_FILENAME).write_text("[]", encoding="utf-8") with pytest.raises(ValueError): VariantManifest.load(tmp_path) def test_video_artifact_shape(): a = VideoArtifact(video_path="/tmp/x.mp4", title="t", description="d", music_name="m", music_attribution="attr") assert a.video_path == "/tmp/x.mp4" and a.extra == {} def test_parse_artifacts_resolves_and_drops_missing(tmp_path): real = tmp_path / "v1.mp4" real.write_bytes(b"\x00\x01") (tmp_path / "artifacts.json").write_text(json.dumps({ "videos": [ {"video_path": "v1.mp4", "title": "ok"}, # relative, exists → kept {"video_path": "missing.mp4", "title": "nope"}, # missing file → dropped {"title": "no path"}, # no path → dropped ], "errors": [], }), encoding="utf-8") arts = parse_artifacts(tmp_path) assert len(arts) == 1 assert arts[0].title == "ok" assert arts[0].video_path == str(real) def test_real_variant_1_manifest_loads(): m = VariantManifest.load(REPO_ROOT / "variants" / "variant_1") assert m.variant_id == "variant_1" assert "source_description" in m.genome