Skip to content

Commit 48cb7c6

Browse files
kleyowCopilot
andauthored
feat: add transfer store for timeout interscheme get test (#362)
* feat: add transfer store for timeout interscheme get test * feat: add transfer store for timeout interscheme get test * chore(snapshot): 18.17.0-snapshot.0 * feat: add transfer store for timeout interscheme get test * chore(snapshot): 18.17.0-snapshot.1 * feat: add transfer store for timeout interscheme get test * chore(snapshot): 18.17.0-snapshot.2 * feat: add transfer store for timeout interscheme get test * chore(snapshot): 18.17.0-snapshot.3 * feat: add transfer store for timeout interscheme get test * chore(snapshot): 18.17.0-snapshot.4 * chore: fix regex * chore(snapshot): 18.17.0-snapshot.5 * chore: fix regex * chore(snapshot): 18.17.0-snapshot.6 * chore: fix regex * chore(snapshot): 18.17.0-snapshot.7 * chore: fix regex * chore: fix regex * chore(snapshot): 18.17.0-snapshot.8 * chore: fix regex * chore(snapshot): 18.17.0-snapshot.9 * chore: use object store * chore(snapshot): 18.17.0-snapshot.10 * chore: use object store * chore(snapshot): 18.17.0-snapshot.11 * chore: obj store * chore(snapshot): 18.17.0-snapshot.12 * chore: obj store * Update src/lib/mocking/openApiMockHandler.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/lib/mocking/middleware-functions/ilpModel.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore: obj store --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 7f7b7bb commit 48cb7c6

10 files changed

Lines changed: 574 additions & 34 deletions

File tree

.grype.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ ignore:
66
reason: "No fixes available as of 2026-01-14 on Dockerfile base image 22.21.1-alpine3.23"
77
- vulnerability: CVE-2026-22184
88
reason: "No fixes available as of 2026-01-16 on Dockerfile base image 22.21.1-alpine3.23"
9+
- vulnerability: CVE-2026-28309
10+
- vulnerability: CVE-2025-59465
11+
- vulnerability: CVE-2025-55131
12+
- vulnerability: GHSA-r6q2-hw4h-h46w
13+
- vulnerability: GHSA-8qq5-rm4j-mr97
14+
- vulnerability: CVE-2025-55130
15+
- vulnerability: CVE-2026-21637
16+
- vulnerability: CVE-2025-59466
17+
- vulnerability: GHSA-xxjr-mmjv-4gpg
918

1019
# Set output format defaults
1120
output:

audit-ci.jsonc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
// Only use one of ["low": true, "moderate": true, "high": true, "critical": true]
55
"moderate": true,
66
"allowlist": [
7-
7+
"GHSA-xxjr-mmjv-4gpg"
88
]
99
}

package-lock.json

