"""配置加载测试"""

import os
from pathlib import Path


class TestConfig:
    """配置加载测试"""

    def test_all_required_env_vars_are_documented(self):
        """所有必需的环境变量都应在.env.example中"""
        # 读取.env.example
        env_example_path = Path(__file__).parent.parent / ".env.example"
        assert env_example_path.exists(), ".env.example文件不存在"

        content = env_example_path.read_text()

        # 检查以下变量是否存在
        required_vars = [
            "MOONSHOT_API_KEY",       # Kimi
            "BAIDU_QIANFAN_API_KEY",  # 文心
            "DOUBAO_API_KEY",         # 豆包
            "DEEPSEEK_API_KEY",
            "OPENAI_API_KEY",
            "REDIS_URL",
            "DATABASE_URL",
            "JWT_SECRET",
        ]

        for var in required_vars:
            assert var in content, f".env.example中缺少必需的环境变量: {var}"

    def test_env_var_loading_without_errors(self):
        """环境变量加载应无错误"""
        # 设置测试环境变量
        os.environ["JWT_SECRET"] = "test-secret-key-that-is-long-enough-for-validation"
        os.environ["ENABLE_LLM"] = "false"

        # 重新加载配置模块
        import importlib
        import app.config as config_module
        importlib.reload(config_module)

        from app.config import settings

        assert settings is not None
        assert settings.JWT_SECRET == "test-secret-key-that-is-long-enough-for-validation"

    def test_llm_providers_have_factory(self):
        """LLM提供商应有工厂函数"""
        # 设置测试用 API keys
        os.environ["OPENAI_API_KEY"] = "test-openai-key"
        os.environ["DEEPSEEK_API_KEY"] = "test-deepseek-key"

        from app.services.llm.factory import LLMFactory

        # 验证已注册的提供商
        providers = ["openai", "deepseek"]
        registered = LLMFactory.list_providers()
        for p in providers:
            assert p in registered, f"Provider {p} 未注册"

        # 验证能创建提供商实例
        for p in providers:
            provider = LLMFactory.create(provider=p)
            assert provider is not None
            assert provider.provider_name == p

    def test_rate_limiter_config_exists(self):
        """限流器配置应存在"""
        from app.services.llm.rate_limiter import TokenBucketRateLimiter

        limiter = TokenBucketRateLimiter(max_rpm=30.0)
        assert limiter is not None
        assert limiter.max_rpm == 30.0
