#!/usr/bin/env node /** * Test des données de nav S / M / XL (B10-M1). * Charge le VRAI fichier utils/echelles.ts via jiti (même patron que test-submit-libre.mjs) : * chaque route → bon groupe et bon onglet actif, un seul onglet actif par route. * Usage : node scripts/test-echelles-nav.mjs */ import { createJiti } from 'jiti' import { fileURLToPath } from 'node:url' import { dirname, join } from 'node:path' const __dirname = dirname(fileURLToPath(import.meta.url)) const jiti = createJiti(import.meta.url) const { ECHELLES, ORDRE_ECHELLES, ECHELLES_CADRE_COURT, echelleDeRoute } = await jiti.import( join(__dirname, '..', 'utils', 'echelles.ts'), ) const cases = [ // [path, query, groupe attendu, onglet attendu] ['/trouver-du-taf', {}, 'S', 'Jobs'], ['/outils', {}, 'S', 'Outils'], ['/', {}, 'M', "Écosystème d'entraide"], ['/', { vue: 'fiches' }, 'M', "Écosystème d'entraide"], ['/agences', {}, 'M', 'Réseaux AEP'], ['/agences', { vue: 'fiches' }, 'M', 'Réseaux AEP'], ['/codev', {}, 'M', 'Codev'], ['/codev/demo', {}, 'M', 'Codev'], ['/codev/carto', {}, 'M', 'Codev'], ['/media', {}, 'XL', 'Recherche média'], ['/media', { tab: 'visuel' }, 'XL', 'Recherche média'], ['/media', { tab: 'projets' }, 'XL', 'Publications'], ['/manifeste', {}, null, null], ['/a-propos', {}, null, null], ['/proposer', {}, null, null], ['/signaler', {}, null, null], ['/fiche/42', {}, null, null], ['/outilsXYZ', {}, null, null], ['/codevelopper', {}, null, null], ] let fail = 0 for (const [path, query, groupe, onglet] of cases) { const route = { path, query } const r = echelleDeRoute(route) const gotG = r?.echelle ?? null const gotO = r?.onglet.libelle ?? null // Un seul onglet actif sur tout le site pour une route donnée. const actifs = ORDRE_ECHELLES.flatMap((id) => ECHELLES[id].onglets.filter((o) => o.actif(route))) const ok = gotG === groupe && gotO === onglet && actifs.length === (groupe ? 1 : 0) if (!ok) fail++ console.log(`${ok ? 'OK ' : 'FAIL'} ${path}${Object.keys(query).length ? '?' + new URLSearchParams(query) : ''} → ${gotG ?? '∅'} / ${gotO ?? '∅'} (actifs : ${actifs.length})`) } // Ordre et contenu des groupes (directive Jules du 29/09 + arbitrage 1A). const attendu = { S: ['Jobs', 'Outils'], M: ["Écosystème d'entraide", 'Réseaux AEP', 'Codev'], XL: ['Recherche média', 'Publications'], } for (const id of ORDRE_ECHELLES) { const got = ECHELLES[id].onglets.map((o) => o.libelle) const ok = JSON.stringify(got) === JSON.stringify(attendu[id]) if (!ok) fail++ console.log(`${ok ? 'OK ' : 'FAIL'} groupe ${id} = ${got.join(' · ')}`) } const cadreOk = ECHELLES_CADRE_COURT === 'Trois échelles, imbriquées. Entrez par celle qui presse.' if (!cadreOk) fail++ console.log(`${cadreOk ? 'OK ' : 'FAIL'} cadre court = « ${ECHELLES_CADRE_COURT} »`) const total = cases.length + ORDRE_ECHELLES.length + 1 console.log(`\n${total - fail}/${total}`) process.exit(fail ? 1 : 0)