import importlib.util from pathlib import Path import tempfile import unittest ROOT = Path(__file__).resolve().parents[1] spec = importlib.util.spec_from_file_location("installer", ROOT / "scripts/install.py") installer = importlib.util.module_from_spec(spec) spec.loader.exec_module(installer) class InstallerTests(unittest.TestCase): def setUp(self): self.temp = tempfile.TemporaryDirectory() self.addCleanup(self.temp.cleanup) self.home = Path(self.temp.name) / "codex-home" self.home.mkdir() def test_preview_never_writes(self): result = installer.install(ROOT, self.home, include_prompt=True) self.assertTrue(result["changed_paths"]) self.assertFalse(result["applied"]) self.assertEqual(list(self.home.iterdir()), []) def test_apply_preserves_user_files_and_backs_up(self): prompt = self.home / "AGENTS.md" prompt.write_text("user prompt\n") config = self.home / "config.toml" config.write_text('model = "user-selected"\n') skill = self.home / "skills/codex-subagent-router" skill.mkdir(parents=True) custom = skill / "custom.md" custom.write_text("local extension") result = installer.install(ROOT, self.home, include_prompt=True, apply=True) self.assertEqual((Path(result["backup"]) / "AGENTS.md").read_text(), "user prompt\n") self.assertEqual(config.read_text(), 'model = "user-selected"\n') self.assertEqual(custom.read_text(), "local extension") self.assertEqual(prompt.read_bytes(), (ROOT / "prompts/AGENTS.md").read_bytes()) again = installer.install(ROOT, self.home, include_prompt=True, apply=True) self.assertEqual(again["changed_paths"], []) self.assertIsNone(again["backup"]) def test_skill_only_does_not_replace_global_prompt(self): prompt = self.home / "AGENTS.md" prompt.write_text("keep") installer.install(ROOT, self.home, apply=True) self.assertEqual(prompt.read_text(), "keep") def test_symlink_target_is_rejected(self): outside = Path(self.temp.name) / "outside" outside.mkdir() (self.home / "skills").symlink_to(outside, target_is_directory=True) with self.assertRaisesRegex(ValueError, "symlink"): installer.install(ROOT, self.home, apply=True) self.assertEqual(list(outside.iterdir()), []) def test_conflicting_directory_is_rejected_before_writes(self): (self.home / "AGENTS.md").mkdir() with self.assertRaisesRegex(ValueError, "regular file"): installer.install(ROOT, self.home, include_prompt=True, apply=True) self.assertFalse((self.home / "skills").exists()) if __name__ == "__main__": unittest.main()