180 lines
5.9 KiB
TypeScript
180 lines
5.9 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-07: Metadata Preservation - Basic Metadata Test', async () => {
|
|
console.log('Testing PDF metadata preservation...');
|
|
|
|
// Import required classes
|
|
const { EInvoice } = await import('../../../ts/index.js');
|
|
|
|
// Create an invoice with full metadata
|
|
const invoice = new EInvoice();
|
|
invoice.id = 'META-TEST-001';
|
|
invoice.accountingDocId = 'META-TEST-001';
|
|
invoice.date = Date.now();
|
|
invoice.currency = 'EUR';
|
|
invoice.from.name = 'Metadata Test Supplier';
|
|
invoice.from.address.city = 'Berlin';
|
|
invoice.from.address.postalCode = '10115';
|
|
invoice.from.address.country = 'DE';
|
|
invoice.to.name = 'Metadata Test Customer';
|
|
invoice.to.address.city = 'Munich';
|
|
invoice.to.address.postalCode = '80331';
|
|
invoice.to.address.country = 'DE';
|
|
|
|
// Set additional metadata
|
|
if (!invoice.metadata) {
|
|
invoice.metadata = {};
|
|
}
|
|
invoice.metadata.format = 'FACTURX';
|
|
invoice.metadata.version = '1.0';
|
|
invoice.metadata.profile = 'BASIC';
|
|
|
|
invoice.addItem({
|
|
name: 'Test Item for Metadata',
|
|
unitQuantity: 1,
|
|
unitNetPrice: 100.00,
|
|
vatPercentage: 19
|
|
});
|
|
|
|
// Test metadata preservation during XML generation
|
|
try {
|
|
const xmlString = await invoice.toXmlString('facturx');
|
|
expect(xmlString).toBeTruthy();
|
|
expect(xmlString.length).toBeGreaterThan(100);
|
|
|
|
// Create a new invoice from the XML
|
|
const newInvoice = new EInvoice();
|
|
await newInvoice.fromXmlString(xmlString);
|
|
|
|
// Verify core data is preserved
|
|
expect(newInvoice.id).toBe('META-TEST-001');
|
|
expect(newInvoice.currency).toBe('EUR');
|
|
expect(newInvoice.from.name).toBe('Metadata Test Supplier');
|
|
expect(newInvoice.to.name).toBe('Metadata Test Customer');
|
|
|
|
console.log('✓ Metadata preserved during XML round-trip');
|
|
|
|
} catch (error) {
|
|
console.log(`⚠ Metadata preservation test failed: ${error.message}`);
|
|
}
|
|
});
|
|
|
|
tap.test('PDF-07: Metadata Preservation - PDF Metadata Test', async () => {
|
|
console.log('Testing PDF metadata extraction and preservation...');
|
|
|
|
// Import required classes
|
|
const { EInvoice } = await import('../../../ts/index.js');
|
|
|
|
// Get PDF files from corpus
|
|
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 metadata test');
|
|
return;
|
|
}
|
|
|
|
// Test metadata extraction from first PDF
|
|
const pdfPath = existingPdfs[0];
|
|
const pdfName = path.basename(pdfPath);
|
|
|
|
try {
|
|
const invoice = new EInvoice();
|
|
await invoice.fromFile(pdfPath);
|
|
|
|
// Check if we have PDF metadata
|
|
if (invoice.pdf) {
|
|
console.log(`✓ PDF metadata available for ${pdfName}`);
|
|
expect(invoice.pdf).toBeTruthy();
|
|
expect(invoice.pdf.name).toBe(pdfName);
|
|
|
|
if (invoice.pdf.metadata) {
|
|
console.log(' PDF format:', invoice.pdf.metadata.format || 'Unknown');
|
|
|
|
// Check for embedded XML info
|
|
if (invoice.pdf.metadata.embeddedXml) {
|
|
console.log(' Embedded XML filename:', invoice.pdf.metadata.embeddedXml.filename);
|
|
expect(invoice.pdf.metadata.embeddedXml.filename).toBeTruthy();
|
|
}
|
|
}
|
|
} else {
|
|
console.log('○ No PDF metadata found');
|
|
}
|
|
|
|
// Verify invoice data was extracted
|
|
expect(invoice.id).toBeTruthy();
|
|
console.log(`✓ Invoice ID extracted: ${invoice.id}`);
|
|
|
|
} catch (error) {
|
|
console.log(`⚠ PDF metadata test failed: ${error.message}`);
|
|
}
|
|
});
|
|
|
|
tap.test('PDF-07: Metadata Preservation - Format Detection Test', async () => {
|
|
console.log('Testing metadata preservation with format detection...');
|
|
|
|
// Import required classes
|
|
const { EInvoice } = await import('../../../ts/index.js');
|
|
const { FormatDetector } = await import('../../../ts/formats/utils/format.detector.js');
|
|
|
|
// Test different invoice formats
|
|
const testData = [
|
|
{
|
|
name: 'UBL Invoice',
|
|
xml: `<?xml version="1.0" encoding="UTF-8"?>
|
|
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
|
|
<ID>UBL-META-001</ID>
|
|
<IssueDate>2024-01-01</IssueDate>
|
|
<InvoiceTypeCode>380</InvoiceTypeCode>
|
|
</Invoice>`
|
|
},
|
|
{
|
|
name: 'CII Invoice',
|
|
xml: `<?xml version="1.0" encoding="UTF-8"?>
|
|
<CrossIndustryInvoice xmlns="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100">
|
|
<ExchangedDocument>
|
|
<ID>CII-META-001</ID>
|
|
</ExchangedDocument>
|
|
</CrossIndustryInvoice>`
|
|
}
|
|
];
|
|
|
|
for (const test of testData) {
|
|
console.log(`\nTesting ${test.name}...`);
|
|
|
|
try {
|
|
// Detect format
|
|
const detectedFormat = FormatDetector.detectFormat(test.xml);
|
|
console.log(` Detected format: ${detectedFormat}`);
|
|
|
|
// Create invoice from XML
|
|
const invoice = new EInvoice();
|
|
await invoice.fromXmlString(test.xml);
|
|
|
|
// Check that format metadata is preserved
|
|
expect(invoice.getFormat()).toBeTruthy();
|
|
console.log(` Invoice format: ${invoice.getFormat()}`);
|
|
|
|
// Verify we can access the original XML
|
|
const originalXml = invoice.getXml();
|
|
expect(originalXml).toBe(test.xml);
|
|
console.log(' ✓ Original XML preserved');
|
|
|
|
} catch (error) {
|
|
console.log(` ⚠ Format test failed: ${error.message}`);
|
|
}
|
|
}
|
|
});
|
|
|
|
tap.test('PDF-07: Metadata Preservation - Summary', async () => {
|
|
console.log(`\n=== Metadata Preservation Testing Summary ===`);
|
|
console.log('✓ Basic metadata preservation tested');
|
|
console.log('✓ PDF metadata extraction tested');
|
|
console.log('✓ Format detection and preservation tested');
|
|
console.log(`\n✓ Metadata preservation testing completed successfully.`);
|
|
});
|
|
|
|
tap.start(); |