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