11import subprocess
22import sys
3+ import re
34import tempfile
45import os
56import yaml
@@ -15,12 +16,59 @@ def _run_module(module, extra_args=None):
1516 args = ["-m" , module ] + (extra_args or [])
1617 return _run (args )
1718
19+ _ANSI_ESCAPE = re .compile (r'\x1b\[[0-9;]*[mK]' )
20+
21+ def _strip_ansi (s ):
22+ """Remove ANSI escape codes so plain-text assertions work regardless of terminal colour."""
23+ return _ANSI_ESCAPE .sub ('' , s )
24+
1825# -- devopsos CLI ----------------------------------------------------------
1926
2027def test_help ():
2128 result = _run (["-m" , "cli.devopsos" , "--help" ])
2229 assert "Unified DevOps-OS CLI tool" in result .stdout
2330
31+ def test_init_help_shows_dir_option ():
32+ """--dir option must appear in `devopsos init --help`."""
33+ result = subprocess .run (
34+ [sys .executable , "-m" , "cli.devopsos" , "init" , "--help" ],
35+ capture_output = True , text = True ,
36+ cwd = os .path .dirname (os .path .dirname (__file__ )),
37+ env = {** os .environ , "NO_COLOR" : "1" },
38+ )
39+ assert result .returncode == 0
40+ assert "--dir" in _strip_ansi (result .stdout )
41+
42+ def test_init_dir_option_creates_devcontainer_in_specified_dir ():
43+ """--dir places .devcontainer inside the given directory, not the cwd."""
44+ from unittest .mock import MagicMock , patch
45+ from typer .testing import CliRunner
46+ from cli .devopsos import app
47+
48+ checkbox_mock = MagicMock ()
49+ checkbox_mock .execute .return_value = [] # nothing selected
50+
51+ # First confirm → Proceed = True
52+ # Second confirm → Generate Dockerfile = False (skip, we only need env.json)
53+ confirm_proceed = MagicMock ()
54+ confirm_proceed .execute .return_value = True
55+ confirm_skip = MagicMock ()
56+ confirm_skip .execute .return_value = False
57+
58+ with tempfile .TemporaryDirectory () as tmp :
59+ with patch ("cli.devopsos.inquirer.checkbox" , return_value = checkbox_mock ), \
60+ patch ("cli.devopsos.inquirer.confirm" ,
61+ side_effect = [confirm_proceed , confirm_skip ]):
62+ runner = CliRunner ()
63+ result = runner .invoke (app , ["init" , "--dir" , tmp ])
64+
65+ assert result .exit_code == 0 , result .output
66+ dc_dir = Path (tmp ) / ".devcontainer"
67+ assert dc_dir .is_dir (), "Expected .devcontainer dir inside --dir target"
68+ assert (dc_dir / "devcontainer.env.json" ).exists (), (
69+ "Expected devcontainer.env.json inside .devcontainer"
70+ )
71+
2472def test_scaffold_unknown ():
2573 result = _run (["-m" , "cli.devopsos" , "scaffold" , "unknown" ])
2674 assert "Unknown scaffold target" in result .stdout
@@ -32,6 +80,45 @@ def test_scaffold_help_lists_new_targets():
3280 assert "argocd" in result .stdout
3381 assert "sre" in result .stdout
3482
83+ def test_scaffold_gha_via_cli ():
84+ """Regression: `python -m cli.devopsos scaffold gha` must not raise argparse error."""
85+ with tempfile .TemporaryDirectory () as tmp :
86+ env = {** os .environ , "DEVOPS_OS_GHA_OUTPUT" : os .path .join (tmp , ".github/workflows" )}
87+ result = subprocess .run (
88+ [sys .executable , "-m" , "cli.devopsos" , "scaffold" , "gha" ],
89+ capture_output = True , text = True ,
90+ cwd = os .path .dirname (os .path .dirname (__file__ )),
91+ env = env ,
92+ )
93+ assert result .returncode == 0 , result .stderr
94+ assert "error: unrecognized arguments" not in result .stderr
95+
96+ def test_scaffold_gitlab_via_cli ():
97+ """Regression: `python -m cli.devopsos scaffold gitlab` must not raise argparse error."""
98+ with tempfile .TemporaryDirectory () as tmp :
99+ env = {** os .environ , "DEVOPS_OS_GITLAB_OUTPUT" : os .path .join (tmp , ".gitlab-ci.yml" )}
100+ result = subprocess .run (
101+ [sys .executable , "-m" , "cli.devopsos" , "scaffold" , "gitlab" ],
102+ capture_output = True , text = True ,
103+ cwd = os .path .dirname (os .path .dirname (__file__ )),
104+ env = env ,
105+ )
106+ assert result .returncode == 0 , result .stderr
107+ assert "error: unrecognized arguments" not in result .stderr
108+
109+ def test_scaffold_argocd_via_cli ():
110+ """Regression: `python -m cli.devopsos scaffold argocd` must not raise argparse error."""
111+ with tempfile .TemporaryDirectory () as tmp :
112+ env = {** os .environ , "DEVOPS_OS_ARGOCD_OUTPUT_DIR" : tmp }
113+ result = subprocess .run (
114+ [sys .executable , "-m" , "cli.devopsos" , "scaffold" , "argocd" ],
115+ capture_output = True , text = True ,
116+ cwd = os .path .dirname (os .path .dirname (__file__ )),
117+ env = env ,
118+ )
119+ assert result .returncode == 0 , result .stderr
120+ assert "error: unrecognized arguments" not in result .stderr
121+
35122# -- GitLab CI generator ---------------------------------------------------
36123
37124def test_scaffold_gitlab_build ():
0 commit comments