Cypress Maildev - Plugin open source pour tester les emails
Créateur de cypress-maildev, un package npm open source qui simplifie les tests d'emails dans Cypress pour des cas d'usage comme l'inscription avec vérification, l'authentification 2FA, ou la validation du rendu visuel des courriels.
Les points clés
- ▸ Créé un package npm open source pour simplifier les tests d'emails, publié sous licence MIT
- ▸ Développé des commandes Cypress permettant de tester des flows complets (inscription, 2FA, notifications)
- ▸ Implémenté la possibilité de visiter et tester le rendu HTML des emails comme une page web classique
Le contexte
Lors de mes projets, je me suis souvent retrouvé à écrire du code répétitif pour tester les emails en E2E. Maildev propose une API REST pratique, mais l’intégrer dans Cypress demandait toujours les mêmes manipulations.
J’ai créé cypress-maildev pour simplifier ces tests. L’idée était de fournir des commandes Cypress natives qui s’intègrent naturellement dans les tests existants.
Cas d’usage principaux
Flow d’inscription avec vérification de compte
Un des cas d’usage les plus courants : tester le parcours complet d’inscription. L’utilisateur s’inscrit, reçoit un email de confirmation, clique sur le lien et active son compte.
// 1. L'utilisateur s'inscrit
cy.get('input[name="email"]').type('user@example.com');
cy.get('button[type="submit"]').click();
// 2. On récupère l'email de confirmation
cy.maildevGetLastMessage().then((email) => {
expect(email.subject).to.contain('Confirmez votre compte');
// 3. On visite le HTML de l'email
cy.maildevVisitMessageById(email.id);
// 4. On clique sur le lien de confirmation
cy.get('a[href*="/confirm"]').click();
});
// 5. Le compte est activé
cy.url().should('include', '/welcome');
Authentification à deux facteurs (2FA)
Tester la 2FA par email est simplifié grâce à l’extraction automatique des codes OTP :
// 1. L'utilisateur se connecte
cy.get('input[name="email"]').type('user@example.com');
cy.get('input[name="password"]').type('password');
cy.get('button[type="submit"]').click();
// 2. Un code 2FA est demandé et envoyé par email
cy.maildevGetMessageBySubject('Votre code de vérification').then((email) => {
// 3. On extrait automatiquement le code à 6 chiffres
cy.maildevGetOTPCode(email.text, 6).then((code) => {
// 4. On le saisit dans le formulaire
cy.get('input[name="otp"]').type(code);
cy.get('button[type="submit"]').click();
});
});
// 5. L'utilisateur est connecté
cy.url().should('include', '/dashboard');
Test du rendu visuel des emails
Une fonctionnalité que je trouve particulièrement utile : pouvoir charger le HTML de l’email directement dans Cypress et le tester comme une page web classique.
cy.maildevGetMessageBySubject('Bienvenue !').then((email) => {
// On visite le rendu HTML de l'email
cy.maildevVisitMessageById(email.id);
// On peut ensuite utiliser toutes les commandes Cypress
cy.get('h1').should('have.text', 'Bienvenue sur notre plateforme');
cy.get('img[alt="Logo"]').should('be.visible');
cy.get('a.button').should('have.attr', 'href').and('include', '/activate');
// Vérifier que le style est correct
cy.get('.button').should('have.css', 'background-color', 'rgb(0, 123, 255)');
});
Cela permet de valider que les emails sont correctement formatés, que les images s’affichent, et que les liens fonctionnent.
Commandes disponibles
Le package fournit une dizaine de commandes suivant les conventions Cypress :
cy.maildevGetAllMessages()- Récupérer tous les emailscy.maildevGetLastMessage()- Récupérer le dernier emailcy.maildevGetMessageById(id)- Trouver un email par IDcy.maildevVisitMessageById(id)- Charger le HTML de l’emailcy.maildevGetMessageBySubject(subject)- Chercher par sujetcy.maildevGetMessageBySentTo(email)- Chercher par destinatairecy.maildevGetOTPCode(text, digits)- Extraire un code OTPcy.maildevDeleteAllMessages()- Vider la boîte mail
Toutes retournent des Cypress Promises pour un chaînage naturel dans vos tests E2E.
Mise en œuvre technique
Simplicité d’intégration
L’installation se fait en une commande npm/yarn, puis un simple import dans le fichier de support Cypress. Si Maildev tourne sur le port par défaut, aucune configuration supplémentaire n’est nécessaire.
Pour des configurations personnalisées (notamment avec Docker Compose), le package supporte des variables d’environnement.
TypeScript et expérience développeur
J’ai développé le package en TypeScript avec exports de types, ce qui permet l’autocomplétion dans les IDE et aide à éviter les erreurs.
Architecture
Sous le capot, le package utilise l’API REST de Maildev en encapsulant les appels HTTP avec cy.request(). L’idée était de masquer cette complexité pour que l’utilisateur puisse simplement utiliser des commandes Cypress familières.
Le package lui-même est testé avec Cypress, avec une suite de tests E2E qui vérifie chaque commande.
Open source et communauté
J’ai publié le projet sous licence MIT pour que tout le monde puisse l’utiliser librement. Le package reçoit régulièrement des téléchargements, ce qui me fait plaisir et montre qu’il répond à un besoin concret.
Je maintiens le projet en répondant aux issues GitHub et en publiant des mises à jour pour rester compatible avec les nouvelles versions de Cypress. J’ai aussi rédigé une documentation avec des exemples concrets pour faciliter la prise en main.
Recevoir des retours de la communauté m’a beaucoup aidé à améliorer le package et à corriger des bugs que je n’aurais pas détectés seul.