Files
multi-bot-tg/tests/test_config_services.py
Azimkin a84467c385 feat: add Claude and OpenRouter AI providers
OpenRouter is used when no provider flag is set. Claude is selected with .cl, and GLM stays available via .glm.
2026-10-13 08:56:16 +00:00

103 lines
4.4 KiB
Python

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()