import { describe, it, expect } from "vitest"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; /** * validate.js ne doit pas redevenir du code mort bien testé. * * Huit de ses douze exports n'étaient appelés nulle part en production : * app.js et adminRoutes.js réimplémentaient la même validation à la main, trois * fois. Les 64 tests de validate.test.js et validate.property.test.js * garantissaient donc une implémentation qui ne tournait nulle part — et une * divergence s'était déjà installée sans que rien ne rougisse (parseMaId exige * un entier, le contrôle en ligne acceptait un flottant, si bien que * /api/band/1.5 était accepté). * * Ce test échoue si un helper cesse d'être branché. Il ne dit rien de sa * qualité — c'est le rôle des deux autres fichiers — seulement qu'il est * réellement sur le chemin d'exécution. */ const SRC = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../src"); const lire = (f) => fs.readFileSync(path.join(SRC, f), "utf8"); const validate = lire("validate.js"); const consommateurs = ["app.js", "adminRoutes.js"].map(lire).join("\n"); const exports = [...validate.matchAll(/export\s+(?:async\s+)?(?:class|function)\s+(\w+)/g)] .map((m) => m[1]); describe("branchement de validate.js", () => { it("expose au moins les douze helpers connus", () => { expect(exports.length).toBeGreaterThanOrEqual(12); }); it.each(exports)("%s est réellement utilisé en production", (nom) => { const utilise = new RegExp(`\\b${nom}\\b`).test(consommateurs); expect(utilise).toBe(true); }); });