Aller au contenu
Facteur

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.jsts
// 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.

Voir l’état de chaque intégration

É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.