"""Gate 8 AI review helper tests (no cursor-agent network).""" from __future__ import annotations import json from scripts.gate_ai_review import ( blockers, extract_json_blob, is_reviewable, normalize_finding, validate_review_doc, ) def test_is_reviewable_skips_docs_and_assets() -> None: assert is_reviewable("server/api/foo.py") assert not is_reviewable("docs/changelog/x.md") assert not is_reviewable("web/app/assets/index-abc.js") def test_blockers_p1_high_confidence() -> None: doc = { "schema_version": 1, "head_sha": "abc", "verdict": "Ready with fixes", "reviewed_at": "2026-06-14T00:00:00+00:00", "findings": [ {"severity": "P1", "file": "a.py", "line": 1, "title": "bug", "confidence": 75}, {"severity": "P2", "file": "b.py", "line": 2, "title": "nit", "confidence": 100}, ], } blocks = blockers(doc) assert len(blocks) == 1 assert blocks[0]["severity"] == "P1" def test_blockers_not_ready_verdict() -> None: doc = { "schema_version": 1, "head_sha": "abc", "verdict": "Not ready", "reviewed_at": "2026-06-14T00:00:00+00:00", "findings": [], } assert len(blockers(doc)) == 1 def test_extract_json_blob_nested_result() -> None: inner = {"verdict": "Ready to merge", "findings": []} outer = {"result": json.dumps(inner)} parsed = extract_json_blob(json.dumps(outer)) assert parsed["verdict"] == "Ready to merge" def test_validate_review_doc() -> None: doc = { "schema_version": 1, "head_sha": "deadbeef", "verdict": "Ready to merge", "reviewed_at": "2026-06-14T00:00:00+00:00", "findings": [normalize_finding({"severity": "p3", "file": "x", "line": "3", "title": "t", "confidence": "50"})], } validate_review_doc(doc) assert doc["findings"][0]["severity"] == "P3"