@mojaloop/sdk-scheme-adapter 18.0.0 → 18.0.1
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/.dockerignore +18 -0
- package/.eslintignore +2 -0
- package/CHANGELOG.md +8 -0
- package/audit-resolve.json +5 -0
- package/package.json +2 -2
- package/test/__mocks__/@mojaloop/sdk-standard-components.js +0 -151
- package/test/__mocks__/javascript-state-machine.js +0 -21
- package/test/__mocks__/redis.js +0 -78
- package/test/__mocks__/uuidv4.js +0 -16
- package/test/config/integration.env +0 -146
- package/test/integration/lib/Outbound/data/quotesPostRequest.json +0 -52
- package/test/integration/lib/Outbound/data/transfersPostRequest.json +0 -24
- package/test/integration/lib/Outbound/parties.test.js +0 -31
- package/test/integration/lib/Outbound/quotes.test.js +0 -62
- package/test/integration/lib/Outbound/simpleTransfers.test.js +0 -70
- package/test/integration/lib/cache.test.js +0 -79
- package/test/integration/testEnv.js +0 -4
- package/test/unit/ControlClient.test.js +0 -69
- package/test/unit/ControlServer/events.js +0 -41
- package/test/unit/ControlServer/index.js +0 -227
- package/test/unit/ControlServer.test.js +0 -66
- package/test/unit/InboundServer.test.js +0 -443
- package/test/unit/TestServer.test.js +0 -392
- package/test/unit/api/accounts/accounts.test.js +0 -128
- package/test/unit/api/accounts/data/postAccountsBody.json +0 -7
- package/test/unit/api/accounts/data/postAccountsErrorMojaloopResponse.json +0 -33
- package/test/unit/api/accounts/data/postAccountsErrorTimeoutResponse.json +0 -19
- package/test/unit/api/accounts/data/postAccountsSuccessResponse.json +0 -31
- package/test/unit/api/accounts/data/postAccountsSuccessResponseWithError1.json +0 -34
- package/test/unit/api/accounts/data/postAccountsSuccessResponseWithError2.json +0 -39
- package/test/unit/api/accounts/utils.js +0 -79
- package/test/unit/api/proxy/data/proxyConfig.yaml +0 -82
- package/test/unit/api/proxy/data/requestBody.json +0 -22
- package/test/unit/api/proxy/data/requestHeaders.json +0 -5
- package/test/unit/api/proxy/data/requestQuery.json +0 -6
- package/test/unit/api/proxy/data/responseBody.json +0 -21
- package/test/unit/api/proxy/data/responseHeaders.json +0 -5
- package/test/unit/api/proxy/proxy.test.js +0 -220
- package/test/unit/api/proxy/utils.js +0 -79
- package/test/unit/api/transfers/data/getTransfersCommittedResponse.json +0 -24
- package/test/unit/api/transfers/data/getTransfersErrorNotFound.json +0 -18
- package/test/unit/api/transfers/data/postQuotesBody.json +0 -52
- package/test/unit/api/transfers/data/postTransfersBadBody.json +0 -17
- package/test/unit/api/transfers/data/postTransfersBody.json +0 -24
- package/test/unit/api/transfers/data/postTransfersErrorMojaloopResponse.json +0 -62
- package/test/unit/api/transfers/data/postTransfersErrorTimeoutResponse.json +0 -48
- package/test/unit/api/transfers/data/postTransfersSimpleBody.json +0 -26
- package/test/unit/api/transfers/data/postTransfersSuccessResponse.json +0 -128
- package/test/unit/api/transfers/data/putPartiesBody.json +0 -20
- package/test/unit/api/transfers/data/putQuotesBody.json +0 -37
- package/test/unit/api/transfers/data/putTransfersBody.json +0 -17
- package/test/unit/api/transfers/transfers.test.js +0 -191
- package/test/unit/api/transfers/utils.js +0 -264
- package/test/unit/api/utils.js +0 -86
- package/test/unit/config.test.js +0 -119
- package/test/unit/data/commonHttpHeaders.json +0 -7
- package/test/unit/data/defaultConfig.json +0 -70
- package/test/unit/data/postQuotesBody.json +0 -52
- package/test/unit/data/putParticipantsBody.json +0 -12
- package/test/unit/data/putPartiesBody.json +0 -20
- package/test/unit/data/testFile.json +0 -29
- package/test/unit/data/testFile.yaml +0 -14
- package/test/unit/inboundApi/data/mockArguments.json +0 -117
- package/test/unit/inboundApi/data/mockTransactionRequest.json +0 -42
- package/test/unit/inboundApi/handlers.test.js +0 -786
- package/test/unit/index.test.js +0 -88
- package/test/unit/lib/cache.test.js +0 -145
- package/test/unit/lib/model/AccountsModel.test.js +0 -124
- package/test/unit/lib/model/InboundTransfersModel.test.js +0 -889
- package/test/unit/lib/model/OutboundBulkQuotesModel.test.js +0 -253
- package/test/unit/lib/model/OutboundBulkTransfersModel.test.js +0 -247
- package/test/unit/lib/model/OutboundRequestToPayModel.test.js +0 -166
- package/test/unit/lib/model/OutboundRequestToPayTransferModel.test.js +0 -245
- package/test/unit/lib/model/OutboundTransfersModel.test.js +0 -1579
- package/test/unit/lib/model/PartiesModel.test.js +0 -478
- package/test/unit/lib/model/QuotesModel.test.js +0 -477
- package/test/unit/lib/model/TransfersModel.test.js +0 -481
- package/test/unit/lib/model/common/PersistentStateMachine.test.js +0 -178
- package/test/unit/lib/model/data/authorizationsResponse.json +0 -13
- package/test/unit/lib/model/data/bulkQuoteRequest.json +0 -27
- package/test/unit/lib/model/data/bulkQuoteResponse.json +0 -35
- package/test/unit/lib/model/data/bulkTransferFulfil.json +0 -13
- package/test/unit/lib/model/data/bulkTransferRequest.json +0 -29
- package/test/unit/lib/model/data/defaultConfig.json +0 -59
- package/test/unit/lib/model/data/getBulkTransfersBackendResponse.json +0 -42
- package/test/unit/lib/model/data/getBulkTransfersMojaloopResponse.json +0 -22
- package/test/unit/lib/model/data/getTransfersBackendResponse.json +0 -34
- package/test/unit/lib/model/data/getTransfersMojaloopResponse.json +0 -17
- package/test/unit/lib/model/data/mockArguments.json +0 -188
- package/test/unit/lib/model/data/mockTxnRequestsArguments.json +0 -63
- package/test/unit/lib/model/data/notificationAbortedToPayee.json +0 -10
- package/test/unit/lib/model/data/notificationReservedToPayee.json +0 -10
- package/test/unit/lib/model/data/notificationToPayee.json +0 -10
- package/test/unit/lib/model/data/payeeParty.json +0 -18
- package/test/unit/lib/model/data/putQuotesResponse.json +0 -33
- package/test/unit/lib/model/data/putTransfersResponse.json +0 -5
- package/test/unit/lib/model/data/quoteResponse.json +0 -42
- package/test/unit/lib/model/data/requestToPayRequest.json +0 -20
- package/test/unit/lib/model/data/requestToPayTransferRequest.json +0 -27
- package/test/unit/lib/model/data/transactionRequestResponse.json +0 -18
- package/test/unit/lib/model/data/transferFulfil.json +0 -10
- package/test/unit/lib/model/data/transferRequest.json +0 -26
- package/test/unit/lib/model/mockedLibRequests.js +0 -74
- package/test/unit/mockLogger.js +0 -39
- package/test/unit/outboundApi/data/bulkQuoteRequest.json +0 -28
- package/test/unit/outboundApi/data/bulkTransferRequest.json +0 -28
- package/test/unit/outboundApi/data/mockBulkQuoteError.json +0 -45
- package/test/unit/outboundApi/data/mockBulkTransferError.json +0 -48
- package/test/unit/outboundApi/data/mockError.json +0 -41
- package/test/unit/outboundApi/data/mockGetPartiesError.json +0 -4
- package/test/unit/outboundApi/data/mockRequestToPayError.json +0 -32
- package/test/unit/outboundApi/data/mockRequestToPayTransferError.json +0 -39
- package/test/unit/outboundApi/data/requestToPay.json +0 -21
- package/test/unit/outboundApi/data/requestToPayTransferRequest.json +0 -20
- package/test/unit/outboundApi/data/transferRequest.json +0 -21
- package/test/unit/outboundApi/handlers.test.js +0 -887
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
/**************************************************************************
|
|
2
|
-
* (C) Copyright ModusBox Inc. 2019 - All rights reserved. *
|
|
3
|
-
* *
|
|
4
|
-
* This file is made available under the terms of the license agreement *
|
|
5
|
-
* specified in the corresponding source code repository. *
|
|
6
|
-
* *
|
|
7
|
-
* ORIGINAL AUTHOR: *
|
|
8
|
-
* Murthy Kakarlamudi - murthy@modusbox.com *
|
|
9
|
-
**************************************************************************/
|
|
10
|
-
|
|
11
|
-
'use strict';
|
|
12
|
-
|
|
13
|
-
// we use a mock standard components lib to intercept and mock certain funcs
|
|
14
|
-
jest.mock('@mojaloop/sdk-standard-components');
|
|
15
|
-
jest.mock('redis');
|
|
16
|
-
|
|
17
|
-
const Cache = require('~/lib/cache');
|
|
18
|
-
const Model = require('~/lib/model').OutboundRequestToPayTransferModel;
|
|
19
|
-
|
|
20
|
-
const { MojaloopRequests, Logger } = require('@mojaloop/sdk-standard-components');
|
|
21
|
-
const StateMachine = require('javascript-state-machine');
|
|
22
|
-
const { SDKStateEnum } = require('../../../../src/lib/model/common');
|
|
23
|
-
|
|
24
|
-
const defaultConfig = require('./data/defaultConfig');
|
|
25
|
-
const requestToPayTransferRequest = require('./data/requestToPayTransferRequest');
|
|
26
|
-
const quoteResponseTemplate = require('./data/quoteResponse');
|
|
27
|
-
const authorizationsResponse = require('./data/authorizationsResponse');
|
|
28
|
-
const transferFulfil = require('./data/transferFulfil');
|
|
29
|
-
|
|
30
|
-
// util function to simulate a quote response subscription message on a cache client
|
|
31
|
-
const emitQuoteResponseCacheMessage = (cache, quoteId, quoteResponse) => cache.publish(`qt_${quoteId}`, JSON.stringify(quoteResponse));
|
|
32
|
-
|
|
33
|
-
// util function to simulate a authorizations response subscription message on a cache client
|
|
34
|
-
const emitAuthorizationsResponseCacheMessage = (cache, authorizationsResponse) => cache.publish(`otp_${requestToPayTransferRequest.requestToPayTransactionId}`, JSON.stringify(authorizationsResponse));
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
// util function to simulate a transfer fulfilment subscription message on a cache client
|
|
38
|
-
const emitTransferFulfilCacheMessage = (cache, transferId, fulfil) => cache.publish(`tf_${transferId}`, JSON.stringify(fulfil));
|
|
39
|
-
|
|
40
|
-
describe('outboundRequestToPayTransferModel', () => {
|
|
41
|
-
let quoteResponse;
|
|
42
|
-
let config;
|
|
43
|
-
let logger;
|
|
44
|
-
let cache;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
*
|
|
48
|
-
* @param {Object} opts
|
|
49
|
-
* @param {Number} opts.expirySeconds
|
|
50
|
-
* @param {Object} opts.delays
|
|
51
|
-
* @param {Number} delays.requestQuotes
|
|
52
|
-
* @param {Number} delays.prepareTransfer
|
|
53
|
-
* @param {Object} opts.rejects
|
|
54
|
-
* @param {boolean} rejects.quoteResponse
|
|
55
|
-
* @param {boolean} rejects.transferFulfils
|
|
56
|
-
*/
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
beforeAll(async () => {
|
|
60
|
-
logger = new Logger.Logger({ context: { app: 'outbound-model-unit-tests-cache' }, stringify: () => '' });
|
|
61
|
-
quoteResponse = JSON.parse(JSON.stringify(quoteResponseTemplate));
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
beforeEach(async () => {
|
|
65
|
-
config = JSON.parse(JSON.stringify(defaultConfig));
|
|
66
|
-
MojaloopRequests.__postParticipants = jest.fn(() => Promise.resolve());
|
|
67
|
-
MojaloopRequests.__getParties = jest.fn(() => Promise.resolve());
|
|
68
|
-
MojaloopRequests.__getAuthorizations = jest.fn(() => Promise.resolve());
|
|
69
|
-
MojaloopRequests.__postQuotes = jest.fn(() => Promise.resolve());
|
|
70
|
-
MojaloopRequests.__putQuotes = jest.fn(() => Promise.resolve());
|
|
71
|
-
MojaloopRequests.__putQuotesError = jest.fn(() => Promise.resolve());
|
|
72
|
-
MojaloopRequests.__postTransfers = jest.fn(() => Promise.resolve());
|
|
73
|
-
|
|
74
|
-
cache = new Cache({
|
|
75
|
-
cacheUrl: 'redis://dummy:1234',
|
|
76
|
-
logger,
|
|
77
|
-
});
|
|
78
|
-
await cache.connect();
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
afterEach(async () => {
|
|
82
|
-
await cache.disconnect();
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
test('initializes to starting state', async () => {
|
|
86
|
-
const model = new Model({
|
|
87
|
-
cache,
|
|
88
|
-
logger,
|
|
89
|
-
...config,
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
await model.initialize(JSON.parse(JSON.stringify(requestToPayTransferRequest)));
|
|
93
|
-
expect(StateMachine.__instance.state).toBe('start');
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
test('executes all three transfer stages without halting when AUTO_ACCEPT_QUOTES and AUTO_ACCEPT_PARTY are true', async () => {
|
|
98
|
-
config.autoAcceptR2PDeviceOTP = true;
|
|
99
|
-
config.autoAcceptR2PDeviceQuotes = true;
|
|
100
|
-
config.autoAcceptQuotes = true;
|
|
101
|
-
|
|
102
|
-
MojaloopRequests.__getAuthorizations = jest.fn(() => {
|
|
103
|
-
emitAuthorizationsResponseCacheMessage(cache, authorizationsResponse);
|
|
104
|
-
return Promise.resolve();
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
MojaloopRequests.__postQuotes = jest.fn((postQuotesBody) => {
|
|
108
|
-
// ensure that the `MojaloopRequests.postQuotes` method has been called with correct arguments
|
|
109
|
-
// including extension list
|
|
110
|
-
const extensionList = postQuotesBody.extensionList.extension;
|
|
111
|
-
expect(extensionList).toBeTruthy();
|
|
112
|
-
expect(extensionList.length).toBe(2);
|
|
113
|
-
expect(extensionList[0]).toEqual({ key: 'qkey1', value: 'qvalue1' });
|
|
114
|
-
expect(extensionList[1]).toEqual({ key: 'qkey2', value: 'qvalue2' });
|
|
115
|
-
|
|
116
|
-
// simulate a callback with the quote response
|
|
117
|
-
emitQuoteResponseCacheMessage(cache, postQuotesBody.quoteId, quoteResponse);
|
|
118
|
-
return Promise.resolve();
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
MojaloopRequests.__postTransfers = jest.fn((postTransfersBody, destFspId) => {
|
|
122
|
-
//ensure that the `MojaloopRequests.postTransfers` method has been called with the correct arguments
|
|
123
|
-
// set as the destination FSPID, picked up from the header's value `fspiop-source`
|
|
124
|
-
expect(model.data.quoteResponseSource).toBe(quoteResponse.data.headers['fspiop-source']);
|
|
125
|
-
|
|
126
|
-
const extensionList = postTransfersBody.extensionList.extension;
|
|
127
|
-
expect(extensionList).toBeTruthy();
|
|
128
|
-
expect(extensionList.length).toBe(2);
|
|
129
|
-
expect(extensionList[0]).toEqual({ key: 'tkey1', value: 'tvalue1' });
|
|
130
|
-
expect(extensionList[1]).toEqual({ key: 'tkey2', value: 'tvalue2' });
|
|
131
|
-
|
|
132
|
-
expect(destFspId).toBe(quoteResponse.data.headers['fspiop-source']);
|
|
133
|
-
expect(quoteResponse.data.headers['fspiop-source']).not.toBe(model.data.to.fspId);
|
|
134
|
-
|
|
135
|
-
// simulate a callback with the transfer fulfilment
|
|
136
|
-
emitTransferFulfilCacheMessage(cache, postTransfersBody.transferId, transferFulfil);
|
|
137
|
-
return Promise.resolve();
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
const model = new Model({
|
|
141
|
-
cache,
|
|
142
|
-
logger,
|
|
143
|
-
...config,
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
await model.initialize(JSON.parse(JSON.stringify(requestToPayTransferRequest)));
|
|
147
|
-
|
|
148
|
-
expect(StateMachine.__instance.state).toBe('start');
|
|
149
|
-
|
|
150
|
-
// start the model running
|
|
151
|
-
const result = await model.run();
|
|
152
|
-
|
|
153
|
-
expect(MojaloopRequests.__postQuotes).toHaveBeenCalledTimes(1);
|
|
154
|
-
expect(MojaloopRequests.__getAuthorizations).toHaveBeenCalledTimes(1);
|
|
155
|
-
expect(MojaloopRequests.__postTransfers).toHaveBeenCalledTimes(1);
|
|
156
|
-
|
|
157
|
-
// check we stopped at payeeResolved state
|
|
158
|
-
expect(result.currentState).toBe(SDKStateEnum.COMPLETED);
|
|
159
|
-
expect(StateMachine.__instance.state).toBe('succeeded');
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
// test('halts and resumes after quotes and otp stages when AUTO_ACCEPT_QUOTES is false and AUTO_ACCEPT_OTP is false', async () => {
|
|
163
|
-
|
|
164
|
-
// config.autoAcceptR2PDeviceOTP = false;
|
|
165
|
-
// config.autoAcceptR2PDeviceQuotes = false;
|
|
166
|
-
|
|
167
|
-
// let model = new Model({
|
|
168
|
-
// cache,
|
|
169
|
-
// logger,
|
|
170
|
-
// ...config,
|
|
171
|
-
// });
|
|
172
|
-
|
|
173
|
-
// await model.initialize(JSON.parse(JSON.stringify(requestToPayTransferRequest)));
|
|
174
|
-
|
|
175
|
-
// expect(StateMachine.__instance.state).toBe('start');
|
|
176
|
-
|
|
177
|
-
// // start the model running
|
|
178
|
-
// let resultPromise = model.run();
|
|
179
|
-
|
|
180
|
-
// // now we started the model running we simulate a callback with the quote response
|
|
181
|
-
// cache.publish(`qt_${model.data.quoteId}`, JSON.stringify(quoteResponse));
|
|
182
|
-
|
|
183
|
-
// // wait for the model to reach a terminal state
|
|
184
|
-
// let result = await resultPromise;
|
|
185
|
-
|
|
186
|
-
// // check we stopped at quoteReceived state
|
|
187
|
-
// expect(result.currentState).toBe(SDKStateEnum.WAITING_FOR_QUOTE_ACCEPTANCE);
|
|
188
|
-
// expect(StateMachine.__instance.state).toBe('quoteReceived');
|
|
189
|
-
|
|
190
|
-
// const requestToPayTransactionId = requestToPayTransferRequest.requestToPayTransactionId;
|
|
191
|
-
|
|
192
|
-
// // load a new model from the saved state
|
|
193
|
-
// model = new Model({
|
|
194
|
-
// cache,
|
|
195
|
-
// logger,
|
|
196
|
-
// ...config,
|
|
197
|
-
// });
|
|
198
|
-
|
|
199
|
-
// await model.load(requestToPayTransactionId);
|
|
200
|
-
|
|
201
|
-
// // check the model loaded to the correct state
|
|
202
|
-
// expect(StateMachine.__instance.state).toBe('quoteReceived');
|
|
203
|
-
|
|
204
|
-
// // now run the model again. this should trigger transition to quote request
|
|
205
|
-
// resultPromise = model.run();
|
|
206
|
-
|
|
207
|
-
// // now we started the model running we simulate a callback with the otp response
|
|
208
|
-
// cache.publish(`otp_${requestToPayTransactionId}`, JSON.stringify(authorizationsResponse));
|
|
209
|
-
|
|
210
|
-
// // wait for the model to reach a terminal state
|
|
211
|
-
// result = await resultPromise;
|
|
212
|
-
|
|
213
|
-
// // check we stopped at quoteReceived state
|
|
214
|
-
// expect(result.currentState).toBe('WAITING_FOR_OTP_ACCEPTANCE');
|
|
215
|
-
// expect(StateMachine.__instance.state).toBe('otpReceived');
|
|
216
|
-
|
|
217
|
-
// // load a new model from the saved state
|
|
218
|
-
// model = new Model({
|
|
219
|
-
// cache,
|
|
220
|
-
// logger,
|
|
221
|
-
// ...config,
|
|
222
|
-
// });
|
|
223
|
-
|
|
224
|
-
// await model.load(requestToPayTransactionId);
|
|
225
|
-
|
|
226
|
-
// // check the model loaded to the correct state
|
|
227
|
-
// expect(StateMachine.__instance.state).toBe('otpReceived');
|
|
228
|
-
|
|
229
|
-
// // now run the model again. this should trigger transition to quote request
|
|
230
|
-
// resultPromise = model.run();
|
|
231
|
-
|
|
232
|
-
// // now we started the model running we simulate a callback with the transfer fulfilment
|
|
233
|
-
// cache.publish(`tf_${model.data.transferId}`, JSON.stringify(transferFulfil));
|
|
234
|
-
|
|
235
|
-
// // wait for the model to reach a terminal state
|
|
236
|
-
// result = await resultPromise;
|
|
237
|
-
|
|
238
|
-
// // check we stopped at quoteReceived state
|
|
239
|
-
// expect(result.currentState).toBe(SDKStateEnum.COMPLETED);
|
|
240
|
-
// expect(StateMachine.__instance.state).toBe('succeeded');
|
|
241
|
-
|
|
242
|
-
// });
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
});
|