77 lines
2.6 KiB
Python
77 lines
2.6 KiB
Python
"""内置平台适配器测试。"""
|
|
|
|
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"
|