Chaque échelle porte ses onglets (libellé, cible, actif(route)) ; echelleDeRoute rend le groupe courant ou null. Source unique de la nav B10. Test node : scripts/test-echelles-nav.mjs (23/23). B10 M1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EBu7CSLy7PJgL4HJaV5oHP
76 lines
2.9 KiB
JavaScript
76 lines
2.9 KiB
JavaScript
#!/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)
|