"""Executable contracts for the source-to-test risk map.""" from __future__ import annotations import json from copy import deepcopy from pathlib import Path from scripts import check_test_risk_map ROOT = Path(__file__).parents[1] def _write(path: Path, value: object) -> Path: path.write_text(json.dumps(value), encoding="utf-8") return path def test_committed_test_risk_map_is_complete(): assert check_test_risk_map.validate( ROOT / "ci" / "test-risk-map.json", ROOT / "ci" / "test-quality-policy.json", ROOT / "ci" / "conditional-test-policy.json", ) == [] def test_risk_map_rejects_duplicate_missing_and_unowned_modules(tmp_path): risk = json.loads((ROOT / "ci" / "test-risk-map.json").read_text()) risk["owner"] = "" duplicate = deepcopy(risk["modules"][0]) duplicate["required_tests"] = ["tests/missing.py"] duplicate["risk_class"] = "unknown" risk["modules"].append(duplicate) errors = check_test_risk_map.validate( _write(tmp_path / "risk.json", risk), ROOT / "ci" / "test-quality-policy.json", ROOT / "ci" / "conditional-test-policy.json", ) assert "test risk map requires a non-empty owner" in errors assert "duplicate risk module path: obliteratus/cli.py" in errors assert "risk module obliteratus/cli.py has invalid risk_class" in errors assert "risk module obliteratus/cli.py maps missing test path: tests/missing.py" in errors def test_risk_map_rejects_missing_exclusion_and_gate_mapping(tmp_path): risk = json.loads((ROOT / "ci" / "test-risk-map.json").read_text()) risk["modules"] = [ module for module in risk["modules"] if module["path"] != "obliteratus/remote.py" ] loader = next( module for module in risk["modules"] if module["path"] == "obliteratus/models/loader.py" ) loader["conditional_gates"].remove("cuda-runtime") errors = check_test_risk_map.validate( _write(tmp_path / "risk.json", risk), ROOT / "ci" / "test-quality-policy.json", ROOT / "ci" / "conditional-test-policy.json", ) assert "CPU exclusion is missing from test risk map: obliteratus/remote.py" in errors assert "conditional path is missing from test risk map: obliteratus/remote.py" in errors assert "risk module obliteratus/models/loader.py is missing conditional gate cuda-runtime" in errors def test_risk_map_rejects_gate_that_does_not_cover_module(tmp_path): risk = json.loads((ROOT / "ci" / "test-risk-map.json").read_text()) cli = next(module for module in risk["modules"] if module["path"] == "obliteratus/cli.py") cli["conditional_gates"] = ["remote-execution", "unknown-gate"] errors = check_test_risk_map.validate( _write(tmp_path / "risk.json", risk), ROOT / "ci" / "test-quality-policy.json", ROOT / "ci" / "conditional-test-policy.json", ) assert "risk module obliteratus/cli.py is not covered by gate remote-execution" in errors assert "risk module obliteratus/cli.py references unknown gate unknown-gate" in errors def test_risk_map_cannot_drop_critical_cpu_path(tmp_path): risk = json.loads((ROOT / "ci" / "test-risk-map.json").read_text()) risk["modules"] = [ module for module in risk["modules"] if module["path"] != "obliteratus/cli.py" ] errors = check_test_risk_map.validate( _write(tmp_path / "risk.json", risk), ROOT / "ci" / "test-quality-policy.json", ROOT / "ci" / "conditional-test-policy.json", ) assert "critical CPU path is missing from test risk map: obliteratus/cli.py" in errors