Files
nav-carte/scripts/test-submit-libre.mjs
T
Jules NenyandClaude Opus 5.5 a1edcf3093 feat(b5): M2b — légende des cinq types et double type pour les indécis
Deux chips maximum : le premier alimente submission_type, le second
s'écrit en tête de description_user (« Type suggéré : X ou Y »), sans
ALTER NocoDB. Le marqueur « Type : non précisé » n'est posé que sans
aucun type (contrat worker/enrich.js inchangé). ?categorie= présélectionne
un seul chip. Tests : 16/16.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvxdoEGWjCTSEJDmraYW96
2026-09-28 12:14:54 +02:00

141 lines
4.7 KiB
JavaScript

#!/usr/bin/env node
/**
* Test du schéma Zod du formulaire assoupli (B5-M1).
* Charge le VRAI schéma TS (utils/submitLibre.ts) via jiti (déjà une dépendance
* transitive de Nuxt, pas de nouveau paquet) — pas de réimplémentation parallèle.
* Usage : node scripts/test-submit-libre.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 { LibreSubmitSchema, toOrgaPayload, toReferencePayload } = await jiti.import(
join(__dirname, '..', 'utils', 'submitLibre.ts'),
)
function baseInput(overrides) {
return { liens: [], texte: '', site_web: '', ...overrides }
}
const cases = [
{
name: 'vide (aucun lien, aucun texte) → refus',
input: baseInput({}),
expectOk: false,
},
{
name: '1 lien seul → ok',
input: baseInput({ liens: ['https://exemple.fr'] }),
expectOk: true,
},
{
name: 'texte seul → ok',
input: baseInput({ texte: "Ça m'a beaucoup aidé pour ma reconversion." }),
expectOk: true,
},
{
name: '11 liens → refus',
input: baseInput({ liens: Array.from({ length: 11 }, (_, i) => `https://exemple${i}.fr`) }),
expectOk: false,
},
{
name: 'URL invalide (pas de schéma) → refus',
input: baseInput({ liens: ['exemple.fr'] }),
expectOk: false,
},
{
name: 'ftp:// → refus',
input: baseInput({ liens: ['ftp://exemple.fr/fichier.pdf'] }),
expectOk: false,
},
{
name: 'double type valide (jobs + outils) → ok',
input: baseInput({ liens: ['https://exemple.fr'], type_suggere: 'jobs', type_secondaire: 'outils' }),
expectOk: true,
},
{
name: 'type_secondaire sans type_suggere → refus',
input: baseInput({ liens: ['https://exemple.fr'], type_secondaire: 'outils' }),
expectOk: false,
},
{
name: 'type_secondaire = type_suggere → refus',
input: baseInput({ liens: ['https://exemple.fr'], type_suggere: 'jobs', type_secondaire: 'jobs' }),
expectOk: false,
},
{
name: 'type inconnu → refus',
input: baseInput({ liens: ['https://exemple.fr'], type_suggere: 'inconnu' }),
expectOk: false,
},
]
let failures = 0
for (const c of cases) {
const result = LibreSubmitSchema.safeParse(c.input)
const pass = result.success === c.expectOk
const detail = result.success ? '' : ` (${JSON.stringify(result.error.flatten().fieldErrors)})`
console.log(`${pass ? 'PASS' : 'FAIL'} — ${c.name}${pass ? '' : detail}`)
if (!pass) failures++
}
// ── Mappings (toOrgaPayload / toReferencePayload) ──────────────────────────
function checkMapping(name, ok) {
console.log(`${ok ? 'PASS' : 'FAIL'} — ${name}`)
if (!ok) failures++
}
{
const data = LibreSubmitSchema.parse(baseInput({ liens: ['https://exemple.fr'] }))
const payload = toOrgaPayload(data)
checkMapping(
'aucun type → description_user commence par « Type : non précisé »',
payload.description_user.startsWith('Type : non précisé'),
)
}
{
const data = LibreSubmitSchema.parse(baseInput({ liens: ['https://exemple.fr'], type_suggere: 'jobs' }))
const payload = toOrgaPayload(data)
checkMapping(
'un type → pas de marqueur ni de ligne « Type suggéré »',
!payload.description_user.startsWith('Type : non précisé') && !payload.description_user.includes('Type suggéré'),
)
}
{
const data = LibreSubmitSchema.parse(
baseInput({ liens: ['https://exemple.fr'], type_suggere: 'jobs', type_secondaire: 'outils' }),
)
const payload = toOrgaPayload(data)
checkMapping(
'double type → description_user commence par « Type suggéré : Jobs ou Outils »',
payload.description_user.startsWith('Type suggéré : Jobs ou Outils'),
)
checkMapping('double type → submission_type = le premier (job)', payload.submission_type === 'job')
checkMapping(
'double type → ne commence PAS par « Type : non précisé »',
!payload.description_user.startsWith('Type : non précisé'),
)
}
{
const data = LibreSubmitSchema.parse(
baseInput({ liens: ['https://exemple.fr'], type_suggere: 'references', type_secondaire: 'outils' }),
)
const payload = toReferencePayload(data)
checkMapping(
'premier = Références + second → description commence par « Type suggéré : Références ou Outils »',
payload.description.startsWith('Type suggéré : Références ou Outils'),
)
}
const totalMappingChecks = 6
console.log(`\n${failures === 0 ? 'PASS' : 'FAIL'} — ${cases.length + totalMappingChecks - failures}/${cases.length + totalMappingChecks} tests passés`)
process.exit(failures > 0 ? 1 : 0)