Skip to content

Commit

Permalink
Feat/fe rollup deposit tests (#419)
Browse files Browse the repository at this point in the history
  • Loading branch information
MariuszSzpyt authored May 17, 2024
1 parent 9bcf01e commit 30bfacb
Show file tree
Hide file tree
Showing 12 changed files with 650 additions and 37 deletions.
1 change: 1 addition & 0 deletions .github/workflows/microapps-ui-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ jobs:
UI_URL : 'https://gasp-testnet-dot-direct-pixel-353917.oa.r.appspot.com/'
SELENIUM_REMOTE_URL: http://localhost:4444/wd/hub
MNEMONIC_META: 'twelve insect obvious hurdle control nature search response march version cake buffalo'
PRIVKEY_META: ${{ secrets.PRIVKEY_META }}
outputs:
testmo-run-id: ${{ steps.setTestRun.outputs.testmo-run-id }}

Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"axios": "^1.4.0",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-plugin-transform-decorators-legacy": "^1.3.5",
"chromedriver": "^121.0.2",
"chromedriver": "^124.0.1",
"commitlint": "^17.4.2",
"cors": "^2.8.5",
"dockerode": "^3.3.5",
Expand Down Expand Up @@ -125,7 +125,7 @@
"test-microapps-chops-fourth": "export CHOPSTICK_UI=true ; rm nonce.db ; rm sudo.lock; node --experimental-specifier-resolution=node --loader ts-node/esm --experimental-vm-modules node_modules/jest/bin/jest.js --verbose --runInBand --ci --group=microappsPosition",
"test-microapps-chops-fifth": "export CHOPSTICK_UI=true ; rm nonce.db ; rm sudo.lock; node --experimental-specifier-resolution=node --loader ts-node/esm --experimental-vm-modules node_modules/jest/bin/jest.js --verbose --runInBand --ci --group=microappsStaking",
"test-microapps-prod-first": "export CHOPSTICK_UI=true ; rm nonce.db ; rm sudo.lock; node --experimental-specifier-resolution=node --loader ts-node/esm --experimental-vm-modules node_modules/jest/bin/jest.js --verbose --runInBand --ci --group=microappsProdDeposit --group=microappsProdSwap --group=microappsProdWallet --group=microappsProdWithdraw --group=microappsProdStaking --group=microappsProdPools",
"test-gasp-ui": "export CHOPSTICK_UI=true ; rm nonce.db ; rm sudo.lock; node --experimental-specifier-resolution=node --loader ts-node/esm --experimental-vm-modules node_modules/jest/bin/jest.js --verbose --runInBand --ci --group=rollupWallet ",
"test-gasp-ui": "export CHOPSTICK_UI=true ; rm nonce.db ; rm sudo.lock; node --experimental-specifier-resolution=node --loader ts-node/esm --experimental-vm-modules node_modules/jest/bin/jest.js --verbose --runInBand --ci --group=rollupDeposit --group=rollupWallet",
"cliTool": "node --experimental-specifier-resolution=node --loader ts-node/esm --experimental-vm-modules cliTool/index.ts --runInBand",
"runtimeUpgrade": " jest --verbose --ci --group=upgradeRuntime --runInBand --forceExit"
},
Expand Down
103 changes: 103 additions & 0 deletions test/rollup-test/rollup-main.deposit.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/*
*
* @group rollupDeposit
*/
import { jest } from "@jest/globals";
import { WebDriver } from "selenium-webdriver";
import { getApi, initApi } from "../../utils/api";
import { DriverBuilder } from "../../utils/frontend/utils/Driver";
import {
acceptNetworkSwitchInNewWindow,
addExtraLogs,
importMetamaskExtension,
} from "../../utils/frontend/utils/Helper";
import "dotenv/config";
import {
connectWallet,
setupPage,
setupPageWithState,
waitForActionNotification,
} from "../../utils/frontend/rollup-utils/Handlers";
import { WalletWrapper } from "../../utils/frontend/rollup-pages/WalletWrapper";
import {
DepositActionType,
DepositModal,
} from "../../utils/frontend/rollup-utils/DepositModal";
import { TransactionType } from "../../utils/frontend/rollup-pages/NotificationToast";

jest.spyOn(console, "log").mockImplementation(jest.fn());

jest.setTimeout(1500000);
let driver: WebDriver;

