import Fastify from "fastify"; import cookie from "@fastify/cookie"; import { makeFakePool } from "./fakePool.js"; /** * Applications de test partagées. * * Construire une app Fastify coûte ~14 ms (helmet + cookie + rate-limit + * ready()). C'est négligeable une fois, mais les tests de mutation rejouent la * suite des milliers de fois : à raison d'une construction par cas de test, ces * 14 ms devenaient l'essentiel des 5 minutes du run. * * On construit donc l'app UNE fois par fichier, autour d'un pool reconfigurable * (`pool.reset(handlers)`), et chaque test ne fait que reprogrammer le pool. * * Une app par fichier de test (et non une globale partagée) : les fichiers * s'exécutent dans des workers séparés, et l'isolation reste totale puisque le * seul état mutable est le pool, remis à zéro avant chaque cas. */ /** App n'exposant que les routes admin (plugin adminRoutes seul). */ export async function createAdminApp() { const { default: adminRoutes } = await import("../../src/adminRoutes.js"); const pool = makeFakePool(); const app = Fastify({ logger: false }); await app.register(cookie); await app.register(adminRoutes, { pool }); await app.ready(); return { app, pool }; } /** App complète (routes publiques + admin), via la fabrique de production. */ export async function createFullApp(opts = {}) { const { buildServer } = await import("../../src/app.js"); const pool = makeFakePool(); const app = await buildServer({ pool, logger: false, corsOrigins: ["https://metalfrom.eu"], seedAdmin: false, // L'app est partagée entre les cas du fichier : les plafonds de débit // réels rendraient le 11e test rouge sans rapport avec ce qu'il vérifie. // Les vraies valeurs sont testées dans rateLimit.test.js. globalRateLimitMax: 1e9, adminRateLimitMax: 1e9, authRateLimitMax: 1e9, ...opts, }); return { app, pool }; } /** * Quelques cas doivent construire leur propre app (options de fabrique * différentes : jeton d'import absent, pool null…). Ils restent rares et * assument le coût de construction. */ export async function createFullAppWith(opts) { const { buildServer } = await import("../../src/app.js"); return buildServer({ logger: false, corsOrigins: ["https://metalfrom.eu"], seedAdmin: false, ...opts, }); }