87 lines
3.7 KiB
Python
87 lines
3.7 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
import yuqei_sdk.scene_review_coverage as coverage_module
|
|
|
|
|
|
def test_real_catalog_has_bounded_batch_a_and_complete_batch_b_coverage():
|
|
catalog = json.loads((Path(coverage_module.__file__).with_name("scene_review_coverage.json")).read_text(encoding="utf-8"))
|
|
entries = list(catalog["entries"].values())
|
|
assert len(entries) == 30
|
|
assert sorted(len(entry["cases"]) for entry in entries).count(1) == 12
|
|
assert sorted(len(entry["cases"]) for entry in entries).count(3) == 18
|
|
for entry in entries:
|
|
assert len(entry["passed_variants"]) == len(entry["cases"])
|
|
assert entry["complete"] is (len(entry["cases"]) == 3)
|
|
|
|
|
|
def test_catalog_embeds_variant_and_hash_provenance_without_external_evidence():
|
|
catalog_path = Path(coverage_module.__file__).with_name("scene_review_coverage.json")
|
|
catalog = json.loads(catalog_path.read_text(encoding="utf-8"))
|
|
expected_variants = {"normal", "missing-key-fact", "opposite-adversarial"}
|
|
|
|
def is_sha256(value):
|
|
return (
|
|
isinstance(value, str)
|
|
and len(value) == 64
|
|
and set(value) <= set("0123456789abcdef")
|
|
)
|
|
|
|
assert catalog["schema_version"] == "scene-review-coverage-catalog.v1"
|
|
assert len(catalog["entries"]) == 30
|
|
for template_id, entry in catalog["entries"].items():
|
|
assert entry["template_id"] == template_id
|
|
assert set(entry["required_variants"]) == expected_variants
|
|
assert set(entry["passed_variants"]) | set(entry["missing_variants"]) == expected_variants
|
|
assert set(entry["passed_variants"]).isdisjoint(entry["missing_variants"])
|
|
assert entry["source_hashes"]
|
|
assert all(is_sha256(value) for value in entry["source_hashes"].values())
|
|
assert is_sha256(entry["template_content_sha256"])
|
|
for prompt_key in ("draft_prompt", "review_prompt"):
|
|
assert is_sha256(entry[prompt_key]["content_sha256"])
|
|
for case in entry["cases"]:
|
|
assert case["variant"] in entry["passed_variants"]
|
|
for hash_key in (
|
|
"request_sha256",
|
|
"artifact_raw_sha256",
|
|
"artifact_canonical_sha256",
|
|
"template_content_sha256",
|
|
):
|
|
assert is_sha256(case[hash_key])
|
|
for prompt_key in ("draft_prompt", "review_prompt"):
|
|
assert is_sha256(case[prompt_key]["content_sha256"])
|
|
|
|
|
|
def test_lookup_returns_defensive_copies():
|
|
first = coverage_module.scene_review_coverage("TPL-TRANSPORT-ORDINARY-001")
|
|
assert first is not None
|
|
first["cases"].clear()
|
|
second = coverage_module.scene_review_coverage("TPL-TRANSPORT-ORDINARY-001")
|
|
assert second is not None and second["cases"]
|
|
assert coverage_module.scene_review_coverage("unknown") is None
|
|
|
|
|
|
def test_catalog_rejects_tampering(monkeypatch):
|
|
class FakeResource:
|
|
def joinpath(self, _name): return self
|
|
def read_bytes(self): return b'{"entries":{}}\n'
|
|
|
|
monkeypatch.setattr(coverage_module, "_CATALOG", None)
|
|
monkeypatch.setattr(coverage_module, "files", lambda _package: FakeResource())
|
|
with pytest.raises(RuntimeError, match="integrity check failed"):
|
|
coverage_module.scene_review_coverage("anything")
|
|
|
|
|
|
def test_catalog_integrity_ignores_lf_vs_crlf(monkeypatch):
|
|
raw = Path(coverage_module.__file__).with_name("scene_review_coverage.json").read_bytes()
|
|
|
|
class FakeResource:
|
|
def joinpath(self, _name): return self
|
|
def read_bytes(self): return raw.replace(b"\n", b"\r\n")
|
|
|
|
monkeypatch.setattr(coverage_module, "_CATALOG", None)
|
|
monkeypatch.setattr(coverage_module, "files", lambda _package: FakeResource())
|
|
assert coverage_module.scene_review_coverage("TPL-TRANSPORT-ORDINARY-001") is not None
|