let acc_addr = "";
let acc_addr_short = "";
const GETH_ASSET_NAME = "GETH";

describe("Gasp Prod UI deposit tests", () => {
beforeAll(async () => {
try {
getApi();
} catch (e) {
await initApi();
}

driver = await DriverBuilder.getInstance();
acc_addr = await importMetamaskExtension(driver, true);
acc_addr_short = acc_addr.slice(-4).toLowerCase();

await setupPage(driver);
await connectWallet(driver, "Metamask", acc_addr_short);
});

test("User can deposit GETH", async () => {
await setupPageWithState(driver, acc_addr_short);

const walletWrapper = new WalletWrapper(driver);
await walletWrapper.openWalletConnectionInfo();
await walletWrapper.openDeposit();
const depositModal = new DepositModal(driver);
const isModalVisible = await depositModal.isModalVisible();
expect(isModalVisible).toBeTruthy();

await depositModal.openChainList();
await depositModal.selectChain("Ethereum");
await depositModal.openTokensList();
await depositModal.waitForTokenListElementsVisible(GETH_ASSET_NAME);
await depositModal.selectToken(GETH_ASSET_NAME);

const randomNum = Math.floor(Math.random() * 99) + 1;
await depositModal.enterValue("1." + randomNum.toString());

await depositModal.waitForContinueState(true, 60000);
const isOriginFeeDisplayed = await depositModal.isOriginFeeDisplayed();
expect(isOriginFeeDisplayed).toBeTruthy();

const isNetworkButtonEnabled = await depositModal.isNetworkButtonEnabled();
expect(isNetworkButtonEnabled).toBeTruthy();

await depositModal.clickDepositButtonByText(DepositActionType.Network);
await acceptNetworkSwitchInNewWindow(driver);

await depositModal.clickDepositButtonByText(DepositActionType.Approve);
await waitForActionNotification(driver, TransactionType.ApproveContract);

await depositModal.clickDepositButtonByText(DepositActionType.Deposit);
await waitForActionNotification(driver, TransactionType.Deposit);
});

afterEach(async () => {
const session = await driver.getSession();
await addExtraLogs(
driver,
expect.getState().currentTestName + " - " + session.getId(),
);
});

afterAll(async () => {
const api = getApi();
await api.disconnect();
await driver.quit();
DriverBuilder.destroy();
});
});
2 changes: 1 addition & 1 deletion test/rollup-test/rollup-main.metamask.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ let driver: WebDriver;
let acc_addr = "";
let acc_addr_short = "";

