"""Config defaults для LLM-инфраструктуры (#960). Критично: llm_enabled СТРОГО False по умолчанию, ключ None. Это гарантирует, что прод не позвонит в OpenAI до осознанного включения. """ from __future__ import annotations from app.core.config import Settings def test_llm_disabled_by_default() -> None: """llm_enabled default False — прод не делает сетевых вызовов случайно.""" s = Settings(_env_file=None) # type: ignore[call-arg] # игнор .env при проверке дефолтов assert s.llm_enabled is False def test_openai_api_key_none_by_default() -> None: """Ключ не зашит — None по умолчанию (читается только из env OPENAI_API_KEY).""" s = Settings(_env_file=None) # type: ignore[call-arg] assert s.openai_api_key is None def test_llm_safe_defaults() -> None: """Прочие дефолты безопасны: внешний base_url, конечные таймаут/лимиты, cap=None.""" s = Settings(_env_file=None) # type: ignore[call-arg] assert s.llm_model == "gpt-4o-mini" assert s.llm_base_url == "https://api.openai.com/v1" assert s.llm_timeout_s > 0 assert s.llm_max_output_tokens > 0 assert s.llm_max_calls_per_request >= 1 assert s.llm_daily_cost_cap_usd is None assert s.llm_max_retries >= 0 def test_openai_api_key_reads_from_env(monkeypatch) -> None: """OPENAI_API_KEY из окружения мапится в settings.openai_api_key (fake-ключ).""" monkeypatch.setenv("OPENAI_API_KEY", "test-fake-key-not-real") s = Settings(_env_file=None) # type: ignore[call-arg] assert s.openai_api_key == "test-fake-key-not-real"