metalfrom.eu/apps/api/test/validateWiring.test.js
Nicolas FRYDER a5de45dd9f refactor(api): brancher validate.js, qui était du code mort bien testé
Huit des douze exports de validate.js 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 cas de validate.test.js et validate.property.test.js
garantissaient donc une implémentation qui ne tournait nulle part — le score de
mutation de 90 % portait sur du code inatteignable.

Une divergence s'était déjà installée sans que rien ne rougisse : parseMaId
exige un entier là où le contrôle en ligne se contentait de Number.isFinite.
/api/band/1.5 était accepté et partait en base pour ne rien trouver ; il répond
désormais 400.

Les routes délèguent maintenant à parseBbox, parseZoom, cellSizeForZoom,
parseCsvList, parseYear, parseLat, parseLon et parseMaId. Aucun test existant
n'a bougé, ce qui confirme que le comportement est identique partout ailleurs.

Ajoute validateWiring.test.js, qui é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. C'est exactement le garde-fou
qui manquait pour que la dérive ne recommence pas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 14:45:54 +02:00

39 lines
1.6 KiB
JavaScript

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);
});
});