from __future__ import annotations import unittest from pathlib import Path from unittest.mock import patch from app.config import _parse_ai_config, _parse_elevenlabs_config class ConfigElevenLabsTests(unittest.TestCase): def test_elevenlabs_config_parses_values(self) -> None: with patch.dict("os.environ", {}, clear=True): config = _parse_elevenlabs_config( { "api_key": "config-key", "model_id": "scribe_v2", "language_code": "ru", "request_timeout_seconds": 120, } ) self.assertEqual(config.api_key, "config-key") self.assertEqual(config.model_id, "scribe_v2") self.assertEqual(config.language_code, "ru") self.assertEqual(config.request_timeout_seconds, 120) def test_elevenlabs_env_overrides(self) -> None: env = { "ELEVENLABS_API_KEY": "env-key", "ELEVENLABS_MODEL_ID": "scribe_v2", "ELEVENLABS_LANGUAGE_CODE": "en", "ELEVENLABS_REQUEST_TIMEOUT_SECONDS": "45", } with patch.dict("os.environ", env, clear=True): config = _parse_elevenlabs_config({"api_key": "config-key"}) self.assertEqual(config.api_key, "env-key") self.assertEqual(config.language_code, "en") self.assertEqual(config.request_timeout_seconds, 45) class ConfigAiTests(unittest.TestCase): def test_ai_config_parses_both_providers(self) -> None: with patch.dict("os.environ", {}, clear=True): config = _parse_ai_config( { "glm": {"api_key": "glm-key", "model": "glm-model"}, "deepseek": {"api_key": "ds-key", "model": "ds-model"}, "claude": {"api_key": "claude-key", "model": "claude-haiku-5-5"}, "openrouter": {"api_key": "or-key", "model": "anthropic/claude-haiku-5.5"}, "web_page_timeout_seconds": 20, "web_page_max_chars": 12345, } ) self.assertEqual(config.glm.api_key, "glm-key") self.assertEqual(config.glm.model, "glm-model") self.assertEqual(config.deepseek.api_key, "ds-key") self.assertEqual(config.deepseek.model, "ds-model") self.assertEqual(config.claude.api_url, "https://api.anthropic.com") self.assertEqual(config.claude.api_key, "claude-key") self.assertEqual(config.claude.model, "claude-haiku-5-5") self.assertEqual(config.openrouter.api_url, "https://openrouter.ai/api/v1") self.assertEqual(config.openrouter.api_key, "or-key") self.assertEqual(config.openrouter.model, "anthropic/claude-haiku-5.5") self.assertEqual(config.web_page_timeout_seconds, 20) self.assertEqual(config.web_page_max_chars, 12345) def test_ai_provider_env_overrides(self) -> None: env = { "GLM_API_KEY": "env-glm", "GLM_MODEL": "env-glm-model", "DEEPSEEK_API_KEY": "env-ds", "DEEPSEEK_MODEL": "env-ds-model", "CLAUDE_API_KEY": "env-claude", "CLAUDE_MODEL": "claude-haiku-5-5", "OPENROUTER_API_KEY": "env-or", "OPENROUTER_MODEL": "anthropic/claude-haiku-5.5", "AI_WEB_PAGE_TIMEOUT_SECONDS": "30", "AI_WEB_PAGE_MAX_CHARS": "54321", "AI_PROMPT_DIR": "alternate-prompts", } with patch.dict("os.environ", env, clear=True): config = _parse_ai_config({}) self.assertEqual(config.glm.api_key, "env-glm") self.assertEqual(config.glm.model, "env-glm-model") self.assertEqual(config.deepseek.api_key, "env-ds") self.assertEqual(config.deepseek.model, "env-ds-model") self.assertEqual(config.claude.api_key, "env-claude") self.assertEqual(config.claude.model, "claude-haiku-5-5") self.assertEqual(config.claude.api_url, "https://api.anthropic.com") self.assertEqual(config.openrouter.api_key, "env-or") self.assertEqual(config.openrouter.model, "anthropic/claude-haiku-5.5") self.assertEqual(config.openrouter.api_url, "https://openrouter.ai/api/v1") self.assertEqual(config.web_page_timeout_seconds, 30) self.assertEqual(config.web_page_max_chars, 54321) self.assertEqual(config.prompt_dir, Path("alternate-prompts")) if __name__ == "__main__": unittest.main()