SignalMod / tests /test_api.py
Mirae Kang
feat: implement unit tests, #13
447c4a0
Raw History Blame
1.61 kB
"""Tests del endpoint POST /predict."""
from unittest.mock import MagicMock
import pytest
from fastapi.testclient import TestClient
from src.api import main as api_main
PREDICT_RESPONSE_KEYS = {
"text",
"is_toxic",
"probability",
"labels",
"model_used",
"latency_ms",
}
@pytest.fixture
def client():
mock_service = MagicMock()
mock_service.predict.return_value = {
"is_toxic": False,
"probability": 0.12,
"labels": [],
"model_used": "LR + TF-IDF (local)",
}
with TestClient(api_main.app) as test_client:
api_main._state["service"] = mock_service
api_main._state["model_name"] = "LR + TF-IDF (local)"
api_main._state["predictions_served"] = 0
yield test_client
api_main._state["service"] = None
api_main._state["model_name"] = None
def test_predict_returns_correct_structure(client: TestClient):
response = client.post(
"/predict",
json={"text": "This is a sample comment", "threshold": 0.5},
)
assert response.status_code == 200
data = response.json()
assert PREDICT_RESPONSE_KEYS <= set(data.keys())
assert data["text"] == "This is a sample comment"
assert isinstance(data["is_toxic"], bool)
assert 0.0 <= data["probability"] <= 1.0
assert isinstance(data["labels"], list)
assert isinstance(data["model_used"], str)
assert isinstance(data["latency_ms"], (int, float))
def test_predict_rejects_empty_text(client: TestClient):
response = client.post("/predict", json={"text": " "})
assert response.status_code == 422