From 6e8da4c772bd5832f58fcc31e88d1cfc84b60816 Mon Sep 17 00:00:00 2001 From: Youngone Lee Date: Thu, 13 Jan 2022 13:01:44 -0600 Subject: [PATCH] fix: plugin ledger connector quorum exception handling and upgrade TS Fixes #1738 Signed-off-by: Youngone Lee --- .../plugin-ledger-connector-quorum.ts | 18 +- ...-solidity-bytecode-endpoint-json-object.ts | 20 +- ...loy-contract-solidity-bytecode-endpoint.ts | 20 +- ...prometheus-exporter-metrics-endpoint-v1.ts | 17 +- .../invoke-contract-endpoint-json-object.ts | 20 +- .../web-services/invoke-contract-endpoint.ts | 20 +- .../web-services/run-transaction-endpoint.ts | 20 +- .../openapi-validation-no-keychain.test.ts | 125 +++++++----- .../openapi/openapi-validation.test.ts | 187 ++++++++++-------- ...ct-from-json-json-object-endpoints.test.ts | 33 ++-- ...loy-contract-from-json-json-object.test.ts | 33 ++-- .../v2.3.0-deploy-contract-from-json.test.ts | 49 +++-- ...oke-contract-json-object-endpoints.test.ts | 33 ++-- 13 files changed, 372 insertions(+), 223 deletions(-) diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts index 1740e2e8f05..165466aa188 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts @@ -30,6 +30,7 @@ import { Checks, Logger, LoggerProvider, + LogHelper, LogLevelDesc, } from "@hyperledger/cactus-common"; @@ -62,6 +63,8 @@ import { GetPrometheusExporterMetricsEndpointV1, IGetPrometheusExporterMetricsEndpointV1Options, } from "./web-services/get-prometheus-exporter-metrics-endpoint-v1"; +import axios from "axios"; +import { RuntimeError } from "run-time-error"; export interface IPluginLedgerConnectorQuorumOptions extends ICactusPluginOptions { @@ -415,11 +418,16 @@ export class PluginLedgerConnectorQuorum const txHash = await sendTransaction(transactionConfig, secret); const transactionReceipt = await this.pollForTxReceipt(txHash); return { transactionReceipt }; - } catch (ex) { - throw new Error( - `${fnTag} Failed to invoke web3.eth.personal.sendTransaction(). ` + - `InnerException: ${ex.stack}`, - ); + } catch (ex: unknown) { + const stack = LogHelper.getExceptionStack(ex); + if (axios.isAxiosError(ex)) { + throw new Error( + `${fnTag} Failed to invoke web3.eth.personal.sendTransaction(). ` + + `InnerException: ${stack}`, + ); + } else { + throw new RuntimeError("expected an axios error, got something else"); + } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint-json-object.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint-json-object.ts index 9b0e72c7d54..e644b350efa 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint-json-object.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint-json-object.ts @@ -12,6 +12,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + LogHelper, } from "@hyperledger/cactus-common"; import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; @@ -98,12 +99,21 @@ export class DeployContractSolidityBytecodeJsonObjectEndpoint reqBody, ); res.json(resBody); - } catch (ex) { + } catch (ex: unknown) { + const stack = LogHelper.getExceptionStack(ex); + const messages = LogHelper.getExceptionMessage(ex); this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + if (ex instanceof Error) { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } else { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts index 14d348fffb8..78d9b5d8e28 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts @@ -12,6 +12,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + LogHelper, } from "@hyperledger/cactus-common"; import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; @@ -91,12 +92,21 @@ export class DeployContractSolidityBytecodeEndpoint try { const resBody = await this.options.connector.deployContract(reqBody); res.json(resBody); - } catch (ex) { + } catch (ex: unknown) { + const stack = LogHelper.getExceptionStack(ex); + const messages = LogHelper.getExceptionMessage(ex); this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + if (ex instanceof Error) { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } else { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts index 88b1eca0348..7caca907840 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -16,6 +16,7 @@ import { LoggerProvider, Checks, IAsyncProvider, + LogHelper, } from "@hyperledger/cactus-common"; import { PluginLedgerConnectorQuorum } from "../plugin-ledger-connector-quorum"; @@ -90,11 +91,19 @@ export class GetPrometheusExporterMetricsEndpointV1 const resBody = await this.options.connector.getPrometheusExporterMetrics(); res.status(200); res.send(resBody); - } catch (ex) { + } catch (ex: unknown) { + const stack = LogHelper.getExceptionStack(ex); + const messages = LogHelper.getExceptionMessage(ex); this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if (ex instanceof Error) { + res.status(500); + res.statusMessage = messages; + res.json({ error: stack }); + } else { + res.status(500); + res.statusMessage = messages; + res.json({ error: stack }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint-json-object.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint-json-object.ts index 00af8359ff4..e1774b7ab89 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint-json-object.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint-json-object.ts @@ -6,6 +6,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + LogHelper, } from "@hyperledger/cactus-common"; import { IEndpointAuthzOptions, @@ -92,12 +93,21 @@ export class InvokeContractJsonObjectEndpoint implements IWebServiceEndpoint { try { const resBody = await this.options.connector.getContractInfo(reqBody); res.json(resBody); - } catch (ex) { + } catch (ex: unknown) { + const stack = LogHelper.getExceptionStack(ex); + const messages = LogHelper.getExceptionMessage(ex); this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + if (ex instanceof Error) { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } else { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint.ts index a15ea9a8ef6..8b0abef6b5c 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint.ts @@ -6,6 +6,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + LogHelper, } from "@hyperledger/cactus-common"; import { IEndpointAuthzOptions, @@ -90,12 +91,21 @@ export class InvokeContractEndpoint implements IWebServiceEndpoint { reqBody, ); res.json(resBody); - } catch (ex) { + } catch (ex: unknown) { + const stack = LogHelper.getExceptionStack(ex); + const messages = LogHelper.getExceptionMessage(ex); this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + if (ex instanceof Error) { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } else { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/run-transaction-endpoint.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/run-transaction-endpoint.ts index b26134087a8..be698af5b4d 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/run-transaction-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/run-transaction-endpoint.ts @@ -6,6 +6,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + LogHelper, } from "@hyperledger/cactus-common"; import { IEndpointAuthzOptions, @@ -88,12 +89,21 @@ export class RunTransactionEndpoint implements IWebServiceEndpoint { try { const resBody = await this.options.connector.transact(reqBody); res.json({ success: true, data: resBody }); - } catch (ex) { + } catch (ex: unknown) { + const stack = LogHelper.getExceptionStack(ex); + const messages = LogHelper.getExceptionMessage(ex); this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + if (ex instanceof Error) { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } else { + res.status(500).json({ + message: "Internal Server Error", + error: stack || messages, + }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation-no-keychain.test.ts b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation-no-keychain.test.ts index 07ee54af179..0a24760d5b4 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation-no-keychain.test.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation-no-keychain.test.ts @@ -35,6 +35,7 @@ import { PluginRegistry } from "@hyperledger/cactus-core"; import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../../../main/json/openapi.json"; +import axios from "axios"; const logLevel: LogLevelDesc = "INFO"; @@ -185,20 +186,24 @@ test(testCase, async (t: Test) => { await apiClient.deployContractSolBytecodeJsonObjectV1( (parameters as any) as DeployContractSolidityBytecodeJsonObjectV1Request, ); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fDeploy} without required contractJSON and bytecode: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("contractJSON"), - "Rejected because contractJSON is required", - ); - t2.notOk(fields.includes("gas"), "gas is not required"); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fDeploy} without required contractJSON and bytecode: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("contractJSON"), + "Rejected because contractJSON is required", + ); + t2.notOk(fields.includes("gas"), "gas is not required"); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); @@ -221,19 +226,23 @@ test(testCase, async (t: Test) => { await apiClient.deployContractSolBytecodeJsonObjectV1( (parameters as any) as DeployContractSolidityBytecodeJsonObjectV1Request, ); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("fake"), - "Rejected because fake is not a valid parameter", - ); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("fake"), + "Rejected because fake is not a valid parameter", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); @@ -257,20 +266,24 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractV1NoKeychain( (parameters as any) as InvokeContractJsonObjectV1Request, ); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fInvoke} without required contractJSON and methodName: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("contractJSON"), - "Rejected because contractJSON is required", - ); - t2.notOk(fields.includes("nonce"), "nonce is not required"); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fInvoke} without required contractJSON and methodName: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("contractJSON"), + "Rejected because contractJSON is required", + ); + t2.notOk(fields.includes("nonce"), "nonce is not required"); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); @@ -296,19 +309,23 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractV1NoKeychain( (parameters as any) as InvokeContractJsonObjectV1Request, ); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fInvoke} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("fake"), - "Rejected because fake is not a valid parameter", - ); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fInvoke} with fake=4: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("fake"), + "Rejected because fake is not a valid parameter", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation.test.ts b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation.test.ts index f6c0cbb5595..25225b9e163 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation.test.ts @@ -31,6 +31,7 @@ import { Configuration } from "@hyperledger/cactus-core-api"; import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../../../main/json/openapi.json"; +import axios from "axios"; const logLevel: LogLevelDesc = "INFO"; const testCase = "Quorum API"; @@ -174,20 +175,24 @@ test(testCase, async (t: Test) => { await apiClient.deployContractSolBytecodeV1( parameters as DeployContractSolidityBytecodeV1Request, ); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fDeploy} without required contractName and bytecode: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("contractName"), - "Rejected because contractName is required", - ); - t2.notOk(fields.includes("gas"), "gas is not required"); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fDeploy} without required contractName and bytecode: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("contractName"), + "Rejected because contractName is required", + ); + t2.notOk(fields.includes("gas"), "gas is not required"); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); @@ -209,19 +214,23 @@ test(testCase, async (t: Test) => { await apiClient.deployContractSolBytecodeV1( parameters as DeployContractSolidityBytecodeV1Request, ); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("fake"), - "Rejected because fake is not a valid parameter", - ); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("fake"), + "Rejected because fake is not a valid parameter", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); @@ -270,20 +279,24 @@ test(testCase, async (t: Test) => { }, }; await apiClient.invokeContractV1(parameters as InvokeContractV1Request); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fInvoke} without required methodName: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("methodName"), - "Rejected because methodName is required", - ); - t2.notOk(fields.includes("nonce"), "nonce is not required"); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fInvoke} without required methodName: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("methodName"), + "Rejected because methodName is required", + ); + t2.notOk(fields.includes("nonce"), "nonce is not required"); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); @@ -308,19 +321,23 @@ test(testCase, async (t: Test) => { fake: 4, }; await apiClient.invokeContractV1(parameters as InvokeContractV1Request); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fInvoke} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("fake"), - "Rejected because fake is not a valid parameter", - ); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fInvoke} with fake=4: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("fake"), + "Rejected because fake is not a valid parameter", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); @@ -359,20 +376,24 @@ test(testCase, async (t: Test) => { }, }; await apiClient.runTransactionV1(parameters as RunTransactionRequest); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fRun} without required transactionConfig: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("transactionConfig"), - "Rejected because transactionConfig is required", - ); - t2.notOk(fields.includes("timeoutMs"), "timeoutMs is not required"); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fRun} without required transactionConfig: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("transactionConfig"), + "Rejected because transactionConfig is required", + ); + t2.notOk(fields.includes("timeoutMs"), "timeoutMs is not required"); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); @@ -394,19 +415,23 @@ test(testCase, async (t: Test) => { fake: 4, }; await apiClient.runTransactionV1(parameters as RunTransactionRequest); - } catch (e) { - t2.equal( - e.response.status, - 400, - `Endpoint ${fRun} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: any) => - param.path.replace(".body.", ""), - ); - t2.ok( - fields.includes("fake"), - "Rejected because fake is not a valid parameter", - ); + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + t2.equal( + e.response?.status, + 400, + `Endpoint ${fRun} with fake=4: response.status === 400 OK`, + ); + const fields = e.response?.data.map((param: any) => + param.path.replace(".body.", ""), + ); + t2.ok( + fields.includes("fake"), + "Rejected because fake is not a valid parameter", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } t2.end(); diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json-json-object-endpoints.test.ts b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json-json-object-endpoints.test.ts index bde4ba590c6..ea8b198b25d 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json-json-object-endpoints.test.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json-json-object-endpoints.test.ts @@ -33,6 +33,7 @@ import bodyParser from "body-parser"; import http from "http"; import { AddressInfo } from "net"; import { Configuration } from "@hyperledger/cactus-core-api"; +import axios from "axios"; const logLevel: LogLevelDesc = "INFO"; @@ -206,12 +207,16 @@ test(testCase, async (t: Test) => { contractJSON: HelloWorldContractJson, }); t2.ifError(setNameOutInvalid.data.transactionReceipt); - } catch (error) { - t2.notStrictEqual( - error, - "Nonce too low", - "setName() invocation with invalid nonce", - ); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + t2.notStrictEqual( + error, + "Nonce too low", + "setName() invocation with invalid nonce", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } const getNameOut = await apiClient.invokeContractV1NoKeychain({ @@ -313,12 +318,16 @@ test(testCase, async (t: Test) => { contractJSON: HelloWorldContractJson, }); t2.ifError(setNameOutInvalid.data.transactionReceipt); - } catch (error) { - t2.notStrictEqual( - error, - "Nonce too low", - "setName() invocation with invalid nonce", - ); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + t2.notStrictEqual( + error, + "Nonce too low", + "setName() invocation with invalid nonce", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } // const { callOutput: getNameOut } = const getNameOut = await apiClient.invokeContractV1NoKeychain({ diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json-json-object.test.ts b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json-json-object.test.ts index 14529d893d7..c499ea2f17e 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json-json-object.test.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json-json-object.test.ts @@ -33,6 +33,7 @@ import bodyParser from "body-parser"; import http from "http"; import { AddressInfo } from "net"; import { Configuration } from "@hyperledger/cactus-core-api"; +import axios from "axios"; const logLevel: LogLevelDesc = "INFO"; @@ -205,12 +206,16 @@ test(testCase, async (t: Test) => { contractJSON: HelloWorldContractJson, }); t2.ifError(setNameOutInvalid.transactionReceipt); - } catch (error) { - t2.notStrictEqual( - error, - "Nonce too low", - "setName() invocation with invalid nonce", - ); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + t2.notStrictEqual( + error, + "Nonce too low", + "setName() invocation with invalid nonce", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } const getNameOut = await connector.getContractInfo({ @@ -309,12 +314,16 @@ test(testCase, async (t: Test) => { contractJSON: HelloWorldContractJson, }); t2.ifError(setNameOutInvalid.transactionReceipt); - } catch (error) { - t2.notStrictEqual( - error, - "Nonce too low", - "setName() invocation with invalid nonce", - ); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + t2.notStrictEqual( + error, + "Nonce too low", + "setName() invocation with invalid nonce", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } const { callOutput: getNameOut } = await connector.getContractInfo({ contractAddress, diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json.test.ts b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json.test.ts index ed4d654e479..ce10948b8c2 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json.test.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-deploy-contract-from-json.test.ts @@ -36,6 +36,7 @@ import bodyParser from "body-parser"; import http from "http"; import { AddressInfo } from "net"; import { Configuration } from "@hyperledger/cactus-core-api"; +import axios from "axios"; const logLevel: LogLevelDesc = "INFO"; const contractName = "HelloWorld"; @@ -222,12 +223,16 @@ test(testCase, async (t: Test) => { nonce: 2, }); t2.ifError(setNameOutInvalid.transactionReceipt); - } catch (error) { - t2.notStrictEqual( - error, - "Nonce too low", - "setName() invocation with invalid nonce", - ); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + t2.notStrictEqual( + error, + "Nonce too low", + "setName() invocation with invalid nonce", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } const getNameOut = await connector.getContractInfoKeychain({ @@ -328,12 +333,16 @@ test(testCase, async (t: Test) => { nonce: 1, }); t2.ifError(setNameOutInvalid.transactionReceipt); - } catch (error) { - t2.notStrictEqual( - error, - "Nonce too low", - "setName() invocation with invalid nonce", - ); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + t2.notStrictEqual( + error, + "Nonce too low", + "setName() invocation with invalid nonce", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } const { callOutput: getNameOut } = await connector.getContractInfoKeychain({ contractName, @@ -406,12 +415,16 @@ test(testCase, async (t: Test) => { nonce: 3, }); t2.ifError(setNameOutInvalid.transactionReceipt); - } catch (error) { - t2.notStrictEqual( - error, - "Nonce too low", - "setName() invocation with invalid nonce", - ); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + t2.notStrictEqual( + error, + "Nonce too low", + "setName() invocation with invalid nonce", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } const { callOutput: getNameOut } = await connector.getContractInfoKeychain({ contractName, diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-invoke-contract-json-object-endpoints.test.ts b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-invoke-contract-json-object-endpoints.test.ts index 2e45e6476b2..6755ac4706b 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-invoke-contract-json-object-endpoints.test.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v2.3.0-invoke-contract-json-object-endpoints.test.ts @@ -29,6 +29,7 @@ import bodyParser from "body-parser"; import http from "http"; import { AddressInfo } from "net"; import { Configuration } from "@hyperledger/cactus-core-api"; +import axios from "axios"; const logLevel: LogLevelDesc = "INFO"; @@ -193,12 +194,16 @@ test("Quorum Ledger Connector Plugin", async (t: Test) => { contractJSON: HelloWorldContractJson, }); t2.ifError(setNameOutInvalid.data.transactionReceipt); - } catch (error) { - t2.notStrictEqual( - error, - "Nonce too low", - "setName() invocation with invalid nonce", - ); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + t2.notStrictEqual( + error, + "Nonce too low", + "setName() invocation with invalid nonce", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } const getNameOut = await apiClient.invokeContractV1NoKeychain({ @@ -303,12 +308,16 @@ test("Quorum Ledger Connector Plugin", async (t: Test) => { contractJSON: HelloWorldContractJson, }); t2.ifError(setNameOutInvalid.data.transactionReceipt); - } catch (error) { - t2.notStrictEqual( - error, - "Nonce too low", - "setName() invocation with invalid nonce", - ); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + t2.notStrictEqual( + error, + "Nonce too low", + "setName() invocation with invalid nonce", + ); + } else { + t2.fail("expected an axios error, got something else"); + } } const getNameOut = await apiClient.invokeContractV1NoKeychain({