diff --git a/lib/__tests__/format.test.js b/lib/__tests__/format.test.js new file mode 100644 index 0000000..6559de4 --- /dev/null +++ b/lib/__tests__/format.test.js @@ -0,0 +1,111 @@ +import {describe, it, expect} from 'vitest' +import {formatKonstitisyon, formatDate, hasRestrictedChar} from '../format.js' + +describe('formatKonstitisyon', () => { + it('renvoie un tableau vide si aucun titre', () => { + expect(formatKonstitisyon([], [])).toEqual([]) + }) + + it('regroupe les articles sous leur titre', () => { + const titres = [{id: 1, contenu: 'Titre I'}] + const articles = [ + {id: 10, titre: 1, contenu: 'Art. 1'}, + {id: 20, titre: 2, contenu: 'Art. 2'}, // autre titre — exclu + ] + + expect(formatKonstitisyon(titres, articles)).toEqual([ + {titre: 'Titre I', titreId: 1, articles: [{id: 10, titre: 1, contenu: 'Art. 1'}]}, + ]) + }) + + it('produit un article vide si aucun article pour ce titre', () => { + const titres = [{id: 1, contenu: 'Titre I'}] + + expect(formatKonstitisyon(titres, [])).toEqual([ + {titre: 'Titre I', titreId: 1, articles: []}, + ]) + }) + + it('gère plusieurs titres et plusieurs articles', () => { + const titres = [ + {id: 1, contenu: 'Titre I'}, + {id: 2, contenu: 'Titre II'}, + ] + const articles = [ + {id: 10, titre: 1}, + {id: 11, titre: 1}, + {id: 20, titre: 2}, + ] + const result = formatKonstitisyon(titres, articles) + + expect(result).toHaveLength(2) + expect(result[0].articles).toHaveLength(2) + expect(result[1].articles).toHaveLength(1) + }) +}) + +describe('formatDate', () => { + const fixedDate = new Date('2024-03-15T10:30:00Z') + + it('renvoie une chaîne non vide par défaut', () => { + const result = formatDate(fixedDate) + + expect(typeof result).toBe('string') + expect(result.length).toBeGreaterThan(0) + }) + + it('ne contient pas de timezone par défaut', () => { + const result = formatDate(fixedDate) + + expect(result).not.toMatch(/\(.+\)$/) + }) + + it('ajoute la timezone entre parenthèses quand withTimezone: true', () => { + const result = formatDate(fixedDate, 'PP', {withTimezone: true}) + + expect(result).toMatch(/\(.+\)$/) + }) + + it('utilise la locale française (contient un mois en français)', () => { + // date-fns format 'MMMM' en fr → mars / janvier / etc. + const result = formatDate(new Date('2024-01-15'), 'MMMM') + + expect(result).toBe('janvier') + }) + + it('respecte le format personnalisé', () => { + const result = formatDate(new Date('2024-03-15'), 'dd/MM/yyyy') + + expect(result).toBe('15/03/2024') + }) +}) + +describe('hasRestrictedChar', () => { + it('détecte le caractère <', () => { + expect(hasRestrictedChar('