""" Tests du contenu des emails : le résumé des articles en stock bas ajouté à l'alerte immédiate, et l'email récapitulatif périodique (stock bas puis reste du stock groupé par catégorie). """ from sqlmodel import Session from app.email_alerts import envoyer_resume_stock, verifier_et_alerter from app.models import Categorie, DestinataireAlerte, Materiel def _categorie(session: Session, nom: str) -> Categorie: categorie = Categorie(nom=nom) session.add(categorie) session.commit() session.refresh(categorie) return categorie def test_alerte_immediate_inclut_le_resume_des_stocks_bas(session: Session, capsys): categorie = _categorie(session, "Ordinateurs") # Un autre matériel déjà en stock bas, pour vérifier qu'il apparaît # dans le résumé même s'il n'est pas celui qui déclenche l'alerte. session.add(Materiel(nom="Souris USB", categorie_id=categorie.id, quantite=1, seuil_alerte=5)) materiel = Materiel(nom="PC Dell XPS 13", categorie_id=categorie.id, quantite=2, seuil_alerte=5) session.add(materiel) session.add(DestinataireAlerte(email="it-dept@clinique.local")) session.commit() session.refresh(materiel) verifier_et_alerter(materiel, session) sortie = capsys.readouterr().out assert "Stock bas : PC Dell XPS 13" in sortie assert "Tous les articles actuellement en stock bas" in sortie assert "Souris USB" in sortie assert "PC Dell XPS 13" in sortie def test_resume_stock_separe_stock_bas_et_reste_du_stock(session: Session, capsys): categorie = _categorie(session, "Réseau") session.add( Materiel(nom="Câble RJ45 2m", categorie_id=categorie.id, quantite=1, seuil_alerte=10) ) session.add(Materiel(nom="Switch 8 ports", categorie_id=categorie.id, quantite=6)) session.add(DestinataireAlerte(email="it-dept@clinique.local")) session.commit() envoyer_resume_stock(session) sortie = capsys.readouterr().out assert "=== Stock bas ===" in sortie assert "=== Reste du stock ===" in sortie position_bas = sortie.index("=== Stock bas ===") position_reste = sortie.index("=== Reste du stock ===") position_cable = sortie.index("Câble RJ45 2m") position_switch = sortie.index("Switch 8 ports") # Le câble (en stock bas) doit apparaître dans la première section, # le switch (pas en stock bas) dans la seconde. assert position_bas < position_cable < position_reste assert position_reste < position_switch def test_resume_stock_sans_destinataire_ne_leve_pas_derreur(session: Session, capsys): _categorie(session, "Réseau") envoyer_resume_stock(session) sortie = capsys.readouterr().out assert "aucun destinataire" in sortie.lower()