mirror of
https://github.com/PR0M3TH3AN/SeedPass.git
synced 2026-10-29 00:42:08 +00:00
89 lines
2.5 KiB
Python
89 lines
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
|
|
def _load_module():
|
|
repo_root = Path(__file__).resolve().parents[2]
|
|
script_path = repo_root / "scripts" / "check_critical_coverage.py"
|
|
spec = importlib.util.spec_from_file_location(
|
|
"check_critical_coverage", script_path
|
|
)
|
|
assert spec is not None and spec.loader is not None
|
|
module = importlib.util.module_from_spec(spec)
|
|
sys.modules[spec.name] = module
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
coverage_gate = _load_module()
|
|
|
|
|
|
def test_default_thresholds_include_tui2_service_module():
|
|
assert coverage_gate.DEFAULT_THRESHOLDS["src/seedpass/core/api.py"] == 85.0
|
|
|
|
|
|
def test_parse_threshold_overrides_valid():
|
|
parsed = coverage_gate._parse_threshold_overrides(
|
|
["src/main.py=40", "src/seedpass/core/manager.py=55.5"]
|
|
)
|
|
assert parsed["src/main.py"] == 40.0
|
|
assert parsed["src/seedpass/core/manager.py"] == 55.5
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"value",
|
|
[
|
|
"src/main.py",
|
|
"src/main.py=abc",
|
|
"src/main.py=-1",
|
|
"src/main.py=101",
|
|
"=50",
|
|
],
|
|
)
|
|
def test_parse_threshold_overrides_invalid(value):
|
|
with pytest.raises(ValueError):
|
|
coverage_gate._parse_threshold_overrides([value])
|
|
|
|
|
|
def test_find_file_payload_accepts_absolute_path_suffix():
|
|
files_payload = {
|
|
"/tmp/work/src/main.py": {"summary": {"percent_covered": 50.0}},
|
|
"/tmp/work/src/seedpass/core/manager.py": {
|
|
"summary": {"percent_covered": 60.0}
|
|
},
|
|
}
|
|
payload = coverage_gate._find_file_payload(files_payload, "src/main.py")
|
|
assert payload == {"summary": {"percent_covered": 50.0}}
|
|
|
|
|
|
def test_compute_function_coverage_reports_uncovered(tmp_path):
|
|
module_file = tmp_path / "example.py"
|
|
module_file.write_text(
|
|
"\n".join(
|
|
[
|
|
"def covered():",
|
|
" return 1",
|
|
"",
|
|
"def uncovered():",
|
|
" return 2",
|
|
"",
|
|
"class A:",
|
|
" def method(self):",
|
|
" return 3",
|
|
]
|
|
),
|
|
encoding="utf-8",
|
|
)
|
|
coverage = coverage_gate._compute_function_coverage(
|
|
module_file, executed_lines={1, 2}
|
|
)
|
|
by_name = {item.name: item for item in coverage}
|
|
assert by_name["covered"].covered is True
|
|
assert by_name["uncovered"].covered is False
|
|
assert by_name["A.method"].covered is False
|