import pytest from pyra.config.schema import PyraConfig, ProviderConfig def test_config_saves_no_api_key(tmp_pyra_home): from pyra.config.manager import save_config, load_config cfg = PyraConfig(ai=ProviderConfig(provider_id="anthropic", model="claude-sonnet-4-6")) save_config(cfg) config_text = (tmp_pyra_home / "config.yaml").read_text() assert "sk-" not in config_text assert "api_key" not in config_text.lower() def test_config_round_trip(tmp_pyra_home): from pyra.config.manager import save_config, load_config cfg = PyraConfig( ai=ProviderConfig( provider_id="lmstudio", model="gemma-4-e4b", base_url="http://localhost:1234/v1", ) ) save_config(cfg) loaded = load_config() assert loaded.ai.provider_id == "lmstudio" assert loaded.ai.model == "gemma-4-e4b" assert loaded.ai.base_url == "http://localhost:1234/v1" def test_config_file_permissions(tmp_pyra_home): import os from pyra.config.manager import save_config cfg = PyraConfig(ai=ProviderConfig(provider_id="ollama", model="llama3")) save_config(cfg) config_file = tmp_pyra_home / "config.yaml" if os.name != "nt": mode = oct(config_file.stat().st_mode)[-3:] assert mode == "600", f"Expected 600, got {mode}" def test_load_config_missing_raises(tmp_pyra_home): from pyra.config.manager import load_config with pytest.raises(FileNotFoundError): load_config()