Bootstrap model routing skill, prompt, evidence validation and development docs
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user