# Recevoir un email dans un test Cypress · Facteur

> Une tâche Node qui garde la clé hors du navigateur, et un test qui attend l'email au lieu de patienter un nombre de secondes fixe. Le plugin Cypress n'est pas encore publié.
> https://facteur.eu/fr/aide/tests-cypress

Rechercher dans l'aide Ctrl K   Rechercher dans l'aide  



Tapez au moins deux caractères.

  

 

 #  Recevoir un email dans un test Cypress 

 Une tâche Node qui garde la clé hors du navigateur, et un test qui attend l'email au lieu de patienter un nombre de secondes fixe. Le plugin Cypress n'est pas encore publié.

 Mis à jour le 17 octobre 2026 

Cypress exécute votre test **dans le navigateur**, ce qui pose deux problèmes pour lire un email : votre clé d'API n'a rien à faire dans une page, et l'appel réseau répond à l'origine du site testé. Une tâche Node règle les deux d'un coup.

Cette page appelle l'API directement. **Le plugin Cypress de Facteur n'est pas encore publié** : il n'y a aucun paquet à installer.

## Avant de commencer

Deux choses, et rien d'autre :

1. **Une clé d'API en lecture seule.** Créez-la dans [**Paramètres → Clés d'API**](https://app.facteur.eu/settings/api-keys)et mettez-la dans les secrets de votre intégration continue, sous `FACTEUR_API_KEY`. Voir [Clés d'API](/fr/aide/cles-api).
2. **L'identifiant de votre inbox**, les huit caractères qui précèdent `.inbox` dans son adresse de réception. Il vaut `j3k9x2mq` dans les exemples qui suivent.

## La configuration, où la clé peut rester

```js
<span class="hl-comment">// cypress.config.js</span>
<span class="hl-keyword">import</span> { defineConfig } <span class="hl-keyword">from</span> <span class="hl-value">'cypress'</span>;

<span class="hl-keyword">export</span> <span class="hl-keyword">default</span> <span class="hl-property">defineConfig</span>({
  <span class="hl-property">e2e</span>: {
    <span class="hl-property">setupNodeEvents</span>(on) {
      <span class="hl-property">on</span>(<span class="hl-value">'task'</span>, {
        <span class="hl-keyword">async</span> <span class="hl-property">attendreEmail</span>({ sentTo }) {
          <span class="hl-keyword">const</span> search = <span class="hl-keyword">new</span> <span class="hl-type">URLSearchParams</span>({ <span class="hl-property">inbox</span>: <span class="hl-value">'j3k9x2mq'</span>, sentTo, <span class="hl-property">wait</span>: <span class="hl-value">'30000'</span> });
          <span class="hl-keyword">const</span> response = <span class="hl-keyword">await</span> <span class="hl-property">fetch</span>(<span class="hl-value">'https://api.facteur.eu/v1/messages?'</span> + search, {
            <span class="hl-property">headers</span>: { <span class="hl-property">authorization</span>: <span class="hl-value">'Bearer '</span> + process.<span class="hl-property">env</span>.<span class="hl-property">FACTEUR_API_KEY</span> },
          });
          <span class="hl-keyword">if</span> (!response.<span class="hl-property">ok</span>) <span class="hl-keyword">throw</span> <span class="hl-keyword">new</span> <span class="hl-type">Error</span>(<span class="hl-value">'Facteur a répondu '</span> + response.<span class="hl-property">status</span>);

          <span class="hl-keyword">const</span> { messages } = <span class="hl-keyword">await</span> response.<span class="hl-property">json</span>();
          <span class="hl-keyword">return</span> messages[0] ?? <span class="hl-keyword">null</span>;
        },
      });
    },
  },
});

```

Ce fichier tourne dans le processus Cypress, pas dans la page. La clé y est lue depuis l'environnement et n'atteint jamais le navigateur.

## Le test

```js
<span class="hl-property">it</span>(<span class="hl-value">'le code arrive par email'</span>, () => {
  <span class="hl-keyword">const</span> tag = <span class="hl-value">'inscription-a'</span> + (<span class="hl-type">Cypress</span>.<span class="hl-property">currentRetry</span> ?? 0) + <span class="hl-value">'-'</span> + <span class="hl-type">Date</span>.<span class="hl-property">now</span>();

  <span class="hl-comment">// Le parcours d'inscription de VOTRE application.</span>
  cy.<span class="hl-property">visit</span>(<span class="hl-value">'/inscription'</span>);
  cy.<span class="hl-property">get</span>(<span class="hl-value">'[name=email]'</span>).<span class="hl-property">type</span>(tag + <span class="hl-value">'@j3k9x2mq.inbox.facteur.eu'</span>);
  cy.<span class="hl-property">contains</span>(<span class="hl-value">'button'</span>, <span class="hl-value">'Créer mon compte'</span>).<span class="hl-property">click</span>();

  cy.<span class="hl-property">task</span>(<span class="hl-value">'attendreEmail'</span>, { <span class="hl-property">sentTo</span>: tag }, { <span class="hl-property">timeout</span>: 40000 }).<span class="hl-property">should</span>((message) => {
    <span class="hl-property">expect</span>(message, <span class="hl-value">"aucun email n'est arrivé"</span>).<span class="hl-property">to</span>.<span class="hl-property">not</span>.<span class="hl-property">be</span>.<span class="hl-property">null</span>;
    <span class="hl-property">expect</span>(message.<span class="hl-property">otp</span>).<span class="hl-property">to</span>.<span class="hl-property">match</span>(/^[0-9]{6}$/);
  });
});

```

## 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. Une pause fixe est soit trop courte sur une machine chargée, soit du temps perdu à chaque exécution.

Le `timeout` passé à `cy.task` doit rester **au-dessus** du `wait` envoyé à l'API : quarante secondes pour une attente de trente, faute de quoi Cypress abandonne la tâche avant que la réponse n'arrive, et l'échec accuse le mauvais coupable.

## Le numéro de tentative dans l'adresse

`Cypress.currentRetry` vaut 0 au premier essai. 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.

## Une inbox suffit pour toute la suite

Toute adresse finissant par le domaine de l'inbox y arrive, sans rien créer. Chaque test reçoit donc à son adresse dans la même inbox. Sur une offre qui n'inclut qu'une inbox, c'est la différence entre une suite qui tourne et une suite qui bute sur un plafond.

## Le plugin Cypress

Un plugin est prévu : il garderait la clé hors du navigateur et rendrait des commandes chaînables, ce que la configuration ci-dessus fait à la main. Il n'est pas encore publié et nous n'annonçons pas de date. Cette configuration continuera de fonctionner le jour où il sortira.

 

  Cet article ne répond pas à votre question ? Écrivez à l'équipe : elle saura de quel article vous venez.

 [ Écrire au support ](https://app.facteur.eu/support?article=tests-cypress)
