mirror of
https://github.com/elder-plinius/OBLITERATUS.git
synced 2026-08-17 16:37:30 +02:00
test: enforce Wave A quality lock
This commit is contained in:
@@ -165,3 +165,142 @@ def test_changed_line_gate_accepts_exact_floor():
|
||||
assert MODULE.validate_changed_coverage(
|
||||
_report(), changed, minimum=75.0,
|
||||
) == []
|
||||
|
||||
|
||||
def _module_report(
|
||||
path: str = "obliteratus/example.py",
|
||||
*,
|
||||
covered_lines: int = 8,
|
||||
statements: int = 10,
|
||||
covered_branches: int = 3,
|
||||
branches: int = 4,
|
||||
) -> dict[str, object]:
|
||||
return {
|
||||
"files": {
|
||||
path: {
|
||||
"summary": {
|
||||
"covered_lines": covered_lines,
|
||||
"num_statements": statements,
|
||||
"covered_branches": covered_branches,
|
||||
"num_branches": branches,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def test_parse_changed_modules_handles_nul_renames_and_filters_nonproduction():
|
||||
raw = (
|
||||
b"M\0obliteratus/current.py\0"
|
||||
b"A\0tests/test_current.py\0"
|
||||
b"D\0obliteratus/deleted.py\0"
|
||||
b"R100\0obliteratus/old.py\0obliteratus/new.py\0"
|
||||
b"R100\0obliteratus/removed.py\0docs/removed.py\0"
|
||||
b"C100\0obliteratus/source.py\0obliteratus/copied.py\0"
|
||||
)
|
||||
|
||||
assert MODULE.parse_changed_modules(raw) == [
|
||||
MODULE.ChangedModule("M", "obliteratus/current.py", "obliteratus/current.py"),
|
||||
MODULE.ChangedModule("D", "obliteratus/deleted.py", "obliteratus/deleted.py"),
|
||||
MODULE.ChangedModule("R100", "obliteratus/old.py", "obliteratus/new.py"),
|
||||
MODULE.ChangedModule("D", "obliteratus/removed.py", "obliteratus/removed.py"),
|
||||
MODULE.ChangedModule("C100", None, "obliteratus/copied.py"),
|
||||
]
|
||||
|
||||
|
||||
def test_parse_changed_modules_rejects_truncated_and_unknown_statuses():
|
||||
import pytest
|
||||
|
||||
with pytest.raises(ValueError, match="truncated"):
|
||||
MODULE.parse_changed_modules(b"R100\0obliteratus/old.py\0")
|
||||
with pytest.raises(ValueError, match="unsupported"):
|
||||
MODULE.parse_changed_modules(b"U\0obliteratus/example.py\0")
|
||||
|
||||
|
||||
def test_touched_module_gate_reports_line_and_branch_regressions_separately():
|
||||
base = _module_report(covered_lines=9, covered_branches=4)
|
||||
head = _module_report(covered_lines=8, covered_branches=3)
|
||||
changes = [MODULE.ChangedModule("M", "obliteratus/example.py", "obliteratus/example.py")]
|
||||
|
||||
assert MODULE.validate_touched_module_regression(head, base, changes) == [
|
||||
"touched module obliteratus/example.py line coverage regressed from 90.00% to 80.00%",
|
||||
"touched module obliteratus/example.py branch coverage regressed from 100.00% to 75.00%",
|
||||
]
|
||||
|
||||
|
||||
def test_touched_module_gate_applies_tolerances_to_existing_module():
|
||||
base = _module_report(covered_lines=801, statements=1000, covered_branches=751, branches=1000)
|
||||
head = _module_report(covered_lines=800, statements=1000, covered_branches=750, branches=1000)
|
||||
changes = [MODULE.ChangedModule("M", "obliteratus/example.py", "obliteratus/example.py")]
|
||||
|
||||
assert MODULE.validate_touched_module_regression(
|
||||
head,
|
||||
base,
|
||||
changes,
|
||||
line_tolerance=0.1,
|
||||
branch_tolerance=0.1,
|
||||
) == []
|
||||
assert len(MODULE.validate_touched_module_regression(
|
||||
head,
|
||||
base,
|
||||
changes,
|
||||
line_tolerance=0.09,
|
||||
branch_tolerance=0.09,
|
||||
)) == 2
|
||||
|
||||
|
||||
def test_touched_module_gate_enforces_new_module_floors():
|
||||
head = _module_report(covered_lines=7, statements=10, covered_branches=2, branches=4)
|
||||
changes = [MODULE.ChangedModule("A", None, "obliteratus/example.py")]
|
||||
|
||||
assert MODULE.validate_touched_module_regression(head, {}, changes) == [
|
||||
"new module obliteratus/example.py line coverage 70.00% is below the 80.00% floor",
|
||||
"new module obliteratus/example.py branch coverage 50.00% is below the 75.00% floor",
|
||||
]
|
||||
|
||||
|
||||
def test_touched_module_gate_requires_floor_when_existing_module_adds_branches():
|
||||
base = _module_report(covered_branches=0, branches=0)
|
||||
head = _module_report(covered_branches=2, branches=4)
|
||||
changes = [MODULE.ChangedModule("M", "obliteratus/example.py", "obliteratus/example.py")]
|
||||
|
||||
assert MODULE.validate_touched_module_regression(head, base, changes) == [
|
||||
"touched module obliteratus/example.py added branches at 50.00% coverage, "
|
||||
"below the 75.00% floor",
|
||||
]
|
||||
|
||||
|
||||
def test_touched_module_gate_accepts_branch_removal_and_rename():
|
||||
base = _module_report("obliteratus/old.py", covered_branches=3, branches=4)
|
||||
head = _module_report("obliteratus/new.py", covered_branches=0, branches=0)
|
||||
changes = [MODULE.ChangedModule("R100", "obliteratus/old.py", "obliteratus/new.py")]
|
||||
|
||||
assert MODULE.validate_touched_module_regression(head, base, changes) == []
|
||||
|
||||
|
||||
def test_touched_module_gate_rejects_missing_and_malformed_measurements():
|
||||
changes = [MODULE.ChangedModule("M", "obliteratus/example.py", "obliteratus/example.py")]
|
||||
assert MODULE.validate_touched_module_regression({}, _module_report(), changes) == [
|
||||
"coverage report is missing touched module obliteratus/example.py",
|
||||
]
|
||||
|
||||
malformed = _module_report()
|
||||
malformed["files"]["obliteratus/example.py"]["summary"]["covered_lines"] = True
|
||||
assert MODULE.validate_touched_module_regression(malformed, _module_report(), changes) == [
|
||||
"coverage report has invalid covered_lines for touched module obliteratus/example.py",
|
||||
]
|
||||
|
||||
|
||||
def test_touched_module_gate_rejects_missing_base_measurement():
|
||||
changes = [MODULE.ChangedModule("M", "obliteratus/example.py", "obliteratus/example.py")]
|
||||
assert MODULE.validate_touched_module_regression(_module_report(), {}, changes) == [
|
||||
"base coverage report is missing touched module obliteratus/example.py",
|
||||
]
|
||||
|
||||
|
||||
def test_touched_module_gate_requires_reviewed_exception_for_deletion():
|
||||
changes = [MODULE.ChangedModule("D", "obliteratus/example.py", "obliteratus/example.py")]
|
||||
assert MODULE.validate_touched_module_regression({}, _module_report(), changes) == [
|
||||
"deleted production module obliteratus/example.py requires an explicit reviewed "
|
||||
"coverage-policy exception",
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user