import os import tempfile import unittest from pathlib import Path from core import claude_setup as cs class AISetupTests(unittest.TestCase): def setUp(self): self._old_target = os.environ.get("SERVER_MANAGER_TARGET_HOME") self._old_all = os.environ.get("SERVER_MANAGER_INSTALL_ALL_USERS") self._old_iter = cs._iter_all_user_homes self._old_platform = cs.sys.platform def tearDown(self): if self._old_target is None: os.environ.pop("SERVER_MANAGER_TARGET_HOME", None) else: os.environ["SERVER_MANAGER_TARGET_HOME"] = self._old_target if self._old_all is None: os.environ.pop("SERVER_MANAGER_INSTALL_ALL_USERS", None) else: os.environ["SERVER_MANAGER_INSTALL_ALL_USERS"] = self._old_all cs._iter_all_user_homes = self._old_iter cs.sys.platform = self._old_platform def test_single_target_installers_create_expected_files(self): with tempfile.TemporaryDirectory() as tmp: os.environ["SERVER_MANAGER_TARGET_HOME"] = tmp cs.install_ssh_script() cs.install_claude_skill() cs.install_codex_skill() cs.install_gemini_skill() cs.install_global_claude_md() cs.install_global_gemini_md() self.assertTrue(Path(tmp, ".server-connections", "ssh.py").exists()) self.assertTrue(Path(tmp, ".server-connections", "encryption.py").exists()) self.assertTrue(Path(tmp, ".claude", "commands", "ssh.md").exists()) self.assertTrue(Path(tmp, ".codex", "skills", "server-manager", "SKILL.md").exists()) self.assertTrue(Path(tmp, ".gemini", "skills", "server-manager", "SKILL.md").exists()) self.assertTrue(Path(tmp, ".server-connections", "codex-ssh").exists()) self.assertTrue(Path(tmp, ".server-connections", "gemini-ssh").exists()) self.assertTrue(Path(tmp, ".claude", "CLAUDE.md").exists()) self.assertTrue(Path(tmp, ".gemini", "GEMINI.md").exists()) self.assertFalse(Path(tmp, ".agents", "skills", "server-manager").exists()) status = cs.check_status() self.assertTrue(status["claude_skill_installed"]) self.assertTrue(status["codex_skill_installed"]) self.assertTrue(status["gemini_skill_installed"]) self.assertTrue(status["codex_wrapper_installed"]) self.assertTrue(status["gemini_wrapper_installed"]) def test_install_all_users_mode_installs_into_each_home_and_skips_ssh_key(self): with tempfile.TemporaryDirectory() as base: home1 = Path(base, "user1") home2 = Path(base, "user2") home1.mkdir() home2.mkdir() os.environ["SERVER_MANAGER_INSTALL_ALL_USERS"] = "1" cs._iter_all_user_homes = lambda: [str(home1), str(home2)] results = cs.install_all() self.assertIn("INFO: SSH key generation skipped", "\n".join(results)) self.assertTrue(Path(home1, ".codex", "skills", "server-manager", "SKILL.md").exists()) self.assertTrue(Path(home1, ".gemini", "skills", "server-manager", "SKILL.md").exists()) self.assertTrue(Path(home2, ".codex", "skills", "server-manager", "SKILL.md").exists()) self.assertTrue(Path(home2, ".gemini", "skills", "server-manager", "SKILL.md").exists()) self.assertFalse(Path(home1, ".ssh", "id_ed25519").exists()) self.assertFalse(Path(home2, ".ssh", "id_ed25519").exists()) def test_windows_wrapper_names_are_generated_with_cmd_suffix(self): with tempfile.TemporaryDirectory() as tmp: os.environ["SERVER_MANAGER_TARGET_HOME"] = tmp cs.sys.platform = "win32" cs.install_ssh_script() cs.install_codex_skill() cs.install_gemini_skill() self.assertTrue(Path(tmp, ".server-connections", "codex-ssh.cmd").exists()) self.assertTrue(Path(tmp, ".server-connections", "gemini-ssh.cmd").exists()) if __name__ == "__main__": unittest.main()