2026-07-14 16:38:59 +00:00
|
|
|
"""
|
2026-07-14 17:06:37 +00:00
|
|
|
Tests du flux principal : créer une arborescence de catégories, créer un
|
2026-07-14 16:38:59 +00:00
|
|
|
matériel, le retrouver par scan, ajuster son stock, et vérifier que
|
|
|
|
|
l'alerte de stock bas se déclenche (elle est simplement affichée dans la
|
|
|
|
|
console tant qu'aucun SMTP n'est configuré, voir app/email_alerts.py).
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from sqlmodel import Session, select
|
|
|
|
|
|
2026-07-14 17:06:37 +00:00
|
|
|
from app.models import Categorie, DestinataireAlerte, Materiel
|
2026-07-14 16:38:59 +00:00
|
|
|
|
|
|
|
|
|
2026-07-14 17:06:37 +00:00
|
|
|
def _creer_sous_categorie(session: Session) -> Categorie:
|
|
|
|
|
"""Crée une petite arborescence à 2 niveaux (Ordinateurs > Portables)
|
|
|
|
|
pour les tests qui n'ont pas besoin de tester la profondeur illimitée
|
|
|
|
|
elle-même — voir test_categories.py pour ça."""
|
|
|
|
|
racine = Categorie(nom="Ordinateurs")
|
|
|
|
|
session.add(racine)
|
2026-07-14 16:38:59 +00:00
|
|
|
session.commit()
|
2026-07-14 17:06:37 +00:00
|
|
|
session.refresh(racine)
|
2026-07-14 16:38:59 +00:00
|
|
|
|
2026-07-14 17:06:37 +00:00
|
|
|
enfant = Categorie(nom="Portables", parent_id=racine.id)
|
|
|
|
|
session.add(enfant)
|
2026-07-14 16:38:59 +00:00
|
|
|
session.commit()
|
2026-07-14 17:06:37 +00:00
|
|
|
session.refresh(enfant)
|
|
|
|
|
return enfant
|
2026-07-14 16:38:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_creation_materiel(client, session):
|
|
|
|
|
sous_categorie = _creer_sous_categorie(session)
|
|
|
|
|
|
|
|
|
|
reponse = client.post(
|
|
|
|
|
"/materiels",
|
|
|
|
|
data={
|
|
|
|
|
"nom": "PC Dell XPS 13",
|
2026-07-14 17:06:37 +00:00
|
|
|
"categorie_id": sous_categorie.id,
|
2026-07-14 16:38:59 +00:00
|
|
|
"code_barre": "1234567890123",
|
|
|
|
|
"quantite": "5",
|
|
|
|
|
"seuil_alerte": "2",
|
|
|
|
|
},
|
|
|
|
|
follow_redirects=False,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert reponse.status_code == 303
|
|
|
|
|
materiel = session.exec(select(Materiel)).first()
|
|
|
|
|
assert materiel is not None
|
|
|
|
|
assert materiel.quantite == 5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_scan_trouve_le_materiel_par_code_barre(client, session):
|
|
|
|
|
sous_categorie = _creer_sous_categorie(session)
|
|
|
|
|
session.add(
|
|
|
|
|
Materiel(
|
|
|
|
|
nom="Câble RJ45 2m",
|
2026-07-14 17:06:37 +00:00
|
|
|
categorie_id=sous_categorie.id,
|
2026-07-14 16:38:59 +00:00
|
|
|
code_barre="9998887776665",
|
|
|
|
|
quantite=10,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
session.commit()
|
|
|
|
|
|
|
|
|
|
reponse = client.post("/scan", data={"code_barre": "9998887776665"})
|
|
|
|
|
|
|
|
|
|
assert reponse.status_code == 200
|
|
|
|
|
assert "Câble RJ45 2m" in reponse.text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_scan_code_inconnu_affiche_une_erreur(client, session):
|
|
|
|
|
_creer_sous_categorie(session)
|
|
|
|
|
|
|
|
|
|
reponse = client.post("/scan", data={"code_barre": "0000000000000"})
|
|
|
|
|
|
|
|
|
|
assert reponse.status_code == 200
|
|
|
|
|
assert "Aucun matériel" in reponse.text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_alerte_declenchee_sous_le_seuil(client, session, capsys):
|
|
|
|
|
sous_categorie = _creer_sous_categorie(session)
|
|
|
|
|
materiel = Materiel(
|
|
|
|
|
nom="Souris USB",
|
2026-07-14 17:06:37 +00:00
|
|
|
categorie_id=sous_categorie.id,
|
2026-07-14 16:38:59 +00:00
|
|
|
quantite=3,
|
|
|
|
|
seuil_alerte=5,
|
|
|
|
|
)
|
|
|
|
|
session.add(materiel)
|
|
|
|
|
session.commit()
|
|
|
|
|
session.refresh(materiel)
|
|
|
|
|
session.add(DestinataireAlerte(email="it-dept@clinique.local"))
|
|
|
|
|
session.commit()
|
|
|
|
|
|
|
|
|
|
reponse = client.post(f"/scan/{materiel.id}/ajuster", data={"delta": "-1"})
|
|
|
|
|
|
|
|
|
|
assert reponse.status_code == 200
|
|
|
|
|
sortie = capsys.readouterr().out
|
|
|
|
|
assert "EMAIL SIMULÉ" in sortie
|
|
|
|
|
assert "Souris USB" in sortie
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_pas_alerte_si_stock_suffisant(client, session, capsys):
|
|
|
|
|
sous_categorie = _creer_sous_categorie(session)
|
|
|
|
|
materiel = Materiel(
|
|
|
|
|
nom="Clavier USB",
|
2026-07-14 17:06:37 +00:00
|
|
|
categorie_id=sous_categorie.id,
|
2026-07-14 16:38:59 +00:00
|
|
|
quantite=10,
|
|
|
|
|
seuil_alerte=5,
|
|
|
|
|
)
|
|
|
|
|
session.add(materiel)
|
|
|
|
|
session.commit()
|
|
|
|
|
session.refresh(materiel)
|
|
|
|
|
session.add(DestinataireAlerte(email="it-dept@clinique.local"))
|
|
|
|
|
session.commit()
|
|
|
|
|
|
|
|
|
|
client.post(f"/scan/{materiel.id}/ajuster", data={"delta": "-1"})
|
|
|
|
|
|
|
|
|
|
sortie = capsys.readouterr().out
|
|
|
|
|
assert "EMAIL SIMULÉ" not in sortie
|