ut-codec
Version:
UT codec module.
133 lines (129 loc) • 6.41 kB
JavaScript
var NDC = require('../ndc');
const ndc = new NDC({messageFormat: {}});
var test = require('blue-tape');
var emv = {
request: {
msg: new Buffer('31311c3030323030303030311c1c31383130303932321c31391c3b353032323635343030303030303030303d323730353632303934303f1c1c' +
'20444220202041441c3030303030303030303030301c31393634323d343f34393433393b313a1c1c1c1c3230303231313030303030303030303030303030303030' +
'3030301c551c3543414d30343030384331353946303230363946303330363946314130323935303535463241303239413033394330313946333730343946303230' +
'3630303030303030303030303039463033303630303030303030303030303035413039353032323635343030303030303030303037354633343031303139463336' +
'3032303042363946323630383332323536364533453434413344454139463237303138303946303930323030303039463333303336303430323039463141303230' +
'3630383946333530313134353730463530323236353430303030303030303030373044323730353632303934303546324130323036303839413033313730373138' +
'39463431303231353537394330313031394633373034303030303135353739463533303135411c353833463239384503', 'hex'),
result: {
amount: '000000000000',
bufferB: '',
bufferC: '',
camFlags: [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]],
coordination: '9',
lastTransactionData: {notes1: 0, notes2: 0, notes3: 0, notes4: 0, sernum: '0021', status: '1'},
luno: '002000001',
opcode: [' ', 'D', 'B', ' ', ' ', ' ', 'A', 'D'],
pinBlock: '19642D4F49439B1A',
pinBlockNew: '',
reserved: '',
session: undefined,
timeVariantNumber: '18100922',
topOfReceipt: '1',
track2: ';5022654000000000=2705620940?',
track3: '',
type: '11'
}
},
response: {
msg: {
luno: '002000001',
coordination: '9',
timeVariantNumber: '19110959',
nextState: '165',
type1Notes: '00',
type2Notes: '00',
type3Notes: '00',
type4Notes: '00',
sernum: '0000',
function: '5',
screenUpdate: '',
screenMessage: '',
cardReturn: '0',
printer: '0',
printerData: '',
conId: 1,
session: {
transferId: false
},
camFlags: [[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]],
emvTags: {
CDOL1: {
tag: '8C',
val: {
'95': {idx: 3, len: 5, tag: '95', val: '0000000000'},
amountAuthorised: {idx: 0, len: 6, tag: '9F02', val: '000000000000'},
amountOther: {idx: 1, len: 6, tag: '9F03', val: '000000000000'},
terminalCountryCode: {idx: 2, len: 2, tag: '9F1A', val: '0608'},
transactionCurrencyCode: {idx: 4, len: 2, tag: '5F2A', val: '0608'},
transactionDate: {idx: 5, len: 3, tag: '9A', val: '170718'},
transactionType: {idx: 6, len: 1, tag: '9C', val: '01'},
unpredictableNumber: {idx: 7, len: 4, tag: '9F37', val: '00001557'}
}
},
amountAuthorised: '000000000000',
amountOther: '000000000000',
pan: '502265400000000007',
panSeqNum: '01',
atc: '00B6',
applicationCryptogram: '322566E3E44A3DEA',
cryptogramInformationData: '80',
applicationVersionNumber: '0000',
terminalCapabilities: '604020',
terminalCountryCode: '0608',
terminalType: '14',
track2EquivalentData: '5022654000000000070D2705620940',
transactionCurrencyCode: '0608',
transactionDate: '170718',
transactionSequenceCounter: '1557',
transactionType: '01',
unpredictableNumber: '0000155F',
'9F53': '5A'
}
},
result: '341c3030323030303030311c31393131303935391c3136351c30303030303030301c30303030351c' +
'39303543414d3034303038433137393535394630323639463033363946314132354632413239413339433139463337333844343943313946333733394630323630' +
'3030303030303030303030394630333630303030303030303030303035413935303232363534303030303030303030303735463334313031394633363230304236' +
'3946323638333232353636453345343441334445413946323731383039463039323030303039463333333630343032303946314132303630383946333531313435' +
'3731353530323236353430303030303030303030373044323730353632303934303546324132303630383941333137303731383946343132313535373943313031' +
'3946333734303030303135354639463533313541'
}
};
var testTimeout = timeout => (resolve, reject) => {
let smallTimeout = {session: {transactionTimeout: timeout}};
let resultReq = ndc.decode(emv.request.msg, {}, smallTimeout);
let response = Object.assign({
transactionRequestId: resultReq.transactionRequestId,
transactionTimeout: resultReq.transactionTimeout
}, emv.response.msg);
setTimeout(() => {
try {
resolve(ndc.encode(response, {opcode: 'transactionReply'}, smallTimeout));
} catch (e) {
reject(e);
}
}, 1500);
};
test('NDC timeout', (t) => {
t.plan(3);
let context = {};
let resultReq = ndc.decode(emv.request.msg, {}, context);
emv.request.result.transactionRequestId = resultReq.transactionRequestId;
emv.request.result.transactionTimeout = resultReq.transactionTimeout;
let response = Object.assign({
transactionRequestId: resultReq.transactionRequestId,
transactionTimeout: resultReq.transactionTimeout
}, emv.response.msg);
t.throws(() => {
resultReq = ndc.decode(emv.request.msg, {}, context);
response = Object.assign({}, emv.response.msg);
ndc.encode(response, {opcode: 'transactionReply'}, context);
}, /Transaction timed out/, 'timeout different transactionRequestId');
t.shouldReject(new Promise(testTimeout(1)), /Transaction timed out/, 'timeout time passed');
t.ok(new Promise(testTimeout(2)), 'timeout did not pass');
});