describe("Microapps Prod UI wallet tests", () => {
describe("Gasp Prod UI wallet tests", () => {
beforeAll(async () => {
try {
getApi();
Expand Down
165 changes: 148 additions & 17 deletions utils/frontend/pages/MetaMask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@ import { WebDriver } from "selenium-webdriver";
import { getEnvironmentRequiredVars } from "../../utils";
import {
appendText,
buildClassXpath,
buildDataTestIdXpath,
buildXpathByElementText,
clearTextManual,
clickElement,
doActionInDifferentWindow,
getText,
isDisplayed,
scrollIntoView,
waitForElement,
waitForElementEnabled,
waitForElementToDissapear,
waitForElementVisible,
writeText,
} from "../utils/Helper";
Expand All @@ -34,26 +38,43 @@ const BTN_ACCOUNT_DETAILS = "account-list-menu-details";
const BTN_ACCOUNT_LABEL = "editable-label-button";
const DIV_ACCOUNT_LABEL_INPUT = "editable-input";
const BTN_CONNECT_ACCOUNT = "page-container-footer-next";
const BTN_APPROVE_NETWORK = "confirmation-submit-button";
const BTN_COPY_ADDRESS = "address-copy-button-text";
const BTN_ACC_SELECTION = "account-menu-icon";
const BTN_IMPORT_ACCOUNT = "multichain-account-menu-popover-action-button";
const BTN_IMPORT_ACCOUNT_CONFIRM = "import-account-confirm-button";
const BTN_FOOTER_NEXT = "page-container-footer-next";
const BTN_GENERIC_CONFIRMATION = "confirmation-submit-button";

export class MetaMask {
WEB_UI_ACCESS_URL =
"chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/home.html";
"chrome-extension://ibkogccjfnojapecnljinaondndgildg/home.html";

driver: any;
userPassword: string;
mnemonicMetaMask: string;
acc_name: string;

constructor(driver: WebDriver) {
private static instance: MetaMask;
private constructor(driver: WebDriver) {
this.driver = driver;
const { uiUserPassword: userPassword, mnemonicMetaMask } =
getEnvironmentRequiredVars();
const {
uiUserPassword: userPassword,
mnemonicMetaMask,
privKeyMetaMask,
} = getEnvironmentRequiredVars();
this.userPassword = userPassword;
this.mnemonicMetaMask = mnemonicMetaMask;
this.privKeyMetaMask = privKeyMetaMask;
this.acc_name = "acc_automation";
}

private driver: any;
userPassword: string;
mnemonicMetaMask: string;
acc_name: string;
privKeyMetaMask: string;

public static getInstance(driver: WebDriver): MetaMask {
if (!MetaMask.instance) {
MetaMask.instance = new MetaMask(driver);
}
return MetaMask.instance;
}
async go() {
await this.driver.get(this.WEB_UI_ACCESS_URL);
}
Expand Down Expand Up @@ -92,6 +113,11 @@ export class MetaMask {
const XPATH_BTN_PIN_EXT_DONE = buildDataTestIdXpath(BTN_PIN_EXT_DONE);
await clickElement(this.driver, XPATH_BTN_PIN_EXT_DONE);

const XPATH_BTN_NO_ENCHANCED_PROTECTION = buildXpathByElementText(
"button",
"Don't enable enhanced protection",
);
await clickElement(this.driver, XPATH_BTN_NO_ENCHANCED_PROTECTION);
await this.acceptTNC();
await this.skipPopup();

Expand All @@ -102,6 +128,60 @@ export class MetaMask {
return address;
}

async setupAccountPrivKey(
mnemonicKeys = this.mnemonicMetaMask,
privKey = this.privKeyMetaMask,
): Promise<string> {
await this.driver.get(
`${this.WEB_UI_ACCESS_URL}#onboarding/import-with-recovery-phrase`,
);

const XPATH_FIRST_WORD = buildDataTestIdXpath(IMPUT_MNEMONIC_FIELD + 0);
await waitForElement(this.driver, XPATH_FIRST_WORD);
await this.fillPassPhrase(mnemonicKeys);

const XPATH_IMPORT_SUBMIT = buildDataTestIdXpath(BTN_IMPORT_SUBMIT);
await clickElement(this.driver, XPATH_IMPORT_SUBMIT);

await this.fillUserPass();

const XPATH_PASS_TERMS = buildDataTestIdXpath(CHECKBOX_PASS_TERMS);
await clickElement(this.driver, XPATH_PASS_TERMS);

const XPATH_CREATE_PASS_SUBMIT = buildDataTestIdXpath(
BTN_CREATE_PASS_SUBMIT,
);
await clickElement(this.driver, XPATH_CREATE_PASS_SUBMIT);

const XPATH_BTN_SECURE_LATER = buildDataTestIdXpath(BTN_SECURE_LATER);
if (await isDisplayed(this.driver, XPATH_BTN_SECURE_LATER)) {
await this.skipBackup();
}

const XPATH_BTN_IMPORT_DONE = buildDataTestIdXpath(BTN_IMPORT_DONE);
await clickElement(this.driver, XPATH_BTN_IMPORT_DONE);
const XPATH_BTN_PIN_EXT_NEXT = buildDataTestIdXpath(BTN_PIN_EXT_NEXT);
await clickElement(this.driver, XPATH_BTN_PIN_EXT_NEXT);
const XPATH_BTN_PIN_EXT_DONE = buildDataTestIdXpath(BTN_PIN_EXT_DONE);
await clickElement(this.driver, XPATH_BTN_PIN_EXT_DONE);

const XPATH_BTN_NO_ENCHANCED_PROTECTION = buildXpathByElementText(
"button",
"Don't enable enhanced protection",
);
await clickElement(this.driver, XPATH_BTN_NO_ENCHANCED_PROTECTION);
await this.acceptTNC();
await this.skipPopup();

await this.openAccountSelection();
await this.importAccount(privKey);
await this.openAccountDetails();
const address = await this.getAddress();
await this.changeAccountName(this.acc_name);

return address;
}

async fillPassPhrase(phrase: string) {
const words = phrase.split(" ");
for (let i = 0; i < words.length; i++) {
Expand Down Expand Up @@ -134,6 +214,31 @@ export class MetaMask {
await clickElement(this.driver, XPATH_BTN_ACCOUNT_DETAILS);
}

async openAccountSelection() {
const XPATH_BTN_ACC_SELECTIONS = buildDataTestIdXpath(BTN_ACC_SELECTION);
await clickElement(this.driver, XPATH_BTN_ACC_SELECTIONS);
}

async importAccount(privKey: string) {
const XPATH_BTN_IMPORT_ACCOUNT = buildDataTestIdXpath(BTN_IMPORT_ACCOUNT);
await clickElement(this.driver, XPATH_BTN_IMPORT_ACCOUNT);
const XPATH_IMPORT_WITH_PK = buildXpathByElementText(
"button",
"Import account",
);
await clickElement(this.driver, XPATH_IMPORT_WITH_PK);
const XPATH_INPUT_PRIV_KEY = "//input[@id='private-key-box']";
await writeText(this.driver, XPATH_INPUT_PRIV_KEY, privKey);
const XPATH_BTN_IMPORT_ACCOUNT_CONFIRM = buildDataTestIdXpath(
BTN_IMPORT_ACCOUNT_CONFIRM,
);
await clickElement(this.driver, XPATH_BTN_IMPORT_ACCOUNT_CONFIRM);
await waitForElementToDissapear(
this.driver,
XPATH_BTN_IMPORT_ACCOUNT_CONFIRM,
);
}

async fillUserPass() {
const XPATH_PASS_NEW = buildDataTestIdXpath(INPUT_PASS_NEW);
const XPATH_PASS_CONFIRM = buildDataTestIdXpath(INPUT_PASS_CONFIRM);
Expand Down Expand Up @@ -179,18 +284,44 @@ export class MetaMask {
await clickElement(driver, XPATH_BTN_CONNECT_ACCOUNT);
}

async acceptNetwork(driver: WebDriver) {
const XPATH_BTN_APPROVE_NETWORK = buildDataTestIdXpath(BTN_APPROVE_NETWORK);
await waitForElement(driver, XPATH_BTN_APPROVE_NETWORK);
await clickElement(driver, XPATH_BTN_APPROVE_NETWORK);
await clickElement(driver, XPATH_BTN_APPROVE_NETWORK);
private static async acceptNetwork(driver: WebDriver) {
const XPATH_BTN_CONFIRM = buildDataTestIdXpath(BTN_GENERIC_CONFIRMATION);
await clickElement(driver, XPATH_BTN_CONFIRM);
await clickElement(driver, XPATH_BTN_CONFIRM);
}

private static async acceptContract(driver: WebDriver) {
const XPATH_BTN_APPROVE_CONTRACT = buildDataTestIdXpath(BTN_FOOTER_NEXT);
await waitForElement(driver, XPATH_BTN_APPROVE_CONTRACT);
await clickElement(driver, XPATH_BTN_APPROVE_CONTRACT);
const XPATH_SPENDING_CAP_VALUE = buildClassXpath(
"mm-box review-spending-cap__value",
);
await waitForElementVisible(driver, XPATH_SPENDING_CAP_VALUE);
await clickElement(driver, XPATH_BTN_APPROVE_CONTRACT);
}

private static async signTransaction(driver: WebDriver) {
const XPATH_BTN_SIGN_TRANSACTION = buildDataTestIdXpath(BTN_FOOTER_NEXT);
await waitForElement(driver, XPATH_BTN_SIGN_TRANSACTION);
await waitForElementEnabled(driver, XPATH_BTN_SIGN_TRANSACTION);
await clickElement(driver, XPATH_BTN_SIGN_TRANSACTION);
}

async acceptPermissions() {
await doActionInDifferentWindow(this.driver, this.acceptModal);
}

async acceptNetworkSwitch() {
await doActionInDifferentWindow(this.driver, this.acceptNetwork);
static async acceptNetworkSwitch(driver: WebDriver) {
await doActionInDifferentWindow(driver, this.acceptNetwork);
return;
}
//handle sign and contract , rename below too
static async acceptContractInDifferentWindow(driver: WebDriver) {
await doActionInDifferentWindow(driver, this.acceptContract);
}

static async signTransactionInDifferentWindow(driver: WebDriver) {
await doActionInDifferentWindow(driver, this.signTransaction);
}
}
Loading

0 comments on commit 30bfacb

Please sign in to comment.