@angro/nav-connector
Version:
Node.js module which provides an interface for communicating with NAV online invoice service.
215 lines (186 loc) • 6.15 kB
JavaScript
const { assert } = require('chai');
const { axios, technicalUser, softwareData } = require('./lib/globals.js');
const createInvoiceOperations = require('./lib/create-invoice-operations.js');
const createInvoiceCorruptOperations = require('./lib/create-invoice-corrupt-operations.js');
const createAnnulmentOperations = require('./lib/create-annulment-operations');
const createAnnulmentCorruptOperations = require('./lib/create-annulment-corrupt-operations');
const waitInvoiceProcessing = require('./lib/wait-invoice-processing.js');
const manageInvoice = require('../src/manage-invoice.js');
const manageAnnulment = require('../src/manage-annulment.js');
const queryTransactionStatus = require('../src/query-transaction-status.js');
describe('queryTransactionStatus()', () => {
let singleTransactionId;
let multiTransactionId;
let corruptTransactionId;
let toAnnulTransactionId;
let annulmentTransactionId;
let corruptAnnulmentTransactionId;
/* Send and wait for a single and multiple invoices to be processed. */
before(async function before() {
const invoiceOperationList = [];
const annulmentOperationList = [];
/* Create invoice operations with a single invoice. */
invoiceOperationList.push(
createInvoiceOperations({
taxNumber: technicalUser.taxNumber,
size: 1,
})
);
/* Create invoice operations with a multiple invoices. */
invoiceOperationList.push(
createInvoiceOperations({
taxNumber: technicalUser.taxNumber,
size: 2,
})
);
/* Create invoice operations with warns and errors. */
invoiceOperationList.push(
createInvoiceCorruptOperations({
taxNumber: technicalUser.taxNumber,
})
);
/* Create invoice operations for annulment */
invoiceOperationList.push(
createInvoiceOperations({
taxNumber: technicalUser.taxNumber,
size: 1,
invoiceNumber: 'INV-1212-K',
})
);
/* Create an annulment operation */
annulmentOperationList.push(
createAnnulmentOperations([{ annulmentReference: 'INV-1212-K' }])
);
/* Create an annulment corrupt operation */
annulmentOperationList.push(createAnnulmentCorruptOperations({ size: 1 }));
/* Send invoices. */
[
singleTransactionId,
multiTransactionId,
corruptTransactionId,
toAnnulTransactionId,
] = await Promise.all(
invoiceOperationList.map(invoiceOperation =>
manageInvoice({
invoiceOperations: {
compressedContent: false,
invoiceOperation,
},
technicalUser,
softwareData,
axios,
})
)
);
/* Wait for invoices to be processes. */
const getStatusPromises = [
singleTransactionId,
multiTransactionId,
corruptTransactionId,
toAnnulTransactionId,
].map((transactionId, index) =>
waitInvoiceProcessing({
transactionId,
technicalUser,
softwareData,
axios,
test: this.test,
ignoreAbortedIndexes: index === 2 ? [1, 2, 3, 4, 5] : [],
})
);
/* send annulments */
[annulmentTransactionId, corruptAnnulmentTransactionId] = await Promise.all(
annulmentOperationList.map(annulmentOperation =>
manageAnnulment({
annulmentOperations: {
annulmentOperation,
},
technicalUser,
softwareData,
axios,
})
)
);
/* Wait for annulments to be processes. */
const getAnnulmentStatusPromises = [
annulmentTransactionId,
corruptAnnulmentTransactionId,
].map((transactionId, index) =>
waitInvoiceProcessing({
transactionId,
technicalUser,
softwareData,
axios,
test: this.test,
ignoreAbortedIndexes: index === 2 ? [1, 2, 3, 4, 5] : [],
})
);
await Promise.all(getStatusPromises.concat(getAnnulmentStatusPromises));
});
it('should resolve to array with single invoice', async () => {
const processingResults = await queryTransactionStatus({
transactionId: singleTransactionId,
technicalUser,
softwareData,
axios,
});
assert.isArray(processingResults);
});
it('should resolve to array with multiple invoice', async () => {
const processingResults = await queryTransactionStatus({
transactionId: multiTransactionId,
technicalUser,
softwareData,
axios,
});
assert.isArray(processingResults);
});
it('should resolve to an empty array if transactionId is invalid', async () => {
const processingResults = await queryTransactionStatus({
transactionId: 'invalid',
technicalUser,
softwareData,
axios,
});
assert.isArray(processingResults);
});
it('should handle originalRequest param', async () => {
const processingResults = await queryTransactionStatus({
transactionId: singleTransactionId,
returnOriginalRequest: true,
technicalUser,
softwareData,
axios,
});
assert.property(processingResults[0], 'originalRequest');
});
it('should convert types', async () => {
const processingResults = await queryTransactionStatus({
transactionId: corruptTransactionId,
technicalUser,
softwareData,
axios,
});
const processingResult = processingResults[1];
assert.isNumber(processingResult.index);
assert.isBoolean(processingResult.compressedContentIndicator);
});
it('should normalize validation messages to arrays', async () => {
const processingResults = await queryTransactionStatus({
transactionId: corruptTransactionId,
technicalUser,
softwareData,
axios,
});
assert.lengthOf(processingResults[4].technicalValidationMessages, 1);
});
it('should resolve to array with single annulment', async () => {
const processingResults = await queryTransactionStatus({
transactionId: annulmentTransactionId,
technicalUser,
softwareData,
axios,
});
assert.isArray(processingResults);
});
});