Skip to content

Commit

Permalink
fe rollup withdraw test (#423)
Browse files Browse the repository at this point in the history
  • Loading branch information
MariuszSzpyt authored May 21, 2024
1 parent 30bfacb commit 19d1588
Show file tree
Hide file tree
Showing 8 changed files with 285 additions and 8 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
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=rollupDeposit --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 --group=rollupWithdraw",
"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
2 changes: 1 addition & 1 deletion test/rollup-test/rollup-main.deposit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ let acc_addr = "";
let acc_addr_short = "";
const GETH_ASSET_NAME = "GETH";

describe("Gasp Prod UI deposit tests", () => {
describe("Gasp UI deposit tests", () => {
beforeAll(async () => {
try {
getApi();
Expand Down
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("Gasp Prod UI wallet tests", () => {
describe("Gasp UI wallet tests", () => {
beforeAll(async () => {
try {
getApi();
Expand Down
99 changes: 99 additions & 0 deletions test/rollup-test/rollup-main.withdraw.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/*
*
* @group rollupWithdraw
*/
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 { TransactionType } from "../../utils/frontend/rollup-pages/NotificationToast";
import {
WithdrawActionType,
WithdrawModal,
} from "../../utils/frontend/rollup-pages/WithdrawModal";

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 UI withdraw 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 withdraw GETH", async () => {
await setupPageWithState(driver, acc_addr_short);

const walletWrapper = new WalletWrapper(driver);
await walletWrapper.openWalletConnectionInfo();
await walletWrapper.openWithdraw();
const withdrawModal = new WithdrawModal(driver);
const isModalVisible = await withdrawModal.isModalVisible();
expect(isModalVisible).toBeTruthy();

await withdrawModal.openChainList();
await withdrawModal.selectChain("Ethereum");
await withdrawModal.openTokensList();
await withdrawModal.waitForTokenListElementsVisible(GETH_ASSET_NAME);
await withdrawModal.selectToken(GETH_ASSET_NAME);
await withdrawModal.enterValue("1");

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

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

await withdrawModal.clickWithdrawButtonByText(WithdrawActionType.Network);
await acceptNetworkSwitchInNewWindow(driver);

await withdrawModal.clickWithdrawButtonByText(WithdrawActionType.Withdraw);
await waitForActionNotification(driver, TransactionType.Withdraw);
});

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();
});
});
17 changes: 17 additions & 0 deletions utils/frontend/pages/MetaMask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ 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";
const BTN_CONFIRM_TRANSACTION = "confirm-footer-confirm-button";

export class MetaMask {
WEB_UI_ACCESS_URL =
Expand Down Expand Up @@ -308,6 +309,18 @@ export class MetaMask {
await clickElement(driver, XPATH_BTN_SIGN_TRANSACTION);
}

private static async signWithdrawal(driver: WebDriver) {
const XPATH_SCROLL_DOWN = "//*[@aria-label='Scroll down']";
await waitForElement(driver, XPATH_SCROLL_DOWN);
await clickElement(driver, XPATH_SCROLL_DOWN);
const XPATH_BTN_SIGN_TRANSACTION = buildDataTestIdXpath(
BTN_CONFIRM_TRANSACTION,
);
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);
}
Expand All @@ -324,4 +337,8 @@ export class MetaMask {
static async signTransactionInDifferentWindow(driver: WebDriver) {
await doActionInDifferentWindow(driver, this.signTransaction);
}

static async signWithdrawInDifferentWindow(driver: WebDriver) {
await doActionInDifferentWindow(driver, this.signWithdrawal);
}
}
2 changes: 1 addition & 1 deletion utils/frontend/rollup-pages/NotificationToast.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export class NotificationToast {

toastTransaction: Record<TransactionType, string> = {
[TransactionType.Deposit]: "-rollupDeposit",
[TransactionType.Withdraw]: "-withdraw",
[TransactionType.Withdraw]: "-rollupWithdrawal",
[TransactionType.AddLiquidity]: "-addLiquidity",
[TransactionType.Swap]: "-swap",
[TransactionType.ActivateLiquidity]: "-activateLP",
Expand Down
152 changes: 152 additions & 0 deletions utils/frontend/rollup-pages/WithdrawModal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
import { By, WebDriver } from "selenium-webdriver";
import { sleep } from "../../utils";
import {
buildDataTestIdXpath,
buildXpathByElementText,
buildXpathByText,
clickElement,
getText,
isDisplayed,
waitForElementStateInterval,
waitForElementVisible,
writeText,
} from "../utils/Helper";

//SELECTORS
const WITHDRAW_MODAL_CONTENT = "withdrawal-modal-content";
const BTN_CHAIN_SELECT = "chain-select-btn";
const CHAIN_SELECT_LIST = "chain-select-list";
const BTN_SELECT_TOKEN = "tokenInput-selector-btn";
const TOKEN_LIST = "tokenList";
const TOKEN_LIST_ITEM = "tokenList-item";
const TOKEN_TEXT_INPUT = "tokenInput-input";
const BTN_SUBMIT = "submit-withdrawal-button";
const ORIGIN_FEE = "origin-fee";
const DESTINATION_FEE = "destination-fee";
const FEE_VALUE = "fee-value";
const ERR_MESSAGE = "withdrawal-error-message";

export enum WithdrawActionType {
Withdraw,
Network,
}

export class WithdrawModal {
driver: WebDriver;

constructor(driver: WebDriver) {
this.driver = driver;
}

withdrawAction: Record<WithdrawActionType, string> = {
[WithdrawActionType.Withdraw]: "Withdraw",
[WithdrawActionType.Network]: "Switch to Holesky",
};

async isModalVisible() {
const title = buildDataTestIdXpath(WITHDRAW_MODAL_CONTENT);
return isDisplayed(this.driver, title);
}

async isOriginFeeDisplayed() {
const xpath =
buildDataTestIdXpath(ORIGIN_FEE) + buildDataTestIdXpath(FEE_VALUE);
return isDisplayed(this.driver, xpath);
}

async isDestinationFeeDisplayed() {
const xpath =
buildDataTestIdXpath(DESTINATION_FEE) + buildDataTestIdXpath(FEE_VALUE);
return isDisplayed(this.driver, xpath);
}

async openChainList() {
await clickElement(this.driver, buildDataTestIdXpath(BTN_CHAIN_SELECT));
}

async isErrorMessage() {
const errMessageXpath = buildDataTestIdXpath(ERR_MESSAGE);
return await isDisplayed(this.driver, errMessageXpath);
}

async selectChain(chainName: string) {
await waitForElementVisible(
this.driver,
buildDataTestIdXpath(CHAIN_SELECT_LIST),
5000,
);
const chainTestId = `${chainName}-chain`;
const chainLocator = buildDataTestIdXpath(chainTestId);
await sleep(1000);
await waitForElementVisible(this.driver, chainLocator, 5000);
await clickElement(this.driver, chainLocator);
}

async openTokensList() {
await clickElement(this.driver, buildDataTestIdXpath(BTN_SELECT_TOKEN));
}

async selectToken(assetName: string) {
//const tokenTestId = `tokenList-item`;
const tokenLocator =
buildDataTestIdXpath(TOKEN_LIST_ITEM) + buildXpathByText(assetName);
await sleep(1000);
await waitForElementVisible(this.driver, tokenLocator, 5000);
await clickElement(this.driver, tokenLocator);
}

async getTokenAmount(assetName: string) {
const assetTestId = `token-list-token-${assetName}-balance`;
const assetLocator = buildDataTestIdXpath(assetTestId);
return parseFloat(await getText(this.driver, assetLocator));
}

async waitForTokenListElementsVisible(assetName: string) {
await waitForElementVisible(
this.driver,
buildDataTestIdXpath(TOKEN_LIST),
5000,
);
const tokenTestId = `token-icon-${assetName}`;
const tokenLocator = buildDataTestIdXpath(tokenTestId);
await waitForElementVisible(this.driver, tokenLocator, 5000);
}

async enterValue(amount: string) {
const inputTokenLocator = buildDataTestIdXpath(TOKEN_TEXT_INPUT);
await clickElement(this.driver, inputTokenLocator);
await writeText(this.driver, inputTokenLocator, amount);
}

async waitForContinueState(isEnabled: boolean, timeout: number) {
const continueBtn = buildDataTestIdXpath(BTN_SUBMIT);
await waitForElementStateInterval(
this.driver,
continueBtn,
isEnabled,
timeout,
);
}

async clickContinue() {
const continueBtn = buildDataTestIdXpath(BTN_SUBMIT);
await clickElement(this.driver, continueBtn);
}

async isContinueButtonEnabled() {
const xpath = buildDataTestIdXpath(BTN_SUBMIT);
return await (await this.driver.findElement(By.xpath(xpath))).isEnabled();
}

async isNetworkButtonEnabled() {
const xpath = buildXpathByElementText("button", "Switch to Holesky");
return await (await this.driver.findElement(By.xpath(xpath))).isEnabled();
}

async clickWithdrawButtonByText(action: WithdrawActionType) {
const xpath =
buildDataTestIdXpath(WITHDRAW_MODAL_CONTENT) +
buildXpathByElementText("button", this.withdrawAction[action]);
await clickElement(this.driver, xpath);
}
}
17 changes: 13 additions & 4 deletions utils/frontend/rollup-utils/Handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,20 @@ export async function waitForActionNotification(
);
expect(isModalWaitingForSignVisible).toBeTruthy();

if (transaction === TransactionType.ApproveContract) {
await MetaMask.acceptContractInDifferentWindow(driver);
} else {
await MetaMask.signTransactionInDifferentWindow(driver);
switch (transaction) {
case TransactionType.ApproveContract:
await MetaMask.acceptContractInDifferentWindow(driver);
break;
case TransactionType.Deposit:
await MetaMask.signTransactionInDifferentWindow(driver);
break;
case TransactionType.Withdraw:
await MetaMask.signWithdrawInDifferentWindow(driver);
break;
default:
await MetaMask.signTransactionInDifferentWindow(driver);
}

await toast.waitForToastState(ToastType.Success, transaction);
}

Expand Down

0 comments on commit 19d1588

Please sign in to comment.