einvoice/test/suite/einvoice_encoding/test.enc-07.attribute-encoding.ts
2025-05-27 19:30:07 +00:00

131 lines
4.4 KiB
TypeScript

import { expect, tap } from '@git.zone/tstest/tapbundle';
import { EInvoice } from '../../../ts/index.js';
import { PerformanceTracker } from '../performance.tracker.js';
tap.test('ENC-07: Attribute Encoding - should handle character encoding in XML attributes', async () => {
// ENC-07: Verify handling of Attribute Encoding encoded documents
// Test 1: Direct Attribute Encoding encoding (expected to fail)
console.log('\nTest 1: Direct Attribute Encoding encoding');
const { result: directResult, metric: directMetric } = await PerformanceTracker.track(
'attribute-direct',
async () => {
// XML parsers typically don't support Attribute Encoding directly
const xmlContent = `<?xml version="1.0" encoding="Attribute Encoding"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<UBLVersionID>2.1</UBLVersionID>
<ID>ATTRIBUTE-TEST</ID>
<IssueDate>2025-01-25</IssueDate>
<DocumentCurrencyCode>EUR</DocumentCurrencyCode>
</Invoice>`;
let success = false;
let error = null;
try {
const newInvoice = new EInvoice();
await newInvoice.fromXmlString(xmlContent);
success = newInvoice.id === 'ATTRIBUTE-TEST' ||
newInvoice.invoiceId === 'ATTRIBUTE-TEST' ||
newInvoice.accountingDocId === 'ATTRIBUTE-TEST';
} catch (e) {
error = e;
console.log(` Attribute Encoding not directly supported: ${e.message}`);
}
return { success, error };
}
);
console.log(` Attribute Encoding direct test completed in ${directMetric.duration}ms`);
// Test 2: UTF-8 fallback (should always work)
console.log('\nTest 2: UTF-8 fallback');
const { result: fallbackResult, metric: fallbackMetric } = await PerformanceTracker.track(
'attribute-fallback',
async () => {
const einvoice = new EInvoice();
einvoice.id = 'ATTRIBUTE-FALLBACK-TEST';
einvoice.issueDate = new Date(2025, 0, 25);
einvoice.invoiceId = 'ATTRIBUTE-FALLBACK-TEST';
einvoice.accountingDocId = 'ATTRIBUTE-FALLBACK-TEST';
einvoice.subject = 'Attribute Encoding fallback test';
einvoice.from = {
type: 'company',
name: 'Test Company',
description: 'Testing Attribute Encoding encoding',
address: {
streetName: 'Test Street',
houseNumber: '1',
postalCode: '12345',
city: 'Test City',
country: 'DE'
},
status: 'active',
foundedDate: { year: 2020, month: 1, day: 1 },
registrationDetails: {
vatId: 'DE123456789',
registrationId: 'HRB 12345',
registrationName: 'Commercial Register'
}
};
einvoice.to = {
type: 'person',
name: 'Test',
surname: 'Customer',
salutation: 'Mr' as const,
sex: 'male' as const,
title: 'Doctor' as const,
description: 'Test customer',
address: {
streetName: 'Customer Street',
houseNumber: '2',
postalCode: '54321',
city: 'Customer City',
country: 'DE'
}
};
einvoice.items = [{
position: 1,
name: 'Test Product',
articleNumber: 'ATTRIBUTE-001',
unitType: 'EA',
unitQuantity: 1,
unitNetPrice: 100,
vatPercentage: 19
}];
// Export as UTF-8 (our default)
const utf8Xml = await einvoice.toXmlString('ubl');
// Verify UTF-8 works correctly
const newInvoice = new EInvoice();
await newInvoice.fromXmlString(utf8Xml);
const success = newInvoice.id === 'ATTRIBUTE-FALLBACK-TEST' ||
newInvoice.invoiceId === 'ATTRIBUTE-FALLBACK-TEST' ||
newInvoice.accountingDocId === 'ATTRIBUTE-FALLBACK-TEST';
console.log(` UTF-8 fallback works: ${success}`);
return { success };
}
);
console.log(` Attribute Encoding fallback test completed in ${fallbackMetric.duration}ms`);
// Summary
console.log('\n=== Attribute Encoding Encoding Test Summary ===');
console.log(`Attribute Encoding Direct: ${directResult.success ? 'Supported' : 'Not supported (acceptable)'}`);
console.log(`UTF-8 Fallback: ${fallbackResult.success ? 'Working' : 'Failed'}`);
// The test passes if UTF-8 fallback works, since Attribute Encoding support is optional
expect(fallbackResult.success).toBeTrue();
});
// Run the test
tap.start();