73 lines
2.7 KiB
Python
73 lines
2.7 KiB
Python
"""Unit tests for the top-level quality-gate runner."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
from testing import quality_gate
|
|
|
|
|
|
def test_run_profile_aggregates_internal_and_pytest_results(tmp_path: Path, monkeypatch):
|
|
build_dir = tmp_path / "build"
|
|
unit_test = tmp_path / "test_sample.py"
|
|
unit_test.write_text("def test_ok():\n assert True\n", encoding="utf-8")
|
|
|
|
contract = {
|
|
"profiles": {"local": ["docs", "smell", "hygiene", "unit", "coverage"]},
|
|
"pytest_suites": {
|
|
"unit": {
|
|
"description": "Unit suite",
|
|
"paths": [str(unit_test.relative_to(tmp_path))],
|
|
"junit": "build/junit-unit.xml",
|
|
"coverage_xml": "build/coverage-unit.xml",
|
|
"coverage_sources": [],
|
|
}
|
|
},
|
|
"manual_scripts": [{"path": "manual.py", "description": "Manual"}],
|
|
}
|
|
|
|
monkeypatch.setattr(quality_gate, "run_docs_check", lambda *_: [])
|
|
monkeypatch.setattr(quality_gate, "run_hygiene_check", lambda *_: [])
|
|
monkeypatch.setattr(quality_gate, "run_coverage_check", lambda *_: [])
|
|
|
|
calls = []
|
|
|
|
def fake_run(command, cwd, check):
|
|
calls.append((command, cwd, check))
|
|
if "--junitxml=" in " ".join(command):
|
|
(build_dir / "junit-unit.xml").write_text(
|
|
'<testsuite tests="1" failures="0" errors="0" skipped="0" />',
|
|
encoding="utf-8",
|
|
)
|
|
(build_dir / "coverage-unit.xml").write_text("<coverage />", encoding="utf-8")
|
|
return type("Completed", (), {"returncode": 0})()
|
|
|
|
monkeypatch.setattr(quality_gate.subprocess, "run", fake_run)
|
|
|
|
summary = quality_gate.run_profile(contract, tmp_path, "local", build_dir)
|
|
|
|
assert summary["status"] == "ok"
|
|
assert [result["name"] for result in summary["results"]] == [
|
|
"docs",
|
|
"smell",
|
|
"hygiene",
|
|
"unit",
|
|
"coverage",
|
|
]
|
|
assert summary["workspace_line_coverage_percent"] == 0.0
|
|
assert summary["source_lines_over_500"] == 0
|
|
assert calls[0][0][:3] == [quality_gate.sys.executable, "-m", "ruff"]
|
|
assert any(result.get("junit") == "build/junit-unit.xml" for result in summary["results"])
|
|
|
|
|
|
def test_main_writes_summary_file(tmp_path: Path, monkeypatch):
|
|
summary = {"status": "ok", "profile": "local", "results": [], "manual_scripts": []}
|
|
monkeypatch.chdir(tmp_path)
|
|
monkeypatch.setattr(quality_gate, "load_contract", lambda: {"profiles": {"local": []}, "pytest_suites": {}})
|
|
monkeypatch.setattr(quality_gate, "run_profile", lambda *args, **kwargs: summary)
|
|
|
|
rc = quality_gate.main(["--profile", "local", "--build-dir", "build"])
|
|
|
|
assert rc == 0
|
|
assert (tmp_path / "build" / "quality-gate-summary.json").exists()
|