import { describe, expect, it } from 'vitest'; import { MissingTemplateValue, referencedFields, renderTemplate, TEMPLATE_FIELD_KEYS, unknownFields, } from '@/domain/documents/template'; describe('referencedFields', () => { it('relève les variables citées, sans doublon', () => { const body = '
{{salarie.nom}} — {{salarie.nom}} {{contrat.debut}}
'; expect(referencedFields(body)).toEqual(['salarie.nom', 'contrat.debut']); }); it('tolère les espaces dans les accolades', () => { expect(referencedFields('{{ salarie.nom }}')).toEqual(['salarie.nom']); }); }); describe('unknownFields', () => { it('signale une variable que l’application ne sait pas résoudre', () => { // Le cas qui compte : la faute de frappe. Sans ce contrôle, le modèle // s'enregistre et échoue au moment de générer la pièce, devant le salarié. expect(unknownFields('{{salarie.salire}}')).toEqual(['salarie.salire']); }); it('accepte toutes les variables du catalogue', () => { const body = TEMPLATE_FIELD_KEYS.map((key) => `{{${key}}}`).join(' '); expect(unknownFields(body)).toEqual([]); }); }); describe('renderTemplate', () => { it('remplace les variables par leur valeur', () => { const out = renderTemplate('{{salarie.nom}}
', { 'salarie.nom': 'Ferrand', }); expect(out).toBe('Ferrand
'); }); it('échappe la valeur, jamais le gabarit', () => { // Le corps est rédigé par un administrateur et reste de l'HTML ; la valeur // vient du dossier et pourrait porter un chevron. const out = renderTemplate('{{salarie.nom}}
', { 'salarie.nom': '', }); expect(out).toBe( '<script>alert(1)</script>
', ); }); it('refuse de rendre une variable sans valeur', () => { // Une attestation trouée est un document faux, pas un document incomplet : // le blanc se remarque une fois sur deux, et la pièce part signée. expect(() => renderTemplate('{{salarie.nom}} {{contrat.debut}}', { 'salarie.nom': 'Ferrand', }), ).toThrow(MissingTemplateValue); }); it('traite la chaîne vide comme une valeur manquante', () => { expect(() => renderTemplate('{{salarie.nom}}', { 'salarie.nom': '' }), ).toThrow(MissingTemplateValue); }); it('nomme les variables manquantes dans l’erreur', () => { try { renderTemplate('{{salarie.nom}} {{contrat.debut}}', {}); expect.unreachable('le rendu aurait dû échouer'); } catch (error) { expect(error).toBeInstanceOf(MissingTemplateValue); expect((error as MissingTemplateValue).keys).toEqual([ 'salarie.nom', 'contrat.debut', ]); } }); });