AIstudioProxyAPI / tests /api_utils /routers /test_model_capabilities.py
peijun1's picture
Deploy AI Studio Proxy API to Hugging Face Spaces
a5784e9
Raw
History Blame Contribute Delete
6.81 kB
"""
Tests for api_utils/routers/model_capabilities.py
Tests for model capability determination and API endpoints.
"""
import pytest
from fastapi.testclient import TestClient
from api_utils.routers.model_capabilities import (
_get_model_capabilities,
router,
)
# ==================== _get_model_capabilities TESTS ====================
class TestGetModelCapabilities:
"""Tests for _get_model_capabilities helper function."""
def test_gemini3_flash(self):
"""Test Gemini 3 Flash model capabilities."""
result = _get_model_capabilities("gemini-3-flash")
assert result["thinkingType"] == "level"
assert result["levels"] == ["minimal", "low", "medium", "high"]
assert result["defaultLevel"] == "high"
assert result["supportsGoogleSearch"] is True
def test_gemini3_flash_variant(self):
"""Test Gemini 3 Flash variant (gemini3flash)."""
result = _get_model_capabilities("gemini3flash-exp")
assert result["thinkingType"] == "level"
assert "minimal" in result["levels"]
def test_gemini3_pro(self):
"""Test Gemini 3 Pro model capabilities."""
result = _get_model_capabilities("gemini-3-pro")
assert result["thinkingType"] == "level"
assert result["levels"] == ["low", "high"]
assert result["defaultLevel"] == "high"
assert result["supportsGoogleSearch"] is True
def test_gemini3_pro_variant(self):
"""Test Gemini 3 Pro variant (gemini3pro)."""
result = _get_model_capabilities("gemini3pro-latest")
assert result["thinkingType"] == "level"
assert result["levels"] == ["low", "high"]
def test_gemini25_pro(self):
"""Test Gemini 2.5 Pro model capabilities."""
result = _get_model_capabilities("gemini-2.5-pro-preview")
assert result["thinkingType"] == "budget"
assert result["alwaysOn"] is True
assert result["budgetRange"] == [1024, 32768]
assert result["defaultBudget"] == 32768
assert result["supportsGoogleSearch"] is True
def test_gemini25_pro_variant(self):
"""Test Gemini 2.5 Pro variant (gemini-2.5pro)."""
result = _get_model_capabilities("gemini-2.5pro-exp")
assert result["thinkingType"] == "budget"
assert result["alwaysOn"] is True
def test_gemini25_flash(self):
"""Test Gemini 2.5 Flash model capabilities."""
result = _get_model_capabilities("gemini-2.5-flash-preview")
assert result["thinkingType"] == "budget"
assert result["alwaysOn"] is False
assert result["budgetRange"] == [512, 24576]
assert result["defaultBudget"] == 24576
assert result["supportsGoogleSearch"] is True
def test_gemini25_flash_variant(self):
"""Test Gemini 2.5 Flash variant (gemini-2.5flash)."""
result = _get_model_capabilities("gemini-2.5flash-exp")
assert result["thinkingType"] == "budget"
assert result["alwaysOn"] is False
def test_gemini_flash_latest(self):
"""Test gemini-flash-latest maps to 2.5 Flash."""
result = _get_model_capabilities("gemini-flash-latest")
assert result["thinkingType"] == "budget"
assert result["alwaysOn"] is False
def test_gemini_flash_lite_latest(self):
"""Test gemini-flash-lite-latest maps to 2.5 Flash."""
result = _get_model_capabilities("gemini-flash-lite-latest")
assert result["thinkingType"] == "budget"
assert result["alwaysOn"] is False
def test_gemini20(self):
"""Test Gemini 2.0 model capabilities (no thinking)."""
result = _get_model_capabilities("gemini-2.0-flash-exp")
assert result["thinkingType"] == "none"
assert result["supportsGoogleSearch"] is False
def test_gemini20_variant(self):
"""Test Gemini 2.0 variant (gemini2.0)."""
result = _get_model_capabilities("gemini2.0-flash")
assert result["thinkingType"] == "none"
assert result["supportsGoogleSearch"] is False
def test_gemini_robotics(self):
"""Test Gemini robotics model (special case - has Google Search)."""
result = _get_model_capabilities("gemini-robotics-er-1.5-preview")
assert result["thinkingType"] == "none"
assert result["supportsGoogleSearch"] is True
def test_other_model(self):
"""Test unknown/other model falls back to defaults."""
result = _get_model_capabilities("some-other-model")
assert result["thinkingType"] == "none"
assert result["supportsGoogleSearch"] is True
def test_case_insensitive(self):
"""Test model matching is case insensitive."""
result = _get_model_capabilities("GEMINI-3-FLASH")
assert result["thinkingType"] == "level"
# ==================== API Endpoint TESTS ====================
@pytest.fixture
def client():
"""Create test client for the router."""
from fastapi import FastAPI
app = FastAPI()
app.include_router(router)
return TestClient(app)
class TestModelCapabilitiesEndpoints:
"""Tests for model capabilities API endpoints."""
@pytest.mark.asyncio
async def test_get_model_capabilities_endpoint(self, client):
"""Test GET /api/model-capabilities returns full structure."""
response = client.get("/api/model-capabilities")
assert response.status_code == 200
data = response.json()
assert "categories" in data
assert "matchers" in data
# Verify categories
categories = data["categories"]
assert "gemini3Flash" in categories
assert "gemini3Pro" in categories
assert "gemini25Pro" in categories
assert "gemini25Flash" in categories
assert "gemini2" in categories
assert "other" in categories
# Verify matchers
matchers = data["matchers"]
assert len(matchers) >= 5
assert all("pattern" in m and "category" in m for m in matchers)
@pytest.mark.asyncio
async def test_get_single_model_capabilities_endpoint(self, client):
"""Test GET /api/model-capabilities/{model_id} returns model capabilities."""
response = client.get("/api/model-capabilities/gemini-3-flash")
assert response.status_code == 200
data = response.json()
assert data["thinkingType"] == "level"
assert "levels" in data
@pytest.mark.asyncio
async def test_get_single_model_unknown(self, client):
"""Test GET /api/model-capabilities/{model_id} for unknown model."""
response = client.get("/api/model-capabilities/unknown-model")
assert response.status_code == 200
data = response.json()
assert data["thinkingType"] == "none"
assert data["supportsGoogleSearch"] is True