Files
OBLITERATUS/tests/test_test_risk_map.py
T

97 lines
3.5 KiB
Python

"""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