"""
Integration tests for the `pkgmgr config` command.

We only exercise non-interactive, read-only subcommands here:
  - pkgmgr config show --all
  - pkgmgr config show pkgmgr

Interactive or mutating subcommands like `add`, `edit`, `init`,
`delete`, `ignore` are intentionally not covered in E2E tests to keep
the CI environment non-interactive and side-effect free.
"""

from __future__ import annotations

import runpy
import sys
import unittest


def _run_pkgmgr_config(extra_args: list[str]) -> None:
    """
    Run `pkgmgr config ...` with the given extra args.

    Any non-zero SystemExit is treated as a test failure and turned into
    an AssertionError with diagnostics.
    """
    cmd_repr = "pkgmgr " + " ".join(extra_args)
    original_argv = list(sys.argv)

    try:
        sys.argv = ["pkgmgr"] + extra_args

        try:
            runpy.run_module("pkgmgr", run_name="__main__")
        except SystemExit as exc:
            code = exc.code if isinstance(exc.code, int) else str(exc.code)
            if code != 0:
                print("[TEST] SystemExit caught while running", cmd_repr)
                print(f"[TEST] Exit code: {code}")
                raise AssertionError(
                    f"{cmd_repr!r} failed with exit code {code}. "
                    "Scroll up to inspect the output printed before failure."
                ) from exc
            # exit code 0 is success

    finally:
        sys.argv = original_argv


class TestIntegrationConfigCommands(unittest.TestCase):
    """
    E2E tests for `pkgmgr config` subcommands.
    """

    def test_config_show_all(self) -> None:
        """
        Run: pkgmgr config show --all
        """
        _run_pkgmgr_config(["config", "show", "--all"])

    def test_config_show_pkgmgr(self) -> None:
        """
        Run: pkgmgr config show pkgmgr

        Uses 'pkgmgr' as the standard repository identifier.
        """
        _run_pkgmgr_config(["config", "show", "pkgmgr"])


if __name__ == "__main__":
    unittest.main()
