# tests/test_prevent_adapter.py
"""prevent.py — the git pre-commit adapter. Focus: load_confirmed's no-false-clean failure modes —
a corrupt ratchet must NEVER silently disable blocking (it warns loudly + fails open to []); a missing
ratchet is a genuinely clean unseeded state (silent [])."""
import importlib.util, json, os

ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

def _load(name, path):
    spec = importlib.util.spec_from_file_location(name, path)
    mod = importlib.util.module_from_spec(spec); spec.loader.exec_module(mod); return mod

prevent = _load("sg_prevent", os.path.join(ROOT, "prevent", "prevent.py"))

def test_load_confirmed_valid(tmp_path):
    p = tmp_path / "confirmed.json"
    p.write_text(json.dumps([{"class": "S9", "file": "a.ts", "symbol": "owner|referee"}]), encoding="utf-8")
    got = prevent.load_confirmed(str(p))
    assert got and got[0]["symbol"] == "owner|referee"

def test_load_confirmed_corrupt_warns_and_fails_open(tmp_path, capsys):
    p = tmp_path / "confirmed.json"
    p.write_text("{ not valid json", encoding="utf-8")
    got = prevent.load_confirmed(str(p))
    assert got == []                                   # fails open (don't wedge the commit)
    err = capsys.readouterr().err
    assert "confirmed.json unreadable" in err and "ratchet DISABLED" in err, f"must warn loudly; got {err!r}"

def test_load_confirmed_missing_is_silent(tmp_path, capsys):
    got = prevent.load_confirmed(str(tmp_path / "nope.json"))
    assert got == []
    assert capsys.readouterr().err == ""               # unseeded ratchet is genuinely clean — no noise
