forked from retoor/devplacepy
83 lines
2.4 KiB
Python
83 lines
2.4 KiB
Python
# retoor <retoor@molodetz.nl>
|
|||
|
|
|
||
|
|
import requests
|
||
|
|
|
||
|
|
from tests.api.admin.gateway.index import JSON_gateway, admin_session, member_key
|
||
|
|
from tests.conftest import BASE_URL
|
||
|
|
|
||
|
|
|
||
|
|
def test_stats_tab_renders_for_admin(seeded_db):
|
||
|
|
admin = admin_session(seeded_db)
|
||
|
|
response = admin.get(
|
||
|
|
f"{BASE_URL}/admin/gateway?tab=stats", headers={"Accept": "text/html"}
|
||
|
|
)
|
||
|
|
assert response.status_code == 200
|
||
|
|
assert "Model pool" in response.text
|
||
|
|
assert "Model routes" not in response.text
|
||
|
|
|
||
|
|
|
||
|
|
def test_stats_data_requires_admin(seeded_db):
|
||
|
|
assert (
|
||
|
|
requests.get(
|
||
|
|
f"{BASE_URL}/admin/gateway/stats/data", headers=JSON_gateway, allow_redirects=False
|
||
|
|
).status_code
|
||
|
|
== 401
|
||
|
|
)
|
||
|
|
key = member_key()
|
||
|
|
assert (
|
||
|
|
requests.get(
|
||
|
|
f"{BASE_URL}/admin/gateway/stats/data",
|
||
|
|
headers={**JSON_gateway, "X-API-KEY": key},
|
||
|
|
allow_redirects=False,
|
||
|
|
).status_code
|
||
|
|
== 403
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_stats_data_shape_for_admin(seeded_db):
|
||
|
|
admin = admin_session(seeded_db)
|
||
|
|
response = admin.get(f"{BASE_URL}/admin/gateway/stats/data?range=24h", headers=JSON_gateway)
|
||
|
|
assert response.status_code == 200
|
||
|
|
data = response.json()
|
||
|
|
for key in (
|
||
|
|
"totals",
|
||
|
|
"per_model",
|
||
|
|
"per_endpoint",
|
||
|
|
"per_provider",
|
||
|
|
"timeseries",
|
||
|
|
"status_codes",
|
||
|
|
"streaming_split",
|
||
|
|
"failure_reasons",
|
||
|
|
"hourly_distribution",
|
||
|
|
"recent_failures",
|
||
|
|
"latency_histogram",
|
||
|
|
"tokens_per_second_histogram",
|
||
|
|
"bucket_seconds",
|
||
|
|
):
|
||
|
|
assert key in data
|
||
|
|
|
||
|
|
|
||
|
|
def test_stats_data_rejects_unknown_range(seeded_db):
|
||
|
|
admin = admin_session(seeded_db)
|
||
|
|
response = admin.get(f"{BASE_URL}/admin/gateway/stats/data?range=nonsense", headers=JSON_gateway)
|
||
|
|
assert response.status_code == 400
|
||
|
|
|
||
|
|
|
||
|
|
def test_stats_models_returns_a_list(seeded_db):
|
||
|
|
admin = admin_session(seeded_db)
|
||
|
|
response = admin.get(f"{BASE_URL}/admin/gateway/stats/models", headers=JSON_gateway)
|
||
|
|
assert response.status_code == 200
|
||
|
|
assert isinstance(response.json()["models"], list)
|
||
|
|
|
||
|
|
|
||
|
|
def test_stats_model_detail_for_an_unknown_model(seeded_db):
|
||
|
|
admin = admin_session(seeded_db)
|
||
|
|
response = admin.get(
|
||
|
|
f"{BASE_URL}/admin/gateway/stats/model/default/never-called-model?range=24h",
|
||
|
|
headers=JSON_gateway,
|
||
|
|
)
|
||
|
|
assert response.status_code == 200
|
||
|
|
data = response.json()
|
||
|
|
assert data["summary"]["total_requests"] == 0
|
||
|
|
assert data["health"] is None
|