128 lines
4.2 KiB
Python
128 lines
4.2 KiB
Python
|
|
# tests/e2e/test_mirror_visibility_smoke.py
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import os
|
||
|
|
import shutil
|
||
|
|
import subprocess
|
||
|
|
import sys
|
||
|
|
import unittest
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
|
||
|
|
class TestMirrorVisibilityE2ESmoke(unittest.TestCase):
|
||
|
|
"""
|
||
|
|
E2E smoke tests for the new mirror visibility feature.
|
||
|
|
|
||
|
|
We intentionally DO NOT execute provider APIs or require tokens.
|
||
|
|
The tests only verify that:
|
||
|
|
- CLI exposes the new subcommands / flags via --help
|
||
|
|
- Python public API surface is wired and importable
|
||
|
|
|
||
|
|
IMPORTANT:
|
||
|
|
- `python -m pkgmgr.cli` is NOT valid unless pkgmgr/cli/__main__.py exists.
|
||
|
|
- In this repo, `from pkgmgr.cli import main` is the stable entrypoint.
|
||
|
|
"""
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def _project_root() -> Path:
|
||
|
|
# tests/e2e/... -> project root is parents[2]
|
||
|
|
return Path(__file__).resolve().parents[2]
|
||
|
|
|
||
|
|
def _run(self, args: list[str]) -> subprocess.CompletedProcess[str]:
|
||
|
|
env = os.environ.copy()
|
||
|
|
env.setdefault("PYTHONUNBUFFERED", "1")
|
||
|
|
|
||
|
|
return subprocess.run(
|
||
|
|
args,
|
||
|
|
cwd=str(self._project_root()),
|
||
|
|
env=env,
|
||
|
|
text=True,
|
||
|
|
stdout=subprocess.PIPE,
|
||
|
|
stderr=subprocess.STDOUT,
|
||
|
|
check=False,
|
||
|
|
)
|
||
|
|
|
||
|
|
def _run_pkgmgr(self, pkgmgr_args: list[str]) -> subprocess.CompletedProcess[str]:
|
||
|
|
"""
|
||
|
|
Run the pkgmgr CLI in a way that works both:
|
||
|
|
- when the console script `pkgmgr` is available on PATH
|
||
|
|
- when only source imports are available
|
||
|
|
|
||
|
|
We prefer the console script if present because it's closest to real E2E.
|
||
|
|
"""
|
||
|
|
exe = shutil.which("pkgmgr")
|
||
|
|
if exe:
|
||
|
|
return self._run([exe, *pkgmgr_args])
|
||
|
|
|
||
|
|
# Fallback to a Python-level entrypoint that exists in your repo:
|
||
|
|
# The stacktrace showed: from pkgmgr.cli import main
|
||
|
|
# We call it with argv simulation.
|
||
|
|
code = r"""
|
||
|
|
import sys
|
||
|
|
from pkgmgr.cli import main
|
||
|
|
|
||
|
|
sys.argv = ["pkgmgr"] + sys.argv[1:]
|
||
|
|
main()
|
||
|
|
"""
|
||
|
|
return self._run([sys.executable, "-c", code, *pkgmgr_args])
|
||
|
|
|
||
|
|
def test_cli_help_lists_visibility_and_provision_public(self) -> None:
|
||
|
|
# `pkgmgr mirror --help` should mention "visibility"
|
||
|
|
p = self._run_pkgmgr(["mirror", "--help"])
|
||
|
|
self.assertEqual(
|
||
|
|
p.returncode,
|
||
|
|
0,
|
||
|
|
msg=f"Expected exit code 0, got {p.returncode}\n\nOutput:\n{p.stdout}",
|
||
|
|
)
|
||
|
|
out_lower = p.stdout.lower()
|
||
|
|
self.assertIn("visibility", out_lower)
|
||
|
|
self.assertIn("provision", out_lower)
|
||
|
|
|
||
|
|
# `pkgmgr mirror provision --help` should show `--public`
|
||
|
|
p = self._run_pkgmgr(["mirror", "provision", "--help"])
|
||
|
|
self.assertEqual(
|
||
|
|
p.returncode,
|
||
|
|
0,
|
||
|
|
msg=f"Expected exit code 0, got {p.returncode}\n\nOutput:\n{p.stdout}",
|
||
|
|
)
|
||
|
|
self.assertIn("--public", p.stdout)
|
||
|
|
|
||
|
|
# `pkgmgr mirror visibility --help` should show choices {private, public}
|
||
|
|
p = self._run_pkgmgr(["mirror", "visibility", "--help"])
|
||
|
|
self.assertEqual(
|
||
|
|
p.returncode,
|
||
|
|
0,
|
||
|
|
msg=f"Expected exit code 0, got {p.returncode}\n\nOutput:\n{p.stdout}",
|
||
|
|
)
|
||
|
|
out_lower = p.stdout.lower()
|
||
|
|
self.assertIn("private", out_lower)
|
||
|
|
self.assertIn("public", out_lower)
|
||
|
|
|
||
|
|
def test_python_api_surface_is_exposed(self) -> None:
|
||
|
|
# Ensure public exports exist and setup_mirrors has ensure_visibility in signature.
|
||
|
|
code = r"""
|
||
|
|
import inspect
|
||
|
|
|
||
|
|
from pkgmgr.actions import mirror as mirror_actions
|
||
|
|
from pkgmgr.core import remote_provisioning as rp
|
||
|
|
|
||
|
|
assert hasattr(mirror_actions, "set_mirror_visibility"), "set_mirror_visibility missing in pkgmgr.actions.mirror"
|
||
|
|
assert hasattr(rp, "set_repo_visibility"), "set_repo_visibility missing in pkgmgr.core.remote_provisioning"
|
||
|
|
|
||
|
|
sig = inspect.signature(mirror_actions.setup_mirrors)
|
||
|
|
assert "ensure_visibility" in sig.parameters, "setup_mirrors missing ensure_visibility parameter"
|
||
|
|
|
||
|
|
print("OK")
|
||
|
|
"""
|
||
|
|
p = self._run([sys.executable, "-c", code])
|
||
|
|
self.assertEqual(
|
||
|
|
p.returncode,
|
||
|
|
0,
|
||
|
|
msg=f"Expected exit code 0, got {p.returncode}\n\nOutput:\n{p.stdout}",
|
||
|
|
)
|
||
|
|
self.assertIn("OK", p.stdout)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
unittest.main()
|