Đỗ Hải Nam
feat(backend): core multi-agent orchestration and API
ba5110e
"""
Test cases for FastAPI endpoints.
Tests health, conversations, and rate limit APIs.
"""
import pytest
from fastapi.testclient import TestClient
from backend.app import app
client = TestClient(app)
class TestHealthEndpoint:
"""Test suite for health check endpoint."""
def test_health_check(self):
"""TC-API-001: Health endpoint should return healthy status."""
response = client.get("/api/health")
assert response.status_code == 200
data = response.json()
assert data["status"] == "healthy"
assert data["service"] == "algebra-chatbot"
class TestConversationEndpoints:
"""Test suite for conversation CRUD endpoints."""
def test_list_conversations_empty(self):
"""TC-API-002: List conversations should return array."""
response = client.get("/api/conversations")
assert response.status_code == 200
assert isinstance(response.json(), list)
def test_create_conversation(self):
"""TC-API-003: Create conversation should return new conversation."""
response = client.post("/api/conversations")
assert response.status_code == 200
data = response.json()
assert "id" in data
assert "created_at" in data
return data["id"]
def test_delete_conversation(self):
"""TC-API-004: Delete conversation should succeed."""
# First create
create_response = client.post("/api/conversations")
conv_id = create_response.json()["id"]
# Then delete
delete_response = client.delete(f"/api/conversations/{conv_id}")
assert delete_response.status_code == 200
assert delete_response.json()["status"] == "deleted"
def test_get_messages_empty(self):
"""TC-API-005: New conversation should have no messages."""
# Create conversation
create_response = client.post("/api/conversations")
conv_id = create_response.json()["id"]
# Get messages
messages_response = client.get(f"/api/conversations/{conv_id}/messages")
assert messages_response.status_code == 200
assert messages_response.json() == []
# Cleanup
client.delete(f"/api/conversations/{conv_id}")
class TestRateLimitEndpoints:
"""Test suite for rate limit status endpoints."""
def test_get_rate_limit_status(self):
"""TC-API-006: Rate limit status should return valid structure."""
response = client.get("/api/rate-limit/test_session")
assert response.status_code == 200
data = response.json()
assert "requests_this_minute" in data
assert "tokens_today" in data
assert "limits" in data
def test_rate_limit_limits_structure(self):
"""TC-API-007: Rate limit should have correct limit values."""
response = client.get("/api/rate-limit/test_session")
data = response.json()
limits = data["limits"]
assert limits["rpm"] == 30
assert limits["rpd"] == 1000
assert limits["tpm"] == 8000
assert limits["tpd"] == 200000
class TestWolframStatusEndpoint:
"""Test suite for Wolfram API status endpoint."""
def test_wolfram_status(self):
"""TC-API-008: Wolfram status should return usage info."""
response = client.get("/api/wolfram-status")
assert response.status_code == 200
data = response.json()
assert "used" in data
assert "limit" in data
assert "remaining" in data
assert "month" in data
assert data["limit"] == 2000
def test_wolfram_remaining_calculation(self):
"""TC-API-009: Remaining should equal limit minus used."""
response = client.get("/api/wolfram-status")
data = response.json()
assert data["remaining"] == data["limit"] - data["used"]
class TestChatEndpoint:
"""Test suite for chat endpoint."""
def test_chat_creates_session(self):
"""TC-API-010: Chat without session_id should create new session."""
response = client.post(
"/api/chat",
data={"message": "Hello"},
)
assert response.status_code == 200
# Should have session ID in header
assert "X-Session-Id" in response.headers or response.status_code == 200
def test_chat_with_session(self):
"""TC-API-011: Chat with existing session_id should work."""
# Create conversation first
create_response = client.post("/api/conversations")
conv_id = create_response.json()["id"]
response = client.post(
"/api/chat",
data={"message": "Test message", "session_id": conv_id},
)
assert response.status_code == 200
# Cleanup
client.delete(f"/api/conversations/{conv_id}")
def test_chat_invalid_session(self):
"""TC-API-012: Chat with invalid session_id should return 404."""
response = client.post(
"/api/chat",
data={"message": "Test", "session_id": "invalid-uuid-12345"},
)
assert response.status_code == 404