# tests/test_cli.py import os, subprocess, sys, unittest ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) def run(*args): return subprocess.run([sys.executable, os.path.join(ROOT, "apex"), *args], text=True, capture_output=True) class TestCli(unittest.TestCase): def test_help_lists_and_exits_zero(self): r = run("--help") self.assertEqual(r.returncode, 0) self.assertIn("Available actions", r.stdout) def test_compose_alias_uses_canonical_action(self): canonical = run("composition/run", "--help") self.assertEqual(canonical.returncode, 0) alias = run("compose", "--help") self.assertEqual(alias.returncode, 0) self.assertEqual(alias.stdout, canonical.stdout) def test_configuration_must_be_selected_explicitly(self): listing = run("--help") self.assertIn("config/hardening", listing.stdout) self.assertIn("repository/chown", listing.stdout) for command in ("configure", "config"): result = run(command) self.assertEqual(result.returncode, 1) self.assertIn("Unknown action", result.stderr) def test_unknown_action_exits_one(self): r = run("no/such") self.assertEqual(r.returncode, 1) self.assertIn("Unknown action", r.stderr) if __name__ == "__main__": unittest.main()