Integración con Playwright

Pruebas de correo con Playwright e InboxTap

InboxTap conecta las acciones del navegador de Playwright con el correo que genera la aplicación real. Su adaptador gestiona un servidor SMTP y API local por proceso de trabajo e inyecta un destinatario nuevo en cada prueba, para que los flujos de correo paralelos sean deterministas sin compartir un buzón alojado.

Ajusta el recurso al ciclo de vida de Playwright

Importa el adaptador desde inboxtap/fixtures/playwright y amplía tu prueba de Playwright existente. El valor inyectado inboxTap tiene ámbito de proceso de trabajo, mientras que inbox tiene ámbito de prueba. Así, Playwright inicia el servicio local una vez por proceso, pero proporciona a cada prueba un destinatario distinto en el sobre SMTP.

Esto sigue el modelo nativo de dependencias de Playwright: un recurso se prepara solo cuando lo necesita una prueba u otro recurso, y una dependencia se inicia antes que quien la consume y se desmonta después. InboxTap aprovecha ese orden para cerrar el transporte Nodemailer verificado y sus escuchas aunque falle una prueba.

Inicia la aplicación después de InboxTap

Cuando la aplicación necesita un puerto SMTP elegido automáticamente, iníciala como un recurso de proceso de trabajo que dependa de inboxTap. Lee inboxTap.smtp al crear el proceso o el transporte de correo; contiene el host y el puerto asignados, además de secure: false e ignoreTLS: true.

La configuración webServer de Playwright se inicia antes de que existan los recursos de prueba. Una aplicación iniciada allí no puede consumir un puerto que el recurso de InboxTap seleccione más tarde. Usa recursos dependientes para los puertos dinámicos o elige deliberadamente puertos fijos e inicia ambos servicios mediante webServer.

tests/fixtures.ts
import { test as base } from "@playwright/test";
import { extendInboxTap } from "inboxtap/fixtures/playwright";

const withInboxTap = extendInboxTap(base);

export const test = withInboxTap.extend<object, { app: TestApp }>({
  app: [
    async ({ inboxTap }, use) => {
      const app = await startTestApp({ smtp: inboxTap.smtp });
      try {
        await use(app);
      } finally {
        await app.close();
      }
    },
    { scope: "worker" },
  ],
});

Ejecuta el flujo de correo real

Rellena el formulario de la aplicación con inbox.address, envíalo desde el navegador y espera desde la prueba ejecutada en Node el enlace, código o mensaje completo esperado. El navegador no necesita credenciales del buzón ni importa el SDK de InboxTap.

Usa waitForLink() para URL de verificación, acceso mediante enlace y restablecimiento; waitForCode() para códigos numéricos; y waitForMessage() cuando la comprobación necesite cabeceras, HTML o destinatarios del sobre. Valida el origen y la ruta esperados de una URL capturada antes de pedir a la página que la abra.

  • Crea el destinatario dentro de cada prueba o usa el recurso inbox inyectado.
  • Configura el tiempo límite de InboxTap por debajo del de Playwright para que aparezca primero el error útil del correo.
  • Filtra los mensajes por un asunto estable o una ruta de enlace cuando una plantilla contenga varias URL.

Mantén aislados los procesos paralelos

El aislamiento procede del destinatario del sobre SMTP, no de vaciar un buzón global. Cada inbox inyectado tiene una dirección generada y todas sus llamadas al SDK filtran por ella. Por eso, las pruebas simultáneas pueden compartir un servicio del proceso sin apropiarse de mensajes ajenos.

No crees un único TestInbox en el ámbito del módulo para toda una batería. Evita también el borrado global mientras haya otras pruebas activas: eliminar el estado compartido del servidor puede borrar un mensaje que otro destinatario todavía espera.

Comprueba la entrega sin filtrar secretos

El adaptador de comparadores de Playwright devuelve un objeto expect ampliado. Usa toHaveDeliveredOnce(), toHaveRecipient() y toContainLink() cuando una comprobación concisa sea más clara que inspeccionar campos manualmente.

toHaveDeliveredOnce() observa la instantánea actual del buzón; no espera el primer mensaje. Espera la entrega de la aplicación o llama antes a waitForMessage() cuando el correo se envíe en segundo plano. Los fallos de los comparadores omiten de forma intencionada el cuerpo, los valores de destinatarios y los enlaces que contienen tokens.

Mantén el comportamiento de la aplicación en su propia prueba

InboxTap demuestra qué llegó al límite SMTP local y ayuda a extraer el valor que necesita el navegador. La prueba de Playwright sigue siendo responsable de las garantías del producto: si un token es de un solo uso, si se rechaza un enlace caducado, si un reintento crea registros de negocio duplicados y si la sesión final tiene los permisos esperados.

Construye el flujo completo con Playwright

Consulta la receta completa para el flujo del navegador, incluido el inicio de servicios con puertos fijos, la introducción de OTP, los procesos paralelos y la solución de problemas.

Leer la guía de Playwright