Guías

Probar correos de Nodemailer con Vitest

Prueba el envío de correos con Nodemailer desde una API Express con Vitest.

Cualquier servidor que envíe correo transaccional mediante Nodemailer puede entregarlo a InboxTap en lugar de a un proveedor real. Así, los correos de bienvenida, los tokens de invitación y los códigos OTP pueden comprobarse en pruebas de integración. El proyecto ejecutable completo, una API Express probada con Vitest, está en examples/express-nodemailer.

Apuntar Nodemailer a InboxTap

InboxTap acepta SMTP plano sin autenticación y sin STARTTLS, así que el transporte necesita exactamente tres opciones no predeterminadas y ningún campo auth:

import { createTransport } from "nodemailer";

const transport = createTransport({
  host: process.env.SMTP_HOST ?? "localhost",
  port: Number(process.env.SMTP_PORT ?? 1025),
  secure: false,
  ignoreTLS: true,
});

Todo lo demás del código de envío mantiene su forma de producción: from, to, subject, text y html pasan sin cambios y se capturan tal cual.

Probar con Vitest

Inicia InboxTap de forma programática en puertos efímeros para cada archivo de pruebas y, después, proporciona el host y el puerto SMTP asignados a la aplicación que se está probando. Cada archivo que se ejecuta en paralelo obtiene un conjunto de servicios aislado:

const server = await new InboxTapServer({ apiPort: 0, smtpPort: 0 }).start();
const inboxTap = new InboxTapClient({ baseUrl: server.apiUrl, domain: server.domain });
const mailer = createMailer({ host: server.smtpHost, port: server.smtpPort });

Cada prueba crea su propio buzón y elige la función auxiliar de espera correspondiente al contenido del correo:

it("verifies a new user through the emailed link", async () => {
  const inbox = await inboxTap.createInbox({ alias: "signup" });

  await postJson(`${baseUrl}/signup`, { email: inbox.address });

  const link = await inbox.waitForLink({ subject: /welcome/i, contains: "/verify?token=" });
  const verify = await fetch(link);
  expect(verify.status).toBe(200);
});

Las demás pruebas del ejemplo muestran el resto del conjunto de herramientas: waitForMatch() extrae un token de invitación personalizado con pattern: /invite_[a-f0-9]{12}/, waitForCode() obtiene un OTP de seis dígitos con su patrón por defecto y waitForMessage() devuelve el correo capturado completo para aserciones de forma sobre destinatarios, HTML y enlaces extraídos.

Ejecutar el ejemplo

cd examples/express-nodemailer
npm install
npm test

Las pruebas inician InboxTap y la aplicación Express en puertos efímeros, sin otra terminal ni conflictos con los puertos de otros procesos. Para una exploración interactiva, ejecuta npx inboxtap en una terminal y npm run dev en otra, inicia un envío con curl y léelo desde http://localhost:8025/api/emails/latest.