Cypress
Attendre un email sans cy.wait
Cypress exécute votre test dans le navigateur, ce qui pose deux problèmes pour lire un email : la clé d’API ne doit pas s’y trouver, et l’appel réseau dépend de l’origine de la page testée. Une tâche Node règle les deux.
La configuration, puis le test
La tâche vit dans le processus Cypress, là où la clé peut rester. Le test, lui, ne voit qu’une commande.
// cypress.config.js — la clé reste ici, hors du navigateur.
import { defineConfig } from 'cypress';
export default defineConfig({
e2e: {
setupNodeEvents(on) {
on('task', {
async attendreEmail({ sentTo }) {
const response = await fetch('https://api.facteur.eu/v1/messages/search', {
method: 'POST',
headers: {
authorization: 'Bearer ' + process.env.FACTEUR_API_KEY,
'content-type': 'application/json',
},
body: JSON.stringify({ inbox: 'j3k9x2mq', sentTo, wait: 30000 }),
});
const { messages } = await response.json();
return messages[0] ?? null;
},
});
},
},
});
// le test — le numéro de tentative sépare une reprise de l'essai précédent.
it('le code arrive par email', () => {
const tag = 'inscription-a' + (Cypress.currentRetry ?? 0) + '-' + Date.now();
cy.visit('/inscription');
cy.get('[name=email]').type(tag + '@j3k9x2mq.inbox.facteur.eu');
cy.contains('button', 'Créer mon compte').click();
cy.task('attendreEmail', { sentTo: tag }, { timeout: 40000 }).should((message) => {
expect(message, "aucun email n'est arrivé").to.not.be.null;
expect(message.otp).to.match(/^[0-9]{6}$/);
});
});La clé reste côté Node
Votre spec est servie à une page : une clé écrite dedans serait une clé dans le JavaScript d’une page. La tâche la garde de l’autre côté.
cy.task rend une valeur, donc la chaîne continue
Le message revient dans le flux de commandes habituel, et .should() se comporte comme sur un cy.get().
Le numéro de tentative est dans l’adresse
Sans lui, un test rejoué relit l’email de sa première tentative et passe pour une mauvaise raison, précisément quand quelque chose est déjà instable.
Pourquoi il n’y a pas de cy.wait
L’attente se fait chez nous
La requête reste ouverte jusqu’à l’arrivée du message, avec un délai maximum que vous fixez. Un cy.wait fixe est soit trop court sur une machine chargée, soit du temps perdu à chaque exécution.
Le code est déjà extrait
Le message arrive avec son code à usage unique dans un champ à part.
Une boîte suffit pour toute la suite
Chaque test reçoit à sa propre adresse dans la même boîte, sans rien créer. Sur un plan qui inclut une seule boîte, c’est la différence entre une suite qui tourne et une suite qui bute sur un plafond.
Et un greffon Cypress ?
Prévu, pas publié : la version ci-dessus est celle qui fonctionne aujourd’hui, en une trentaine de lignes que vous gardez.
Écrivez ce test aujourd’hui
Une boîte de test et une clé en lecture seule suffisent. Le plan gratuit ne demande pas de carte bancaire.