ln-service
Version:
Interaction helper for your Lightning Network daemon
137 lines (94 loc) • 3.99 kB
JavaScript
const {deepStrictEqual} = require('node:assert').strict;
const {strictEqual} = require('node:assert').strict;
const test = require('node:test');
const asyncRetry = require('async/retry');
const {setupChannel} = require('ln-docker-daemons');
const {spawnLightningCluster} = require('ln-docker-daemons');
const {addPeer} = require('./../../');
const {createInvoice} = require('./../../');
const {getForwards} = require('./../../');
const {pay} = require('./../../');
const delay = n => new Promise(resolve => setTimeout(resolve, n));
const interval = 100;
const limit = 1;
const size = 3;
const times = 1000;
const tokens = 100;
// Getting forwarded payments should return all forwarded payments
test('Get forwards', async () => {
const {kill, nodes} = await spawnLightningCluster({size});
const [{generate, lnd}, target, remote] = nodes;
await asyncRetry({interval, times}, async () => {
await addPeer({lnd, public_key: remote.id, socket: remote.socket});
await setupChannel({generate, lnd, to: target});
await setupChannel({
lnd: target.lnd,
generate: target.generate,
to: remote,
});
});
await addPeer({lnd, public_key: remote.id, socket: remote.socket});
await delay(2000);
for (let i = 0, l = remote.lnd; i < 3; i++) {
await asyncRetry({interval, times}, async () => {
await delay(1000);
await pay({
lnd,
request: (await createInvoice({lnd: l, tokens: tokens + i})).request,
});
});
}
const page1 = await getForwards({limit, lnd: target.lnd});
strictEqual(!!page1.next, true, 'Page 1 leads to page 2');
{
const [forward] = page1.forwards;
strictEqual(!!forward.created_at, true, 'Forward created at');
strictEqual(forward.fee, 1, 'Forward fee charged');
strictEqual(forward.fee_mtokens, '1000', 'Forward fee charged');
strictEqual(!!forward.incoming_channel, true, 'Forward incoming channel');
strictEqual(forward.tokens, 100, 'Forwarded tokens count');
strictEqual(!!forward.outgoing_channel, true, 'Forward outgoing channel');
}
const page2 = await getForwards({lnd: target.lnd, token: page1.next});
strictEqual(!!page2.next, true, 'Page 2 leads to page 3');
{
const [forward] = page2.forwards;
strictEqual(forward.tokens, 101, 'Second forward tokens count');
}
const page3 = await getForwards({lnd: target.lnd, token: page2.next});
strictEqual(!!page3.next, true, 'Page 3 leads to page 4');
{
const [forward] = page3.forwards;
strictEqual(forward.tokens, 102, 'Third forward tokens count');
// Check "before" based paging
const prev0 = await getForwards({
limit,
before: forward.created_at,
lnd: target.lnd,
});
const [firstForward] = prev0.forwards;
strictEqual(firstForward.tokens, 100, 'Previous row #1');
const prev1 = await getForwards({lnd: target.lnd, token: prev0.next});
const [secondForward] = prev1.forwards;
strictEqual(secondForward.tokens, 101, 'Previous row #2');
const prev2 = await getForwards({lnd: target.lnd, token: prev1.next});
strictEqual(prev2.next, undefined, 'Ended paging of previous rows');
// Check "after" based paging
const after0 = await getForwards({
limit,
before: forward.created_at,
after: firstForward.created_at,
lnd: target.lnd,
});
deepStrictEqual(after0.forwards, prev0.forwards, 'After is inclusive');
const after1 = await getForwards({lnd: target.lnd, token: after0.next});
deepStrictEqual(after1.forwards, prev1.forwards, 'Iterating before');
const after2 = await getForwards({lnd: target.lnd, token: after1.next});
strictEqual(after2.next, undefined, 'Before is non-inclusive');
}
const page4 = await getForwards({lnd: target.lnd, token: page3.next});
strictEqual(page4.forwards.length, [].length, 'Page 4 has no results');
strictEqual(page4.next, undefined, 'Page 4 leads to nowhere');
await kill({});
return;
});