paid-services 6.1.4 → 6.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/package.json +6 -6
- package/test/client/test_make_service_request.js +0 -2
- package/test/respond/test_send_service_response.js +82 -70
- package/test/server/test_paid_service_event.js +161 -155
- package/test/server/test_process_paywall.js +95 -89
- package/test/server/test_process_request.js +128 -120
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
"asyncjs-util": "1.2.12",
|
|
14
14
|
"bech32": "2.0.0",
|
|
15
15
|
"bolt01": "2.0.0",
|
|
16
|
-
"bolt07": "1.9.
|
|
16
|
+
"bolt07": "1.9.4",
|
|
17
17
|
"ecpair": "2.1.0",
|
|
18
18
|
"goldengate": "14.0.7",
|
|
19
19
|
"invoices": "3.0.0",
|
|
20
|
-
"ln-service": "57.
|
|
21
|
-
"ln-sync": "6.0
|
|
20
|
+
"ln-service": "57.17.0",
|
|
21
|
+
"ln-sync": "6.1.0",
|
|
22
22
|
"psbt": "3.0.0",
|
|
23
23
|
"p2tr": "2.0.0",
|
|
24
24
|
"tiny-secp256k1": "2.2.3"
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"description": "Lightning Paid Services library",
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@alexbosworth/tap": "15.0.12",
|
|
29
|
-
"ln-docker-daemons": "6.0.
|
|
30
|
-
"mock-lnd": "
|
|
29
|
+
"ln-docker-daemons": "6.0.21",
|
|
30
|
+
"mock-lnd": "2.0.0",
|
|
31
31
|
"secp256k1": "5.0.0"
|
|
32
32
|
},
|
|
33
33
|
"engines": {
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"integration-tests": "tap -j 2 --branches=1 --functions=1 --lines=1 --statements=1 -t 2700 test/integration/*.js",
|
|
49
49
|
"test": "tap --branches=1 --functions=1 --lines=1 --statements=1 -t 60 test/actions/*.js test/balanced/*.js test/capacity/*.js test/client/*.js test/config/*.js test/p2p/*.js test/records/*.js test/respond/*.js test/server/*.js test/swaps/*.js test/services/*.js test/trades/*.js"
|
|
50
50
|
},
|
|
51
|
-
"version": "6.1.
|
|
51
|
+
"version": "6.1.5"
|
|
52
52
|
}
|
|
@@ -4,7 +4,6 @@ const {makeInvoiceSubscription} = require('mock-lnd');
|
|
|
4
4
|
const {makeLnd} = require('mock-lnd');
|
|
5
5
|
const {makePaySubscription} = require('mock-lnd');
|
|
6
6
|
const {makePayViaRoutesResponse} = require('mock-lnd');
|
|
7
|
-
const {makePaymentRequest} = require('mock-lnd');
|
|
8
7
|
const {test} = require('@alexbosworth/tap');
|
|
9
8
|
|
|
10
9
|
const messagesForResponse = require('./../../respond/messages_for_response');
|
|
@@ -14,7 +13,6 @@ const responseForSchema = require('./../../services/response_for_schema');
|
|
|
14
13
|
const encode = records => encodeTlvStream({records: [records]}).encoded;
|
|
15
14
|
const id1 = Buffer.alloc(32).toString('hex');
|
|
16
15
|
const id2 = Buffer.alloc(32, 1).toString('hex');
|
|
17
|
-
const {request} = makePaymentRequest({});
|
|
18
16
|
|
|
19
17
|
const makeArgs = overrides => {
|
|
20
18
|
let requests = 0;
|
|
@@ -2,87 +2,99 @@ const {makeLnd} = require('mock-lnd');
|
|
|
2
2
|
const {makePayViaRoutesResponse} = require('mock-lnd');
|
|
3
3
|
const {makePaymentRequest} = require('mock-lnd');
|
|
4
4
|
const {test} = require('@alexbosworth/tap');
|
|
5
|
+
const tinysecp = require('tiny-secp256k1');
|
|
5
6
|
|
|
6
7
|
const method = require('./../../respond/send_service_response');
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
(async () => {
|
|
10
|
+
const ecp = (await import('ecpair')).ECPairFactory(tinysecp);
|
|
10
11
|
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
requests++;
|
|
12
|
+
const makeArgs = overrides => {
|
|
13
|
+
let requests = 0;
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
const lnd = makeLnd({
|
|
16
|
+
payViaRoutes: ({}, cbk) => {
|
|
17
|
+
requests++;
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
if (requests === 2) {
|
|
20
|
+
return cbk(null, makePayViaRoutesResponse({}));
|
|
21
|
+
}
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
request: 'lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w',
|
|
27
|
-
text: 'text',
|
|
28
|
-
};
|
|
23
|
+
return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
|
|
24
|
+
},
|
|
25
|
+
});
|
|
29
26
|
|
|
30
|
-
|
|
27
|
+
const args = {
|
|
28
|
+
lnd,
|
|
29
|
+
mtokens: '10000',
|
|
30
|
+
request: 'lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w',
|
|
31
|
+
text: 'text',
|
|
32
|
+
};
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
};
|
|
34
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
args: makeArgs({error: 'error'}),
|
|
38
|
-
description: 'A request is expected to include valid response records',
|
|
39
|
-
error: [400, 'ExpectedValidServiceResponseToSend'],
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
args: makeArgs({mtokens: undefined}),
|
|
43
|
-
description: 'The mtokens received are expected',
|
|
44
|
-
error: [400, 'ExpectedMillitokensReceivedToSendResponse'],
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
args: makeArgs({request: undefined}),
|
|
48
|
-
description: 'A response request is expected',
|
|
49
|
-
error: [400, 'ExpectedResponsePaymentRequestToSendResponse'],
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
args: makeArgs({request: 'request'}),
|
|
53
|
-
description: 'A valid response request is expected',
|
|
54
|
-
error: [400, 'ExpectedValidPaymentRequestToPayResponse'],
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
args: makeArgs({}),
|
|
58
|
-
description: 'An unexpired invoice is required',
|
|
59
|
-
error: [400, 'ExpectedUnexpiredInvoiceToSendServiceResponse'],
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
args: makeArgs({mtokens: '1', request: makePaymentRequest({}).request}),
|
|
63
|
-
description: 'Payment cannot be greater than the mtokens received',
|
|
64
|
-
error: [400, 'ExpectedPaymentTokensNotGreaterThanReceived'],
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
args: makeArgs({request: makePaymentRequest({mtokens: '0'}).request}),
|
|
68
|
-
description: 'A zero mtokens response is paid',
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
args: makeArgs({request: makePaymentRequest({mtokens: '1'}).request}),
|
|
72
|
-
description: 'A service response is delivered',
|
|
73
|
-
},
|
|
74
|
-
];
|
|
36
|
+
return args;
|
|
37
|
+
};
|
|
75
38
|
|
|
76
|
-
tests
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
39
|
+
const tests = [
|
|
40
|
+
{
|
|
41
|
+
args: makeArgs({error: 'error'}),
|
|
42
|
+
description: 'A request is expected to include valid response records',
|
|
43
|
+
error: [400, 'ExpectedValidServiceResponseToSend'],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
args: makeArgs({mtokens: undefined}),
|
|
47
|
+
description: 'The mtokens received are expected',
|
|
48
|
+
error: [400, 'ExpectedMillitokensReceivedToSendResponse'],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
args: makeArgs({request: undefined}),
|
|
52
|
+
description: 'A response request is expected',
|
|
53
|
+
error: [400, 'ExpectedResponsePaymentRequestToSendResponse'],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
args: makeArgs({request: 'request'}),
|
|
57
|
+
description: 'A valid response request is expected',
|
|
58
|
+
error: [400, 'ExpectedValidPaymentRequestToPayResponse'],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
args: makeArgs({}),
|
|
62
|
+
description: 'An unexpired invoice is required',
|
|
63
|
+
error: [400, 'ExpectedUnexpiredInvoiceToSendServiceResponse'],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
args: makeArgs({
|
|
67
|
+
mtokens: '1',
|
|
68
|
+
request: makePaymentRequest({ecp}).request,
|
|
69
|
+
}),
|
|
70
|
+
description: 'Payment cannot be greater than the mtokens received',
|
|
71
|
+
error: [400, 'ExpectedPaymentTokensNotGreaterThanReceived'],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
args: makeArgs({
|
|
75
|
+
request: makePaymentRequest({ecp, mtokens: '0'}).request,
|
|
76
|
+
}),
|
|
77
|
+
description: 'A zero mtokens response is paid',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
args: makeArgs({
|
|
81
|
+
request: makePaymentRequest({ecp, mtokens: '1'}).request,
|
|
82
|
+
}),
|
|
83
|
+
description: 'A service response is delivered',
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
88
|
+
return test(description, async ({end, strictSame, rejects}) => {
|
|
89
|
+
if (!!error) {
|
|
90
|
+
await rejects(method(args), error, 'Got error');
|
|
91
|
+
} else {
|
|
92
|
+
const res = await method(args);
|
|
82
93
|
|
|
83
|
-
|
|
84
|
-
|
|
94
|
+
strictSame(res, expected, 'Got expected result');
|
|
95
|
+
}
|
|
85
96
|
|
|
86
|
-
|
|
97
|
+
return end();
|
|
98
|
+
});
|
|
87
99
|
});
|
|
88
|
-
});
|
|
100
|
+
})();
|
|
@@ -4,6 +4,7 @@ const {makeLnd} = require('mock-lnd');
|
|
|
4
4
|
const {makePayViaRoutesResponse} = require('mock-lnd');
|
|
5
5
|
const {makePaymentRequest} = require('mock-lnd');
|
|
6
6
|
const {test} = require('@alexbosworth/tap');
|
|
7
|
+
const tinysecp = require('tiny-secp256k1');
|
|
7
8
|
|
|
8
9
|
const messagesForRequest = require('./../../client/messages_for_request');
|
|
9
10
|
const method = require('./../../server/paid_service_event');
|
|
@@ -11,187 +12,192 @@ const method = require('./../../server/paid_service_event');
|
|
|
11
12
|
const encode = records => encodeTlvStream({records: [records]}).encoded;
|
|
12
13
|
const id1 = Buffer.alloc(32).toString('hex');
|
|
13
14
|
const id2 = Buffer.alloc(32, 1).toString('hex');
|
|
14
|
-
const {request} = makePaymentRequest({});
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
(async () => {
|
|
17
|
+
const ecp = (await import('ecpair')).ECPairFactory(tinysecp);
|
|
17
18
|
|
|
18
|
-
const
|
|
19
|
-
let requests = 0;
|
|
19
|
+
const {request} = makePaymentRequest({ecp});
|
|
20
20
|
|
|
21
|
-
const
|
|
22
|
-
getInvoice: ({}, cbk) => {
|
|
23
|
-
return cbk(null, makeInvoice({
|
|
24
|
-
is_confirmed: true,
|
|
25
|
-
is_push: true,
|
|
26
|
-
payments: [{messages, is_confirmed: true}],
|
|
27
|
-
}));
|
|
28
|
-
},
|
|
29
|
-
payViaRoutes: ({}, cbk) => {
|
|
30
|
-
requests++;
|
|
21
|
+
const {messages} = messagesForRequest({reply: request, service: '2'});
|
|
31
22
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
23
|
+
const makeArgs = overrides => {
|
|
24
|
+
let requests = 0;
|
|
35
25
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
26
|
+
const lnd = makeLnd({
|
|
27
|
+
getInvoice: ({}, cbk) => {
|
|
28
|
+
return cbk(null, makeInvoice({
|
|
29
|
+
is_confirmed: true,
|
|
30
|
+
is_push: true,
|
|
31
|
+
payments: [{messages, is_confirmed: true}],
|
|
32
|
+
}));
|
|
33
|
+
},
|
|
34
|
+
payViaRoutes: ({}, cbk) => {
|
|
35
|
+
requests++;
|
|
36
|
+
|
|
37
|
+
if (requests === 2) {
|
|
38
|
+
return cbk(null, makePayViaRoutesResponse({}));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const args = {
|
|
46
|
+
lnd,
|
|
47
|
+
env: {},
|
|
48
|
+
fetch: () => new Promise(resolve => resolve()),
|
|
49
|
+
id: id1,
|
|
50
|
+
network: 'btc',
|
|
51
|
+
payer: lnd,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
39
55
|
|
|
40
|
-
|
|
41
|
-
lnd,
|
|
42
|
-
env: {},
|
|
43
|
-
fetch: () => new Promise(resolve => resolve()),
|
|
44
|
-
id: id1,
|
|
45
|
-
network: 'btc',
|
|
46
|
-
payer: lnd,
|
|
56
|
+
return args;
|
|
47
57
|
};
|
|
48
58
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const tests = [
|
|
55
|
-
{
|
|
56
|
-
args: makeArgs({env: undefined}),
|
|
57
|
-
description: 'Processing a service request requires env vars',
|
|
58
|
-
error: [400, 'ExpectedEnvironmentVariablesForPaidServiceEvent'],
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
args: makeArgs({fetch: undefined}),
|
|
62
|
-
description: 'Processing a service request requires a fetch function',
|
|
63
|
-
error: [400, 'ExpectedFetchFunctionForPaidServiceEvent'],
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
args: makeArgs({id: undefined}),
|
|
67
|
-
description: 'Processing a service request requires an invoice id',
|
|
68
|
-
error: [400, 'ExpectedInvoiceIdForPaidServiceEvent'],
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
args: makeArgs({lnd: undefined}),
|
|
72
|
-
description: 'Processing a service request requires lnd to lookup invoice',
|
|
73
|
-
error: [400, 'ExpectedAuthenticatedLndForPaidServiceEvent'],
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
args: makeArgs({network: undefined}),
|
|
77
|
-
description: 'Processing a service request requires network name',
|
|
78
|
-
error: [400, 'ExpectedNetworkNameStringToGetServiceRequest'],
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
args: makeArgs({payer: undefined}),
|
|
82
|
-
description: 'Processing a service request requires a payer to respond',
|
|
83
|
-
error: [400, 'ExpectedPayerLndForPaidServiceEvent'],
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
args: makeArgs({}),
|
|
87
|
-
description: 'A paid service event happens',
|
|
88
|
-
expected: {
|
|
89
|
-
error: undefined,
|
|
90
|
-
node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
|
|
91
|
-
service: 'ping',
|
|
59
|
+
const tests = [
|
|
60
|
+
{
|
|
61
|
+
args: makeArgs({env: undefined}),
|
|
62
|
+
description: 'Processing a service request requires env vars',
|
|
63
|
+
error: [400, 'ExpectedEnvironmentVariablesForPaidServiceEvent'],
|
|
92
64
|
},
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}),
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
65
|
+
{
|
|
66
|
+
args: makeArgs({fetch: undefined}),
|
|
67
|
+
description: 'Processing a service request requires a fetch function',
|
|
68
|
+
error: [400, 'ExpectedFetchFunctionForPaidServiceEvent'],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
args: makeArgs({id: undefined}),
|
|
72
|
+
description: 'Processing a service request requires an invoice id',
|
|
73
|
+
error: [400, 'ExpectedInvoiceIdForPaidServiceEvent'],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
args: makeArgs({lnd: undefined}),
|
|
77
|
+
description: 'Processing a service request requires lnd to lookup invoice',
|
|
78
|
+
error: [400, 'ExpectedAuthenticatedLndForPaidServiceEvent'],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
args: makeArgs({network: undefined}),
|
|
82
|
+
description: 'Processing a service request requires network name',
|
|
83
|
+
error: [400, 'ExpectedNetworkNameStringToGetServiceRequest'],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
args: makeArgs({payer: undefined}),
|
|
87
|
+
description: 'Processing a service request requires a payer to respond',
|
|
88
|
+
error: [400, 'ExpectedPayerLndForPaidServiceEvent'],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
args: makeArgs({}),
|
|
92
|
+
description: 'A paid service event happens',
|
|
93
|
+
expected: {
|
|
94
|
+
error: undefined,
|
|
95
|
+
node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
|
|
96
|
+
service: 'ping',
|
|
116
97
|
},
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
args: makeArgs({
|
|
101
|
+
lnd: makeLnd({
|
|
102
|
+
getInvoice: ({}, cbk) => {
|
|
122
103
|
return cbk(null, makeInvoice({
|
|
123
|
-
description_hash: id2,
|
|
124
104
|
is_confirmed: true,
|
|
105
|
+
is_push: true,
|
|
106
|
+
payments: [],
|
|
125
107
|
}));
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
110
|
+
}),
|
|
111
|
+
description: 'A random push happens',
|
|
112
|
+
expected: {},
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
args: makeArgs({
|
|
116
|
+
env: {
|
|
117
|
+
PAID_SERVICES_INBOX_EMAIL_FROM: 'from',
|
|
118
|
+
PAID_SERVICES_INBOX_EMAIL_TO: 'to',
|
|
119
|
+
PAID_SERVICES_INBOX_POSTMARK_API_KEY: 'key',
|
|
120
|
+
PAID_SERVICES_INBOX_PRICE: '1',
|
|
121
|
+
},
|
|
122
|
+
lnd: makeLnd({
|
|
123
|
+
getInvoice: ({id}, cbk) => {
|
|
124
|
+
switch (id) {
|
|
125
|
+
// Return a paywall invoice
|
|
126
|
+
case id1:
|
|
127
|
+
return cbk(null, makeInvoice({
|
|
128
|
+
description_hash: id2,
|
|
129
|
+
is_confirmed: true,
|
|
130
|
+
}));
|
|
126
131
|
|
|
127
|
-
|
|
128
|
-
|
|
132
|
+
// Return a keysend invoice
|
|
133
|
+
case id2:
|
|
134
|
+
return cbk(null, makeInvoice({
|
|
135
|
+
is_confirmed: true,
|
|
136
|
+
is_push: true,
|
|
137
|
+
payments: [{
|
|
138
|
+
is_confirmed: true,
|
|
139
|
+
messages: messagesForRequest({
|
|
140
|
+
arguments: encode({
|
|
141
|
+
type: '0',
|
|
142
|
+
value: Buffer.from('message').toString('hex'),
|
|
143
|
+
}),
|
|
144
|
+
reply: request,
|
|
145
|
+
service: '4',
|
|
146
|
+
}).messages,
|
|
147
|
+
}],
|
|
148
|
+
}));
|
|
149
|
+
|
|
150
|
+
default:
|
|
151
|
+
return cbk([500, 'UnexpectedIdentifierForGetInvoice', {id}]);
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
}),
|
|
155
|
+
}),
|
|
156
|
+
description: 'A paywall request is processed',
|
|
157
|
+
expected: {
|
|
158
|
+
error: undefined,
|
|
159
|
+
node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
|
|
160
|
+
service: 'inbox',
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
args: makeArgs({
|
|
165
|
+
lnd: makeLnd({
|
|
166
|
+
getInvoice: ({}, cbk) => {
|
|
129
167
|
return cbk(null, makeInvoice({
|
|
130
168
|
is_confirmed: true,
|
|
131
169
|
is_push: true,
|
|
132
170
|
payments: [{
|
|
133
|
-
is_confirmed: true,
|
|
134
171
|
messages: messagesForRequest({
|
|
135
|
-
arguments: encode({
|
|
136
|
-
type: '0',
|
|
137
|
-
value: Buffer.from('message').toString('hex'),
|
|
138
|
-
}),
|
|
139
172
|
reply: request,
|
|
140
|
-
service: '
|
|
173
|
+
service: '3',
|
|
141
174
|
}).messages,
|
|
175
|
+
is_confirmed: true,
|
|
142
176
|
}],
|
|
143
177
|
}));
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return cbk([500, 'UnexpectedIdentifierForGetInvoice', {id}]);
|
|
147
|
-
}
|
|
148
|
-
},
|
|
178
|
+
},
|
|
179
|
+
}),
|
|
149
180
|
}),
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
},
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
args: makeArgs({
|
|
160
|
-
lnd: makeLnd({
|
|
161
|
-
getInvoice: ({}, cbk) => {
|
|
162
|
-
return cbk(null, makeInvoice({
|
|
163
|
-
is_confirmed: true,
|
|
164
|
-
is_push: true,
|
|
165
|
-
payments: [{
|
|
166
|
-
messages: messagesForRequest({
|
|
167
|
-
reply: request,
|
|
168
|
-
service: '3',
|
|
169
|
-
}).messages,
|
|
170
|
-
is_confirmed: true,
|
|
171
|
-
}],
|
|
172
|
-
}));
|
|
173
|
-
},
|
|
174
|
-
}),
|
|
175
|
-
}),
|
|
176
|
-
description: 'A request is processed',
|
|
177
|
-
expected: {
|
|
178
|
-
error: [404, 'ServiceCurrentlyUnsupported'],
|
|
179
|
-
node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
|
|
180
|
-
service: 'profile',
|
|
181
|
+
description: 'A request is processed',
|
|
182
|
+
expected: {
|
|
183
|
+
error: [404, 'ServiceCurrentlyUnsupported'],
|
|
184
|
+
node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
|
|
185
|
+
service: 'profile',
|
|
186
|
+
},
|
|
181
187
|
},
|
|
182
|
-
|
|
183
|
-
];
|
|
188
|
+
];
|
|
184
189
|
|
|
185
|
-
tests.forEach(({args, description, error, expected}) => {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
190
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
191
|
+
return test(description, async ({end, equal, rejects, strictSame}) => {
|
|
192
|
+
if (!!error) {
|
|
193
|
+
await rejects(method(args), error, 'Got expected error');
|
|
194
|
+
} else {
|
|
195
|
+
const res = await method(args);
|
|
191
196
|
|
|
192
|
-
|
|
193
|
-
|
|
197
|
+
strictSame(res, expected, 'Got expected result');
|
|
198
|
+
}
|
|
194
199
|
|
|
195
|
-
|
|
200
|
+
return end();
|
|
201
|
+
});
|
|
196
202
|
});
|
|
197
|
-
});
|
|
203
|
+
})();
|
|
@@ -3,6 +3,7 @@ const {makeInvoice} = require('mock-lnd');
|
|
|
3
3
|
const {makeLnd} = require('mock-lnd');
|
|
4
4
|
const {makePaymentRequest} = require('mock-lnd');
|
|
5
5
|
const {test} = require('@alexbosworth/tap');
|
|
6
|
+
const tinysecp = require('tiny-secp256k1');
|
|
6
7
|
|
|
7
8
|
const messagesForRequest = require('./../../client/messages_for_request');
|
|
8
9
|
const method = require('./../../server/process_paywall');
|
|
@@ -10,104 +11,109 @@ const method = require('./../../server/process_paywall');
|
|
|
10
11
|
const encode = records => encodeTlvStream({records: [records]}).encoded;
|
|
11
12
|
const id1 = Buffer.alloc(32).toString('hex');
|
|
12
13
|
const id2 = Buffer.alloc(32, 1).toString('hex');
|
|
13
|
-
const {request} = makePaymentRequest({});
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
(async () => {
|
|
16
|
+
const ecp = (await import('ecpair')).ECPairFactory(tinysecp);
|
|
16
17
|
|
|
17
|
-
const
|
|
18
|
-
const args = {
|
|
19
|
-
env: {
|
|
20
|
-
PAID_SERVICES_INBOX_EMAIL_FROM: 'from',
|
|
21
|
-
PAID_SERVICES_INBOX_EMAIL_TO: 'to',
|
|
22
|
-
PAID_SERVICES_INBOX_POSTMARK_API_KEY: 'key',
|
|
23
|
-
PAID_SERVICES_INBOX_PRICE: '1',
|
|
24
|
-
},
|
|
25
|
-
fetch: () => new Promise(resolve => resolve()),
|
|
26
|
-
id: id1,
|
|
27
|
-
lnd: makeLnd({
|
|
28
|
-
getInvoice: ({id}, cbk) => {
|
|
29
|
-
switch (id) {
|
|
30
|
-
// Return a paywall invoice
|
|
31
|
-
case id1:
|
|
32
|
-
return cbk(null, makeInvoice({
|
|
33
|
-
description_hash: id2,
|
|
34
|
-
is_confirmed: true,
|
|
35
|
-
}));
|
|
18
|
+
const {request} = makePaymentRequest({ecp});
|
|
36
19
|
|
|
37
|
-
|
|
38
|
-
case id2:
|
|
39
|
-
return cbk(null, makeInvoice({
|
|
40
|
-
is_confirmed: true,
|
|
41
|
-
is_push: true,
|
|
42
|
-
payments: [{
|
|
43
|
-
is_confirmed: true,
|
|
44
|
-
messages: messagesForRequest({
|
|
45
|
-
arguments: encode({
|
|
46
|
-
type: '0',
|
|
47
|
-
value: Buffer.from('message').toString('hex'),
|
|
48
|
-
}),
|
|
49
|
-
reply: request,
|
|
50
|
-
service: '4',
|
|
51
|
-
}).messages,
|
|
52
|
-
}],
|
|
53
|
-
}));
|
|
20
|
+
const {messages} = messagesForRequest({reply: request, service: '2'});
|
|
54
21
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
22
|
+
const makeArgs = overrides => {
|
|
23
|
+
const args = {
|
|
24
|
+
env: {
|
|
25
|
+
PAID_SERVICES_INBOX_EMAIL_FROM: 'from',
|
|
26
|
+
PAID_SERVICES_INBOX_EMAIL_TO: 'to',
|
|
27
|
+
PAID_SERVICES_INBOX_POSTMARK_API_KEY: 'key',
|
|
28
|
+
PAID_SERVICES_INBOX_PRICE: '1',
|
|
58
29
|
},
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
30
|
+
fetch: () => new Promise(resolve => resolve()),
|
|
31
|
+
id: id1,
|
|
32
|
+
lnd: makeLnd({
|
|
33
|
+
getInvoice: ({id}, cbk) => {
|
|
34
|
+
switch (id) {
|
|
35
|
+
// Return a paywall invoice
|
|
36
|
+
case id1:
|
|
37
|
+
return cbk(null, makeInvoice({
|
|
38
|
+
description_hash: id2,
|
|
39
|
+
is_confirmed: true,
|
|
40
|
+
}));
|
|
41
|
+
|
|
42
|
+
// Return a keysend invoice
|
|
43
|
+
case id2:
|
|
44
|
+
return cbk(null, makeInvoice({
|
|
45
|
+
is_confirmed: true,
|
|
46
|
+
is_push: true,
|
|
47
|
+
payments: [{
|
|
48
|
+
is_confirmed: true,
|
|
49
|
+
messages: messagesForRequest({
|
|
50
|
+
arguments: encode({
|
|
51
|
+
type: '0',
|
|
52
|
+
value: Buffer.from('message').toString('hex'),
|
|
53
|
+
}),
|
|
54
|
+
reply: request,
|
|
55
|
+
service: '4',
|
|
56
|
+
}).messages,
|
|
57
|
+
}],
|
|
58
|
+
}));
|
|
59
|
+
|
|
60
|
+
default:
|
|
61
|
+
return cbk([500, 'UnexpectedIdentifierForGetInvoice', {id}]);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
}),
|
|
65
|
+
network: 'btc',
|
|
66
|
+
payer: makeLnd({}),
|
|
67
|
+
};
|
|
63
68
|
|
|
64
|
-
|
|
69
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
65
70
|
|
|
66
|
-
|
|
67
|
-
};
|
|
71
|
+
return args;
|
|
72
|
+
};
|
|
68
73
|
|
|
69
|
-
const tests = [
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
];
|
|
74
|
+
const tests = [
|
|
75
|
+
{
|
|
76
|
+
args: makeArgs({env: undefined}),
|
|
77
|
+
description: 'Processing a paywall requires env vars',
|
|
78
|
+
error: [400, 'ExpectedEnvironmentVariablesToProcessPaywall'],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
args: makeArgs({fetch: undefined}),
|
|
82
|
+
description: 'Processing a paywall requires a fetch function',
|
|
83
|
+
error: [400, 'ExpectedFetchFunctionToProcessPaywallPayment'],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
args: makeArgs({id: undefined}),
|
|
87
|
+
description: 'Processing a paywall requires an invoice id',
|
|
88
|
+
error: [400, 'ExpectedInvoiceIdToProcessPaywallRequest'],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
args: makeArgs({lnd: undefined}),
|
|
92
|
+
description: 'Processing a paywall requires lnd',
|
|
93
|
+
error: [400, 'ExpectedLndToProcessPaywallRequest'],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
args: makeArgs({network: undefined}),
|
|
97
|
+
description: 'Processing a paywall requires a network name',
|
|
98
|
+
error: [400, 'ExpectedNetworkNameToProcessPaywallRequest'],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
args: makeArgs({}),
|
|
102
|
+
description: 'A paywall is processed',
|
|
103
|
+
},
|
|
104
|
+
];
|
|
100
105
|
|
|
101
|
-
tests.forEach(({args, description, error, expected}) => {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
106
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
107
|
+
return test(description, async ({end, equal, rejects, strictSame}) => {
|
|
108
|
+
if (!!error) {
|
|
109
|
+
await rejects(method(args), error, 'Got expected error');
|
|
110
|
+
} else {
|
|
111
|
+
const res = await method(args);
|
|
107
112
|
|
|
108
|
-
|
|
109
|
-
|
|
113
|
+
strictSame(res, expected, 'Got expected result');
|
|
114
|
+
}
|
|
110
115
|
|
|
111
|
-
|
|
116
|
+
return end();
|
|
117
|
+
});
|
|
112
118
|
});
|
|
113
|
-
});
|
|
119
|
+
})();
|
|
@@ -4,6 +4,7 @@ const {makeLnd} = require('mock-lnd');
|
|
|
4
4
|
const {makePayViaRoutesResponse} = require('mock-lnd');
|
|
5
5
|
const {makePaymentRequest} = require('mock-lnd');
|
|
6
6
|
const {test} = require('@alexbosworth/tap');
|
|
7
|
+
const tinysecp = require('tiny-secp256k1');
|
|
7
8
|
|
|
8
9
|
const messagesForRequest = require('./../../client/messages_for_request');
|
|
9
10
|
const method = require('./../../server/process_request');
|
|
@@ -11,142 +12,149 @@ const method = require('./../../server/process_request');
|
|
|
11
12
|
const encode = records => encodeTlvStream({records: [records]}).encoded;
|
|
12
13
|
const id1 = Buffer.alloc(32).toString('hex');
|
|
13
14
|
const id2 = Buffer.alloc(32, 1).toString('hex');
|
|
14
|
-
const {request} = makePaymentRequest({});
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
(async () => {
|
|
17
|
+
const ecp = (await import('ecpair')).ECPairFactory(tinysecp);
|
|
17
18
|
|
|
18
|
-
const
|
|
19
|
-
let requests = 0;
|
|
19
|
+
const {request} = makePaymentRequest({ecp});
|
|
20
20
|
|
|
21
|
-
const
|
|
22
|
-
payViaRoutes: ({}, cbk) => {
|
|
23
|
-
requests++;
|
|
21
|
+
const {messages} = messagesForRequest({reply: request, service: '2'});
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
23
|
+
const makeArgs = overrides => {
|
|
24
|
+
let requests = 0;
|
|
28
25
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
const lnd = makeLnd({
|
|
27
|
+
payViaRoutes: ({}, cbk) => {
|
|
28
|
+
requests++;
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
getInvoice: ({}, cbk) => {
|
|
39
|
-
return cbk(null, makeInvoice({
|
|
40
|
-
is_confirmed: true,
|
|
41
|
-
is_push: true,
|
|
42
|
-
payments: [{messages, is_confirmed: true}],
|
|
43
|
-
}));
|
|
30
|
+
if (requests === 2) {
|
|
31
|
+
return cbk(null, makePayViaRoutesResponse({}));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
|
|
44
35
|
},
|
|
45
|
-
})
|
|
46
|
-
network: 'btc',
|
|
47
|
-
payer: lnd,
|
|
48
|
-
};
|
|
36
|
+
});
|
|
49
37
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const tests = [
|
|
56
|
-
{
|
|
57
|
-
args: makeArgs({env: undefined}),
|
|
58
|
-
description: 'Processing a service request requires env vars',
|
|
59
|
-
error: [400, 'ExpectedEnvironmentVarsToProcessPaidRequest'],
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
args: makeArgs({fetch: undefined}),
|
|
63
|
-
description: 'Processing a service request requires a fetch function',
|
|
64
|
-
error: [400, 'ExpectedFetchFunctionToProcessPaidRequest'],
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
args: makeArgs({id: undefined}),
|
|
68
|
-
description: 'Processing a service request requires an invoice id',
|
|
69
|
-
error: [400, 'ExpectedInvoiceIdToProcessPaidRequest'],
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
args: makeArgs({lnd: undefined}),
|
|
73
|
-
description: 'Processing a service request requires lnd to lookup invoice',
|
|
74
|
-
error: [400, 'ExpectedAuthenticatedLndToProcessPaidRequest'],
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
args: makeArgs({network: undefined}),
|
|
78
|
-
description: 'Processing a service request requires network name',
|
|
79
|
-
error: [400, 'ExpectedNetworkNameToProcessPaidRequest'],
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
args: makeArgs({payer: undefined}),
|
|
83
|
-
description: 'Processing a service request requires a payer to respond',
|
|
84
|
-
error: [400, 'ExpectedPayerLndToProcessPaidRequest'],
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
args: makeArgs({network: 'network'}),
|
|
88
|
-
description: 'A request is processed',
|
|
89
|
-
error: [500, 'UnexpectedErrMappingInvoiceToPaidRequest'],
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
args: makeArgs({}),
|
|
93
|
-
description: 'A request is processed',
|
|
94
|
-
expected: {},
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
args: makeArgs({
|
|
38
|
+
const args = {
|
|
39
|
+
env: {},
|
|
40
|
+
fetch: () => {},
|
|
41
|
+
id: id1,
|
|
98
42
|
lnd: makeLnd({
|
|
99
43
|
getInvoice: ({}, cbk) => {
|
|
100
44
|
return cbk(null, makeInvoice({
|
|
101
45
|
is_confirmed: true,
|
|
102
46
|
is_push: true,
|
|
103
|
-
payments: [{
|
|
104
|
-
messages: messagesForRequest({
|
|
105
|
-
reply: request,
|
|
106
|
-
service: Number.MAX_SAFE_INTEGER.toString(),
|
|
107
|
-
}).messages,
|
|
108
|
-
is_confirmed: true,
|
|
109
|
-
}],
|
|
47
|
+
payments: [{messages, is_confirmed: true}],
|
|
110
48
|
}));
|
|
111
49
|
},
|
|
112
50
|
}),
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
51
|
+
network: 'btc',
|
|
52
|
+
payer: lnd,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
56
|
+
|
|
57
|
+
return args;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const tests = [
|
|
61
|
+
{
|
|
62
|
+
args: makeArgs({env: undefined}),
|
|
63
|
+
description: 'Processing a service request requires env vars',
|
|
64
|
+
error: [400, 'ExpectedEnvironmentVarsToProcessPaidRequest'],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
args: makeArgs({fetch: undefined}),
|
|
68
|
+
description: 'Processing a service request requires a fetch function',
|
|
69
|
+
error: [400, 'ExpectedFetchFunctionToProcessPaidRequest'],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
args: makeArgs({id: undefined}),
|
|
73
|
+
description: 'Processing a service request requires an invoice id',
|
|
74
|
+
error: [400, 'ExpectedInvoiceIdToProcessPaidRequest'],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
args: makeArgs({lnd: undefined}),
|
|
78
|
+
description: 'Processing a service request requires lnd to lookup invoice',
|
|
79
|
+
error: [400, 'ExpectedAuthenticatedLndToProcessPaidRequest'],
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
args: makeArgs({network: undefined}),
|
|
83
|
+
description: 'Processing a service request requires network name',
|
|
84
|
+
error: [400, 'ExpectedNetworkNameToProcessPaidRequest'],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
args: makeArgs({payer: undefined}),
|
|
88
|
+
description: 'Processing a service request requires a payer to respond',
|
|
89
|
+
error: [400, 'ExpectedPayerLndToProcessPaidRequest'],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
args: makeArgs({network: 'network'}),
|
|
93
|
+
description: 'A request is processed',
|
|
94
|
+
error: [500, 'UnexpectedErrMappingInvoiceToPaidRequest'],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
args: makeArgs({}),
|
|
98
|
+
description: 'A request is processed',
|
|
99
|
+
expected: {},
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
args: makeArgs({
|
|
103
|
+
lnd: makeLnd({
|
|
104
|
+
getInvoice: ({}, cbk) => {
|
|
105
|
+
return cbk(null, makeInvoice({
|
|
129
106
|
is_confirmed: true,
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
107
|
+
is_push: true,
|
|
108
|
+
payments: [{
|
|
109
|
+
messages: messagesForRequest({
|
|
110
|
+
reply: request,
|
|
111
|
+
service: Number.MAX_SAFE_INTEGER.toString(),
|
|
112
|
+
}).messages,
|
|
113
|
+
is_confirmed: true,
|
|
114
|
+
}],
|
|
115
|
+
}));
|
|
116
|
+
},
|
|
117
|
+
}),
|
|
133
118
|
}),
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
119
|
+
description: 'A request is processed',
|
|
120
|
+
expected: {error: [404, 'UnknownServiceType']},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
args: makeArgs({
|
|
124
|
+
lnd: makeLnd({
|
|
125
|
+
getInvoice: ({}, cbk) => {
|
|
126
|
+
return cbk(null, makeInvoice({
|
|
127
|
+
is_confirmed: true,
|
|
128
|
+
is_push: true,
|
|
129
|
+
payments: [{
|
|
130
|
+
messages: messagesForRequest({
|
|
131
|
+
reply: request,
|
|
132
|
+
service: '3',
|
|
133
|
+
}).messages,
|
|
134
|
+
is_confirmed: true,
|
|
135
|
+
}],
|
|
136
|
+
}));
|
|
137
|
+
},
|
|
138
|
+
}),
|
|
139
|
+
}),
|
|
140
|
+
description: 'A request is processed',
|
|
141
|
+
expected: {error: [404, 'ServiceCurrentlyUnsupported']},
|
|
142
|
+
},
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
146
|
+
return test(description, async ({end, equal, rejects, strictSame}) => {
|
|
147
|
+
args.ecp = (await import('ecpair')).ECPairFactory(tinysecp);
|
|
148
|
+
|
|
149
|
+
if (!!error) {
|
|
150
|
+
await rejects(method(args), error, 'Got expected error');
|
|
151
|
+
} else {
|
|
152
|
+
const res = await method(args);
|
|
153
|
+
|
|
154
|
+
strictSame(res, expected, 'Got expected result');
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return end();
|
|
158
|
+
});
|
|
151
159
|
});
|
|
152
|
-
});
|
|
160
|
+
})();
|