mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-06 10:59:59 +00:00
96 lines
3.3 KiB
Python
96 lines
3.3 KiB
Python
from __future__ import annotations
|
|
|
|
import io
|
|
import tempfile
|
|
from pathlib import Path
|
|
from unittest import TestCase, main
|
|
from unittest.mock import patch
|
|
|
|
import cli.meta.domains.__main__ as mod
|
|
from utils.cache.yaml import dump_yaml_str
|
|
from utils.roles.mapping import ROLE_FILE_META_DOMAINS, ROLE_FILE_VARS_MAIN
|
|
|
|
|
|
class TestCliMetaApplicationsDomains(TestCase):
|
|
def write_role(
|
|
self, roles_dir: Path, role_name: str, app_id: str, config: dict
|
|
) -> None:
|
|
role_dir = roles_dir / role_name
|
|
(role_dir / "vars").mkdir(parents=True, exist_ok=True)
|
|
(role_dir / "meta").mkdir(parents=True, exist_ok=True)
|
|
(role_dir / ROLE_FILE_VARS_MAIN).write_text(
|
|
dump_yaml_str({"application_id": app_id}),
|
|
encoding="utf-8",
|
|
)
|
|
domains_payload = config.get("domains", {}) if isinstance(config, dict) else {}
|
|
(role_dir / ROLE_FILE_META_DOMAINS).write_text(
|
|
dump_yaml_str(domains_payload),
|
|
encoding="utf-8",
|
|
)
|
|
|
|
def _run(self, argv: list[str]) -> tuple[int, str, str]:
|
|
out = io.StringIO()
|
|
err = io.StringIO()
|
|
with patch("sys.stdout", out), patch("sys.stderr", err):
|
|
try:
|
|
with patch("sys.argv", ["prog", *argv]):
|
|
mod.main()
|
|
return 0, out.getvalue(), err.getvalue()
|
|
except SystemExit as e:
|
|
code = int(e.code) if e.code is not None else 0
|
|
return code, out.getvalue(), err.getvalue()
|
|
|
|
def test_domain_primary_default_resolution(self) -> None:
|
|
with patch.dict(mod.os.environ, {"DOMAIN": "explicit.env"}, clear=False):
|
|
self.assertEqual(
|
|
mod.parse_args(["--domain-primary", "flag.wins"]).domain_primary,
|
|
"flag.wins",
|
|
)
|
|
self.assertEqual(mod.parse_args([]).domain_primary, "explicit.env")
|
|
with patch.dict(mod.os.environ, {}, clear=True):
|
|
self.assertEqual(mod.parse_args([]).domain_primary, "infinito.test")
|
|
|
|
def test_cli_supports_alias_and_www_flags(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
roles_dir = Path(tmp) / "roles"
|
|
roles_dir.mkdir()
|
|
self.write_role(
|
|
roles_dir,
|
|
"web-app-dashboard",
|
|
"web-app-dashboard",
|
|
{
|
|
"domains": {
|
|
"canonical": ["dashboard.{{ DOMAIN_PRIMARY }}"],
|
|
"aliases": ["alias.{{ DOMAIN_PRIMARY }}"],
|
|
}
|
|
},
|
|
)
|
|
|
|
with patch.object(mod.domain_list, "ROLES_DIR", roles_dir):
|
|
code, out, err = self._run(
|
|
[
|
|
"--domain-primary",
|
|
"infinito.test",
|
|
"--alias",
|
|
"--www",
|
|
]
|
|
)
|
|
|
|
self.assertEqual(code, 0)
|
|
self.assertEqual(err, "")
|
|
self.assertEqual(
|
|
out.strip().splitlines(),
|
|
[
|
|
"alias.infinito.test",
|
|
"dashboard.infinito.test",
|
|
"test.infinito.test",
|
|
"www.alias.infinito.test",
|
|
"www.dashboard.infinito.test",
|
|
"www.test.infinito.test",
|
|
],
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|