Le contributeur colle un lien (ou plusieurs) et explique en texte libre pourquoi c'est pertinent, sans template ni minimum de caractères. Le type devient une suggestion optionnelle (chips). Les 5 formulaires typés restent disponibles derrière « Mode détaillé » (replié par défaut). - utils/submitLibre.ts : schéma Zod partagé client/serveur + mapping vers les colonnes NocoDB existantes (aucun changement de schéma) — table orgas par défaut, table ressources_references si le chip « Références » est choisi. - components/FormLibre.vue : liens dynamiques (1-10), texte libre, chips, email optionnel, honeypot. - server/api/submit/index.post.ts : branche mode=libre en amont du schéma typé existant ; email Jules remplacé par ntfy (server/utils/notify.ts) — jamais l'email ni le texte du contributeur dans la notif. - scripts/test-submit-libre.mjs : 6 cas contre le vrai schéma Zod (via jiti). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
67 lines
1.9 KiB
JavaScript
67 lines
1.9 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 } = 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,
|
|
},
|
|
]
|
|
|
|
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++
|
|
}
|
|
|
|
console.log(`\n${cases.length - failures}/${cases.length} tests passés`)
|
|
process.exit(failures > 0 ? 1 : 0)
|