@mojaloop/sdk-scheme-adapter 17.0.2-snapshot.6 → 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.
Files changed (120) hide show
  1. package/.circleci/config.yml +0 -4
  2. package/.dockerignore +18 -0
  3. package/.eslintignore +2 -0
  4. package/CHANGELOG.md +20 -0
  5. package/Dockerfile +8 -5
  6. package/audit-resolve.json +10 -0
  7. package/docker-compose.yml +3 -2
  8. package/package.json +4 -3
  9. package/src/lib/model/InboundTransfersModel.js +2 -2
  10. package/test/__mocks__/@mojaloop/sdk-standard-components.js +0 -151
  11. package/test/__mocks__/javascript-state-machine.js +0 -21
  12. package/test/__mocks__/redis.js +0 -78
  13. package/test/__mocks__/uuidv4.js +0 -16
  14. package/test/config/integration.env +0 -146
  15. package/test/integration/lib/Outbound/data/quotesPostRequest.json +0 -52
  16. package/test/integration/lib/Outbound/data/transfersPostRequest.json +0 -24
  17. package/test/integration/lib/Outbound/parties.test.js +0 -31
  18. package/test/integration/lib/Outbound/quotes.test.js +0 -62
  19. package/test/integration/lib/Outbound/simpleTransfers.test.js +0 -70
  20. package/test/integration/lib/cache.test.js +0 -79
  21. package/test/integration/testEnv.js +0 -4
  22. package/test/unit/ControlClient.test.js +0 -69
  23. package/test/unit/ControlServer/events.js +0 -41
  24. package/test/unit/ControlServer/index.js +0 -227
  25. package/test/unit/ControlServer.test.js +0 -66
  26. package/test/unit/InboundServer.test.js +0 -443
  27. package/test/unit/TestServer.test.js +0 -392
  28. package/test/unit/api/accounts/accounts.test.js +0 -128
  29. package/test/unit/api/accounts/data/postAccountsBody.json +0 -7
  30. package/test/unit/api/accounts/data/postAccountsErrorMojaloopResponse.json +0 -33
  31. package/test/unit/api/accounts/data/postAccountsErrorTimeoutResponse.json +0 -19
  32. package/test/unit/api/accounts/data/postAccountsSuccessResponse.json +0 -31
  33. package/test/unit/api/accounts/data/postAccountsSuccessResponseWithError1.json +0 -34
  34. package/test/unit/api/accounts/data/postAccountsSuccessResponseWithError2.json +0 -39
  35. package/test/unit/api/accounts/utils.js +0 -79
  36. package/test/unit/api/proxy/data/proxyConfig.yaml +0 -82
  37. package/test/unit/api/proxy/data/requestBody.json +0 -22
  38. package/test/unit/api/proxy/data/requestHeaders.json +0 -5
  39. package/test/unit/api/proxy/data/requestQuery.json +0 -6
  40. package/test/unit/api/proxy/data/responseBody.json +0 -21
  41. package/test/unit/api/proxy/data/responseHeaders.json +0 -5
  42. package/test/unit/api/proxy/proxy.test.js +0 -220
  43. package/test/unit/api/proxy/utils.js +0 -79
  44. package/test/unit/api/transfers/data/getTransfersCommittedResponse.json +0 -24
  45. package/test/unit/api/transfers/data/getTransfersErrorNotFound.json +0 -18
  46. package/test/unit/api/transfers/data/postQuotesBody.json +0 -52
  47. package/test/unit/api/transfers/data/postTransfersBadBody.json +0 -17
  48. package/test/unit/api/transfers/data/postTransfersBody.json +0 -24
  49. package/test/unit/api/transfers/data/postTransfersErrorMojaloopResponse.json +0 -62
  50. package/test/unit/api/transfers/data/postTransfersErrorTimeoutResponse.json +0 -48
  51. package/test/unit/api/transfers/data/postTransfersSimpleBody.json +0 -26
  52. package/test/unit/api/transfers/data/postTransfersSuccessResponse.json +0 -128
  53. package/test/unit/api/transfers/data/putPartiesBody.json +0 -20
  54. package/test/unit/api/transfers/data/putQuotesBody.json +0 -37
  55. package/test/unit/api/transfers/data/putTransfersBody.json +0 -17
  56. package/test/unit/api/transfers/transfers.test.js +0 -191
  57. package/test/unit/api/transfers/utils.js +0 -264
  58. package/test/unit/api/utils.js +0 -86
  59. package/test/unit/config.test.js +0 -119
  60. package/test/unit/data/commonHttpHeaders.json +0 -7
  61. package/test/unit/data/defaultConfig.json +0 -70
  62. package/test/unit/data/postQuotesBody.json +0 -52
  63. package/test/unit/data/putParticipantsBody.json +0 -12
  64. package/test/unit/data/putPartiesBody.json +0 -20
  65. package/test/unit/data/testFile.json +0 -29
  66. package/test/unit/data/testFile.yaml +0 -14
  67. package/test/unit/inboundApi/data/mockArguments.json +0 -117
  68. package/test/unit/inboundApi/data/mockTransactionRequest.json +0 -42
  69. package/test/unit/inboundApi/handlers.test.js +0 -786
  70. package/test/unit/index.test.js +0 -88
  71. package/test/unit/lib/cache.test.js +0 -145
  72. package/test/unit/lib/model/AccountsModel.test.js +0 -124
  73. package/test/unit/lib/model/InboundTransfersModel.test.js +0 -889
  74. package/test/unit/lib/model/OutboundBulkQuotesModel.test.js +0 -253
  75. package/test/unit/lib/model/OutboundBulkTransfersModel.test.js +0 -247
  76. package/test/unit/lib/model/OutboundRequestToPayModel.test.js +0 -166
  77. package/test/unit/lib/model/OutboundRequestToPayTransferModel.test.js +0 -245
  78. package/test/unit/lib/model/OutboundTransfersModel.test.js +0 -1579
  79. package/test/unit/lib/model/PartiesModel.test.js +0 -478
  80. package/test/unit/lib/model/QuotesModel.test.js +0 -477
  81. package/test/unit/lib/model/TransfersModel.test.js +0 -481
  82. package/test/unit/lib/model/common/PersistentStateMachine.test.js +0 -178
  83. package/test/unit/lib/model/data/authorizationsResponse.json +0 -13
  84. package/test/unit/lib/model/data/bulkQuoteRequest.json +0 -27
  85. package/test/unit/lib/model/data/bulkQuoteResponse.json +0 -35
  86. package/test/unit/lib/model/data/bulkTransferFulfil.json +0 -13
  87. package/test/unit/lib/model/data/bulkTransferRequest.json +0 -29
  88. package/test/unit/lib/model/data/defaultConfig.json +0 -59
  89. package/test/unit/lib/model/data/getBulkTransfersBackendResponse.json +0 -42
  90. package/test/unit/lib/model/data/getBulkTransfersMojaloopResponse.json +0 -22
  91. package/test/unit/lib/model/data/getTransfersBackendResponse.json +0 -34
  92. package/test/unit/lib/model/data/getTransfersMojaloopResponse.json +0 -17
  93. package/test/unit/lib/model/data/mockArguments.json +0 -188
  94. package/test/unit/lib/model/data/mockTxnRequestsArguments.json +0 -63
  95. package/test/unit/lib/model/data/notificationAbortedToPayee.json +0 -10
  96. package/test/unit/lib/model/data/notificationReservedToPayee.json +0 -10
  97. package/test/unit/lib/model/data/notificationToPayee.json +0 -10
  98. package/test/unit/lib/model/data/payeeParty.json +0 -18
  99. package/test/unit/lib/model/data/putQuotesResponse.json +0 -33
  100. package/test/unit/lib/model/data/putTransfersResponse.json +0 -5
  101. package/test/unit/lib/model/data/quoteResponse.json +0 -42
  102. package/test/unit/lib/model/data/requestToPayRequest.json +0 -20
  103. package/test/unit/lib/model/data/requestToPayTransferRequest.json +0 -27
  104. package/test/unit/lib/model/data/transactionRequestResponse.json +0 -18
  105. package/test/unit/lib/model/data/transferFulfil.json +0 -10
  106. package/test/unit/lib/model/data/transferRequest.json +0 -26
  107. package/test/unit/lib/model/mockedLibRequests.js +0 -74
  108. package/test/unit/mockLogger.js +0 -39
  109. package/test/unit/outboundApi/data/bulkQuoteRequest.json +0 -28
  110. package/test/unit/outboundApi/data/bulkTransferRequest.json +0 -28
  111. package/test/unit/outboundApi/data/mockBulkQuoteError.json +0 -45
  112. package/test/unit/outboundApi/data/mockBulkTransferError.json +0 -48
  113. package/test/unit/outboundApi/data/mockError.json +0 -41
  114. package/test/unit/outboundApi/data/mockGetPartiesError.json +0 -4
  115. package/test/unit/outboundApi/data/mockRequestToPayError.json +0 -32
  116. package/test/unit/outboundApi/data/mockRequestToPayTransferError.json +0 -39
  117. package/test/unit/outboundApi/data/requestToPay.json +0 -21
  118. package/test/unit/outboundApi/data/requestToPayTransferRequest.json +0 -20
  119. package/test/unit/outboundApi/data/transferRequest.json +0 -21
  120. 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
- });