@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.
- package/.circleci/config.yml +625 -204
- package/.env +3 -2
- package/.ncurc.yaml +9 -0
- package/.nvmrc +1 -1
- package/.versionrc +15 -0
- package/CHANGELOG.md +353 -0
- package/CODEOWNERS +31 -0
- package/Dockerfile +20 -14
- package/LICENSE.md +4 -4
- package/Onboarding.md +0 -7
- package/README.md +99 -22
- package/audit-resolve.json +136 -1
- package/config/default.json +82 -27
- package/docker/central-ledger/default.json +68 -21
- package/docker/ml-api-adapter/default.json +10 -1
- package/docker/wait-for/wait-for-objstore.sh +1 -6
- package/docker/wait-for/wait-for.env +1 -1
- package/docker-compose.integration.yml +8 -5
- package/docker-compose.yml +73 -16
- package/migrations/310203_transferParticipant-indexes.js +38 -0
- package/migrations/310503_participantLimit-indexes-composite.js +38 -0
- package/migrations/{400401_settlementWindowStateChange-indexes.js → 400401_settlmentWindowStateChange-indexes.js} +0 -0
- package/migrations/401301_settlementModel-indexes.js +2 -0
- package/migrations/500401_quote-hotfix-2719.js +58 -0
- package/migrations/500501_feature-fixSubIdRef.js +53 -0
- package/migrations/500601_party-2480.js +63 -0
- package/migrations/501001_quoteExtension-quote-service-174.js +46 -0
- package/migrations/501002_quoteExtension-2522.js +61 -0
- package/migrations/800101_feature-fixSubIdRef.js +90 -0
- package/migrations/910102_hotfix954.js +4 -1
- package/migrations/940100_quotePartyIdInfoExtension.js +52 -0
- package/migrations/940101_quotePartyIdInfoExtension-2522.js +64 -0
- package/migrations/950100_settlementContentAggregation-decimal184.js +40 -0
- package/migrations/950101_transferParticipantStateChange.js +46 -0
- package/migrations/950102_settlementModel-adjustPosition.js +42 -0
- package/migrations/950103_dropTransferParticipantStateChange.js +47 -0
- package/migrations/950104_settlementModel-settlementAccountTypeId.js +79 -0
- package/migrations/950106_unique_settlement_model_ledger_account_currency.js +38 -0
- package/migrations/950107_settlementWindowContent_foreign_settlementModel.js +60 -0
- package/package.json +99 -81
- package/scripts/_wait4_all.js +146 -0
- package/seeds/amountType.js +4 -6
- package/seeds/balanceOfPayments.js +4 -6
- package/seeds/bulkProcessingState.js +4 -6
- package/seeds/bulkTransferState.js +4 -6
- package/seeds/currency.js +4 -6
- package/seeds/endpointType.js +128 -7
- package/seeds/ledgerAccountType.js +11 -10
- package/seeds/ledgerEntryType.js +5 -7
- package/seeds/participant.js +4 -6
- package/seeds/participantLimitType.js +4 -6
- package/seeds/partyIdentifierType.js +4 -6
- package/seeds/partyType.js +4 -6
- package/seeds/settlementDelay.js +4 -6
- package/seeds/settlementGranularity.js +4 -6
- package/seeds/settlementInterchange.js +4 -6
- package/seeds/settlementState.js +4 -6
- package/seeds/settlementWindow1State.js +4 -6
- package/seeds/transactionInitiator.js +4 -6
- package/seeds/transactionInitiatorType.js +4 -6
- package/seeds/transactionScenario.js +4 -6
- package/seeds/transferParticipantRoleType.js +4 -6
- package/seeds/transferState.js +9 -6
- package/src/api/interface/swagger.json +728 -948
- package/src/api/ledgerAccountTypes/handler.js +55 -0
- package/src/api/ledgerAccountTypes/routes.js +63 -0
- package/src/api/metrics/handler.js +2 -2
- package/src/api/metrics/routes.js +1 -1
- package/src/api/participants/handler.js +43 -35
- package/src/api/participants/routes.js +13 -13
- package/src/api/root/routes.js +2 -2
- package/src/api/settlementModels/handler.js +9 -26
- package/src/api/settlementModels/routes.js +4 -4
- package/src/api/transactions/handler.js +46 -0
- package/src/api/transactions/routes.js +45 -0
- package/src/domain/bulkTransfer/index.js +6 -5
- package/src/domain/ledgerAccountTypes/index.js +58 -0
- package/src/domain/participant/index.js +55 -4
- package/src/domain/position/index.js +18 -2
- package/src/domain/settlement/index.js +39 -6
- package/src/domain/transactions/index.js +61 -0
- package/src/domain/transfer/index.js +22 -2
- package/src/domain/transfer/transform.js +3 -3
- package/src/handlers/admin/handler.js +24 -32
- package/src/handlers/bulk/fulfil/handler.js +89 -56
- package/src/handlers/bulk/get/handler.js +203 -0
- package/src/handlers/bulk/index.js +4 -1
- package/src/handlers/bulk/prepare/handler.js +30 -29
- package/src/handlers/bulk/processing/handler.js +61 -32
- package/src/handlers/bulk/shared/validator.js +13 -1
- package/src/handlers/index.js +18 -9
- package/src/handlers/positions/handler.js +67 -46
- package/src/handlers/register.js +7 -7
- package/src/handlers/timeouts/handler.js +9 -4
- package/src/handlers/transfers/handler.js +408 -182
- package/src/handlers/transfers/validator.js +41 -11
- package/src/lib/cache.js +8 -34
- package/src/lib/config.js +5 -7
- package/src/lib/enum.js +22 -22
- package/src/lib/enumCached.js +76 -0
- package/src/lib/healthCheck/subServiceHealth.js +2 -2
- package/src/lib/requestLogger.js +9 -9
- package/src/lib/urlParser.js +1 -1
- package/src/models/bulkTransfer/bulkTransfer.js +6 -6
- package/src/models/bulkTransfer/bulkTransferAssociation.js +3 -3
- package/src/models/bulkTransfer/bulkTransferDuplicateCheck.js +4 -4
- package/src/models/bulkTransfer/bulkTransferExtension.js +2 -2
- package/src/models/bulkTransfer/bulkTransferFulfilmentDuplicateCheck.js +4 -4
- package/src/models/bulkTransfer/bulkTransferStateChange.js +7 -7
- package/src/models/bulkTransfer/facade.js +54 -3
- package/src/models/bulkTransfer/individualTransfer.js +2 -2
- package/src/models/ilpPackets/ilpPacket.js +36 -0
- package/src/models/ledgerAccountType/ledgerAccountType.js +139 -3
- package/src/models/misc/migrationLock.js +1 -1
- package/src/models/misc/segment.js +1 -1
- package/src/models/participant/facade.js +226 -76
- package/src/models/participant/participant.js +6 -5
- package/src/models/participant/participantCached.js +8 -0
- package/src/models/participant/participantCurrency.js +7 -7
- package/src/models/participant/participantCurrencyCached.js +11 -1
- package/src/models/participant/participantLimit.js +13 -13
- package/src/models/participant/participantLimitCached.js +124 -0
- package/src/models/participant/participantPosition.js +34 -5
- package/src/models/participant/participantPositionChange.js +10 -2
- package/src/models/position/facade.js +112 -18
- package/src/models/position/participantPosition.js +6 -6
- package/src/models/settlement/settlementModel.js +92 -17
- package/src/models/settlement/settlementModelCached.js +139 -0
- package/src/models/transfer/facade.js +97 -32
- package/src/models/transfer/ilpPacket.js +4 -4
- package/src/models/transfer/transfer.js +7 -7
- package/src/models/transfer/transferDuplicateCheck.js +21 -5
- package/src/models/transfer/transferError.js +5 -5
- package/src/models/transfer/transferErrorDuplicateCheck.js +4 -4
- package/src/models/transfer/transferExtension.js +4 -4
- package/src/models/transfer/transferFulfilment.js +5 -5
- package/src/models/transfer/transferFulfilmentDuplicateCheck.js +4 -4
- package/src/models/transfer/transferParticipant.js +3 -3
- package/src/models/transfer/transferStateChange.js +11 -11
- package/src/models/transfer/transferTimeout.js +5 -5
- package/src/schema/bulkTransfer.js +4 -4
- package/src/shared/plugins.js +10 -9
- package/src/shared/setup.js +69 -46
- package/test/integration/domain/participant/index.test.js +2 -0
- package/test/integration/handlers/handlers.test.js +605 -166
- package/test/integration/handlers/root.test.js +1 -1
- package/test/integration/helpers/hubAccounts.js +62 -0
- package/test/integration/helpers/ilpPacket.js +1 -1
- package/test/integration/helpers/participantFundsInOut.js +80 -0
- package/test/integration/helpers/participantLimit.js +6 -1
- package/test/integration/helpers/settlementModels.js +88 -0
- package/test/integration/helpers/testConsumer.js +163 -0
- package/test/integration/helpers/testProducer.js +0 -1
- package/test/integration/helpers/transferDuplicateCheck.js +1 -1
- package/test/integration/helpers/transferStateChange.js +1 -1
- package/test/integration/helpers/transferTestHelper.js +3 -5
- package/test/integration/models/transfer/transferStateChange.test.js +6 -0
- package/test/unit/api/ledgerAccountTypes/handler.test.js +126 -0
- package/test/unit/api/ledgerAccountTypes/routes.test.js +52 -0
- package/test/unit/api/participants/handler.test.js +75 -33
- package/test/unit/api/root/handler.test.js +1 -1
- package/test/unit/api/root/routes.test.js +2 -2
- package/test/unit/api/settlementModels/handler.test.js +21 -57
- package/test/unit/api/transactions/handler.test.js +108 -0
- package/test/unit/api/transactions/routes.test.js +38 -0
- package/test/unit/domain/ledgerAccountTypes/index.test.js +197 -0
- package/test/unit/domain/participant/index.test.js +115 -2
- package/test/unit/domain/settlement/index.test.js +199 -29
- package/test/unit/domain/transactions/index.test.js +128 -0
- package/test/unit/domain/transfer/index.test.js +1 -0
- package/test/unit/domain/transfer/transform.test.js +2 -0
- package/test/unit/handlers/admin/handler.test.js +5 -5
- package/test/unit/handlers/bulk/get/handler.test.js +401 -0
- package/test/unit/handlers/index.test.js +6 -0
- package/test/unit/handlers/positions/handler.test.js +26 -0
- package/test/unit/handlers/register.test.js +2 -0
- package/test/unit/handlers/transfers/handler.test.js +491 -36
- package/test/unit/handlers/transfers/validator.test.js +31 -31
- package/test/unit/lib/cache.test.js +0 -64
- package/test/unit/lib/cachingOfEnums.test.js +121 -0
- package/test/unit/lib/config.test.js +34 -0
- package/test/unit/lib/enum.test.js +6 -1
- package/test/unit/lib/enumCached.test.js +82 -0
- package/test/unit/lib/healthCheck/subServiceHealth.test.js +2 -0
- package/test/unit/lib/requestLogger.test.js +14 -12
- package/test/unit/models/ilpPackets/ilpPacket.test.js +89 -0
- package/test/unit/models/ledgerAccountType/ledgerAccountType.test.js +255 -6
- package/test/unit/models/misc/migrationLock.test.js +4 -0
- package/test/unit/models/misc/segment.test.js +5 -0
- package/test/unit/models/participant/facade.test.js +493 -54
- package/test/unit/models/participant/participant.test.js +4 -0
- package/test/unit/models/participant/participantCurrency.test.js +22 -9
- package/test/unit/models/participant/participantCurrencyCached.test.js +1 -1
- package/test/unit/models/participant/participantLimit.test.js +97 -0
- package/test/unit/models/participant/participantLimitCached.test.js +232 -0
- package/test/unit/models/participant/participantPosition.test.js +217 -0
- package/test/unit/models/participant/participantPositionChange.test.js +3 -0
- package/test/unit/models/position/facade.test.js +318 -29
- package/test/unit/models/position/participantPosition.test.js +22 -7
- package/test/unit/models/settlement/settlementModel.test.js +18 -37
- package/test/unit/models/settlement/settlementModelCached.test.js +171 -0
- package/test/unit/models/transfer/facade.test.js +115 -0
- package/test/unit/models/transfer/ilpPacket.test.js +28 -11
- package/test/unit/models/transfer/transfer.test.js +13 -4
- package/test/unit/models/transfer/transferDuplicateCheck.test.js +4 -0
- package/test/unit/models/transfer/transferError.test.js +5 -1
- package/test/unit/models/transfer/transferErrorDuplicateCheck.test.js +4 -0
- package/test/unit/models/transfer/transferExtension.test.js +26 -9
- package/test/unit/models/transfer/transferFulfilment.test.js +14 -5
- package/test/unit/models/transfer/transferFulfilmentDuplicateCheck.test.js +4 -0
- package/test/unit/models/transfer/transferParticipant.test.js +14 -5
- package/test/unit/models/transfer/transferStateChange.test.js +3 -0
- package/test/unit/models/transfer/transferTimeout.test.js +6 -0
- package/test/unit/seeds/amountType.test.js +6 -22
- package/test/unit/seeds/balanceOfPayments.test.js +6 -22
- package/test/unit/seeds/bulkProcessingState.test.js +84 -0
- package/test/unit/{lib/sidecar/nullClient.test.js → seeds/bulkTransferState.test.js} +36 -39
- package/test/unit/seeds/currency.test.js +6 -22
- package/test/unit/seeds/endpointType.test.js +6 -22
- package/test/unit/seeds/ledgerAccountType.test.js +5 -22
- package/test/unit/seeds/ledgerEntryType.test.js +6 -22
- package/test/unit/seeds/participant.test.js +5 -22
- package/test/unit/seeds/participantLimitType.test.js +6 -22
- package/test/unit/seeds/partyIdentifierType.test.js +6 -22
- package/test/unit/seeds/partyType.test.js +6 -22
- package/test/unit/seeds/settlementState.test.js +5 -22
- package/test/unit/seeds/settlementWindow1State.test.js +5 -22
- package/test/unit/seeds/transactionInitiator.test.js +6 -22
- package/test/unit/seeds/transactionInitiatorType.test.js +6 -22
- package/test/unit/seeds/transactionScenario.test.js +6 -22
- package/test/unit/seeds/transferParticipantRoleType.test.js +6 -22
- package/test/unit/seeds/transferState.test.js +6 -22
- package/test/unit/shared/plugins.test.js +31 -1
- package/test/unit/shared/setup.test.js +25 -36
- package/test/util/helpers.js +37 -2
- package/test/util/randomTransfers.js +1 -1
- package/test/util/scripts/env.sh +6 -5
- package/test/util/scripts/populateTestData.sh +204 -181
- package/test/util/scripts/populateTestDataForLegacySimulator.sh +261 -0
- package/test/util/scripts/restartObjStore.sh +1 -1
- package/test-integration.Dockerfile +15 -15
- package/test.Dockerfile +12 -12
- package/.circleci/_set_up_deploy_envs.sh +0 -47
- package/.dockerignore +0 -17
- package/.ncurc.json +0 -3
- package/server.sh +0 -4
- package/sonar-project.properties +0 -17
- package/src/lib/sidecar/index.js +0 -47
- package/src/lib/sidecar/nullClient.js +0 -18
- package/test/.env +0 -8
- package/test/integration-config.json +0 -367
- package/test/integration-runner.env +0 -31
- package/test/integration-runner.sh +0 -264
- package/test/spec-runner.sh +0 -132
- package/test/unit/lib/sidecar/index.test.js +0 -148
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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({
|
|
1003
|
-
|
|
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({
|
|
1017
|
-
|
|
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({
|
|
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({
|
|
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({
|
|
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({
|
|
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({
|
|
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({
|
|
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
|
-
|
|
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
|
}))
|