PDF-Assit_RAG / backend /tests /test_api.py
Param20h's picture
deploy: pure backend API with keywords fix
7c46845 unverified
Raw
History Blame Contribute Delete
3.29 kB
import pytest
from httpx import AsyncClient, ASGITransport
from app.main import app # Adjust this import based on where the FastAPI app instance lives
# Mark all tests in this module to use asyncio
pytestmark = pytest.mark.anyio
async def test_health_check_route():
# Use ASGITransport to test the FastAPI app directly without running a server
async with AsyncClient(transport=ASGITransport(app=app), base_url="http://testserver") as ac:
response = await ac.get("/health") # Replace with a real route from the app
assert response.status_code == 200
# Add more assertions based on expected JSON response
async def test_health_check_db_healthy_chroma_healthy(monkeypatch):
# Case 1: DB healthy, Chroma healthy -> status = healthy
# Both are healthy by default in test env (get_db yields test db, get_chroma_client works)
async with AsyncClient(transport=ASGITransport(app=app), base_url="http://testserver") as ac:
response = await ac.get("/health")
assert response.status_code == 200
data = response.json()
assert data["status"] == "healthy"
assert data["db"] == "up"
assert data["chroma"] == "up"
async def test_health_check_db_healthy_chroma_unhealthy(monkeypatch):
# Case 2: DB healthy, Chroma unhealthy -> status = degraded
def mock_get_chroma_client_down():
raise Exception("Chroma connection refused")
monkeypatch.setattr("app.main.get_chroma_client", mock_get_chroma_client_down)
async with AsyncClient(transport=ASGITransport(app=app), base_url="http://testserver") as ac:
response = await ac.get("/health")
assert response.status_code == 200
data = response.json()
assert data["status"] == "degraded"
assert data["db"] == "up"
assert data["chroma"] == "down"
async def test_health_check_db_unhealthy_chroma_healthy(monkeypatch):
# Case 3: DB unhealthy, Chroma healthy -> status = degraded
from sqlalchemy.exc import SQLAlchemyError
def mock_get_db_down():
raise SQLAlchemyError("DB Connection refused")
yield
monkeypatch.setattr("app.main.get_db", mock_get_db_down)
async with AsyncClient(transport=ASGITransport(app=app), base_url="http://testserver") as ac:
response = await ac.get("/health")
assert response.status_code == 200
data = response.json()
assert data["status"] == "degraded"
assert data["db"] == "down"
assert data["chroma"] == "up"
async def test_health_check_db_unhealthy_chroma_unhealthy(monkeypatch):
# Case 4: DB unhealthy, Chroma unhealthy -> status = unhealthy
from sqlalchemy.exc import SQLAlchemyError
def mock_get_db_down():
raise SQLAlchemyError("DB Connection refused")
yield
def mock_get_chroma_client_down():
raise Exception("Chroma connection refused")
monkeypatch.setattr("app.main.get_db", mock_get_db_down)
monkeypatch.setattr("app.main.get_chroma_client", mock_get_chroma_client_down)
async with AsyncClient(transport=ASGITransport(app=app), base_url="http://testserver") as ac:
response = await ac.get("/health")
assert response.status_code == 200
data = response.json()
assert data["status"] == "unhealthy"
assert data["db"] == "down"
assert data["chroma"] == "down"