@mojaloop/central-ledger 9.2.2 → 15.1.3-snapshot.2

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 (256) hide show
  1. package/.circleci/config.yml +625 -204
  2. package/.env +3 -2
  3. package/.ncurc.yaml +9 -0
  4. package/.nvmrc +1 -1
  5. package/.versionrc +15 -0
  6. package/CHANGELOG.md +353 -0
  7. package/CODEOWNERS +31 -0
  8. package/Dockerfile +20 -14
  9. package/LICENSE.md +4 -4
  10. package/Onboarding.md +0 -7
  11. package/README.md +99 -22
  12. package/audit-resolve.json +136 -1
  13. package/config/default.json +82 -27
  14. package/docker/central-ledger/default.json +68 -21
  15. package/docker/ml-api-adapter/default.json +10 -1
  16. package/docker/wait-for/wait-for-objstore.sh +1 -6
  17. package/docker/wait-for/wait-for.env +1 -1
  18. package/docker-compose.integration.yml +8 -5
  19. package/docker-compose.yml +73 -16
  20. package/migrations/310203_transferParticipant-indexes.js +38 -0
  21. package/migrations/310503_participantLimit-indexes-composite.js +38 -0
  22. package/migrations/{400401_settlementWindowStateChange-indexes.js → 400401_settlmentWindowStateChange-indexes.js} +0 -0
  23. package/migrations/401301_settlementModel-indexes.js +2 -0
  24. package/migrations/500401_quote-hotfix-2719.js +58 -0
  25. package/migrations/500501_feature-fixSubIdRef.js +53 -0
  26. package/migrations/500601_party-2480.js +63 -0
  27. package/migrations/501001_quoteExtension-quote-service-174.js +46 -0
  28. package/migrations/501002_quoteExtension-2522.js +61 -0
  29. package/migrations/800101_feature-fixSubIdRef.js +90 -0
  30. package/migrations/910102_hotfix954.js +4 -1
  31. package/migrations/940100_quotePartyIdInfoExtension.js +52 -0
  32. package/migrations/940101_quotePartyIdInfoExtension-2522.js +64 -0
  33. package/migrations/950100_settlementContentAggregation-decimal184.js +40 -0
  34. package/migrations/950101_transferParticipantStateChange.js +46 -0
  35. package/migrations/950102_settlementModel-adjustPosition.js +42 -0
  36. package/migrations/950103_dropTransferParticipantStateChange.js +47 -0
  37. package/migrations/950104_settlementModel-settlementAccountTypeId.js +79 -0
  38. package/migrations/950106_unique_settlement_model_ledger_account_currency.js +38 -0
  39. package/migrations/950107_settlementWindowContent_foreign_settlementModel.js +60 -0
  40. package/package.json +99 -81
  41. package/scripts/_wait4_all.js +146 -0
  42. package/seeds/amountType.js +4 -6
  43. package/seeds/balanceOfPayments.js +4 -6
  44. package/seeds/bulkProcessingState.js +4 -6
  45. package/seeds/bulkTransferState.js +4 -6
  46. package/seeds/currency.js +4 -6
  47. package/seeds/endpointType.js +128 -7
  48. package/seeds/ledgerAccountType.js +11 -10
  49. package/seeds/ledgerEntryType.js +5 -7
  50. package/seeds/participant.js +4 -6
  51. package/seeds/participantLimitType.js +4 -6
  52. package/seeds/partyIdentifierType.js +4 -6
  53. package/seeds/partyType.js +4 -6
  54. package/seeds/settlementDelay.js +4 -6
  55. package/seeds/settlementGranularity.js +4 -6
  56. package/seeds/settlementInterchange.js +4 -6
  57. package/seeds/settlementState.js +4 -6
  58. package/seeds/settlementWindow1State.js +4 -6
  59. package/seeds/transactionInitiator.js +4 -6
  60. package/seeds/transactionInitiatorType.js +4 -6
  61. package/seeds/transactionScenario.js +4 -6
  62. package/seeds/transferParticipantRoleType.js +4 -6
  63. package/seeds/transferState.js +9 -6
  64. package/src/api/interface/swagger.json +728 -948
  65. package/src/api/ledgerAccountTypes/handler.js +55 -0
  66. package/src/api/ledgerAccountTypes/routes.js +63 -0
  67. package/src/api/metrics/handler.js +2 -2
  68. package/src/api/metrics/routes.js +1 -1
  69. package/src/api/participants/handler.js +43 -35
  70. package/src/api/participants/routes.js +13 -13
  71. package/src/api/root/routes.js +2 -2
  72. package/src/api/settlementModels/handler.js +9 -26
  73. package/src/api/settlementModels/routes.js +4 -4
  74. package/src/api/transactions/handler.js +46 -0
  75. package/src/api/transactions/routes.js +45 -0
  76. package/src/domain/bulkTransfer/index.js +6 -5
  77. package/src/domain/ledgerAccountTypes/index.js +58 -0
  78. package/src/domain/participant/index.js +55 -4
  79. package/src/domain/position/index.js +18 -2
  80. package/src/domain/settlement/index.js +39 -6
  81. package/src/domain/transactions/index.js +61 -0
  82. package/src/domain/transfer/index.js +22 -2
  83. package/src/domain/transfer/transform.js +3 -3
  84. package/src/handlers/admin/handler.js +24 -32
  85. package/src/handlers/bulk/fulfil/handler.js +89 -56
  86. package/src/handlers/bulk/get/handler.js +203 -0
  87. package/src/handlers/bulk/index.js +4 -1
  88. package/src/handlers/bulk/prepare/handler.js +30 -29
  89. package/src/handlers/bulk/processing/handler.js +61 -32
  90. package/src/handlers/bulk/shared/validator.js +13 -1
  91. package/src/handlers/index.js +18 -9
  92. package/src/handlers/positions/handler.js +67 -46
  93. package/src/handlers/register.js +7 -7
  94. package/src/handlers/timeouts/handler.js +9 -4
  95. package/src/handlers/transfers/handler.js +408 -182
  96. package/src/handlers/transfers/validator.js +41 -11
  97. package/src/lib/cache.js +8 -34
  98. package/src/lib/config.js +5 -7
  99. package/src/lib/enum.js +22 -22
  100. package/src/lib/enumCached.js +76 -0
  101. package/src/lib/healthCheck/subServiceHealth.js +2 -2
  102. package/src/lib/requestLogger.js +9 -9
  103. package/src/lib/urlParser.js +1 -1
  104. package/src/models/bulkTransfer/bulkTransfer.js +6 -6
  105. package/src/models/bulkTransfer/bulkTransferAssociation.js +3 -3
  106. package/src/models/bulkTransfer/bulkTransferDuplicateCheck.js +4 -4
  107. package/src/models/bulkTransfer/bulkTransferExtension.js +2 -2
  108. package/src/models/bulkTransfer/bulkTransferFulfilmentDuplicateCheck.js +4 -4
  109. package/src/models/bulkTransfer/bulkTransferStateChange.js +7 -7
  110. package/src/models/bulkTransfer/facade.js +54 -3
  111. package/src/models/bulkTransfer/individualTransfer.js +2 -2
  112. package/src/models/ilpPackets/ilpPacket.js +36 -0
  113. package/src/models/ledgerAccountType/ledgerAccountType.js +139 -3
  114. package/src/models/misc/migrationLock.js +1 -1
  115. package/src/models/misc/segment.js +1 -1
  116. package/src/models/participant/facade.js +226 -76
  117. package/src/models/participant/participant.js +6 -5
  118. package/src/models/participant/participantCached.js +8 -0
  119. package/src/models/participant/participantCurrency.js +7 -7
  120. package/src/models/participant/participantCurrencyCached.js +11 -1
  121. package/src/models/participant/participantLimit.js +13 -13
  122. package/src/models/participant/participantLimitCached.js +124 -0
  123. package/src/models/participant/participantPosition.js +34 -5
  124. package/src/models/participant/participantPositionChange.js +10 -2
  125. package/src/models/position/facade.js +112 -18
  126. package/src/models/position/participantPosition.js +6 -6
  127. package/src/models/settlement/settlementModel.js +92 -17
  128. package/src/models/settlement/settlementModelCached.js +139 -0
  129. package/src/models/transfer/facade.js +97 -32
  130. package/src/models/transfer/ilpPacket.js +4 -4
  131. package/src/models/transfer/transfer.js +7 -7
  132. package/src/models/transfer/transferDuplicateCheck.js +21 -5
  133. package/src/models/transfer/transferError.js +5 -5
  134. package/src/models/transfer/transferErrorDuplicateCheck.js +4 -4
  135. package/src/models/transfer/transferExtension.js +4 -4
  136. package/src/models/transfer/transferFulfilment.js +5 -5
  137. package/src/models/transfer/transferFulfilmentDuplicateCheck.js +4 -4
  138. package/src/models/transfer/transferParticipant.js +3 -3
  139. package/src/models/transfer/transferStateChange.js +11 -11
  140. package/src/models/transfer/transferTimeout.js +5 -5
  141. package/src/schema/bulkTransfer.js +4 -4
  142. package/src/shared/plugins.js +10 -9
  143. package/src/shared/setup.js +69 -46
  144. package/test/integration/domain/participant/index.test.js +2 -0
  145. package/test/integration/handlers/handlers.test.js +605 -166
  146. package/test/integration/handlers/root.test.js +1 -1
  147. package/test/integration/helpers/hubAccounts.js +62 -0
  148. package/test/integration/helpers/ilpPacket.js +1 -1
  149. package/test/integration/helpers/participantFundsInOut.js +80 -0
  150. package/test/integration/helpers/participantLimit.js +6 -1
  151. package/test/integration/helpers/settlementModels.js +88 -0
  152. package/test/integration/helpers/testConsumer.js +163 -0
  153. package/test/integration/helpers/testProducer.js +0 -1
  154. package/test/integration/helpers/transferDuplicateCheck.js +1 -1
  155. package/test/integration/helpers/transferStateChange.js +1 -1
  156. package/test/integration/helpers/transferTestHelper.js +3 -5
  157. package/test/integration/models/transfer/transferStateChange.test.js +6 -0
  158. package/test/unit/api/ledgerAccountTypes/handler.test.js +126 -0
  159. package/test/unit/api/ledgerAccountTypes/routes.test.js +52 -0
  160. package/test/unit/api/participants/handler.test.js +75 -33
  161. package/test/unit/api/root/handler.test.js +1 -1
  162. package/test/unit/api/root/routes.test.js +2 -2
  163. package/test/unit/api/settlementModels/handler.test.js +21 -57
  164. package/test/unit/api/transactions/handler.test.js +108 -0
  165. package/test/unit/api/transactions/routes.test.js +38 -0
  166. package/test/unit/domain/ledgerAccountTypes/index.test.js +197 -0
  167. package/test/unit/domain/participant/index.test.js +115 -2
  168. package/test/unit/domain/settlement/index.test.js +199 -29
  169. package/test/unit/domain/transactions/index.test.js +128 -0
  170. package/test/unit/domain/transfer/index.test.js +1 -0
  171. package/test/unit/domain/transfer/transform.test.js +2 -0
  172. package/test/unit/handlers/admin/handler.test.js +5 -5
  173. package/test/unit/handlers/bulk/get/handler.test.js +401 -0
  174. package/test/unit/handlers/index.test.js +6 -0
  175. package/test/unit/handlers/positions/handler.test.js +26 -0
  176. package/test/unit/handlers/register.test.js +2 -0
  177. package/test/unit/handlers/transfers/handler.test.js +491 -36
  178. package/test/unit/handlers/transfers/validator.test.js +31 -31
  179. package/test/unit/lib/cache.test.js +0 -64
  180. package/test/unit/lib/cachingOfEnums.test.js +121 -0
  181. package/test/unit/lib/config.test.js +34 -0
  182. package/test/unit/lib/enum.test.js +6 -1
  183. package/test/unit/lib/enumCached.test.js +82 -0
  184. package/test/unit/lib/healthCheck/subServiceHealth.test.js +2 -0
  185. package/test/unit/lib/requestLogger.test.js +14 -12
  186. package/test/unit/models/ilpPackets/ilpPacket.test.js +89 -0
  187. package/test/unit/models/ledgerAccountType/ledgerAccountType.test.js +255 -6
  188. package/test/unit/models/misc/migrationLock.test.js +4 -0
  189. package/test/unit/models/misc/segment.test.js +5 -0
  190. package/test/unit/models/participant/facade.test.js +493 -54
  191. package/test/unit/models/participant/participant.test.js +4 -0
  192. package/test/unit/models/participant/participantCurrency.test.js +22 -9
  193. package/test/unit/models/participant/participantCurrencyCached.test.js +1 -1
  194. package/test/unit/models/participant/participantLimit.test.js +97 -0
  195. package/test/unit/models/participant/participantLimitCached.test.js +232 -0
  196. package/test/unit/models/participant/participantPosition.test.js +217 -0
  197. package/test/unit/models/participant/participantPositionChange.test.js +3 -0
  198. package/test/unit/models/position/facade.test.js +318 -29
  199. package/test/unit/models/position/participantPosition.test.js +22 -7
  200. package/test/unit/models/settlement/settlementModel.test.js +18 -37
  201. package/test/unit/models/settlement/settlementModelCached.test.js +171 -0
  202. package/test/unit/models/transfer/facade.test.js +115 -0
  203. package/test/unit/models/transfer/ilpPacket.test.js +28 -11
  204. package/test/unit/models/transfer/transfer.test.js +13 -4
  205. package/test/unit/models/transfer/transferDuplicateCheck.test.js +4 -0
  206. package/test/unit/models/transfer/transferError.test.js +5 -1
  207. package/test/unit/models/transfer/transferErrorDuplicateCheck.test.js +4 -0
  208. package/test/unit/models/transfer/transferExtension.test.js +26 -9
  209. package/test/unit/models/transfer/transferFulfilment.test.js +14 -5
  210. package/test/unit/models/transfer/transferFulfilmentDuplicateCheck.test.js +4 -0
  211. package/test/unit/models/transfer/transferParticipant.test.js +14 -5
  212. package/test/unit/models/transfer/transferStateChange.test.js +3 -0
  213. package/test/unit/models/transfer/transferTimeout.test.js +6 -0
  214. package/test/unit/seeds/amountType.test.js +6 -22
  215. package/test/unit/seeds/balanceOfPayments.test.js +6 -22
  216. package/test/unit/seeds/bulkProcessingState.test.js +84 -0
  217. package/test/unit/{lib/sidecar/nullClient.test.js → seeds/bulkTransferState.test.js} +36 -39
  218. package/test/unit/seeds/currency.test.js +6 -22
  219. package/test/unit/seeds/endpointType.test.js +6 -22
  220. package/test/unit/seeds/ledgerAccountType.test.js +5 -22
  221. package/test/unit/seeds/ledgerEntryType.test.js +6 -22
  222. package/test/unit/seeds/participant.test.js +5 -22
  223. package/test/unit/seeds/participantLimitType.test.js +6 -22
  224. package/test/unit/seeds/partyIdentifierType.test.js +6 -22
  225. package/test/unit/seeds/partyType.test.js +6 -22
  226. package/test/unit/seeds/settlementState.test.js +5 -22
  227. package/test/unit/seeds/settlementWindow1State.test.js +5 -22
  228. package/test/unit/seeds/transactionInitiator.test.js +6 -22
  229. package/test/unit/seeds/transactionInitiatorType.test.js +6 -22
  230. package/test/unit/seeds/transactionScenario.test.js +6 -22
  231. package/test/unit/seeds/transferParticipantRoleType.test.js +6 -22
  232. package/test/unit/seeds/transferState.test.js +6 -22
  233. package/test/unit/shared/plugins.test.js +31 -1
  234. package/test/unit/shared/setup.test.js +25 -36
  235. package/test/util/helpers.js +37 -2
  236. package/test/util/randomTransfers.js +1 -1
  237. package/test/util/scripts/env.sh +6 -5
  238. package/test/util/scripts/populateTestData.sh +204 -181
  239. package/test/util/scripts/populateTestDataForLegacySimulator.sh +261 -0
  240. package/test/util/scripts/restartObjStore.sh +1 -1
  241. package/test-integration.Dockerfile +15 -15
  242. package/test.Dockerfile +12 -12
  243. package/.circleci/_set_up_deploy_envs.sh +0 -47
  244. package/.dockerignore +0 -17
  245. package/.ncurc.json +0 -3
  246. package/server.sh +0 -4
  247. package/sonar-project.properties +0 -17
  248. package/src/lib/sidecar/index.js +0 -47
  249. package/src/lib/sidecar/nullClient.js +0 -18
  250. package/test/.env +0 -8
  251. package/test/integration-config.json +0 -367
  252. package/test/integration-runner.env +0 -31
  253. package/test/integration-runner.sh +0 -264
  254. package/test/spec-runner.sh +0 -132
  255. package/test/unit/lib/sidecar/index.test.js +0 -148
  256. package/test/unit/models/position/participantLimit.test.js +0 -135
