paid-services
Version:
Lightning Paid Services library
173 lines (152 loc) • 4.58 kB
JavaScript
const {deepStrictEqual, rejects} = require('node:assert/strict');
const {before, test} = require('node:test');
const {makeInvoice} = require('mock-lnd');
const {makeLnd} = require('mock-lnd');
const {makePayViaRoutesResponse} = require('mock-lnd');
const {makePaymentRequest} = require('mock-lnd');
const tinysecp = require('tiny-secp256k1');
const messagesForRequest = require('./../../client/messages_for_request');
const method = require('./../../server/process_request');
const id1 = Buffer.alloc(32).toString('hex');
let ecp;
let messages;
let request;
before(async () => {
ecp = (await import('ecpair')).ECPairFactory(tinysecp);
({request} = makePaymentRequest({ecp}));
({messages} = messagesForRequest({reply: request, service: '2'}));
});
const makeArgs = overrides => {
let requests = 0;
const lnd = makeLnd({
payViaRoutes: ({}, cbk) => {
requests++;
if (requests === 2) {
return cbk(null, makePayViaRoutesResponse({}));
}
return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
},
});
const args = {
env: {},
fetch: () => {},
id: id1,
lnd: makeLnd({
getInvoice: ({}, cbk) => {
return cbk(null, makeInvoice({
is_confirmed: true,
is_push: true,
payments: [{messages, is_confirmed: true}],
}));
},
}),
network: 'btc',
payer: lnd,
};
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
return args;
};
const tests = [
{
args: () => makeArgs({env: undefined}),
description: 'Processing a service request requires env vars',
error: [400, 'ExpectedEnvironmentVarsToProcessPaidRequest'],
},
{
args: () => makeArgs({fetch: undefined}),
description: 'Processing a service request requires a fetch function',
error: [400, 'ExpectedFetchFunctionToProcessPaidRequest'],
},
{
args: () => makeArgs({id: undefined}),
description: 'Processing a service request requires an invoice id',
error: [400, 'ExpectedInvoiceIdToProcessPaidRequest'],
},
{
args: () => makeArgs({lnd: undefined}),
description: 'Processing a service request requires lnd to lookup invoice',
error: [400, 'ExpectedAuthenticatedLndToProcessPaidRequest'],
},
{
args: () => makeArgs({network: undefined}),
description: 'Processing a service request requires network name',
error: [400, 'ExpectedNetworkNameToProcessPaidRequest'],
},
{
args: () => makeArgs({payer: undefined}),
description: 'Processing a service request requires a payer to respond',
error: [400, 'ExpectedPayerLndToProcessPaidRequest'],
},
{
args: () => makeArgs({network: 'network'}),
description: 'A request is processed',
error: [500, 'UnexpectedErrMappingInvoiceToPaidRequest'],
},
{
args: () => makeArgs({}),
description: 'A request is processed',
expected: {},
},
{
args: () => makeArgs({
lnd: makeLnd({
getInvoice: ({}, cbk) => {
return cbk(null, makeInvoice({
is_confirmed: true,
is_push: true,
payments: [{
messages: messagesForRequest({
reply: request,
service: Number.MAX_SAFE_INTEGER.toString(),
}).messages,
is_confirmed: true,
}],
}));
},
}),
}),
description: 'A request is processed',
expected: {error: [404, 'UnknownServiceType']},
},
{
args: () => makeArgs({
lnd: makeLnd({
getInvoice: ({}, cbk) => {
return cbk(null, makeInvoice({
is_confirmed: true,
is_push: true,
payments: [{
messages: messagesForRequest({
reply: request,
service: '3',
}).messages,
is_confirmed: true,
}],
}));
},
}),
}),
description: 'A request is processed',
expected: {error: [404, 'ServiceCurrentlyUnsupported']},
},
];
tests.forEach(({args, description, error, expected}) => {
test(description, async () => {
const testArgs = args();
testArgs.ecp = ecp;
if (!!error) {
await rejects(
method(testArgs),
err => {
const [code, message] = err;
deepStrictEqual([code, message], error, 'Got expected error');
return true;
},
'Got expected error'
);
} else {
const res = await method(testArgs);
deepStrictEqual(res, expected, 'Got expected result');
}
});
});