From 1280003b493fd71537b2563c267c8813544e768f Mon Sep 17 00:00:00 2001 From: ashnashahgrover Date: Mon, 12 Aug 2024 19:22:56 +0000 Subject: [PATCH] test(ethereum): refactor jest test negative test cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Primary Changes --------------- 1. Refactored negative test case exception assertions for cactus-plugin-ledger-connector-ethereum. Removed try-catch blocks, replaced with declarations through jest-extended's own API. 2. Made comments on specific tests where the tests should fail but are actually passing and thus cannot be refactored before being investigated further.   Fixes #3475 Signed-off-by: ashnashahgrover --- ...oy-and-invoke-using-json-object-v1.test.ts | 60 ++++++------ ...eploy-and-invoke-using-keychain-v1.test.ts | 91 ++++++++++--------- .../geth-invoke-web3-method-v1.test.ts | 30 +++--- .../geth-transact-and-gas-fees.test.ts | 21 +++-- 4 files changed, 104 insertions(+), 98 deletions(-) diff --git a/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-contract-deploy-and-invoke-using-json-object-v1.test.ts b/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-contract-deploy-and-invoke-using-json-object-v1.test.ts index 8c6815ad9aa..7a90eaca2dc 100644 --- a/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-contract-deploy-and-invoke-using-json-object-v1.test.ts +++ b/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-contract-deploy-and-invoke-using-json-object-v1.test.ts @@ -24,6 +24,7 @@ import { LogLevelDesc, IListenOptions, Servers, + LoggerProvider, } from "@hyperledger/cactus-common"; import { PluginRegistry } from "@hyperledger/cactus-core"; import { Configuration, Constants } from "@hyperledger/cactus-core-api"; @@ -50,6 +51,12 @@ const containerImageName = "ghcr.io/hyperledger/cacti-geth-all-in-one"; const containerImageVersion = "2023-07-27-2a8c48ed6"; describe("Ethereum contract deploy and invoke using keychain tests", () => { + const logLevel: LogLevelDesc = "info"; + const log = LoggerProvider.getOrCreate({ + label: "geth-contract-deploy-and-invoke-using-json-object-v1.test.ts", + level: logLevel, + }); + const keychainEntryKey = uuidV4(); let testEthAccount: { address: HexString; @@ -227,22 +234,23 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { }); test("deployContract without contractJSON should fail", async () => { - try { - await apiClient.deployContract({ + await expect( + apiClient.deployContract({ contract: {} as ContractJsonDefinition, web3SigningCredential: { ethAccount: WHALE_ACCOUNT_ADDRESS, secret: "", type: Web3SigningCredentialType.GethKeychainPassword, }, - }); - fail("Expected deployContract call to fail but it succeeded."); - } catch (error) { - console.log("deployContract failed as expected"); - } + }), + ).rejects.toThrow(); + + log.info("deployContract failed as expected"); }); test("deployContract with additional parameters should fail", async () => { + //this try-catch statement was not refactored because calling deployContract with additional parameters is actually not + //causing an error. try { await apiClient.deployContract({ contract: { @@ -256,6 +264,7 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { gas: 1000000, fake: 4, } as DeployContractV1Request); + //test is failing because "fail" is not defined. Without the fail statement, the test actually passes. fail("Expected deployContract call to fail but it succeeded."); } catch (error) { console.log("deployContract failed as expected"); @@ -285,8 +294,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { expect(setNameOut).toBeTruthy(); expect(setNameOut.data).toBeTruthy(); - try { - await apiClient.invokeContractV1({ + await expect( + apiClient.invokeContractV1({ contract: { contractJSON: HelloWorldContractJson, contractAddress, @@ -299,11 +308,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { secret: "", type: Web3SigningCredentialType.GethKeychainPassword, }, - }); - fail("Expected getContractInfoKeychain call to fail but it succeeded."); - } catch (error) { - expect(error).toBeTruthy(); - } + }), + ).rejects.toBeTruthy(); const getNameOut = await apiClient.invokeContractV1({ contract: { @@ -366,8 +372,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { expect(setNameOut).toBeTruthy(); expect(setNameOut.data).toBeTruthy(); - try { - await apiClient.invokeContractV1({ + await expect( + apiClient.invokeContractV1({ contract: { contractJSON: HelloWorldContractJson, contractAddress, @@ -383,11 +389,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { secret: testEthAccount.privateKey, type: Web3SigningCredentialType.PrivateKeyHex, }, - }); - fail("Expected getContractInfoKeychain call to fail but it succeeded."); - } catch (error) { - expect(error).toBeTruthy(); - } + }), + ).rejects.toBeTruthy(); const invokeGetNameOut = await apiClient.invokeContractV1({ contract: { @@ -410,8 +413,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { }); test("invokeContractV1 without methodName should fail", async () => { - try { - await apiClient.invokeContractV1({ + await expect( + apiClient.invokeContractV1({ contract: { contractJSON: HelloWorldContractJson, contractAddress, @@ -423,12 +426,9 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { secret: "", type: Web3SigningCredentialType.GethKeychainPassword, }, - } as InvokeContractV1Request); - fail( - "Expected deployContractSolBytecodeV1 call to fail but it succeeded.", - ); - } catch (error) { - console.log("deployContractSolBytecodeV1 failed as expected"); - } + } as InvokeContractV1Request), + ).rejects.toThrow(); + + log.info("deployContractSolBytecodeV1 failed as expected"); }); }); diff --git a/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-contract-deploy-and-invoke-using-keychain-v1.test.ts b/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-contract-deploy-and-invoke-using-keychain-v1.test.ts index 70f4f4dda7e..570c56a73eb 100644 --- a/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-contract-deploy-and-invoke-using-keychain-v1.test.ts +++ b/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-contract-deploy-and-invoke-using-keychain-v1.test.ts @@ -24,6 +24,7 @@ import { LogLevelDesc, IListenOptions, Servers, + LoggerProvider, } from "@hyperledger/cactus-common"; import { PluginRegistry } from "@hyperledger/cactus-core"; import { Configuration, Constants } from "@hyperledger/cactus-core-api"; @@ -54,6 +55,11 @@ const containerImageName = "ghcr.io/hyperledger/cacti-geth-all-in-one"; const containerImageVersion = "2023-07-27-2a8c48ed6"; describe("Ethereum contract deploy and invoke using keychain tests", () => { + const log = LoggerProvider.getOrCreate({ + label: "geth-contract-deploy-and-invoke-using-keychain-v1.test.ts", + level: testLogLevel, + }); + const keychainEntryKey = uuidV4(); let testEthAccount: { address: HexString; @@ -230,8 +236,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { }); test("deployContract without contractName should fail", async () => { - try { - await apiClient.deployContract({ + await expect( + apiClient.deployContract({ contract: { keychainId: keychainPlugin.getKeychainId(), } as ContractKeychainDefinition, @@ -240,14 +246,16 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { secret: "", type: Web3SigningCredentialType.GethKeychainPassword, }, - }); - fail("Expected deployContract call to fail but it succeeded."); - } catch (error) { - console.log("deployContract failed as expected"); - } + }), + ).rejects.toThrow(); + + log.info("deployContract failed as expected"); }); test("deployContract with additional parameters should fail", async () => { + //did not refactor because the test is not actually failing + //it returns a message saying: INFO (PluginLedgerConnectorEthereum): Contract deployed successfully, saving address in keychain entry + //it only hits the catch statement because "fail is not defined" try { await apiClient.deployContract({ contract: { @@ -264,7 +272,9 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { } as DeployContractV1Request); fail("Expected deployContract call to fail but it succeeded."); } catch (error) { - console.log("deployContract failed as expected"); + log.info("error message:"); + log.info(error.message); + log.info("deployContract failed as expected"); } }); @@ -291,8 +301,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { expect(setNameOut).toBeTruthy(); expect(setNameOut.data).toBeTruthy(); - try { - await apiClient.invokeContractV1({ + await expect( + apiClient.invokeContractV1({ contract: { contractName: HelloWorldContractJson.contractName, keychainId: keychainPlugin.getKeychainId(), @@ -305,11 +315,10 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { secret: "", type: Web3SigningCredentialType.GethKeychainPassword, }, - }); - fail("Expected invokeContractV1 call to fail but it succeeded."); - } catch (error) { - expect(error).toBeTruthy(); - } + }), + ).rejects.toThrow(); + + log.info("invokeContractV1 failed as expected"); const getNameOut = await apiClient.invokeContractV1({ contract: { @@ -385,16 +394,15 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { }); test("runTransactionV1 without transaction config should fail", async () => { - try { - await apiClient.runTransactionV1({ + await expect( + apiClient.runTransactionV1({ web3SigningCredential: { type: Web3SigningCredentialType.None, }, - } as RunTransactionRequest); - fail("Expected runTransactionV1 call to fail but it succeeded."); - } catch (error) { - console.log("runTransactionV1 failed as expected"); - } + } as RunTransactionRequest), + ).rejects.toThrow(); + + log.info("runTransactionV1 failed as expected"); }); test("invoke Web3SigningCredentialType.PrivateKeyHex", async () => { @@ -420,8 +428,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { expect(setNameOut).toBeTruthy(); expect(setNameOut.data).toBeTruthy(); - try { - await apiClient.invokeContractV1({ + await expect( + apiClient.invokeContractV1({ contract: { contractName: HelloWorldContractJson.contractName, keychainId: keychainPlugin.getKeychainId(), @@ -437,11 +445,10 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { secret: testEthAccount.privateKey, type: Web3SigningCredentialType.PrivateKeyHex, }, - }); - fail("Expected invokeContractV1 call to fail but it succeeded."); - } catch (error) { - expect(error).toBeTruthy(); - } + }), + ).rejects.toThrow(); + + log.info("invokeContractV1 failed as expected"); const invokeGetNameOut = await apiClient.invokeContractV1({ contract: { @@ -490,8 +497,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { expect(setNameOut).toBeTruthy(); expect(setNameOut.data).toBeTruthy(); - try { - await apiClient.invokeContractV1({ + await expect( + apiClient.invokeContractV1({ contract: { contractName: HelloWorldContractJson.contractName, keychainId: keychainPlugin.getKeychainId(), @@ -507,11 +514,10 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { secret: "", type: Web3SigningCredentialType.GethKeychainPassword, }, - }); - fail("Expected invokeContractV1 call to fail but it succeeded."); - } catch (error) { - expect(error).toBeTruthy(); - } + }), + ).rejects.toThrow(); + + log.info("invokeContractV1 failed as expected"); const invokeGetNameOut = await apiClient.invokeContractV1({ contract: { @@ -530,8 +536,8 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { }); test("invokeContractV1 without methodName should fail", async () => { - try { - await apiClient.invokeContractV1({ + await expect( + apiClient.invokeContractV1({ contract: { contractName: HelloWorldContractJson.contractName, keychainId: keychainPlugin.getKeychainId(), @@ -543,11 +549,10 @@ describe("Ethereum contract deploy and invoke using keychain tests", () => { secret: "", type: Web3SigningCredentialType.GethKeychainPassword, }, - } as InvokeContractV1Request); - fail("Expected invokeContractV1 call to fail but it succeeded."); - } catch (error) { - console.log("invokeContractV1 failed as expected"); - } + } as InvokeContractV1Request), + ).rejects.toThrow(); + + log.info("invokeContractV1 failed as expected"); }); // @todo - move to separate test suite diff --git a/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-invoke-web3-method-v1.test.ts b/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-invoke-web3-method-v1.test.ts index 5cf120279a9..ae1e12b945e 100644 --- a/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-invoke-web3-method-v1.test.ts +++ b/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-invoke-web3-method-v1.test.ts @@ -167,12 +167,14 @@ describe("invokeRawWeb3EthMethod Tests", () => { }); test("invokeRawWeb3EthMethod with missing arg throws error (getBlock)", async () => { + //did not refactor because the test is not failing. try { const connectorResponse = connector.invokeRawWeb3EthMethod({ methodName: "getBlock", }); await connectorResponse; + //This test is actually passing, but the statement below is not being printed. fail("Calling getBlock with missing argument should throw an error"); } catch (err) { expect(err).toBeTruthy(); @@ -180,30 +182,26 @@ describe("invokeRawWeb3EthMethod Tests", () => { }); test("invokeRawWeb3EthMethod with invalid arg throws error (getBlock)", async () => { - try { - const connectorResponse = connector.invokeRawWeb3EthMethod({ + await expect( + connector.invokeRawWeb3EthMethod({ methodName: "getBlock", params: ["foo"], - }); + }), + ).rejects.toThrow(); - await connectorResponse; - fail("Calling getBlock with argument should throw an error"); - } catch (err) { - expect(err).toBeTruthy(); - } + log.info( + "Calling getBlock with an invalid argument threw an error as expected", + ); }); test("invokeRawWeb3EthMethod with non existing method throws error", async () => { - try { - const connectorResponse = connector.invokeRawWeb3EthMethod({ + await expect( + connector.invokeRawWeb3EthMethod({ methodName: "foo", params: ["foo"], - }); + }), + ).rejects.toThrow(); - await connectorResponse; - fail("Calling non existing method should throw an error"); - } catch (err) { - expect(err).toBeTruthy(); - } + log.info("Calling non-existing method threw an error as expected"); }); }); diff --git a/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-transact-and-gas-fees.test.ts b/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-transact-and-gas-fees.test.ts index 4b8cadff0ef..830efe8eab1 100644 --- a/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-transact-and-gas-fees.test.ts +++ b/packages/cactus-plugin-ledger-connector-ethereum/src/test/typescript/integration/geth-transact-and-gas-fees.test.ts @@ -22,6 +22,7 @@ import { LogLevelDesc, IListenOptions, Servers, + LoggerProvider, } from "@hyperledger/cactus-common"; import { PluginRegistry } from "@hyperledger/cactus-core"; import { Configuration, Constants } from "@hyperledger/cactus-core-api"; @@ -41,6 +42,11 @@ const containerImageName = "ghcr.io/hyperledger/cacti-geth-all-in-one"; const containerImageVersion = "2023-07-27-2a8c48ed6"; describe("Running ethereum transactions with different gas configurations", () => { + const log = LoggerProvider.getOrCreate({ + label: "geth-contract-deploy-and-invoke-using-keychain-v1.test.ts", + level: testLogLevel, + }); + let web3: InstanceType, addressInfo, address: string, @@ -133,8 +139,8 @@ describe("Running ethereum transactions with different gas configurations", () = web3.utils.toWei(2, "gwei"), ); - try { - await apiClient.runTransactionV1({ + await expect( + apiClient.runTransactionV1({ web3SigningCredential: { ethAccount: WHALE_ACCOUNT_ADDRESS, secret: "", @@ -149,13 +155,10 @@ describe("Running ethereum transactions with different gas configurations", () = maxFeePerGas: maxFee, }, }, - }); - fail( - "Expected runTransactionV1 with mixed config to fail but it succeeded.", - ); - } catch (error) { - console.log("runTransactionV1 with mixed config failed as expected"); - } + }), + ).rejects.toThrow(); + + log.info("runTransactionV1 with mixed config failed as expected"); const balance = await web3.eth.getBalance(testEthAccount.address); expect(balance.toString()).toEqual("0");