futurisys_ml_api / tests /test_endpoints.py
NIX3S
add HF model
9ca0b5a
# tests/test_endpoints.py
import pytest
from fastapi.testclient import TestClient
from app.main import app
from app.services.prediction import predict
from app.api.endpoints import InputData
from fastapi import HTTPException
client = TestClient(app)
# ----------------------
# Données valides
# ----------------------
valid_data = {
"NumberofFloors": 50,
"NumberofBuildings": 1,
"GFAPerFloor": 500,
"PropertyGFATotal": 500000,
"GFA_Prison_Incarceration": 0,
"GFA_College_University": 0,
"GFA_Office": 0,
"GFA_Parking": 0,
"GFA_Medical_Office": 0,
"GFA_Indoor_Arena": 0,
"GFA_Hospital_General_Medical_Surgical": 0,
"GFA_Data_Center": 0,
"GFA_Laboratory": 0,
"GFA_Supermarket_Grocery_Store": 0,
"GFA_Urgent_Care_Clinic_Other_Outpatient": 0,
"BuildingType_Nonresidential_WA": 0,
"ZipCode_infrequent_sklearn": 0,
"EPAPropertyType_infrequent_sklearn": 0
}
# ----------------------
# Test endpoint /predict avec données valides
# ----------------------
def test_predict_valid_endpoint():
response = client.post("/predict", json=valid_data)
assert response.status_code == 200
json_resp = response.json()
assert "prediction" in json_resp
assert isinstance(json_resp["prediction"], float)
# ----------------------
# Test endpoint /predict avec feature manquante -> HTTP 422
# ----------------------
def test_predict_missing_feature():
invalid_data = valid_data.copy()
del invalid_data["NumberofFloors"] # supprime une colonne obligatoire
response = client.post("/predict", json=invalid_data)
assert response.status_code == 422
json_resp = response.json()
assert "Feature manquante" in str(json_resp["detail"])
# ----------------------
# Test endpoint /predict avec type incorrect -> HTTP 422
# ----------------------
def test_predict_wrong_type():
invalid_data = valid_data.copy()
invalid_data["NumberofFloors"] = "cinquante" # string au lieu d'int
response = client.post("/predict", json=invalid_data)
assert response.status_code == 422
json_resp = response.json()
assert any("Input should be a valid integer" in msg for msg in json_resp["detail"])
# ----------------------
# Test endpoint /predict pour erreur interne -> HTTP 500
# ----------------------
def test_predict_internal_error(monkeypatch):
# Force une exception dans predict()
def fake_predict(data):
raise Exception("Erreur inattendue")
monkeypatch.setattr("app.api.endpoints.predict", fake_predict)
response = client.post("/predict", json=valid_data)
assert response.status_code == 500
json_resp = response.json()
assert json_resp["detail"] == "Erreur interne du serveur"