Add assess_validation_cwd_proof_report so reviewer final reports must prove pwd, git rev-parse HEAD, git status, and expected PR head SHA before claiming validation ran in a branches/ worktree. Wire the verifier into final_report_validator and gitea_validate_review_final_report. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
135 lines
4.9 KiB
Python
135 lines
4.9 KiB
Python
"""Tests for validation cwd/HEAD proof verifier (#398)."""
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
|
|
from final_report_validator import assess_final_report_validator # noqa: E402
|
|
from reviewer_validation_cwd_proof import assess_validation_cwd_proof_report # noqa: E402
|
|
|
|
ROOT = "/Users/jasonwalker/Development/Gitea-Tools"
|
|
WORKTREE = f"{ROOT}/branches/review-feat-issue-398"
|
|
HEAD = "f5953549aad5e822f14f52d3ea3c6d7990109384"
|
|
|
|
|
|
def _proof_backed_report() -> str:
|
|
return "\n".join([
|
|
f"Candidate head SHA: {HEAD}",
|
|
f"pwd: {WORKTREE}",
|
|
f"git rev-parse HEAD: {HEAD}",
|
|
"git status --short --branch: ## feat/issue-398...prgs/master",
|
|
f"Validation command: cd {WORKTREE} && venv/bin/python -m pytest tests/ -q",
|
|
"Result: 1497 passed, 6 skipped",
|
|
])
|
|
|
|
|
|
class TestValidationCwdProof(unittest.TestCase):
|
|
def test_no_validation_claim_passes(self):
|
|
result = assess_validation_cwd_proof_report("Review decision: approve")
|
|
self.assertTrue(result["proven"])
|
|
|
|
def test_missing_cwd_proof_fails(self):
|
|
result = assess_validation_cwd_proof_report(
|
|
f"Validation command: pytest tests/\nCandidate head SHA: {HEAD}",
|
|
validation_session={"validation_ran": True, "expected_head_sha": HEAD},
|
|
)
|
|
self.assertFalse(result["proven"])
|
|
self.assertTrue(result["block"])
|
|
|
|
def test_main_checkout_cwd_blocks(self):
|
|
result = assess_validation_cwd_proof_report(
|
|
"\n".join([
|
|
f"Candidate head SHA: {HEAD}",
|
|
f"pwd: {ROOT}",
|
|
f"git rev-parse HEAD: {HEAD}",
|
|
"git status --short --branch: ## master",
|
|
"Validation command: pytest tests/ -q",
|
|
]),
|
|
validation_session={"validation_ran": True, "expected_head_sha": HEAD},
|
|
project_root=ROOT,
|
|
)
|
|
self.assertFalse(result["proven"])
|
|
self.assertTrue(result["violations"])
|
|
|
|
def test_wrong_head_blocks(self):
|
|
wrong = "a" * 40
|
|
result = assess_validation_cwd_proof_report(
|
|
"\n".join([
|
|
f"Candidate head SHA: {HEAD}",
|
|
f"pwd: {WORKTREE}",
|
|
f"git rev-parse HEAD: {wrong}",
|
|
"git status --short --branch: clean",
|
|
f"Validation command: cd {WORKTREE} && pytest -q",
|
|
]),
|
|
validation_session={"validation_ran": True, "expected_head_sha": HEAD},
|
|
project_root=ROOT,
|
|
)
|
|
self.assertFalse(result["proven"])
|
|
self.assertTrue(result["violations"])
|
|
|
|
def test_fully_proof_backed_passes(self):
|
|
result = assess_validation_cwd_proof_report(
|
|
_proof_backed_report(),
|
|
validation_session={"validation_ran": True, "expected_head_sha": HEAD},
|
|
project_root=ROOT,
|
|
)
|
|
self.assertTrue(result["proven"], result["reasons"])
|
|
|
|
def test_baseline_without_cwd_fails(self):
|
|
result = assess_validation_cwd_proof_report(
|
|
"\n".join([
|
|
_proof_backed_report(),
|
|
"Baseline validation command: pytest tests/ -q",
|
|
]),
|
|
validation_session={
|
|
"validation_ran": True,
|
|
"expected_head_sha": HEAD,
|
|
"baseline_validation_ran": True,
|
|
},
|
|
project_root=ROOT,
|
|
)
|
|
self.assertFalse(result["proven"])
|
|
self.assertTrue(
|
|
any("baseline" in r.lower() for r in result["reasons"])
|
|
)
|
|
|
|
def test_baseline_with_full_proof_passes(self):
|
|
result = assess_validation_cwd_proof_report(
|
|
"\n".join([
|
|
_proof_backed_report(),
|
|
f"Baseline worktree: {ROOT}/branches/baseline-master-pr376",
|
|
f"Baseline target SHA: {HEAD}",
|
|
f"Baseline validation command: cd {ROOT}/branches/baseline-master-pr376 && pytest -q",
|
|
]),
|
|
validation_session={
|
|
"validation_ran": True,
|
|
"expected_head_sha": HEAD,
|
|
"baseline_validation_ran": True,
|
|
},
|
|
project_root=ROOT,
|
|
)
|
|
self.assertTrue(result["proven"], result["reasons"])
|
|
|
|
def test_final_report_validator_integration(self):
|
|
result = assess_final_report_validator(
|
|
"Validation command: pytest tests/ -q",
|
|
"review_pr",
|
|
validation_session={"validation_ran": True},
|
|
)
|
|
self.assertTrue(result["blocked"] or result["downgraded"])
|
|
self.assertTrue(
|
|
any(
|
|
f.get("rule_id") == "reviewer.validation_cwd_proof"
|
|
for f in result.get("findings") or []
|
|
)
|
|
)
|
|
|
|
def test_exported_from_review_proofs(self):
|
|
from review_proofs import assess_validation_cwd_proof_report as exported
|
|
|
|
self.assertTrue(callable(exported))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main() |