from __future__ import annotations import json import tempfile from pathlib import Path import unittest from model_selector.config import OpenClawConfigRepository SOURCE_CONFIG = Path("/home/lucky/.openclaw/openclaw.json") class ConfigRepositoryTests(unittest.TestCase): def test_alias_update_uses_copy_and_preserves_original(self) -> None: original_bytes = SOURCE_CONFIG.read_bytes() with tempfile.TemporaryDirectory() as tmp: temp_config = Path(tmp) / "openclaw.json" temp_config.write_bytes(original_bytes) repo = OpenClawConfigRepository(temp_config) loaded = repo.load() self.assertIn("models", loaded) repo.update_alias("openai/gpt-5.4", "osiris-test") updated = json.loads(temp_config.read_text(encoding="utf-8")) self.assertEqual(updated["agents"]["defaults"]["models"]["openai/gpt-5.4"]["alias"], "osiris-test") self.assertEqual(SOURCE_CONFIG.read_bytes(), original_bytes) def test_configured_models_parses_expected_shape(self) -> None: with tempfile.TemporaryDirectory() as tmp: temp_config = Path(tmp) / "openclaw.json" temp_config.write_bytes(SOURCE_CONFIG.read_bytes()) repo = OpenClawConfigRepository(temp_config) models = repo.configured_models() self.assertTrue(any(model.full_key == "openai/gpt-5.4" for model in models)) self.assertTrue(any(model.full_key == "groq-cloud/openai/gpt-oss-20b" for model in models)) def test_add_and_remove_model_updates_only_copy(self) -> None: with tempfile.TemporaryDirectory() as tmp: temp_config = Path(tmp) / "openclaw.json" original_bytes = SOURCE_CONFIG.read_bytes() temp_config.write_bytes(original_bytes) repo = OpenClawConfigRepository(temp_config) repo.add_model( "openai", { "id": "gpt-5.4-test", "name": "GPT-5.4 Test", "reasoning": True, "input": ["text"], "contextWindow": 1024, "maxTokens": 256, }, ) after_add = repo.load() models = after_add["models"]["providers"]["openai"]["models"] self.assertTrue(any(model["id"] == "gpt-5.4-test" for model in models)) repo.remove_model("openai/gpt-5.4-test") after_remove = repo.load() models = after_remove["models"]["providers"]["openai"]["models"] self.assertFalse(any(model["id"] == "gpt-5.4-test" for model in models)) self.assertEqual(SOURCE_CONFIG.read_bytes(), original_bytes)