import { PDFDocument } from 'pdf-lib'; import { extrahiereEingebetteteDateien } from './pdf-attachment.util'; const XML = ''; async function pdfMitAnhang( ...anhaenge: { name: string; inhalt: string }[] ): Promise { const doc = await PDFDocument.create(); doc.addPage(); for (const a of anhaenge) { await doc.attach(Buffer.from(a.inhalt, 'utf8'), a.name, { mimeType: 'text/xml', }); } return Buffer.from(await doc.save()); } describe('extrahiereEingebetteteDateien', () => { it('liest einen eingebetteten ZUGFeRD-Anhang aus', async () => { const pdf = await pdfMitAnhang({ name: 'factur-x.xml', inhalt: XML }); const dateien = await extrahiereEingebetteteDateien(pdf); expect(dateien).toHaveLength(1); expect(dateien[0].name).toBe('factur-x.xml'); expect(dateien[0].inhalt.toString('utf8')).toBe(XML); }); it('liefert jeden Anhang nur einmal, obwohl er in /Names und /AF steht', async () => { const pdf = await pdfMitAnhang( { name: 'xrechnung.xml', inhalt: XML }, { name: 'anhang.txt', inhalt: 'Lieferschein' }, ); const dateien = await extrahiereEingebetteteDateien(pdf); expect(dateien.map((d) => d.name).sort()).toEqual([ 'anhang.txt', 'xrechnung.xml', ]); }); it('liefert eine leere Liste für ein PDF ohne Anhänge', async () => { const doc = await PDFDocument.create(); doc.addPage(); const pdf = Buffer.from(await doc.save()); expect(await extrahiereEingebetteteDateien(pdf)).toEqual([]); }); });