Next.js & Playwright / Cypress

El problema

Los datos aleatorios en tests E2E son frágiles: un DNI o un IBAN generado al vuelo puede chocar con validaciones, o hacer que un test falle una vez de cada mil sin motivo aparente.

La solución: seed fija por test

Cada test usa su propia seed (por ejemplo, el nombre del test). Misma seed + mismos parámetros ⇒ siempre los mismos datos, así que el test es reproducible y sus asserts pueden usar valores concretos.

Playwright

tests/alta-cliente.spec.ts
import { test, expect } from "@playwright/test";

async function fetchDni(seed: string) {
  const res = await fetch(
    "https://datamockseed.firstflip.es/api/v1/es/document?sub=dni&count=1&seed=" + seed,
  );
  const { data } = await res.json();
  return data[0].documento as string;
}

test("el formulario de alta valida un DNI ficticio", async ({ page }) => {
  const dni = await fetchDni("alta-cliente-e2e");
  await page.goto("/alta");
  await page.getByLabel("DNI").fill(dni);
  await page.getByRole("button", { name: "Continuar" }).click();
  await expect(page.getByText("DNI válido")).toBeVisible();
});

Cypress

cypress/e2e/alta-cliente.cy.js
Cypress.Commands.add("fixtureDni", (seed) => {
  return cy
    .request(
      `https://datamockseed.firstflip.es/api/v1/es/document?sub=dni&count=1&seed=${seed}`,
    )
    .its("body.data.0.documento");
});

it("valida un DNI ficticio", () => {
  cy.fixtureDni("alta-cliente-e2e").then((dni) => {
    cy.visit("/alta");
    cy.findByLabelText("DNI").type(dni);
    cy.findByRole("button", { name: "Continuar" }).click();
    cy.findByText("DNI válido").should("be.visible");
  });
});

Datasets de fixtures completos

Para un fixture con varias filas coherentes (nombre + DNI + email), usa POST /v1/es/bulk con la misma seed del test, en vez de encadenar peticiones individuales.