Skip to content

Commit

Permalink
test(ethereum): refactor jest test negative test cases
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
ashnashahgrover committed Aug 16, 2024
1 parent 30cde8b commit 1280003
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 98 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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;
Expand Down Expand Up @@ -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: {
Expand All @@ -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");
Expand Down Expand Up @@ -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,
Expand All @@ -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: {
Expand Down Expand Up @@ -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,
Expand All @@ -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: {
Expand All @@ -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,
Expand All @@ -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");
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand All @@ -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: {
Expand All @@ -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");
}
});

Expand All @@ -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(),
Expand All @@ -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: {
Expand Down Expand Up @@ -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 () => {
Expand All @@ -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(),
Expand All @@ -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: {
Expand Down Expand Up @@ -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(),
Expand All @@ -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: {
Expand All @@ -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(),
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,43 +167,41 @@ 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();
}
});

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");
});
});
Loading

0 comments on commit 1280003

Please sign in to comment.