166 lines
6 KiB
TypeScript
166 lines
6 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { generateMaterialEventPDF, generateReservationPDF } from './pdfGenerator';
|
|
|
|
describe('generateReservationPDF', () => {
|
|
it('should generate a PDF buffer for a complete reservation', async () => {
|
|
const data = {
|
|
titre: 'Réservation Salle TOUCAN - 15/04/2026',
|
|
status: 'soumise',
|
|
createdAt: new Date('2026-03-01'),
|
|
dateSubmission: new Date('2026-03-01'),
|
|
dateTraitement: null,
|
|
commentaireAdmin: null,
|
|
formData: {
|
|
nomAssociation: 'Association Test',
|
|
adresseAssociation: '12 rue de la Paix, 97300 Cayenne',
|
|
communeSiege: 'Cayenne',
|
|
representantLegal: 'Jean Dupont',
|
|
telephoneAssociation: '0694123456',
|
|
emailAssociation: 'test@asso.fr',
|
|
sallesSelectionnees: ['Salle TOUCAN', 'Salle IBIS'],
|
|
motifReservation: 'Assemblée générale annuelle',
|
|
dateReservation: '2026-04-15',
|
|
dateFinReservation: '2026-04-15',
|
|
heureDebut: '09:00',
|
|
heureFin: '17:00',
|
|
nombreParticipants: '50',
|
|
materielNecessaire: 'Tables, chaises, vidéoprojecteur',
|
|
observations: 'Prévoir un accès PMR',
|
|
},
|
|
};
|
|
|
|
const buffer = await generateReservationPDF(data);
|
|
expect(buffer).toBeInstanceOf(Buffer);
|
|
expect(buffer.length).toBeGreaterThan(0);
|
|
// Verify PDF header
|
|
expect(buffer.slice(0, 5).toString()).toBe('%PDF-');
|
|
});
|
|
|
|
it('should generate a PDF with DSU cadre filled', async () => {
|
|
const data = {
|
|
titre: 'Réservation Salle PELICAN',
|
|
status: 'validee',
|
|
createdAt: new Date('2026-03-01'),
|
|
dateSubmission: new Date('2026-03-01'),
|
|
dateTraitement: new Date('2026-03-10'),
|
|
commentaireAdmin: 'Demande acceptée sous conditions',
|
|
formData: {
|
|
nomAssociation: 'Association Sportive',
|
|
adresseAssociation: '5 avenue des Sports, 97360 Mana',
|
|
communeSiege: 'Mana',
|
|
representantLegal: 'Marie Martin',
|
|
telephoneAssociation: '0694567890',
|
|
emailAssociation: 'sport@asso.fr',
|
|
sallesSelectionnees: ['Salle PELICAN'],
|
|
motifReservation: 'Tournoi de basketball',
|
|
dateReservation: '2026-05-20',
|
|
dateFinReservation: '2026-05-21',
|
|
heureDebut: '08:00',
|
|
heureFin: '20:00',
|
|
nombreParticipants: '100',
|
|
materielNecessaire: 'Sono, tables de score',
|
|
observations: '',
|
|
cadreDSU: {
|
|
dateReception: '2026-03-02',
|
|
avisDSU: 'favorable_avec_reserves',
|
|
conditionsParticulieres: 'Nettoyage obligatoire après utilisation',
|
|
cautionRequise: true,
|
|
montantCaution: '500',
|
|
assuranceRequise: true,
|
|
horairesImposes: '08:00 - 20:00 strictement',
|
|
responsableDSU: 'Pierre Durand',
|
|
dateDecision: '2026-03-10',
|
|
observationsDSU: 'Veiller au respect des horaires de fermeture',
|
|
},
|
|
},
|
|
};
|
|
|
|
const buffer = await generateReservationPDF(data);
|
|
expect(buffer).toBeInstanceOf(Buffer);
|
|
expect(buffer.length).toBeGreaterThan(0);
|
|
expect(buffer.slice(0, 5).toString()).toBe('%PDF-');
|
|
// PDF with DSU should be larger than without
|
|
expect(buffer.length).toBeGreaterThan(1000);
|
|
});
|
|
|
|
it('should generate a PDF with empty DSU cadre (pending)', async () => {
|
|
const data = {
|
|
titre: 'Réservation DOJO',
|
|
status: 'soumise',
|
|
createdAt: new Date('2026-03-05'),
|
|
formData: {
|
|
nomAssociation: 'Club Judo',
|
|
sallesSelectionnees: ['DOJO'],
|
|
motifReservation: 'Entraînement hebdomadaire',
|
|
dateReservation: '2026-04-01',
|
|
heureDebut: '18:00',
|
|
heureFin: '20:00',
|
|
},
|
|
};
|
|
|
|
const buffer = await generateReservationPDF(data);
|
|
expect(buffer).toBeInstanceOf(Buffer);
|
|
expect(buffer.length).toBeGreaterThan(0);
|
|
expect(buffer.slice(0, 5).toString()).toBe('%PDF-');
|
|
});
|
|
|
|
it('should handle missing optional fields gracefully', async () => {
|
|
const data = {
|
|
titre: 'Réservation minimale',
|
|
status: 'brouillon',
|
|
createdAt: new Date(),
|
|
formData: {},
|
|
};
|
|
|
|
const buffer = await generateReservationPDF(data);
|
|
expect(buffer).toBeInstanceOf(Buffer);
|
|
expect(buffer.length).toBeGreaterThan(0);
|
|
expect(buffer.slice(0, 5).toString()).toBe('%PDF-');
|
|
});
|
|
});
|
|
|
|
describe('generateMaterialEventPDF', () => {
|
|
it('should generate a PDF buffer for an event material request', async () => {
|
|
const data = {
|
|
titre: 'Demande matériel événementiel',
|
|
status: 'validee',
|
|
createdAt: new Date('2026-03-01'),
|
|
dateSubmission: new Date('2026-03-01'),
|
|
dateTraitement: new Date('2026-03-10'),
|
|
commentaireAdmin: 'Accord partiel',
|
|
formData: {
|
|
nomAssociation: 'Association Test',
|
|
commune: 'Kourou',
|
|
direction: 'Sports',
|
|
service: 'Animation',
|
|
demandeurNomPrenom: 'Jean Dupont',
|
|
dateDemande: '2026-03-01',
|
|
dateManifestation: '2026-04-15',
|
|
dateDebutManifestation: '2026-04-15',
|
|
dateFinManifestation: '2026-04-16',
|
|
motifDemande: 'Fête communale',
|
|
datePriseEnCharge: '2026-04-15',
|
|
dateRestitution: '2026-04-19',
|
|
materielsDemandes: { tente3x3: true, podium: true, chapiteau5x5: false, autres: true },
|
|
quantitesDemandees: { tente3x3: '5', podium: '1', chapiteau5x5: '', autres: '2' },
|
|
autreMaterielPrecisions: 'Barrières',
|
|
cadreDSU: {
|
|
dateReception: '2026-03-02',
|
|
responsableDSU: 'Pierre Durand',
|
|
dateDecision: '2026-03-10',
|
|
observationsDSU: 'Prévoir le retrait la veille',
|
|
materielEvent: {
|
|
itemsAccordes: { tente3x3: true, podium: true, chapiteau5x5: false, autres: false },
|
|
quantitesAccordees: { tente3x3: '3', podium: '1', chapiteau5x5: '', autres: '' },
|
|
autresPrecisions: '',
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
const buffer = await generateMaterialEventPDF(data);
|
|
expect(buffer).toBeInstanceOf(Buffer);
|
|
expect(buffer.length).toBeGreaterThan(0);
|
|
expect(buffer.slice(0, 5).toString()).toBe('%PDF-');
|
|
});
|
|
});
|