"""Tests for the declarative installed-wheel E2E coverage disposition gate."""

from __future__ import annotations

import importlib.util
import json
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[3]
SPEC = importlib.util.spec_from_file_location(
    "validate_coverage_manifest",
    ROOT / "ci" / "integration" / "validate_coverage_manifest.py",
)
assert SPEC is not None and SPEC.loader is not None
validator = importlib.util.module_from_spec(SPEC)
sys.modules[SPEC.name] = validator
SPEC.loader.exec_module(validator)


def _artifacts() -> tuple[dict[str, object], dict[str, object]]:
    manifest = json.loads(
        (ROOT / "ci" / "integration" / "coverage_manifest.json").read_text()
    )
    import tomllib

    metadata = tomllib.loads((ROOT / "pyproject.toml").read_text())
    return manifest, metadata


def test_checked_in_manifest_covers_every_declared_entry_point_once() -> None:
    manifest, metadata = _artifacts()
    assert validator.validate(manifest, metadata) == []


def test_public_cli_inventory_uses_the_canonical_cli_module() -> None:
    assert validator.CLI_SOURCE_PATH == ROOT / "src" / "rfgen" / "cli.py"


def test_manifest_rejects_an_unmapped_declared_identifier() -> None:
    manifest, metadata = _artifacts()
    manifest["covered"]["rfgen.nodes.source"].remove("chirp_radar")
    assert "missing manifest identifiers in rfgen.nodes.source: ['chirp_radar']" in validator.validate(
        manifest, metadata
    )


def test_manifest_rejects_a_stale_scenario_node() -> None:
    manifest, metadata = _artifacts()
    manifest["scenarios"]["rfgen.nodes.source"]["chirp_radar"] = [
        "tests/unit/nodes/test_chirp_source.py::missing_test"
    ]
    assert "invalid or stale scenario mapping for rfgen.nodes.source.chirp_radar" in validator.validate(
        manifest, metadata
    )


def test_manifest_rejects_a_new_unmapped_public_cli_command(monkeypatch) -> None:
    manifest, metadata = _artifacts()
    original_commands = validator._public_cli_commands()
    monkeypatch.setattr(
        validator,
        "_public_cli_commands",
        lambda: frozenset((*original_commands, "new-command")),
    )
    assert any(
        error.startswith("CLI command inventory drift:")
        for error in validator.validate(manifest, metadata)
    )
