Aller au contenu
Facteur

Playwright

Votre test attend un email, il ne dort pas

Un parcours d’inscription se termine dans une boîte mail. Sans boîte que le test puisse lire, il ne reste que deux options : simuler l’envoi, ce qui ne prouve rien de la partie la plus fragile, ou boucler avec un délai fixe. Voici la troisième.

Le test en entier

Rien n’est coupé : c’est le fichier complet, et il n’importe que Playwright.

inscription.spec.tsts
import { expect, test } from '@playwright/test';

const KEY = process.env.FACTEUR_API_KEY!;
const INBOX = 'j3k9x2mq';
const DOMAIN = `${INBOX}.inbox.facteur.eu`;

/** Reste ouvert jusqu'à l'arrivée du message, trente secondes au plus. */
const attendre = (sentTo: string) =>
  fetch('https://api.facteur.eu/v1/messages/search', {
    method: 'POST',
    headers: {
      authorization: `Bearer ${KEY}`,
      'content-type': 'application/json',
    },
    body: JSON.stringify({ inbox: INBOX, sentTo, wait: 30_000 }),
  }).then((response) => response.json());

test('le lien de vérification active le compte', async ({ page }) => {
  const tag = `run-${Date.now()}`;

  // Lancée avant le clic : elle répond dès que l'email arrive.
  const arrive = attendre(`inscription+${tag}`);

  await page.goto('/inscription');
  await page.getByLabel('Email').fill(`inscription+${tag}@${DOMAIN}`);
  await page.getByRole('button', { name: 'Créer mon compte' }).click();

  const { messages } = await arrive;
  const message = messages[0];

  // Le status avant tout champ tiré du corps du message.
  expect(message.status).toBe('parsed');
  await page.goto(message.links[0].href);

  await expect(page.getByText('Compte vérifié')).toBeVisible();
});
  • La requête part avant le clic

    Elle reste ouverte et répond à l’instant où l’email arrive, pas à l’échéance. Lancée après le clic, elle courrait après un message peut-être déjà traité.

  • Chaque test a son adresse

    Tout ce qui suit le « + » vous appartient et arrive quand même. Deux tests qui tournent en même temps ne se volent donc pas leurs emails, sans rien créer au préalable.

  • Le code est déjà extrait

    Le message arrive avec son code à usage unique dans un champ à part. Vous ne réécrivez pas l’expression régulière qui traîne dans toutes les suites de tests.

  • On lit status avant tout le reste

    Un email accepté existe avant d’être analysé : pendant quelques millisecondes il n’a ni sujet, ni code. Ce champ sépare « pas de code dans ce message » de « le code n’est pas encore extrait ».

Pourquoi ce test tient en trente lignes

L’attente se fait chez nous

Vous fixez un délai maximum, la requête reste ouverte, et elle répond dès l’arrivée. Votre test ne contient donc aucune boucle de relance, et rien à régler quand l’intégration continue devient lente.

L’extraction se fait à la réception

Codes à usage unique, liens et boutons sont sortis du corps du message au moment où il arrive. Votre test lit un champ au lieu de découper du HTML.

Les adresses sont illimitées

Toute adresse finissant par le domaine de votre boîte de test arrive, sans appel d’API pour la créer. C’est ce qui rend une adresse par test gratuite.

Et un greffon Playwright ?

Il est prévu et il n’est pas publié : nous préférons l’écrire plutôt que vous laisser chercher un paquet qui n’existe pas. En attendant, le test ci-dessus n’a besoin d’aucune dépendance de notre part, ce qui reste vrai le jour où le greffon sortira.

Voir l’état de chaque intégration

Écrivez ce test aujourd’hui

Le plan gratuit ouvre une boîte de test, sans carte bancaire. Le temps de créer un compte, vous avez l’adresse à mettre dans le test ci-dessus.