From c42956332bf64723182e9fa6dc5ae9b37c403742 Mon Sep 17 00:00:00 2001 From: Georgi Georgiev Date: Wed, 8 May 2019 15:25:28 +0300 Subject: [PATCH] hotfix/Fixed SQL Error output and improved coverage (#72) * Fixed SQL Error output and improved coverage * Updated version * Restart CI workflow * interrupt integration runner just before central-ledger health check --- package-lock.json | 2 +- package.json | 4 +- src/domain/settlement/index.js | 6 +- src/interface/swagger.json | 3 +- test/integration-runner.sh | 1 + test/unit/domain/settlement/index.test.js | 4 +- test/unit/handlers/settlements/{id}.test.js | 64 ++++++++++++++++++++- 7 files changed, 73 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index efc813c5..44ad877b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "central-settlement", - "version": "6.1.0", + "version": "6.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 49da88bd..2f981dc3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "central-settlement", - "description": "Central settlements hosted by a scheme to record and make settlements", - "version": "6.1.0", + "description": "Central settlements hosted by a scheme to record and make settlements.", + "version": "6.1.1", "license": "Apache-2.0", "private": true, "author": "ModusBox", diff --git a/src/domain/settlement/index.js b/src/domain/settlement/index.js index ff1bccb0..2e918594 100644 --- a/src/domain/settlement/index.js +++ b/src/domain/settlement/index.js @@ -191,8 +191,8 @@ module.exports = { let idList = settlementWindowsIdList.map(v => v.id) // validate windows state const settlementWindows = await SettlementWindowModel.getByListOfIds(idList, enums.settlementWindowStates) - if (settlementWindows.length && settlementWindows.length !== idList.length) { - let err = new Error('Not all provided windows were found') + if (settlementWindows && settlementWindows.length !== idList.length) { + let err = new Error('At least one settlement window does not exist') throw err } @@ -200,7 +200,7 @@ module.exports = { let { state } = settlementWindow if (state !== enums.settlementWindowStates.CLOSED && state !== enums.settlementWindowStates.ABORTED) { - let err = new Error('At least one settlement window is not CLOSED/ABORTED') + let err = new Error('At least one settlement window is not in CLOSED or ABORTED state') throw err } } diff --git a/src/interface/swagger.json b/src/interface/swagger.json index b174ff62..c9bae698 100644 --- a/src/interface/swagger.json +++ b/src/interface/swagger.json @@ -882,7 +882,8 @@ "state": { "type": "string", "enum": [ - "ABORTED" + "ABORTED", + "INVALID" ] }, "reason": { diff --git a/test/integration-runner.sh b/test/integration-runner.sh index 04276d56..d325e8a2 100644 --- a/test/integration-runner.sh +++ b/test/integration-runner.sh @@ -306,6 +306,7 @@ done >&1 echo "Central-ledger is starting" start_central_ledger +exit 0 if [ "$?" != 0 ] then diff --git a/test/unit/domain/settlement/index.test.js b/test/unit/domain/settlement/index.test.js index a56ec2b3..03f9598d 100644 --- a/test/unit/domain/settlement/index.test.js +++ b/test/unit/domain/settlement/index.test.js @@ -330,7 +330,7 @@ Test('SettlementService', async (settlementServiceTest) => { test.end() } catch (err) { Logger.error(`settlementEventTriggerTest failed with error - ${err}`) - test.equal(err.message, 'Not all provided windows were found', `Error "${err.message}" thrown`) + test.equal(err.message, 'At least one settlement window does not exist', `Error "${err.message}" thrown`) test.end() } }) @@ -343,7 +343,7 @@ Test('SettlementService', async (settlementServiceTest) => { test.end() } catch (err) { Logger.error(`settlementEventTriggerTest failed with error - ${err}`) - test.equal(err.message, 'At least one settlement window is not CLOSED/ABORTED', `Error "${err.message}" thrown`) + test.equal(err.message, 'At least one settlement window is not in CLOSED or ABORTED state', `Error "${err.message}" thrown`) test.end() } }) diff --git a/test/unit/handlers/settlements/{id}.test.js b/test/unit/handlers/settlements/{id}.test.js index 4d1d03e7..317eee30 100644 --- a/test/unit/handlers/settlements/{id}.test.js +++ b/test/unit/handlers/settlements/{id}.test.js @@ -232,6 +232,7 @@ Test('/settlements/{id}', async (settlementTest) => { }) const mock = await requests + mock.request.body.state = 'ABORTED' t.ok(mock) t.ok(mock.request) @@ -268,6 +269,65 @@ Test('/settlements/{id}', async (settlementTest) => { } }) + await settlementTest.test('test settlements put operation :: invlidState', async (t) => { + sandbox.stub(Enums, 'ledgerAccountTypes').returns({}) + sandbox.stub(Enums, 'ledgerEntryTypes').returns({}) + sandbox.stub(Enums, 'participantLimitTypes').returns({}) + sandbox.stub(Enums, 'settlementStates').returns({ ABORTED: 'ABORTED' }) + sandbox.stub(Enums, 'settlementWindowStates').returns({}) + sandbox.stub(Enums, 'transferParticipantRoleTypes').returns({}) + sandbox.stub(Enums, 'transferStates').returns({}) + sandbox.stub(Enums, 'transferStateEnums').returns({}) + sandbox.stub(settlement, 'abortById').returns({}) + try { + const requests = new Promise((resolve, reject) => { + Mockgen().requests({ + path: '/settlements/{id}', + operation: 'put' + }, function (error, mock) { + return error ? reject(error) : resolve(mock) + }) + }) + + const mock = await requests + mock.request.body.state = 'INVALID' + + t.ok(mock) + t.ok(mock.request) + // Get the resolved path from mock request + // Mock request Path templates({}) are resolved using path parameters + const options = { + method: 'put', + url: '/v1' + mock.request.path + } + if (mock.request.body) { + // Send the request body + options.payload = mock.request.body + } else if (mock.request.formData) { + // Send the request form data + options.payload = mock.request.formData + // Set the Content-Type as application/x-www-form-urlencoded + options.headers = options.headers || {} + options.headers['Content-Type'] = 'application/x-www-form-urlencoded' + } + // If headers are present, set the headers. + if (mock.request.headers && mock.request.headers.length > 0) { + options.headers = mock.request.headers + } + + delete options.payload.participants + + const response = await server.inject(options) + t.equal(response.statusCode, 400, 'Bad Request response status') + t.equal(response.result.message.errorInformation.errorDescription, 'Invalid request payload input', 'Error description matched') + t.end() + } catch (e) { + Logger.error(`testing error ${e}`) + t.fail() + t.end() + } + }) + await settlementTest.test('test settlements put operation :: abortById :: only state provided', async (t) => { sandbox.stub(Enums, 'ledgerAccountTypes').returns({}) sandbox.stub(Enums, 'ledgerEntryTypes').returns({}) @@ -316,7 +376,7 @@ Test('/settlements/{id}', async (settlementTest) => { delete options.payload.reason const response = await server.inject(options) - t.equal(response.statusCode, 400, 'Ok response status') + t.equal(response.statusCode, 400, 'Bad Request response status') t.end() } catch (e) { Logger.error(`testing error ${e}`) @@ -373,7 +433,7 @@ Test('/settlements/{id}', async (settlementTest) => { delete options.payload.participants const response = await server.inject(options) - t.equal(response.statusCode, 400, 'Ok response status') + t.equal(response.statusCode, 400, 'Bad Request response status') t.end() } catch (e) { Logger.error(`testing error ${e}`)