"""Tests for configuration loading and validation.""" import json import pytest from cortex_ai.config import CortexConfig, EngineConfig, ServerConfig, DEFAULT_MODEL_ID def test_defaults(): cfg = CortexConfig() assert cfg.model_id == DEFAULT_MODEL_ID assert cfg.engine.thinking_mode == "thinking" assert cfg.engine.reasoning_effort == "high" assert cfg.server.requires_auth is False def test_invalid_thinking_mode_is_rejected(): with pytest.raises(ValueError, match="thinking_mode"): EngineConfig(thinking_mode="turbo") def test_invalid_reasoning_effort_is_rejected(): with pytest.raises(ValueError, match="reasoning_effort"): EngineConfig(reasoning_effort="extreme") def test_invalid_max_tool_rounds_is_rejected(): with pytest.raises(ValueError, match="max_tool_rounds"): EngineConfig(max_tool_rounds=0) def test_round_trip_through_dict(): cfg = CortexConfig( model_id="exemple/modele", engine=EngineConfig(thinking_mode="chat", max_tool_rounds=3), enabled_tools=["calculate"], ) restored = CortexConfig.from_dict(cfg.to_dict()) assert restored.model_id == "exemple/modele" assert restored.engine.thinking_mode == "chat" assert restored.engine.max_tool_rounds == 3 assert restored.enabled_tools == ["calculate"] def test_save_and_load_a_file(tmp_path): path = tmp_path / "cortex.json" cfg = CortexConfig(model_id="exemple/enregistre") cfg.save(path) assert json.loads(path.read_text())["model_id"] == "exemple/enregistre" assert CortexConfig.load(path).model_id == "exemple/enregistre" def test_env_overrides(monkeypatch): monkeypatch.setenv("CORTEX_MODEL_ID", "exemple/depuis-env") monkeypatch.setenv("CORTEX_PORT", "9001") monkeypatch.setenv("CORTEX_THINKING_MODE", "chat") monkeypatch.setenv("CORTEX_TOOLS", "calculate, text_stats") cfg = CortexConfig.from_env() assert cfg.model_id == "exemple/depuis-env" assert cfg.server.port == 9001 assert cfg.engine.thinking_mode == "chat" assert cfg.enabled_tools == ["calculate", "text_stats"] def test_api_key_makes_auth_required(): assert ServerConfig(api_key="abc").requires_auth is True assert ServerConfig(api_key="").requires_auth is False