Files
ai-balance-monitor/tests/test_providers.py
T

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"