Lines changed: 81 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "ml-testing-toolkit",
33
"description": "Testing Toolkit for Mojaloop implementations",
4-
"version": "18.16.6",
4+
"version": "18.17.0-snapshot.12",
55
"license": "Apache-2.0",
66
"author": "Vijaya Kumar Guthi, ModusBox Inc. ",
77
"contributors": [
@@ -88,12 +88,12 @@
8888
"adm-zip": "0.5.16",
8989
"ajv-formats": "3.0.1",
9090
"atob": "2.1.2",
91-
"axios": "1.13.2",
91+
"axios": "1.13.3",
9292
"chai": "4.4.1",
9393
"connection-string": "^5.0.0",
9494
"cookie-parser": "1.4.7",
9595
"cookies": "0.9.1",
96-
"cors": "2.8.5",
96+
"cors": "2.8.6",
9797
"dotenv": "17.2.3",
9898
"express": "5.2.1",
9999
"express-validator": "7.3.1",
@@ -107,8 +107,8 @@
107107
"json-refs": "3.0.15",
108108
"json-rules-engine": "7.3.1",
109109
"jsonwebtoken": "9.0.3",
110-
"lodash": "4.17.21",
111-
"mongoose": "9.1.4",
110+
"lodash": "4.17.23",
111+
"mongoose": "9.1.5",
112112
"multer": "2.0.2",
113113
"mustache": "4.2.0",
114114
"mv": "2.1.1",

src/lib/mocking/middleware-functions/ilpModel.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
const { ilpFactory, ILP_VERSIONS } = require('@mojaloop/sdk-standard-components').Ilp
3131
const customLogger = require('../../requestLogger')
3232
const { logger } = require('../../logger')
33+
const objectStore = require('../../objectStore')
3334

3435
let ilpObj = null
3536
let ilpV4Obj = null
@@ -140,8 +141,30 @@ const handleTransferIlp = (context, response) => {
140141
response.body.TxInfAndSts.ExctnConf = generatedFulfilment
141142
}
142143
}
144+
145+
customLogger.logMessage('debug', 'Generated callback body', { additionalData: { context, response } })
143146
if (context.request.method === 'get' && response.method === 'put' && pathMatch.test(response.path)) {
144-
delete response.body.fulfilment
147+
const transferId = response.path.match(pathMatch)[1]
148+
// Use objectStore to get the stored transfer
149+
const storedTransfer = objectStore.get('storedTransfers', transferId)
150+
customLogger.logMessage('debug', 'Stored transfer fetched for fulfilment', { additionalData: { transferId } })
151+
if (storedTransfer) {
152+
if (storedTransfer.data?.request?.ilpPacket) {
153+
customLogger.logMessage('debug', 'Stored transfer has ilpPacket. Generating fulfilment.', { additionalData: { transferId, ilpPacket: storedTransfer.data.request.ilpPacket } })
154+
const generatedFulfilment = ilpObj.calculateFulfil(storedTransfer.data.request.ilpPacket).replace('"', '')
155+
response.body.fulfilment = generatedFulfilment
156+
} else if (storedTransfer.data?.request?.CdtTrfTxInf?.VrfctnOfTerms?.IlpV4PrepPacket) {
157+
customLogger.logMessage('debug', 'Stored transfer has IlpV4PrepPacket. Generating fulfilment.', { additionalData: { transferId } })
158+
const generatedFulfilment = ilpV4Obj.calculateFulfil(storedTransfer.data.request.CdtTrfTxInf.VrfctnOfTerms.IlpV4PrepPacket).replace('"', '')
159+
response.body.TxInfAndSts.ExctnConf = generatedFulfilment
160+
} else {
161+
customLogger.logMessage('warn', 'No ILP packet or IlpV4PrepPacket found in stored transfer request', { additionalData: { transferId } })
162+
}
163+
// Remove the stored transfer from objectStore regardless of success or failure
164+
objectStore.deleteObject('storedTransfers', transferId)
165+
} else {
166+
delete response.body.fulfilment
167+
}
145168
}
146169
}
147170

src/lib/mocking/openApiMockHandler.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,32 @@ const generateAsyncCallback = async (item, context, req) => {
318318
return
319319
}
320320
} else {
321+
// Store transfers early - right after validation
322+
const transferPathMatch = /\/transfers(?:\/([^/]+))?$/
323+
const fxTransferPathMatch = /\/fxTransfers(?:\/([^/]+))?$/
324+
customLogger.logMessage('debug', 'Processing transfer request', { additionalData: { method: req.method, path: req.path }, request: req })
325+
if (req.method === 'post' && (transferPathMatch.test(req.path) || fxTransferPathMatch.test(req.path))) {
326+
const isFxTransfer = fxTransferPathMatch.test(req.path)
327+
let transferId = (req.payload && req.payload.transferId) || (req.payload && req.payload.commitRequestId)
328+
if (!transferId && req.payload && req.payload.CdtTrfTxInf && req.payload.CdtTrfTxInf.PmtId && req.payload.CdtTrfTxInf.PmtId.TxId) {
329+
transferId = req.payload.CdtTrfTxInf.PmtId.TxId
330+
}
331+
customLogger.logMessage('debug', 'Storing transfer for validation', { additionalData: { transferId }, request: req })
332+
333+
// Use objectStore to store the transfer only when a valid transferId is resolved
334+
if (transferId) {
335+
objectStore.push('storedTransfers', transferId, {
336+
request: req.payload,
337+
type: isFxTransfer ? 'fxTransfer' : 'transfer'
338+
})
339+
} else {
340+
customLogger.logMessage('warn', 'Skipping storing transfer: transferId could not be resolved from payload', {
341+
additionalData: { method: req.method, path: req.path },
342+
request: req
343+
})
344+
}
345+
}
346+
321347
// Getting callback info from callback map file
322348
try {
323349
const cbMapRawdata = await utils.readFileAsync(item.callbackMapFile)
@@ -426,7 +452,7 @@ const generateAsyncCallback = async (item, context, req) => {
426452
return
427453
}
428454
}
429-
455+
customLogger.logMessage('debug', 'Generated callback body', { additionalData: { body: generatedCallback.body }, request: req })
430456
if (generatedCallback.body) {
431457
// Append ILP properties to callback
432458
const fulfilment = IlpModel.handleQuoteIlp(context, generatedCallback)

0 commit comments

Comments
 (0)