Tests (factories + client de route)

defineFactory génère des données de test typées et séquencées ; testRoute(module) appelle le loader/action d'une route avec une requête synthétisée pour vérifier le résultat — sans serveur ni DOM. Les assertions ci-dessous s'exécutent en direct, avec les mêmes helpers qu'en bun test.

Astuce
Pour le test de composants (rendu + requêtes + interactions dans un DOM happy-dom), utilisez @bext-stack/framework/testing. testkit est pur (aucune dépendance DOM) et cible la logique applicative : données via factories, routes via testRoute.

Données générées par la factory

u0user0@acme.coadmin
u1user1@acme.comember
u2user2@acme.coadmin

Assertions en direct

rejects an invalid signup (bad email + underage)réussi
accepts a valid signup and coerces age to a numberréussi
factory make() applies overrides (role = admin)réussi
src/app/examples/testkit/page.tsxTSX
import { defineFactory, cycle, testRoute } from "@bext-stack/framework/testkit";
import * as signup from "../app/signup/page";  // your route module

const userFactory = defineFactory((n) => ({
  id: `u${n}`, email: `user${n}@example.com`, role: cycle("admin", "member")(n),
}));

test("rejects an invalid signup", async () => {
  const route = testRoute(signup);
  const res = await route.post({ email: "nope", age: "12" });  // calls the action
  expect(res.ok).toBe(false);
});

test("loader reads query params", async () => {
  expect(await testRoute(signup).get({ ref: "promo" })).toMatchObject({ ref: "promo" });
});