Skip to content

Commit 2dc1e8b

Browse files
committed
test(server): quota 端点开发者白名单豁免分支测试
1 parent 49f9abf commit 2dc1e8b

1 file changed

Lines changed: 65 additions & 0 deletions

File tree

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""
2+
测试配额端点(GET /api/v1/license/quota)——重点覆盖开发者白名单豁免分支
3+
4+
@ai-context: is_dev 用户(DEV_USER_IDS 白名单)返回 total_calls=-1 /
5+
cost_limit=-1(客户端渲染 ∞,避免误导性显示 120 次/天),普通用户返回
6+
tier 对应实际限额(free=15 次/0.5 元)。
7+
"""
8+
9+
import sys
10+
from pathlib import Path
11+
12+
GATEWAY_ROOT = str(Path(__file__).resolve().parent.parent)
13+
if GATEWAY_ROOT not in sys.path:
14+
sys.path.insert(0, GATEWAY_ROOT)
15+
16+
from fastapi import FastAPI
17+
from fastapi.testclient import TestClient
18+
19+
from middleware.auth import verify_token
20+
from routers.license import router as license_router
21+
22+
23+
def _create_app(is_dev: bool) -> FastAPI:
24+
"""构造仅含 license 路由的测试 app:覆写 token 依赖 + 注入 request.state"""
25+
app = FastAPI()
26+
app.include_router(license_router)
27+
28+
async def override_verify_token():
29+
return "test-user"
30+
31+
app.dependency_overrides[verify_token] = override_verify_token
32+
33+
@app.middleware("http")
34+
async def inject_state(request, call_next):
35+
# 模拟 auth 中间件注入的身份信息
36+
request.state.user_id = "test-user"
37+
request.state.is_dev = is_dev
38+
request.state.beta_tier = None
39+
request.state.paid_tier = None
40+
return await call_next(request)
41+
42+
return app
43+
44+
45+
class TestQuotaDeveloperExemption:
46+
"""开发者白名单:无限配额展示(-1 = 不限)"""
47+
48+
def test_dev_returns_unlimited(self):
49+
client = TestClient(_create_app(is_dev=True))
50+
resp = client.get("/api/v1/license/quota")
51+
assert resp.status_code == 200
52+
data = resp.json()
53+
assert data["total_calls"] == -1
54+
assert data["cost_limit"] == -1
55+
assert data["tier"] == "lifetime"
56+
assert data["expires_at"] is None
57+
58+
def test_regular_user_returns_free_limits(self):
59+
client = TestClient(_create_app(is_dev=False))
60+
resp = client.get("/api/v1/license/quota")
61+
assert resp.status_code == 200
62+
data = resp.json()
63+
# free tier 每日 15 次 / 0.5 元(TIER_LIMITS 默认档)
64+
assert data["total_calls"] == 15
65+
assert data["cost_limit"] == 0.5

0 commit comments

Comments
 (0)