einvoice/test/suite/einvoice_pdf-operations/test.pdf-06.multiple-attachments.ts
2025-05-28 08:40:26 +00:00

162 lines
5.7 KiB
TypeScript

import { expect, tap } from '@git.zone/tstest/tapbundle';
import { promises as fs } from 'fs';
import * as path from 'path';
import { CorpusLoader } from '../../helpers/corpus.loader.js';
tap.test('PDF-06: Multiple Attachments - Basic Multiple Attachments Test', async () => {
console.log('Testing PDFs with multiple embedded files...');
// Import required classes
const { EInvoice } = await import('../../../ts/index.js');
const { PDFExtractor } = await import('../../../ts/formats/pdf/pdf.extractor.js');
// Get existing PDF files from corpus that might have multiple attachments
const pdfFiles = await CorpusLoader.getFiles('ZUGFERD_V2_CORRECT');
const existingPdfs = pdfFiles.filter(file => file.endsWith('.pdf'));
if (existingPdfs.length === 0) {
console.log('⚠ No PDF files found in corpus for multiple attachments test');
return;
}
// Test multiple PDFs to find ones with attachments
let attachmentCount = 0;
for (const pdfPath of existingPdfs.slice(0, 5)) { // Test first 5 PDFs
const pdfName = path.basename(pdfPath);
const pdfBuffer = await fs.readFile(pdfPath);
try {
// Create an extractor instance
const extractor = new PDFExtractor();
const extractResult = await extractor.extractXml(pdfBuffer);
if (extractResult.success) {
attachmentCount++;
console.log(`${pdfName}: Successfully extracted XML (${(extractResult.xml.length / 1024).toFixed(1)}KB)`);
// Verify we got XML content
expect(extractResult.xml).toBeTruthy();
expect(extractResult.xml.length).toBeGreaterThan(100);
// If we have metadata about multiple attachments
if (extractResult.metadata && extractResult.metadata.attachments) {
console.log(` Found ${extractResult.metadata.attachments.length} attachments`);
expect(extractResult.metadata.attachments.length).toBeGreaterThan(0);
}
} else {
console.log(`${pdfName}: No XML found`);
}
} catch (error) {
console.log(`${pdfName}: Extraction failed - ${error.message}`);
}
}
console.log(`\nTotal PDFs with attachments: ${attachmentCount}`);
// At least some PDFs should have attachments
expect(attachmentCount).toBeGreaterThan(0);
});
tap.test('PDF-06: Multiple Attachments - Attachment Handling Test', async () => {
console.log('Testing handling of PDFs with different attachment scenarios...');
// Import required classes
const { EInvoice } = await import('../../../ts/index.js');
// Test creating and embedding multiple attachments
const invoice = new EInvoice();
invoice.id = 'MULTI-ATTACH-001';
invoice.accountingDocId = 'MULTI-ATTACH-001';
invoice.date = Date.now();
invoice.currency = 'EUR';
invoice.from.name = 'Multi-Attachment Test Supplier';
invoice.from.address.city = 'Berlin';
invoice.from.address.postalCode = '10115';
invoice.from.address.country = 'DE';
invoice.to.name = 'Multi-Attachment Test Customer';
invoice.to.address.city = 'Munich';
invoice.to.address.postalCode = '80331';
invoice.to.address.country = 'DE';
invoice.addItem({
name: 'Test Item',
unitQuantity: 1,
unitNetPrice: 100.00,
vatPercentage: 19
});
// Test if we can handle multiple attachments
try {
// Check if the invoice supports additional attachments
if (invoice.pdfAttachments) {
console.log('✓ Invoice supports PDF attachments array');
expect(Array.isArray(invoice.pdfAttachments)).toBe(true);
} else {
console.log('○ No PDF attachments support detected');
}
// Test XML generation with metadata
const xmlString = await invoice.toXmlString('facturx');
expect(xmlString).toBeTruthy();
expect(xmlString.length).toBeGreaterThan(100);
console.log(`✓ Generated XML: ${(xmlString.length / 1024).toFixed(1)}KB`);
} catch (error) {
console.log(`⚠ Attachment handling test failed: ${error.message}`);
}
});
tap.test('PDF-06: Multiple Attachments - Error Handling', async () => {
console.log('Testing multiple attachments error handling...');
// Import required classes
const { PDFExtractor } = await import('../../../ts/formats/pdf/pdf.extractor.js');
const extractor = new PDFExtractor();
// Test 1: Empty PDF buffer
try {
const result = await extractor.extractXml(Buffer.alloc(0));
expect(result.success).toBe(false);
console.log('✓ Correctly handled empty PDF buffer');
} catch (error) {
console.log('✓ Correctly rejected empty PDF buffer');
expect(error.message).toBeTruthy();
}
// Test 2: Invalid PDF data
try {
const result = await extractor.extractXml(Buffer.from('Not a PDF'));
expect(result.success).toBe(false);
console.log('✓ Correctly handled invalid PDF data');
} catch (error) {
console.log('✓ Correctly rejected invalid PDF data');
expect(error.message).toBeTruthy();
}
// Test 3: PDF without attachments
const minimalPdf = Buffer.from('%PDF-1.4\n%%EOF');
try {
const result = await extractor.extractXml(minimalPdf);
if (result.success) {
console.log('○ Minimal PDF processed (may have found XML)');
} else {
console.log('✓ Correctly handled PDF without attachments');
expect(result.success).toBe(false);
}
} catch (error) {
console.log('✓ Correctly handled minimal PDF');
}
});
tap.test('PDF-06: Multiple Attachments - Summary', async () => {
console.log(`\n=== Multiple Attachments Testing Summary ===`);
console.log('✓ Basic multiple attachments extraction tested');
console.log('✓ Attachment handling functionality tested');
console.log('✓ Error handling scenarios tested');
console.log(`\n✓ Multiple attachments testing completed successfully.`);
});
tap.start();