"""内置平台适配器测试。""" import pytest from app.expr import ExprError from app.providers import get_provider, list_providers from app.providers.deepseek import DeepSeekProvider from app.providers.openrouter import OpenRouterProvider DEEPSEEK_RESPONSE = { "is_available": True, "balance_infos": [ { "currency": "CNY", "total_balance": "1.34", "granted_balance": "0.00", "topped_up_balance": "1.34", } ], } class TestDeepSeek: def test_build_request(self): prov = DeepSeekProvider() url, headers, body = prov.build_request("sk-abc") assert url == "https://api.deepseek.com/user/balance" assert headers["Authorization"] == "Bearer sk-abc" assert body is None assert prov.method == "GET" def test_extract_balance(self): assert DeepSeekProvider().extract_balance(DEEPSEEK_RESPONSE) == 1.34 def test_extract_missing(self): with pytest.raises(ExprError): DeepSeekProvider().extract_balance({"is_available": False}) class TestOpenRouter: def test_build_request(self): prov = OpenRouterProvider() url, headers, body = prov.build_request("sk-or-1") assert url == "https://openrouter.ai/api/v1/credits" assert headers["Authorization"] == "Bearer sk-or-1" assert body is None def test_extract_balance_remaining(self): resp = {"data": {"total_credits": 100.5, "total_usage": 25.75}} assert OpenRouterProvider().extract_balance(resp) == 74.75 def test_extract_zero_usage(self): resp = {"data": {"total_credits": 10.0, "total_usage": 0}} assert OpenRouterProvider().extract_balance(resp) == 10.0 def test_extract_missing(self): with pytest.raises(ExprError): OpenRouterProvider().extract_balance({"data": {}}) class TestRegistry: def test_get_provider(self): assert isinstance(get_provider("deepseek"), DeepSeekProvider) assert isinstance(get_provider("openrouter"), OpenRouterProvider) def test_unknown_provider_none(self): assert get_provider("nope") is None def test_list_providers(self): provs = list_providers() ids = [p["id"] for p in provs] assert "deepseek" in ids and "openrouter" in ids dp = next(p for p in provs if p["id"] == "deepseek") assert dp["name"] == "DeepSeek" and dp["currency"] == "CNY" and dp["icon"] == "DeepSeek" orp = next(p for p in provs if p["id"] == "openrouter") assert orp["currency"] == "USD" and orp["icon"] == "OpenRouter"