Nicolas Delebecque opened issue #33: fix: prevent SMTP connection attempt during test suite at Nicolas Delebecque / Countdowns

Nicolas Delebecque
2026-04-15T20:11:27Z

Résumé

yarn test:server retourne un exit code 1 à cause d'une tentative de connexion SMTP dans SecurityAlerter au démarrage des tests, alors qu'aucun serveur SMTP n'est configuré dans l'environnement de test.

Comportement actuel

unhandledRejection: connect ECONNREFUSED 127.0.0.1:1025 [Lifecycle] 💥 Unhandled rejection at: [object Promise], reason: Error: connect ECONNREFUSED [Lifecycle] 🚨 Force exiting with code 1

Toutes les assertions Mocha passent (218 ✔️, 0 ✗), mais le processus se termine avec code 1. La CI/CD interprète ce code comme un échec.

Cause

SecurityAlerter (singleton) appelle verifyTransporter() à l'initialisation. Cette méthode exécute this.transporter.verify(callback) sur le transport nodemailer.

La connexion SMTP échoue car .env.test ne définit pas COUNTDOWNS_EMAIL_SMTP_HOST ni COUNTDOWNS_EMAIL_SMTP_PORT, ce qui fait tomber sur le défaut localhost:1025.

Nodemailer émet une rejection non gérée sur la Promise interne, que AppLifecycle intercepte via son handler unhandledRejection et force l'exit avec code 1.

Fichiers concernés

src/shared/infra/security/alerting/SecurityAlerter.ts — méthode verifyTransporter()

src/shared/infra/lifecycle/appLifecycle.ts — handler unhandledRejection

.env.test — absence de config SMTP

Solutions envisageables

Option A — Désactiver la vérification SMTP en mode test (recommandé) Conditionner l'appel verifyTransporter() à NODE_ENV !== 'test' dans SecurityAlerter.

Option B — Ajouter une config SMTP factice dans .env.test Pointer vers un serveur SMTP de test (mailpit, mailhog, ou nodemailer.createTestAccount()). Nécessite une dépendance ou un service externe.

Option C — Absorber l'erreur dans verifyTransporter() Wrapper l'appel verify() dans un try/catch ou retourner une Promise rejetée de manière gérée pour éviter que l'erreur remonte en unhandledRejection.

Critère d'acceptation

yarn test:server retourne exit code 0 quand toutes les assertions passent, quel que soit l'environnement.