Files
computer-playbook/tests/unit/python/cli/meta/domains/test_main.py
T

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