@@ -39,6 +39,7 @@ const Validator = require('../../../../src/handlers/transfers/validator')
39
39
  const TransferService = require('../../../../src/domain/transfer')
40
40
  const TransferObjectTransform = require('../../../../src/domain/transfer/transform')
41
41
  const MainUtil = require('@mojaloop/central-services-shared').Util
42
+ const Time = require('@mojaloop/central-services-shared').Util.Time
42
43
  const ilp = require('../../../../src/models/transfer/ilpPacket')
43
44
  const Uuid = require('uuid4')
44
45
  const KafkaConsumer = require('@mojaloop/central-services-stream').Kafka.Consumer
@@ -49,6 +50,7 @@ const TransferState = Enum.Transfers.TransferState
49
50
  const TransferInternalState = Enum.Transfers.TransferInternalState
50
51
  const Comparators = require('@mojaloop/central-services-shared').Util.Comparators
51
52
  const Proxyquire = require('proxyquire')
53
+ const { getMessagePayloadOrThrow } = require('../../../util/helpers')
52
54
 
53
55
  const transfer = {
54
56
  transferId: 'b51ec534-ee48-4575-b6a9-ead2955b8999',
@@ -131,7 +133,7 @@ const messageProtocol = {
131
133
  to: transfer.payeeFsp,
132
134
  type: 'application/json',
133
135
  content: {
134
- headers: { 'fspiop-destination': transfer.payerFsp },
136
+ headers: { 'fspiop-destination': transfer.payerFsp, 'content-type': 'application/vnd.interoperability.transfers+json;version=1.1' },
135
137
  uriParams: { id: transfer.transferId },
136
138
  payload: transfer
137
139
  },
@@ -177,7 +179,8 @@ const fulfilMessages = [
177
179
  uriParams: { id: messageProtocol.content.uriParams.id },
178
180
  headers: {
179
181
  'fspiop-source': 'dfsp1',
180
- 'fspiop-destination': 'dfsp2'
182
+ 'fspiop-destination': 'dfsp2',
183
+ 'content-type': 'application/vnd.interoperability.transfers+json;version=1.1'
181
184
  }
182
185
  },
183
186
  metadata: {
@@ -196,7 +199,8 @@ const fulfilMessages = [
196
199
  uriParams: { id: messageProtocolBulkCommit.content.uriParams.id },
197
200
  headers: {
198
201
  'fspiop-source': 'dfsp1',
199
- 'fspiop-destination': 'dfsp2'
202
+ 'fspiop-destination': 'dfsp2',
203
+ 'content-type': 'application/vnd.interoperability.transfers+json;version=1.1'
200
204
  }
201
205
  },
202
206
  metadata: {
@@ -327,7 +331,7 @@ Test('Transfer handler', transferHandlerTest => {
327
331
  await Consumer.createHandler(topicName, config, command)
328
332
  Kafka.transformAccountToTopicName.returns(topicName)
329
333
  Kafka.proceed.returns(true)
330
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
334
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
331
335
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
332
336
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
333
337
  Comparators.duplicateCheckComparator.withArgs(transfer.transferId, transfer).returns(Promise.resolve({
@@ -344,7 +348,7 @@ Test('Transfer handler', transferHandlerTest => {
344
348
  await Consumer.createHandler(topicName, config, command)
345
349
  Consumer.getConsumer.throws(new Error())
346
350
  Kafka.transformAccountToTopicName.returns(topicName)
347
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
351
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
348
352
  TransferService.prepare.returns(Promise.resolve(true))
349
353
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
350
354
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -362,7 +366,7 @@ Test('Transfer handler', transferHandlerTest => {
362
366
  await Consumer.createHandler(topicName, config, command)
363
367
  Kafka.transformAccountToTopicName.returns(topicName)
364
368
  Kafka.proceed.returns(true)
365
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
369
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
366
370
  TransferService.getByIdLight.returns(Promise.resolve(null))
367
371
  TransferService.prepare.returns(Promise.resolve(true))
368
372
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -383,7 +387,7 @@ Test('Transfer handler', transferHandlerTest => {
383
387
  Consumer.isConsumerAutoCommitEnabled.returns(true)
384
388
  Kafka.transformAccountToTopicName.returns(topicName)
385
389
  Kafka.proceed.returns(true)
386
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
390
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
387
391
  TransferService.getByIdLight.returns(Promise.resolve(null))
388
392
  TransferService.prepare.returns(Promise.resolve(true))
389
393
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -403,7 +407,7 @@ Test('Transfer handler', transferHandlerTest => {
403
407
  await Consumer.createHandler(topicName, configAutocommit, command)
404
408
  Kafka.transformAccountToTopicName.returns(topicName)
405
409
  Kafka.proceed.returns(true)
406
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
410
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
407
411
  TransferService.getByIdLight.returns(Promise.resolve(null))
408
412
  TransferService.prepare.returns(Promise.resolve(true))
409
413
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -423,7 +427,7 @@ Test('Transfer handler', transferHandlerTest => {
423
427
  await Consumer.createHandler(topicName, config, command)
424
428
  Kafka.transformAccountToTopicName.returns(topicName)
425
429
  Kafka.proceed.returns(true)
426
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
430
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
427
431
  TransferService.prepare.returns(Promise.resolve(true))
428
432
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
429
433
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -444,7 +448,7 @@ Test('Transfer handler', transferHandlerTest => {
444
448
  await Consumer.createHandler(topicName, config, command)
445
449
  Kafka.transformAccountToTopicName.returns(topicName)
446
450
  Kafka.proceed.returns(true)
447
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
451
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
448
452
  TransferService.prepare.returns(Promise.resolve(true))
449
453
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
450
454
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -467,7 +471,7 @@ Test('Transfer handler', transferHandlerTest => {
467
471
  await Consumer.createHandler(topicName, config, command)
468
472
  Kafka.transformAccountToTopicName.returns(topicName)
469
473
  Kafka.proceed.returns(true)
470
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
474
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
471
475
  TransferService.prepare.returns(Promise.resolve(true))
472
476
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
473
477
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -487,7 +491,7 @@ Test('Transfer handler', transferHandlerTest => {
487
491
  await Consumer.createHandler(topicName, config, command)
488
492
  Kafka.transformAccountToTopicName.returns(topicName)
489
493
  Kafka.proceed.returns(true)
490
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
494
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
491
495
  TransferService.prepare.returns(Promise.resolve(true))
492
496
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
493
497
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -508,7 +512,7 @@ Test('Transfer handler', transferHandlerTest => {
508
512
  await Consumer.createHandler(topicName, config, command)
509
513
  Kafka.transformAccountToTopicName.returns(topicName)
510
514
  Kafka.proceed.returns(true)
511
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
515
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
512
516
  TransferService.prepare.returns(Promise.resolve(true))
513
517
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
514
518
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -528,7 +532,7 @@ Test('Transfer handler', transferHandlerTest => {
528
532
  await Consumer.createHandler(topicName, config, command)
529
533
  Kafka.transformAccountToTopicName.returns(topicName)
530
534
  Kafka.proceed.returns(true)
531
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
535
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
532
536
  TransferService.prepare.returns(Promise.resolve(true))
533
537
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
534
538
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -548,7 +552,7 @@ Test('Transfer handler', transferHandlerTest => {
548
552
  Consumer.isConsumerAutoCommitEnabled.returns(true)
549
553
  Kafka.transformAccountToTopicName.returns(topicName)
550
554
  Kafka.proceed.returns(true)
551
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
555
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
552
556
  TransferService.prepare.returns(Promise.resolve(true))
553
557
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
554
558
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -567,7 +571,7 @@ Test('Transfer handler', transferHandlerTest => {
567
571
  await Consumer.createHandler(topicName, config, command)
568
572
  Kafka.transformAccountToTopicName.returns(topicName)
569
573
  Kafka.proceed.returns(true)
570
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
574
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
571
575
  TransferService.prepare.returns(Promise.resolve(true))
572
576
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
573
577
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -585,7 +589,7 @@ Test('Transfer handler', transferHandlerTest => {
585
589
  await Consumer.createHandler(topicName, config, command)
586
590
  Kafka.transformAccountToTopicName.returns(topicName)
587
591
  Kafka.proceed.returns(true)
588
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
592
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
589
593
  TransferService.prepare.returns(Promise.resolve(true))
590
594
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
591
595
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -604,7 +608,7 @@ Test('Transfer handler', transferHandlerTest => {
604
608
  Consumer.isConsumerAutoCommitEnabled.returns(true)
605
609
  Kafka.transformAccountToTopicName.returns(topicName)
606
610
  Kafka.proceed.returns(true)
607
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
611
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
608
612
  TransferService.prepare.returns(Promise.resolve(true))
609
613
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
610
614
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -622,7 +626,7 @@ Test('Transfer handler', transferHandlerTest => {
622
626
  await Consumer.createHandler(topicName, configAutocommit, command)
623
627
  Kafka.transformAccountToTopicName.returns(topicName)
624
628
  Kafka.proceed.returns(true)
625
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
629
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
626
630
  TransferService.prepare.returns(Promise.resolve(true))
627
631
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
628
632
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -640,7 +644,7 @@ Test('Transfer handler', transferHandlerTest => {
640
644
  await Consumer.createHandler(topicName, config, command)
641
645
  Kafka.transformAccountToTopicName.returns(topicName)
642
646
  Kafka.proceed.returns(true)
643
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
647
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
644
648
  TransferService.prepare.throws(new Error())
645
649
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
646
650
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -659,7 +663,7 @@ Test('Transfer handler', transferHandlerTest => {
659
663
  Consumer.isConsumerAutoCommitEnabled.returns(true)
660
664
  Kafka.transformAccountToTopicName.returns(topicName)
661
665
  Kafka.proceed.returns(true)
662
- Validator.validateByName.returns({ validationPassed: true, reasons: [] })
666
+ Validator.validatePrepare.returns({ validationPassed: true, reasons: [] })
663
667
  TransferService.prepare.throws(new Error())
664
668
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
665
669
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -684,7 +688,7 @@ Test('Transfer handler', transferHandlerTest => {
684
688
  hasDuplicateHash: false
685
689
  }))
686
690
  MainUtil.StreamingProtocol.createEventState.returns(messageProtocol.metadata.event.state)
687
- Validator.validateByName.returns({ validationPassed: false, reasons: [] })
691
+ Validator.validatePrepare.returns({ validationPassed: false, reasons: [] })
688
692
  TransferService.getById.returns(Promise.resolve(null))
689
693
  TransferService.prepare.returns(Promise.resolve(true))
690
694
  const result = await allTransferHandlers.prepare(null, localMessages)
@@ -704,7 +708,7 @@ Test('Transfer handler', transferHandlerTest => {
704
708
  hasDuplicateHash: false
705
709
  }))
706
710
  MainUtil.StreamingProtocol.createEventState.returns(messageProtocol.metadata.event.state)
707
- Validator.validateByName.returns({ validationPassed: false, reasons: [] })
711
+ Validator.validatePrepare.returns({ validationPassed: false, reasons: [] })
708
712
  TransferService.prepare.returns(Promise.resolve(true))
709
713
 
710
714
  const result = await allTransferHandlers.prepare(null, messages)
@@ -717,7 +721,7 @@ Test('Transfer handler', transferHandlerTest => {
717
721
  await Consumer.createHandler(topicName, config, command)
718
722
  Kafka.transformAccountToTopicName.returns(topicName)
719
723
  Kafka.proceed.returns(true)
720
- Validator.validateByName.returns({ validationPassed: false, reasons: [] })
724
+ Validator.validatePrepare.returns({ validationPassed: false, reasons: [] })
721
725
  TransferService.prepare.throws(new Error())
722
726
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
723
727
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -736,7 +740,7 @@ Test('Transfer handler', transferHandlerTest => {
736
740
  Consumer.isConsumerAutoCommitEnabled.returns(true)
737
741
  Kafka.transformAccountToTopicName.returns(topicName)
738
742
  Kafka.proceed.returns(true)
739
- Validator.validateByName.returns({ validationPassed: false, reasons: [] })
743
+ Validator.validatePrepare.returns({ validationPassed: false, reasons: [] })
740
744
  TransferService.prepare.throws(new Error())
741
745
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
742
746
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -931,6 +935,28 @@ Test('Transfer handler', transferHandlerTest => {
931
935
  test.end()
932
936
  })
933
937
 
938
+ transformTransfer.test('log an error when the transfer state is EXPIRED_RESERVED', async (test) => {
939
+ const localMessages = MainUtil.clone(messages)
940
+ await Consumer.createHandler(topicName, config, command)
941
+ Kafka.proceed.returns(Promise.resolve(true))
942
+ Validator.validateParticipantByName.returns(true)
943
+ Validator.validateParticipantTransferId.returns(true)
944
+ const transferResult = MainUtil.clone(transferReturn)
945
+ transferResult.transferState = 'EXPIRED_RESERVED'
946
+ transferResult.extensionList = []
947
+ TransferService.getByIdLight.withArgs(transfer.transferId).returns(Promise.resolve(transferResult))
948
+
949
+ try {
950
+ await allTransferHandlers.getTransfer(null, localMessages)
951
+ const expectedState = new EventSdk.EventStateMetadata(EventSdk.EventStatusType.failed, '3303', 'Transfer expired')
952
+ test.ok(SpanStub.finish.calledWith('', expectedState))
953
+ test.end()
954
+ } catch (e) {
955
+ test.fail('Error thrown')
956
+ test.end()
957
+ }
958
+ })
959
+
934
960
  transformTransfer.test('log an error when general message cannot be produced', async (test) => {
935
961
  const localMessages = MainUtil.clone(messages)
936
962
  await Consumer.createHandler(topicName, config, command)
@@ -957,6 +983,137 @@ Test('Transfer handler', transferHandlerTest => {
957
983
  })
958
984
 
959
985
  transferHandlerTest.test('fulfil should', fulfilTest => {
986
+ fulfilTest.test('emit a RESERVED_ABORTED if validation fails when transfer.expirationDate has passed', async (test) => {
987
+ // Arrange
988
+ const localfulfilMessages = MainUtil.clone(fulfilMessages)
989
+ localfulfilMessages[0].value.content.payload.transferState = 'RESERVED'
990
+ localfulfilMessages[0].value.metadata.event.action = 'reserve'
991
+
992
+ // mock out validation calls
993
+ TransferService.getById.returns(Promise.resolve({
994
+ condition: 'condition',
995
+ payeeFsp: 'dfsp1',
996
+ payerFsp: 'dfsp2',
997
+ transferState: TransferState.RESERVED,
998
+ id: Uuid(),
999
+ completedTimestamp: Time.getUTCString(new Date()),
1000
+ expirationDate: new Date('2020-01-01')
1001
+ }))
1002
+ Comparators.duplicateCheckComparator.withArgs(
1003
+ transfer.transferId,
1004
+ localfulfilMessages[0].value.content.payload
1005
+ ).returns(Promise.resolve({
1006
+ hasDuplicateId: false,
1007
+ hasDuplicateHash: false
1008
+ }))
1009
+ Validator.validateFulfilCondition.returns(true)
1010
+ Kafka.proceed.returns(true)
1011
+
1012
+ // Act
1013
+ const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1014
+
1015
+ // Assert
1016
+ test.ok(Kafka.proceed.calledTwice, 'Kafka.proceed was called twice')
1017
+ const reservedAbortedPayload = getMessagePayloadOrThrow(Kafka.proceed.getCall(1).args[1].message)
1018
+ test.equal(reservedAbortedPayload.transferState, 'ABORTED')
1019
+ test.ok(reservedAbortedPayload.transferId, 'payload.transferId is defined')
1020
+ test.ok(reservedAbortedPayload.completedTimestamp, 'payload.completedTimestamp is defined')
1021
+ test.equal(result, true)
1022
+ test.end()
1023
+ })
1024
+
1025
+ fulfilTest.test('emit a RESERVED_ABORTED if validation fails when transferState !== RESERVED', async (test) => {
1026
+ // Arrange
1027
+ const localfulfilMessages = MainUtil.clone(fulfilMessages)
1028
+ localfulfilMessages[0].value.content.payload.transferState = 'RESERVED'
1029
+ localfulfilMessages[0].value.metadata.event.action = 'reserve'
1030
+
1031
+ // mock out validation calls
1032
+ TransferService.getById.returns(Promise.resolve({
1033
+ condition: 'condition',
1034
+ payeeFsp: 'dfsp1',
1035
+ payerFsp: 'dfsp2',
1036
+ transferState: TransferState.ABORTED,
1037
+ id: Uuid(),
1038
+ completedTimestamp: Time.getUTCString(new Date())
1039
+
1040
+ }))
1041
+ Comparators.duplicateCheckComparator.withArgs(
1042
+ transfer.transferId,
1043
+ localfulfilMessages[0].value.content.payload
1044
+ ).returns(Promise.resolve({
1045
+ hasDuplicateId: false,
1046
+ hasDuplicateHash: false
1047
+ }))
1048
+ Validator.validateFulfilCondition.returns(true)
1049
+ Kafka.proceed.returns(true)
1050
+
1051
+ // Act
1052
+ const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1053
+
1054
+ // Assert
1055
+ test.ok(Kafka.proceed.calledTwice, 'Kafka.proceed was called twice')
1056
+ const reservedAbortedPayload = getMessagePayloadOrThrow(Kafka.proceed.getCall(1).args[1].message)
1057
+ test.equal(reservedAbortedPayload.transferState, 'ABORTED')
1058
+ test.ok(reservedAbortedPayload.transferId, 'payload.transferId is defined')
1059
+ test.ok(reservedAbortedPayload.completedTimestamp, 'payload.completedTimestamp is defined')
1060
+ test.equal(result, true)
1061
+ test.end()
1062
+ })
1063
+
1064
+ fulfilTest.test('emit a RESERVED_ABORTED if validation fails when action === RESERVE', async (test) => {
1065
+ // Arrange
1066
+ const localfulfilMessages = MainUtil.clone(fulfilMessages)
1067
+ localfulfilMessages[0].value.content.payload.transferState = 'RESERVED'
1068
+ localfulfilMessages[0].value.metadata.event.action = 'reserve'
1069
+
1070
+ // mock out validation calls
1071
+ TransferService.getById.returns(Promise.resolve({
1072
+ condition: 'condition',
1073
+ payeeFsp: 'dfsp1',
1074
+ payerFsp: 'dfsp2',
1075
+ transferState: TransferState.RESERVED,
1076
+ id: Uuid(),
1077
+ completedTimestamp: Time.getUTCString(new Date())
1078
+
1079
+ }))
1080
+ Comparators.duplicateCheckComparator.withArgs(
1081
+ transfer.transferId,
1082
+ localfulfilMessages[0].value.content.payload
1083
+ ).returns(Promise.resolve({
1084
+ hasDuplicateId: false,
1085
+ hasDuplicateHash: false
1086
+ }))
1087
+ Validator.validateFulfilCondition.returns(false)
1088
+ Kafka.proceed.returns(true)
1089
+
1090
+ // Act
1091
+ const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1092
+
1093
+ // Assert
1094
+ test.ok(Kafka.proceed.calledTwice, 'Kafka.proceed was called twice')
1095
+ const reservedAbortedPayload = getMessagePayloadOrThrow(Kafka.proceed.getCall(1).args[1].message)
1096
+ test.equal(reservedAbortedPayload.transferState, 'ABORTED')
1097
+ test.ok(reservedAbortedPayload.transferId, 'payload.transferId is defined')
1098
+ test.ok(reservedAbortedPayload.completedTimestamp, 'payload.completedTimestamp is defined')
1099
+ test.equal(result, true)
1100
+ test.end()
1101
+ })
1102
+
1103
+ fulfilTest.test('fail validation when when RESERVED transfer state is received from v1.0 clients', async (test) => {
1104
+ const localfulfilMessages = MainUtil.clone(fulfilMessages)
1105
+ localfulfilMessages[0].value.content.headers['content-type'] = 'application/vnd.interoperability.transfers+json;version=1.0'
1106
+ localfulfilMessages[0].value.content.payload.transferState = 'RESERVED'
1107
+ await Consumer.createHandler(topicName, config, command)
1108
+ Kafka.transformGeneralTopicName.returns(topicName)
1109
+ TransferService.getById.returns(Promise.resolve(null))
1110
+ Kafka.proceed.returns(true)
1111
+
1112
+ const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1113
+ test.equal(result, true)
1114
+ test.end()
1115
+ })
1116
+
960
1117
  fulfilTest.test('fail validation when invalid event action is provided', async (test) => {
961
1118
  const localfulfilMessages = MainUtil.clone(fulfilMessages)
962
1119
  await Consumer.createHandler(topicName, config, command)
@@ -995,30 +1152,198 @@ Test('Transfer handler', transferHandlerTest => {
995
1152
  test.end()
996
1153
  })
997
1154
 
1155
+ fulfilTest.test('fail validation when fspiop-destination does not match payerFsp', async (test) => {
1156
+ // Setup
1157
+ const localfulfilMessages = MainUtil.clone(fulfilMessages)
1158
+ await Consumer.createHandler(topicName, config, command)
1159
+ Kafka.transformGeneralTopicName.returns(topicName)
1160
+ TransferService.getById.returns(Promise.resolve({
1161
+ payeeFsp: 'dfsp2',
1162
+ payerFsp: 'dfsp1'
1163
+ }))
1164
+ localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1165
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'fspdoesnotexist'
1166
+ Kafka.proceed.returns(true)
1167
+
1168
+ // Act
1169
+ const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1170
+
1171
+ // Assert
1172
+
1173
+ test.equal(result, true)
1174
+ test.ok(Kafka.proceed.calledOnce, 'Kafka.proceed was called once')
1175
+
1176
+ // fetch kafka proceed arguments
1177
+ const kafkaCallOne = Kafka.proceed.getCall(0)
1178
+
1179
+ // lets check if the first kafka proceed message contains an applicable error
1180
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorCode, '3100')
1181
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorDescription, 'Generic validation error - fspiop-destination does not match payer fsp on the Fulfil callback response')
1182
+ test.equal(kafkaCallOne.args[2].eventDetail.functionality, Enum.Events.Event.Type.POSITION)
1183
+ test.equal(kafkaCallOne.args[2].eventDetail.action, Enum.Events.Event.Action.ABORT_VALIDATION)
1184
+ test.equal(kafkaCallOne.args[2].fromSwitch, true)
1185
+ test.equal(kafkaCallOne.args[2].toDestination, 'dfsp1')
1186
+
1187
+ test.end()
1188
+ })
1189
+
998
1190
  fulfilTest.test('fail validation when fspiop-source does not match payeeFsp', async (test) => {
1191
+ // Setup
999
1192
  const localfulfilMessages = MainUtil.clone(fulfilMessages)
1000
1193
  await Consumer.createHandler(topicName, config, command)
1001
1194
  Kafka.transformGeneralTopicName.returns(topicName)
1002
- TransferService.getById.returns(Promise.resolve({ payeeFsp: 'dfsp2' }))
1003
- localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp1'
1195
+ TransferService.getById.returns(Promise.resolve({
1196
+ payeeFsp: 'dfsp2',
1197
+ payerFsp: 'dfsp1'
1198
+ }))
1199
+ localfulfilMessages[0].value.content.headers['fspiop-source'] = 'fspdoesnotexist'
1200
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1004
1201
  Kafka.proceed.returns(true)
1005
1202
 
1203
+ // Act
1006
1204
  const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1205
+
1206
+ // Assert
1007
1207
  test.equal(result, true)
1208
+ test.ok(Kafka.proceed.calledOnce, 'Kafka.proceed was called once')
1209
+
1210
+ // fetch kafka proceed arguments
1211
+ const kafkaCallOne = Kafka.proceed.getCall(0)
1212
+
1213
+ // lets check if the first kafka proceed message contains an applicable error
1214
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorCode, '3100')
1215
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorDescription, 'Generic validation error - fspiop-source does not match payee fsp on the Fulfil callback response')
1216
+ test.equal(kafkaCallOne.args[2].eventDetail.functionality, Enum.Events.Event.Type.POSITION)
1217
+ test.equal(kafkaCallOne.args[2].eventDetail.action, Enum.Events.Event.Action.ABORT_VALIDATION)
1218
+ test.equal(kafkaCallOne.args[2].fromSwitch, true)
1219
+ test.equal(kafkaCallOne.args[2].toDestination, 'dfsp1')
1220
+
1008
1221
  test.end()
1009
1222
  })
1010
1223
 
1011
1224
  fulfilTest.test('fail validation when fspiop-source does not match payeeFsp - autocommit is enabled', async (test) => {
1225
+ // Setup
1012
1226
  const localfulfilMessages = MainUtil.clone(fulfilMessages)
1013
1227
  await Consumer.createHandler(topicName, config, command)
1014
1228
  Consumer.isConsumerAutoCommitEnabled.returns(true)
1015
1229
  Kafka.transformGeneralTopicName.returns(topicName)
1016
- TransferService.getById.returns(Promise.resolve({ payeeFsp: 'dfsp2' }))
1017
- localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp1'
1230
+ TransferService.getById.returns(Promise.resolve({
1231
+ payeeFsp: 'dfsp2',
1232
+ payerFsp: 'dfsp1'
1233
+ }))
1234
+ localfulfilMessages[0].value.content.headers['fspiop-source'] = 'fspdoesnotexist'
1235
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1236
+ Kafka.proceed.returns(true)
1237
+
1238
+ // Act
1239
+ const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1240
+
1241
+ // Assert
1242
+ test.equal(result, true)
1243
+ test.ok(Kafka.proceed.calledOnce, 'Kafka.proceed was called once')
1244
+
1245
+ // fetch kafka proceed arguments
1246
+ const kafkaCallOne = Kafka.proceed.getCall(0)
1247
+
1248
+ // lets check if the first kafka proceed message contains an applicable error
1249
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorCode, '3100')
1250
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorDescription, 'Generic validation error - fspiop-source does not match payee fsp on the Fulfil callback response')
1251
+ test.equal(kafkaCallOne.args[2].eventDetail.functionality, Enum.Events.Event.Type.POSITION)
1252
+ test.equal(kafkaCallOne.args[2].eventDetail.action, Enum.Events.Event.Action.ABORT_VALIDATION)
1253
+ test.equal(kafkaCallOne.args[2].fromSwitch, true)
1254
+ test.equal(kafkaCallOne.args[2].toDestination, 'dfsp1')
1255
+
1256
+ test.end()
1257
+ })
1258
+
1259
+ fulfilTest.test('fail validation when fspiop-destination does not match payerFsp for RESERVED callback', async (test) => {
1260
+ // Setup
1261
+ const localfulfilMessages = MainUtil.clone(fulfilMessages)
1262
+ await Consumer.createHandler(topicName, config, command)
1263
+ Kafka.transformGeneralTopicName.returns(topicName)
1264
+ TransferService.getById.returns(Promise.resolve({
1265
+ payeeFsp: 'dfsp2',
1266
+ payerFsp: 'dfsp1'
1267
+ }))
1268
+ localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1269
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'fspdoesnotexist'
1270
+ localfulfilMessages[0].value.content.headers['content-type'] = 'application/vnd.interoperability.transfers+json;version=1.1'
1271
+ localfulfilMessages[0].value.content.payload.transferState = TransferState.RESERVED
1272
+ localfulfilMessages[0].value.metadata.event.action = Enum.Events.Event.Action.RESERVE
1273
+ Kafka.proceed.returns(true)
1274
+
1275
+ // Act
1276
+ const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1277
+
1278
+ // Assert
1279
+
1280
+ test.equal(result, true)
1281
+ test.ok(Kafka.proceed.calledTwice, 'Kafka.proceed was called twice')
1282
+
1283
+ // fetch kafka proceed arguments
1284
+ const kafkaCallOne = Kafka.proceed.getCall(0)
1285
+ const kafkaCallTwo = Kafka.proceed.getCall(1)
1286
+
1287
+ // lets check if the first kafka proceed message contains an applicable error
1288
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorCode, '3100')
1289
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorDescription, 'Generic validation error - fspiop-destination does not match payer fsp on the Fulfil callback response')
1290
+ test.equal(kafkaCallOne.args[2].eventDetail.functionality, Enum.Events.Event.Type.POSITION)
1291
+ test.equal(kafkaCallOne.args[2].eventDetail.action, Enum.Events.Event.Action.ABORT_VALIDATION)
1292
+ test.equal(kafkaCallOne.args[2].fromSwitch, true)
1293
+ test.equal(kafkaCallOne.args[2].toDestination, 'dfsp1')
1294
+
1295
+ // lets check if the outbound event is sent to the notifications with the correct status
1296
+ test.equal(kafkaCallTwo.args[1].message.value.content.payload.transferState, TransferState.ABORTED)
1297
+ test.equal(kafkaCallTwo.args[2].eventDetail.functionality, Enum.Events.Event.Type.NOTIFICATION)
1298
+ test.equal(kafkaCallTwo.args[2].eventDetail.action, Enum.Events.Event.Action.RESERVED_ABORTED)
1299
+ test.equal(kafkaCallTwo.args[2].fromSwitch, true)
1300
+ test.equal(kafkaCallTwo.args[2].toDestination, 'dfsp2')
1301
+
1302
+ test.end()
1303
+ })
1304
+
1305
+ fulfilTest.test('fail validation when fspiop-source does not match payeeFsp for RESERVED callback', async (test) => {
1306
+ // Setup
1307
+ const localfulfilMessages = MainUtil.clone(fulfilMessages)
1308
+ await Consumer.createHandler(topicName, config, command)
1309
+ Kafka.transformGeneralTopicName.returns(topicName)
1310
+ TransferService.getById.returns(Promise.resolve({
1311
+ payeeFsp: 'dfsp2',
1312
+ payerFsp: 'dfsp1'
1313
+ }))
1314
+ localfulfilMessages[0].value.content.headers['fspiop-source'] = 'fspdoesnotexist'
1315
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1316
+ localfulfilMessages[0].value.content.headers['content-type'] = 'application/vnd.interoperability.transfers+json;version=1.1'
1317
+ localfulfilMessages[0].value.content.payload.transferState = TransferState.RESERVED
1318
+ localfulfilMessages[0].value.metadata.event.action = Enum.Events.Event.Action.RESERVE
1018
1319
  Kafka.proceed.returns(true)
1019
1320
 
1321
+ // Act
1020
1322
  const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1323
+
1324
+ // Assert
1021
1325
  test.equal(result, true)
1326
+ test.ok(Kafka.proceed.calledTwice, 'Kafka.proceed was called twice')
1327
+
1328
+ // fetch kafka proceed arguments
1329
+ const kafkaCallOne = Kafka.proceed.getCall(0)
1330
+ const kafkaCallTwo = Kafka.proceed.getCall(1)
1331
+
1332
+ // lets check if the first kafka proceed message contains an applicable error
1333
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorCode, '3100')
1334
+ test.equal(kafkaCallOne.args[2].fspiopError.errorInformation.errorDescription, 'Generic validation error - fspiop-source does not match payee fsp on the Fulfil callback response')
1335
+ test.equal(kafkaCallOne.args[2].eventDetail.functionality, Enum.Events.Event.Type.POSITION)
1336
+ test.equal(kafkaCallOne.args[2].eventDetail.action, Enum.Events.Event.Action.ABORT_VALIDATION)
1337
+ test.equal(kafkaCallOne.args[2].fromSwitch, true)
1338
+ test.equal(kafkaCallOne.args[2].toDestination, 'dfsp1')
1339
+
1340
+ // lets check if the outbound event is sent to the notifications with the correct status
1341
+ test.equal(kafkaCallTwo.args[1].message.value.content.payload.transferState, TransferState.ABORTED)
1342
+ test.equal(kafkaCallTwo.args[2].eventDetail.functionality, Enum.Events.Event.Type.NOTIFICATION)
1343
+ test.equal(kafkaCallTwo.args[2].eventDetail.action, Enum.Events.Event.Action.RESERVED_ABORTED)
1344
+ test.equal(kafkaCallTwo.args[2].fromSwitch, true)
1345
+ test.equal(kafkaCallTwo.args[2].toDestination, 'dfsp2')
1346
+
1022
1347
  test.end()
1023
1348
  })
1024
1349
 
@@ -1026,8 +1351,13 @@ Test('Transfer handler', transferHandlerTest => {
1026
1351
  const localfulfilMessages = MainUtil.clone(fulfilMessages)
1027
1352
  await Consumer.createHandler(topicName, config, command)
1028
1353
  Kafka.transformGeneralTopicName.returns(topicName)
1029
- TransferService.getById.returns(Promise.resolve({ condition: 'condition', payeeFsp: 'dfsp2' }))
1354
+ TransferService.getById.returns(Promise.resolve({
1355
+ condition: 'condition',
1356
+ payeeFsp: 'dfsp2',
1357
+ payerFsp: 'dfsp1'
1358
+ }))
1030
1359
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1360
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1031
1361
  localfulfilMessages[0].value.content.payload.fulfilment = 'fulfilment'
1032
1362
  Kafka.proceed.returns(true)
1033
1363
 
@@ -1048,8 +1378,13 @@ Test('Transfer handler', transferHandlerTest => {
1048
1378
  await Consumer.createHandler(topicName, config, command)
1049
1379
  Consumer.isConsumerAutoCommitEnabled.returns(true)
1050
1380
  Kafka.transformGeneralTopicName.returns(topicName)
1051
- TransferService.getById.returns(Promise.resolve({ condition: 'condition', payeeFsp: 'dfsp2' }))
1381
+ TransferService.getById.returns(Promise.resolve({
1382
+ condition: 'condition',
1383
+ payeeFsp: 'dfsp2',
1384
+ payerFsp: 'dfsp1'
1385
+ }))
1052
1386
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1387
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1053
1388
  localfulfilMessages[0].value.content.payload.fulfilment = 'fulfilment'
1054
1389
  Kafka.proceed.returns(true)
1055
1390
 
@@ -1069,9 +1404,15 @@ Test('Transfer handler', transferHandlerTest => {
1069
1404
  const localfulfilMessages = MainUtil.clone(fulfilMessages)
1070
1405
  await Consumer.createHandler(topicName, config, command)
1071
1406
  Kafka.transformGeneralTopicName.returns(topicName)
1072
- TransferService.getById.returns(Promise.resolve({ condition: 'condition', payeeFsp: 'dfsp2', transferState: TransferInternalState.RECEIVED_PREPARE }))
1407
+ TransferService.getById.returns(Promise.resolve({
1408
+ condition: 'condition',
1409
+ payeeFsp: 'dfsp2',
1410
+ payerFsp: 'dfsp1',
1411
+ transferState: TransferState.RECEIVED_PREPARE
1412
+ }))
1073
1413
  Validator.validateFulfilCondition.returns(true)
1074
1414
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1415
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1075
1416
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1076
1417
  Kafka.proceed.returns(true)
1077
1418
 
@@ -1091,10 +1432,46 @@ Test('Transfer handler', transferHandlerTest => {
1091
1432
  const localfulfilMessages = MainUtil.clone(fulfilMessages)
1092
1433
  await Consumer.createHandler(topicName, config, command)
1093
1434
  Kafka.transformGeneralTopicName.returns(topicName)
1094
- TransferService.getById.returns(Promise.resolve({ condition: 'condition', payeeFsp: 'dfsp2', transferState: TransferState.RESERVED }))
1435
+ TransferService.getById.returns(Promise.resolve({
1436
+ condition: 'condition',
1437
+ payeeFsp: 'dfsp2',
1438
+ payerFsp: 'dfsp1',
1439
+ transferState: TransferState.RESERVED
1440
+ }))
1095
1441
  ilp.update.returns(Promise.resolve())
1096
1442
  Validator.validateFulfilCondition.returns(true)
1097
1443
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1444
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1445
+ localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1446
+ Kafka.proceed.returns(true)
1447
+
1448
+ TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
1449
+ TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
1450
+ Comparators.duplicateCheckComparator.withArgs(transfer.transferId, localfulfilMessages[0].value.content.payload).returns(Promise.resolve({
1451
+ hasDuplicateId: false,
1452
+ hasDuplicateHash: false
1453
+ }))
1454
+
1455
+ const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
1456
+ test.equal(result, true)
1457
+ test.end()
1458
+ })
1459
+
1460
+ fulfilTest.test('produce message to position topic when validations pass and action is RESERVE', async (test) => {
1461
+ const localfulfilMessages = MainUtil.clone(fulfilMessages)
1462
+ localfulfilMessages[0].value.metadata.event.action = 'reserve'
1463
+ await Consumer.createHandler(topicName, config, command)
1464
+ Kafka.transformGeneralTopicName.returns(topicName)
1465
+ TransferService.getById.returns(Promise.resolve({
1466
+ condition: 'condition',
1467
+ payeeFsp: 'dfsp2',
1468
+ payerFsp: 'dfsp1',
1469
+ transferState: TransferState.RESERVED
1470
+ }))
1471
+ ilp.update.returns(Promise.resolve())
1472
+ Validator.validateFulfilCondition.returns(true)
1473
+ localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1474
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1098
1475
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1099
1476
  Kafka.proceed.returns(true)
1100
1477
 
@@ -1114,10 +1491,16 @@ Test('Transfer handler', transferHandlerTest => {
1114
1491
  const localfulfilMessages = MainUtil.clone(fulfilMessages)
1115
1492
  await Consumer.createHandler(topicName, config, command)
1116
1493
  Kafka.transformGeneralTopicName.returns(topicName)
1117
- TransferService.getById.returns(Promise.resolve({ condition: 'condition', payeeFsp: 'dfsp2', transferState: TransferState.RESERVED }))
1494
+ TransferService.getById.returns(Promise.resolve({
1495
+ condition: 'condition',
1496
+ payeeFsp: 'dfsp2',
1497
+ payerFsp: 'dfsp1',
1498
+ transferState: TransferState.RESERVED
1499
+ }))
1118
1500
  ilp.update.returns(Promise.resolve())
1119
1501
  Validator.validateFulfilCondition.returns(true)
1120
1502
  localfulfilMessages[1].value.content.headers['fspiop-source'] = 'dfsp2'
1503
+ localfulfilMessages[1].value.content.headers['fspiop-destination'] = 'dfsp1'
1121
1504
  localfulfilMessages[1].value.content.payload.fulfilment = 'condition'
1122
1505
  Kafka.proceed.returns(true)
1123
1506
 
@@ -1133,16 +1516,52 @@ Test('Transfer handler', transferHandlerTest => {
1133
1516
  test.end()
1134
1517
  })
1135
1518
 
1519
+ fulfilTest.test('produce message to position topic when BULK_ABORT message is received', async (test) => {
1520
+ const localfulfilMessages = MainUtil.clone(fulfilMessages)
1521
+ await Consumer.createHandler(topicName, config, command)
1522
+ Kafka.transformGeneralTopicName.returns(topicName)
1523
+ TransferService.getById.returns(Promise.resolve({
1524
+ condition: 'condition',
1525
+ payeeFsp: 'dfsp2',
1526
+ payerFsp: 'dfsp1',
1527
+ transferState: TransferState.RESERVED
1528
+ }))
1529
+ ilp.update.returns(Promise.resolve())
1530
+ Validator.validateFulfilCondition.returns(true)
1531
+ localfulfilMessages[1].value.content.headers['fspiop-source'] = 'dfsp2'
1532
+ localfulfilMessages[1].value.content.headers['fspiop-destination'] = 'dfsp1'
1533
+ localfulfilMessages[1].value.content.payload = errInfo
1534
+ localfulfilMessages[1].value.metadata.event.action = 'bulk-abort'
1535
+ Kafka.proceed.returns(true)
1536
+
1537
+ TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
1538
+ TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
1539
+ Comparators.duplicateCheckComparator.withArgs(transfer.transferId, localfulfilMessages[1].value.content.payload).returns(Promise.resolve({
1540
+ hasDuplicateId: false,
1541
+ hasDuplicateHash: false
1542
+ }))
1543
+
1544
+ const result = await allTransferHandlers.fulfil(null, localfulfilMessages[1])
1545
+ test.equal(result, true)
1546
+ test.end()
1547
+ })
1548
+
1136
1549
  fulfilTest.test('produce message to position topic when validations pass - autocommit is enabled', async (test) => {
1137
1550
  const localfulfilMessages = MainUtil.clone(fulfilMessages)
1138
1551
  await Consumer.createHandler(topicName, config, command)
1139
1552
  Consumer.isConsumerAutoCommitEnabled.returns(true)
1140
1553
  Validator.validateFulfilCondition.returns(true)
1141
1554
  Kafka.transformGeneralTopicName.returns(topicName)
1142
- TransferService.getById.returns(Promise.resolve({ condition: 'condition', payeeFsp: 'dfsp2', transferState: TransferState.RESERVED }))
1555
+ TransferService.getById.returns(Promise.resolve({
1556
+ condition: 'condition',
1557
+ payeeFsp: 'dfsp2',
1558
+ payerFsp: 'dfsp1',
1559
+ transferState: TransferState.RESERVED
1560
+ }))
1143
1561
  ilp.update.returns(Promise.resolve())
1144
1562
  Kafka.proceed.returns(true)
1145
1563
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1564
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1146
1565
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1147
1566
 
1148
1567
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1164,14 +1583,16 @@ Test('Transfer handler', transferHandlerTest => {
1164
1583
  TransferService.getById.returns(Promise.resolve({
1165
1584
  condition: 'condition',
1166
1585
  payeeFsp: 'dfsp2',
1586
+ payerFsp: 'dfsp1',
1167
1587
  expirationDate: new Date('1900-01-01'),
1168
1588
  transferState: TransferState.RESERVED
1169
1589
  }))
1170
1590
  ilp.update.returns(Promise.resolve())
1171
1591
  Validator.validateFulfilCondition.returns(true)
1172
1592
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1173
- Kafka.proceed.returns(true)
1593
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1174
1594
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1595
+ Kafka.proceed.returns(true)
1175
1596
 
1176
1597
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
1177
1598
  TransferService.saveTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1193,6 +1614,7 @@ Test('Transfer handler', transferHandlerTest => {
1193
1614
  TransferService.getById.returns(Promise.resolve({
1194
1615
  condition: 'condition',
1195
1616
  payeeFsp: 'dfsp2',
1617
+ payerFsp: 'dfsp1',
1196
1618
  expirationDate: new Date('1900-01-01'),
1197
1619
  transferState: TransferState.RESERVED
1198
1620
  }))
@@ -1200,6 +1622,7 @@ Test('Transfer handler', transferHandlerTest => {
1200
1622
  Validator.validateFulfilCondition.returns(true)
1201
1623
  Kafka.proceed.returns(true)
1202
1624
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1625
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1203
1626
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1204
1627
 
1205
1628
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1272,6 +1695,7 @@ Test('Transfer handler', transferHandlerTest => {
1272
1695
  TransferService.getById.returns(Promise.resolve({
1273
1696
  condition: 'condition',
1274
1697
  payeeFsp: 'dfsp2',
1698
+ payerFsp: 'dfsp1',
1275
1699
  expirationDate: new Date('1900-01-01'),
1276
1700
  transferState: TransferState.RESERVED
1277
1701
  }))
@@ -1280,6 +1704,7 @@ Test('Transfer handler', transferHandlerTest => {
1280
1704
  Validator.validateFulfilCondition.returns(true)
1281
1705
  Kafka.proceed.returns(true)
1282
1706
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp1'
1707
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1283
1708
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1284
1709
 
1285
1710
  const result = await allTransferHandlers.fulfil(null, localfulfilMessages)
@@ -1295,12 +1720,14 @@ Test('Transfer handler', transferHandlerTest => {
1295
1720
  TransferService.getById.returns(Promise.resolve({
1296
1721
  condition: 'condition',
1297
1722
  payeeFsp: 'dfsp2',
1723
+ payerFsp: 'dfsp1',
1298
1724
  expirationDate: new Date('1900-01-01'),
1299
1725
  transferState: TransferState.COMMITTED,
1300
1726
  transferStateEnumeration: TransferState.COMMITTED
1301
1727
  }))
1302
1728
  Kafka.proceed.returns(true)
1303
1729
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1730
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1304
1731
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1305
1732
 
1306
1733
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1323,12 +1750,14 @@ Test('Transfer handler', transferHandlerTest => {
1323
1750
  TransferService.getById.returns(Promise.resolve({
1324
1751
  condition: 'condition',
1325
1752
  payeeFsp: 'dfsp2',
1753
+ payerFsp: 'dfsp1',
1326
1754
  expirationDate: new Date('1900-01-01'),
1327
1755
  transferState: TransferState.COMMITTED,
1328
1756
  transferStateEnumeration: TransferState.COMMITTED
1329
1757
  }))
1330
1758
  Kafka.proceed.returns(true)
1331
1759
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1760
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1332
1761
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1333
1762
 
1334
1763
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1351,12 +1780,14 @@ Test('Transfer handler', transferHandlerTest => {
1351
1780
  TransferService.getById.returns(Promise.resolve({
1352
1781
  condition: 'condition',
1353
1782
  payeeFsp: 'dfsp2',
1783
+ payerFsp: 'dfsp1',
1354
1784
  expirationDate: new Date('1900-01-01'),
1355
1785
  transferState: TransferInternalState.RECEIVED_FULFIL,
1356
1786
  transferStateEnumeration: TransferState.RECEIVED
1357
1787
  }))
1358
1788
  Kafka.proceed.returns(true)
1359
1789
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1790
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1360
1791
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1361
1792
 
1362
1793
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1379,12 +1810,14 @@ Test('Transfer handler', transferHandlerTest => {
1379
1810
  TransferService.getById.returns(Promise.resolve({
1380
1811
  condition: 'condition',
1381
1812
  payeeFsp: 'dfsp2',
1813
+ payerFsp: 'dfsp1',
1382
1814
  expirationDate: new Date('1900-01-01'),
1383
1815
  transferState: TransferState.RESERVED,
1384
1816
  transferStateEnumeration: TransferState.RESERVED
1385
1817
  }))
1386
1818
  Kafka.proceed.returns(true)
1387
1819
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1820
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1388
1821
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1389
1822
 
1390
1823
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1407,12 +1840,14 @@ Test('Transfer handler', transferHandlerTest => {
1407
1840
  TransferService.getById.returns(Promise.resolve({
1408
1841
  condition: 'condition',
1409
1842
  payeeFsp: 'dfsp2',
1843
+ payerFsp: 'dfsp1',
1410
1844
  expirationDate: new Date('1900-01-01'),
1411
1845
  transferState: TransferInternalState.ABORTED_REJECTED,
1412
1846
  transferStateEnumeration: TransferState.ABORTED
1413
1847
  }))
1414
1848
  Kafka.proceed.returns(true)
1415
1849
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1850
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1416
1851
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1417
1852
 
1418
1853
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1435,12 +1870,14 @@ Test('Transfer handler', transferHandlerTest => {
1435
1870
  TransferService.getById.returns(Promise.resolve({
1436
1871
  condition: 'condition',
1437
1872
  payeeFsp: 'dfsp2',
1873
+ payerFsp: 'dfsp1',
1438
1874
  expirationDate: new Date('1900-01-01'),
1439
1875
  transferState: undefined,
1440
1876
  transferStateEnumeration: undefined
1441
1877
  }))
1442
1878
  Kafka.proceed.returns(true)
1443
1879
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1880
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1444
1881
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1445
1882
 
1446
1883
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1463,12 +1900,14 @@ Test('Transfer handler', transferHandlerTest => {
1463
1900
  TransferService.getById.returns(Promise.resolve({
1464
1901
  condition: 'condition',
1465
1902
  payeeFsp: 'dfsp2',
1903
+ payerFsp: 'dfsp1',
1466
1904
  expirationDate: new Date('1900-01-01'),
1467
1905
  transferState: TransferState.RESERVED,
1468
1906
  transferStateEnumeration: TransferState.RESERVED
1469
1907
  }))
1470
1908
  Kafka.proceed.returns(true)
1471
1909
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1910
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1472
1911
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1473
1912
 
1474
1913
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1491,12 +1930,14 @@ Test('Transfer handler', transferHandlerTest => {
1491
1930
  TransferService.getById.returns(Promise.resolve({
1492
1931
  condition: 'condition',
1493
1932
  payeeFsp: 'dfsp2',
1933
+ payerFsp: 'dfsp1',
1494
1934
  expirationDate: new Date('1900-01-01'),
1495
1935
  transferState: TransferInternalState.ABORTED_ERROR,
1496
1936
  transferStateEnumeration: TransferState.ABORTED
1497
1937
  }))
1498
1938
  Kafka.proceed.returns(true)
1499
1939
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1940
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1500
1941
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1501
1942
  localfulfilMessages[0].value.metadata.event.action = 'abort'
1502
1943
 
@@ -1520,12 +1961,14 @@ Test('Transfer handler', transferHandlerTest => {
1520
1961
  TransferService.getById.returns(Promise.resolve({
1521
1962
  condition: 'condition',
1522
1963
  payeeFsp: 'dfsp2',
1964
+ payerFsp: 'dfsp1',
1523
1965
  expirationDate: new Date('1900-01-01'),
1524
1966
  transferState: TransferInternalState.ABORTED_ERROR,
1525
1967
  transferStateEnumeration: TransferState.ABORTED
1526
1968
  }))
1527
1969
  Kafka.proceed.returns(true)
1528
1970
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
1971
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1529
1972
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1530
1973
  localfulfilMessages[0].value.metadata.event.action = 'abort'
1531
1974
 
@@ -1549,12 +1992,14 @@ Test('Transfer handler', transferHandlerTest => {
1549
1992
  TransferService.getById.returns(Promise.resolve({
1550
1993
  condition: 'condition',
1551
1994
  payeeFsp: 'dfsp2',
1995
+ payerFsp: 'dfsp1',
1552
1996
  expirationDate: new Date('1900-01-01'),
1553
1997
  transferState: TransferInternalState.ABORTED_ERROR,
1554
1998
  transferStateEnumeration: TransferState.ABORTED
1555
1999
  }))
1556
2000
  Kafka.proceed.returns(true)
1557
2001
  localfulfilMessages[0].value.content.headers['fspiop-source'] = 'dfsp2'
2002
+ localfulfilMessages[0].value.content.headers['fspiop-destination'] = 'dfsp1'
1558
2003
  localfulfilMessages[0].value.content.payload.fulfilment = 'condition'
1559
2004
  localfulfilMessages[0].value.metadata.event.action = 'abort'
1560
2005
 
@@ -1578,10 +2023,12 @@ Test('Transfer handler', transferHandlerTest => {
1578
2023
  TransferService.getById.returns(Promise.resolve({
1579
2024
  condition: 'condition',
1580
2025
  payeeFsp: 'dfsp2',
2026
+ payerFsp: 'dfsp1',
1581
2027
  transferState: TransferInternalState.RESERVED,
1582
2028
  transferStateEnumeration: TransferState.RESERVED
1583
2029
  }))
1584
2030
  invalidEventMessage.value.content.headers['fspiop-source'] = 'dfsp2'
2031
+ invalidEventMessage.value.content.headers['fspiop-destination'] = 'dfsp1'
1585
2032
  invalidEventMessage.value.metadata.event.action = 'reject'
1586
2033
  Kafka.proceed.returns(true)
1587
2034
 
@@ -1606,10 +2053,12 @@ Test('Transfer handler', transferHandlerTest => {
1606
2053
  TransferService.getById.returns(Promise.resolve({
1607
2054
  condition: 'condition',
1608
2055
  payeeFsp: 'dfsp2',
2056
+ payerFsp: 'dfsp1',
1609
2057
  transferState: TransferInternalState.RESERVED,
1610
2058
  transferStateEnumeration: TransferState.RESERVED
1611
2059
  }))
1612
2060
  invalidEventMessage.value.content.headers['fspiop-source'] = 'dfsp2'
2061
+ invalidEventMessage.value.content.headers['fspiop-destination'] = 'dfsp1'
1613
2062
  invalidEventMessage.value.metadata.event.action = 'reject'
1614
2063
  Kafka.proceed.returns(true)
1615
2064
 
@@ -1633,6 +2082,7 @@ Test('Transfer handler', transferHandlerTest => {
1633
2082
  TransferService.getById.returns(Promise.resolve({
1634
2083
  condition: 'condition',
1635
2084
  payeeFsp: 'dfsp2',
2085
+ payerFsp: 'dfsp1',
1636
2086
  transferState: TransferInternalState.RESERVED,
1637
2087
  transferStateEnumeration: TransferState.RESERVED
1638
2088
  }))
@@ -1667,11 +2117,13 @@ Test('Transfer handler', transferHandlerTest => {
1667
2117
  TransferService.getById.returns(Promise.resolve({
1668
2118
  condition: 'condition',
1669
2119
  payeeFsp: 'dfsp2',
2120
+ payerFsp: 'dfsp1',
1670
2121
  transferState: TransferState.RESERVED
1671
2122
  }))
1672
2123
  TransferService.handlePayeeResponse.returns(Promise.resolve({ transferErrorRecord: { errorCode: '5000', errorDescription: 'error text' } }))
1673
2124
  invalidEventMessage.value.metadata.event.action = 'abort'
1674
2125
  invalidEventMessage.value.content.headers['fspiop-source'] = 'dfsp2'
2126
+ invalidEventMessage.value.content.headers['fspiop-destination'] = 'dfsp1'
1675
2127
  Kafka.proceed.returns(true)
1676
2128
 
1677
2129
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1694,12 +2146,14 @@ Test('Transfer handler', transferHandlerTest => {
1694
2146
  TransferService.getById.returns(Promise.resolve({
1695
2147
  condition: 'condition',
1696
2148
  payeeFsp: 'dfsp2',
2149
+ payerFsp: 'dfsp1',
1697
2150
  transferState: TransferState.RESERVED
1698
2151
  }))
1699
2152
  TransferService.handlePayeeResponse.returns(Promise.resolve({ transferErrorRecord: { errorCode: '5000', errorDescription: 'error text' } }))
1700
2153
  invalidEventMessage.value.metadata.event.action = 'abort'
1701
2154
  invalidEventMessage.value.content.payload = errInfo
1702
2155
  invalidEventMessage.value.content.headers['fspiop-source'] = 'dfsp2'
2156
+ invalidEventMessage.value.content.headers['fspiop-destination'] = 'dfsp1'
1703
2157
  Kafka.proceed.returns(true)
1704
2158
 
1705
2159
  TransferService.getTransferDuplicateCheck.returns(Promise.resolve(null))
@@ -1742,6 +2196,7 @@ Test('Transfer handler', transferHandlerTest => {
1742
2196
  TransferService.getById.returns(Promise.resolve({
1743
2197
  condition: 'condition',
1744
2198
  payeeFsp: 'dfsp1',
2199
+ payerFsp: 'dfsp1',
1745
2200
  transferState: TransferState.RESERVED,
1746
2201
  transferStateEnumeration: TransferState.RESERVED
1747
2202
  }))