churn-predictor / tests /test_api.py
github-actions
Déploiement automatique depuis GitHub Actions (branche main)
442d016
Raw
History Blame Contribute Delete
2.61 kB
import os
import sys
from fastapi.testclient import TestClient
# Ajouter la racine du projet au PYTHONPATH
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from main_api import app
client = TestClient(app)
def test_health_check():
response = client.get("/health")
assert response.status_code == 200
data = response.json()
assert data["status"] in ("healthy", "unhealthy")
assert "modele" in data
assert "scaler" in data
def test_test_prediction_ok_and_has_fields():
response = client.post("/test-prediction")
assert response.status_code == 200
data = response.json()
for field in [
"prediction",
"probabilite_abandon",
"seuil_applique",
"confiance_modele",
"recommandation",
"details",
]:
assert field in data
for field in ["prob_rester", "prob_partir", "satisfaction_moyenne"]:
assert field in data["details"]
from main_api import GenreEnum, EtatCivilEnum, DepartementEnum, \
DomaineEtudeEnum, FrequenceDeplacementEnum
def build_payload(**overrides):
base = dict(
age=35,
genre=GenreEnum.masculin.value,
etat_civil=EtatCivilEnum.celibataire.value,
salaire=5000,
distance=5,
departement=DepartementEnum.consulting.value,
domaine_etude=DomaineEtudeEnum.transformation_digitale.value,
niveau_hierarchique=2,
poste_freq_deplacement=FrequenceDeplacementEnum.modere.value,
emplois_precedents=3,
experience_totale=8,
annees_entreprise=5,
annees_poste=2,
annees_derniere_promotion=1,
annees_responsable_actuel=3,
heures_semaine=40,
heures_supplementaires=False,
employes_supervision=0,
evaluation_precedente=3,
evaluation_actuelle=3,
satisfaction_environnement=3,
satisfaction_travail=3,
satisfaction_equipe=3,
satisfaction_balance=3,
augmentation_salaire=15,
participation_pee=1,
formations_completees=2,
)
base.update(overrides)
return base
def test_predict_single_valid_employee():
payload = build_payload()
response = client.post("/predict", json=payload)
assert response.status_code == 200
data = response.json()
assert data["prediction"] in ("Risque Élevé", "Risque Faible")
assert 0 <= data["probabilite_abandon"] <= 100
def test_predict_missing_field_returns_422():
payload = build_payload()
payload.pop("age")
response = client.post("/predict", json=payload)
assert response.status_code == 422