diff --git a/cypress/e2e/pages/cross-chain.po.cy.ts b/cypress/e2e/pages/cross-chain.po.cy.ts index c6ab4c4074..5f4244a522 100644 --- a/cypress/e2e/pages/cross-chain.po.cy.ts +++ b/cypress/e2e/pages/cross-chain.po.cy.ts @@ -1,5 +1,10 @@ import { NETWORK_LIST } from "../selectors/constants.cy" import { CrossChainLocators, NetworkLocators } from "../selectors/selectors.cy" +import { TokenCatalog } from "./swap-page.po.cy" + +export interface myCallbackType { + (myArgument: T): void +} export const CrossChain = { @@ -27,6 +32,15 @@ export const CrossChain = { return NETWORK_LIST[random] }, + selectTokenIn(): TokenCatalog { + cy.selectToken(CrossChainLocators.dropdownTokenIn) + return new TokenCatalog() + }, + selectTokenOut(): TokenCatalog { + cy.selectToken(CrossChainLocators.dropdownTokenOut) + return new TokenCatalog() + }, + checkLoadedPage() { return cy.get(CrossChainLocators.rechartsSurface, { timeout: 20000 }).should('be.visible').then($obj => { if ($obj.length > 0) { @@ -47,4 +61,12 @@ export const CrossChain = { return network }) }, + + getCurrentTokenIn(text: myCallbackType) { + cy.getContent(CrossChainLocators.dropdownTokenIn, text) + }, + + getCurrentTokenOut(text: myCallbackType) { + cy.getContent(CrossChainLocators.dropdownTokenOut, text) + }, } diff --git a/cypress/e2e/pages/farm-page.po.cy.ts b/cypress/e2e/pages/farm-page.po.cy.ts deleted file mode 100644 index 3575e57f45..0000000000 --- a/cypress/e2e/pages/farm-page.po.cy.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { FarmLocators, HeaderLocators } from "../selectors/selectors.cy" - -export class FarmPage { - - getTvlValues() { - const arr: string[] = [] - const listData = cy.get(FarmLocators.lblTvl) - listData - .each(item => { - arr.push(item.text().split('$')[1]) - }) - return arr - } - - getAprValues() { - const arr: string[] = [] - const listData = cy.get(FarmLocators.lblApr) - listData - .each(item => { - arr.push(item.text().split('%')[0]) - }) - return arr - } - - countInvalidFarms(arrApr: string[], arrTvl: string[]) { - const totalFarms = arrApr.length - let count = 0; - for (let i = 0; i < totalFarms; i++) { - if (((arrTvl[i]) === undefined || Number(arrTvl[i]) === 0) && Number(arrApr[i]) === 0) { - count = count + 1; - } - } - return count - } - - checkExistData() { - return cy.get(FarmLocators.lblApr, {timeout: 5000}).should(() => { }).then($obj => { - if ($obj.length > 0) { - return true - } - else { - return false - } - }) - } -} \ No newline at end of file diff --git a/cypress/e2e/pages/header.po.cy.ts b/cypress/e2e/pages/header.po.cy.ts index e7641eb8dc..12e14d18d9 100644 --- a/cypress/e2e/pages/header.po.cy.ts +++ b/cypress/e2e/pages/header.po.cy.ts @@ -1,6 +1,5 @@ import { CrossChainLocators, - HeaderLocators, LimitOrderLocators, NetworkLocators, SwapPageLocators, diff --git a/cypress/e2e/pages/pools-page.po.cy.ts b/cypress/e2e/pages/pools-page.po.cy.ts deleted file mode 100644 index 2975f3b1a5..0000000000 --- a/cypress/e2e/pages/pools-page.po.cy.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { PoolLocators } from '../selectors/selectors.cy' - -export enum CustomRange { - FullRange = 'Full Range', - Safe = 'Safe', - Common = 'Common', - Expert = 'Expert', -} -export type FarmingRange = { - minPrice: string - maxPrice: string -} -export const PoolsPage = { - open(chain: string) { - cy.visit('/pools/' + chain) - }, - searchByPoolAddress(poolAddress: string) { - cy.get(PoolLocators.txtSearchPool).clear().type(poolAddress) - cy.wait(2000) - }, - selectCustomRange(range: CustomRange) { - cy.get('button').contains(range).click() - }, - selectFarmingRange(farmingRange: FarmingRange) { - cy.get('[role=button]').contains('Farming Ranges').click() - cy.get(PoolLocators.txtPriceValue).eq(0).clear().type(farmingRange.minPrice) - cy.get(PoolLocators.txtPriceValue).eq(1).clear().type(farmingRange.maxPrice) - }, - getCurrentPrice() { - return cy - .get(PoolLocators.lblCurrentPrice) - .invoke('text') - .then(currenPriceValue => { - return currenPriceValue - }) - }, - addLiquidity(poolAddress: string, amountIn: string, customRange?: CustomRange, farmingRange?: FarmingRange) { - PoolsPage.searchByPoolAddress(poolAddress) - cy.get('button').contains('Add Liquidity').click() - cy.get(PoolLocators.btnZapIn).click() - if (typeof customRange != 'undefined') { - PoolsPage.selectCustomRange(customRange) - } - if (typeof farmingRange != 'undefined') { - PoolsPage.selectFarmingRange(farmingRange) - } - cy.get(PoolLocators.txtAmountIn).type(amountIn) - cy.wait(20000) - cy.go('back') - }, -} diff --git a/cypress/e2e/pages/swap-page.po.cy.ts b/cypress/e2e/pages/swap-page.po.cy.ts index 459c1e8012..9fdb7bceda 100644 --- a/cypress/e2e/pages/swap-page.po.cy.ts +++ b/cypress/e2e/pages/swap-page.po.cy.ts @@ -1,6 +1,5 @@ import { CrossChainLocators, - HeaderLocators, LimitOrderLocators, NetworkLocators, SwapPageLocators, @@ -55,19 +54,12 @@ export const SwapPage = { cy.get(CrossChainLocators.btnCrossChain).click() }, - goToFarmPage() { - cy.get(HeaderLocators.dropdownEarn).click({ force: true }) - cy.get(HeaderLocators.lblFarms).click({ force: true }) + getBalanceWallet(text: myCallbackType) { + cy.getContent(WalletLocators.lblBalance, text) }, - goToPoolPage() { - cy.get(HeaderLocators.dropdownEarn).click({ force: true }) - cy.get(HeaderLocators.lblPools).click({ force: true }) - }, - - goToMyPoolsPage() { - cy.get(HeaderLocators.dropdownEarn).click({ force: true }) - cy.get(HeaderLocators.lblMyPools).click({ force: true }) + getCurrentBalanceIn(text: myCallbackType) { + cy.getContent(SwapPageLocators.lblBalanceIn, text) }, } diff --git a/cypress/e2e/selectors/selectors.cy.ts b/cypress/e2e/selectors/selectors.cy.ts index 52f760fa52..aa4efbd807 100644 --- a/cypress/e2e/selectors/selectors.cy.ts +++ b/cypress/e2e/selectors/selectors.cy.ts @@ -21,6 +21,7 @@ export const SwapPageLocators = { dropdownTokenIn: '[data-testid=swap-currency-input] [data-testid=token-symbol-container]', dropdownTokenOut: '[data-testid=swap-currency-output] [data-testid=token-symbol-container]', btnSkipTutorial: '[data-testid=button-skip-tutorial]', + lblBalanceIn: '[data-testid=swap-currency-input] [data-testid=balance]', } export const LimitOrderLocators = { @@ -38,6 +39,8 @@ export const CrossChainLocators = { btnCrossChain: '[data-testid=cross-chain-tab]', btnNetworkIn: '[data-testid=swap-currency-input] [data-testid=network-button]', btnNetworkOut: '[data-testid=swap-currency-output] [data-testid=network-button]', + dropdownTokenIn: '[data-testid=swap-currency-input] [data-testid=open-currency-select-button]', + dropdownTokenOut: '[data-testid=swap-currency-output] [data-testid=open-currency-select-button]', btnUnderstand: '[data-testid=understand-button]', rechartsSurface: '.recharts-surface', //it's in the library so don't use data-testid } @@ -47,29 +50,10 @@ export const WalletLocators = { btnMetaMask: '[data-testid=connect-METAMASK]', chkAcceptTerm: '[data-testid=accept-term]', statusConnected: '[data-testid=web3-status-connected]', + lblBalance: '[data-testid=select-network] div div div' } export const NetworkLocators = { btnSelectNetwork: '[data-testid=select-network]', btnNetwork: '[data-testid=network-list]', } - -export const HeaderLocators = { - dropdownEarn: '[data-testid=earn-menu]', - lblPools: '[data-testid=pools-nav-link]', - lblMyPools: '[data-testid=my-pools-nav-link]', - lblFarms: '[data-testid=farms-nav-link]', -} - -export const FarmLocators = { - lblApr: '[data-testid=apr-value]', - lblTvl: '[data-testid=tvl-value]', -} - -export const PoolLocators = { - txtSearchPool: 'input[data-testid="search-pool"]', - txtPriceValue: 'input[data-testid="price-value"]', - txtAmountIn: '[data-testid="token-amount-input"]', - lblCurrentPrice: '[data-testid="current-price"]', - btnZapIn: '[data-testid="zap-in-btn"]', -} diff --git a/cypress/e2e/specs/connect-wallet.e2e.cy.ts b/cypress/e2e/specs/connect-wallet.e2e.cy.ts index aa43af977c..4b1bbff9a1 100644 --- a/cypress/e2e/specs/connect-wallet.e2e.cy.ts +++ b/cypress/e2e/specs/connect-wallet.e2e.cy.ts @@ -1,5 +1,6 @@ import { Network, SwapPage } from '../pages/swap-page.po.cy' import { DEFAULT_NETWORK, DEFAULT_URL, NETWORK, TAG } from '../selectors/constants.cy' +import { SwapPageLocators } from '../selectors/selectors.cy' const wallet = new Network() @@ -11,7 +12,7 @@ describe('Metamask Extension tests', { tags: TAG.regression }, () => { SwapPage.getStatusConnectedWallet() }) - it('Redirects to swap page when a user has already connected a wallet', { tags: TAG.smoke }, () => { + it('Redirects to swap page when a user has already connected a wallet', () => { cy.url().should('include', '/swap') }) @@ -22,6 +23,15 @@ describe('Metamask Extension tests', { tags: TAG.regression }, () => { cy.allowMetamaskToAddAndSwitchNetwork().then(approved => { expect(approved).to.be.true }) + cy.wait(2000) + SwapPage.getBalanceWallet(value => { + const balance = value.split(' ')[0] + if (balance !== '0') { + SwapPage.getCurrentBalanceIn(value => { + expect(Number(value)).to.be.greaterThan(0); + }) + } + }) } }) }) diff --git a/cypress/e2e/specs/constants.ts b/cypress/e2e/specs/constants.ts deleted file mode 100644 index 0ab7fc596f..0000000000 --- a/cypress/e2e/specs/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -const noResultsText = 'No results found.' -const noTokensText = 'Select a token' -const unListedToken = ['KNNC', 'KCCN'] diff --git a/cypress/e2e/specs/farm-page.e2e.cy.ts b/cypress/e2e/specs/farm-page.e2e.cy.ts deleted file mode 100644 index 2015017a57..0000000000 --- a/cypress/e2e/specs/farm-page.e2e.cy.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { FarmPage } from "../pages/farm-page.po.cy"; -import { SwapPage } from "../pages/swap-page.po.cy" -import { DEFAULT_URL, TAG, } from "../selectors/constants.cy" -const farm = new FarmPage() - -describe('Farm', { tags: TAG.regression }, () => { - beforeEach(() => { - SwapPage.open(DEFAULT_URL) - SwapPage.goToFarmPage() - farm.checkExistData().then((value) => { - if (value === true) { - cy.wrap(farm.getAprValues()).as('arrApr') - cy.wrap(farm.getTvlValues()).as('arrTvl') - } - cy.wrap(value).as('checkData') - }) - }) - it('Should be displayed APR and TVL values', function () { - if (this.checkData === true) { - const count = farm.countInvalidFarms(this.arrApr, this.arrTvl) - expect(count).not.to.equal(this.arrApr.length) - } - }) -}) diff --git a/cypress/e2e/specs/intercept.e2e.cy.ts b/cypress/e2e/specs/intercept.e2e.cy.ts index 384570e5c7..a54a9b16bb 100644 --- a/cypress/e2e/specs/intercept.e2e.cy.ts +++ b/cypress/e2e/specs/intercept.e2e.cy.ts @@ -1,72 +1,16 @@ -import { FarmPage } from "../pages/farm-page.po.cy"; import { SwapPage, TokenCatalog } from "../pages/swap-page.po.cy" import { DEFAULT_URL, TAG, } from "../selectors/constants.cy" const tokenCatalog = new TokenCatalog() -const farm = new FarmPage() describe('Intercept', { tags: TAG.regression }, () => { beforeEach(() => { SwapPage.open(DEFAULT_URL) }) - afterEach(() => { - cy.clearCookies(); - cy.clearLocalStorage(); - }) - describe('Swap', () => { it('Should get route successfully', () => { cy.intercept('GET', '**/routes?**').as('get-route') cy.wait('@get-route', { timeout: 20000 }).its('response.statusCode').should('be.oneOf', [200, 404, 408]) }) }) - - describe('Pools', () => { - it('Should get pool, farm list successfully', () => { - cy.intercept('GET', '**/farm-pools?**').as('get-farm-list') - cy.intercept('GET', '**/pools?**').as('get-pool-list') - SwapPage.goToPoolPage() - cy.wait('@get-farm-list', { timeout: 5000 }).its('response.statusCode').should('equal', 200) - cy.wait('@get-pool-list', { timeout: 5000 }).its('response.statusCode').should('equal', 200) - }) - - it('Should be displayed APR and TVL values', () => { - cy.intercept('GET', '**/pools?**').as('get-pools') - SwapPage.goToPoolPage() - cy.wait('@get-pools', { timeout: 20000 }).its('response.body.data').then(response => { - const totalPools = response.pools.length; - const count = response.pools.reduce((acc: number, pool: { totalValueLockedUsd: string; apr: string }) => { - if (pool.totalValueLockedUsd === '0' && pool.apr === '0') { - return acc + 1; - } - return acc; - }, 0); - expect(count).not.to.equal(totalPools); - }) - }) - }) - - describe('My Pools', () => { - it('Should get farm list successfully', () => { - cy.intercept('GET', '**/farm-pools?**').as('get-farm-list') - SwapPage.goToMyPoolsPage() - cy.wait('@get-farm-list', { timeout: 5000 }).its('response.statusCode').should('equal', 200) - }) - }) - - describe('Farms', () => { - it('Should get pool, farm list successfully', () => { - cy.intercept('GET', '**/farm-pools?**').as('get-farm-list') - cy.intercept('GET', '**/pools?**').as('get-pool-list') - SwapPage.goToFarmPage() - cy.get('[data-testid=farm-block]') - .should(_ => { }) - .then($list => { - if ($list.length) { - cy.wait('@get-pool-list', { timeout: 5000 }).its('response.statusCode').should('equal', 200) - } - cy.wait('@get-farm-list', { timeout: 5000 }).its('response.statusCode').should('equal', 200) - }) - }) - }) }) \ No newline at end of file diff --git a/cypress/e2e/specs/swap-page.e2e.cy.ts b/cypress/e2e/specs/swap-page.e2e.cy.ts index dd96372409..b5ee94ead3 100644 --- a/cypress/e2e/specs/swap-page.e2e.cy.ts +++ b/cypress/e2e/specs/swap-page.e2e.cy.ts @@ -1,15 +1,18 @@ -import { SwapPage, TokenCatalog } from '../pages/swap-page.po.cy' +import { Network, SwapPage, TokenCatalog } from '../pages/swap-page.po.cy' import { + DEFAULT_NETWORK, DEFAULT_URL, NETWORK, NORESULTS_TEXT, - NOTOKENS_TEXT, TAG, TOKEN_SYMBOLS, UNWHITELIST_SYMBOL_TOKENS, UNWHITELIST_TOKENS, } from '../selectors/constants.cy' +import { LimitOder } from "../pages/limit-order.po.cy" +import { CrossChain } from "../pages/cross-chain.po.cy" + const unWhitelistTokens = UNWHITELIST_TOKENS[NETWORK] const tokenSymbols = TOKEN_SYMBOLS[NETWORK] @@ -17,6 +20,7 @@ const arrAddress = [unWhitelistTokens[0].address, unWhitelistTokens[1].address, const arrSymbol = [unWhitelistTokens[0].symbol, unWhitelistTokens[1].symbol, unWhitelistTokens[2].symbol] const tokenCatalog = new TokenCatalog() +const network = new Network() describe(`Token Catalog on ${NETWORK}`, { tags: TAG.regression }, () => { before(() => { @@ -25,6 +29,12 @@ describe(`Token Catalog on ${NETWORK}`, { tags: TAG.regression }, () => { SwapPage.getStatusConnectedWallet() }) + after(() => { + //Verify that Metamask is disconnected + cy.disconnectMetamaskWalletFromDapp() + cy.contains('Connect').should('be.visible'); + }) + describe('Select token in favorite tokens list', () => { it('Should be selected tokenIn in favorite tokens list successfully', () => { SwapPage.selectTokenIn().getFavoriteTokens(arr => { @@ -155,29 +165,77 @@ describe(`Token Catalog on ${NETWORK}`, { tags: TAG.regression }, () => { tokenCatalog.closePopup() }) }) +}) + +describe('E2E Smoke', { tags: TAG.smoke }, () => { + before(() => { + SwapPage.open(DEFAULT_URL) + SwapPage.connectWallet() + cy.acceptMetamaskAccess() + SwapPage.getStatusConnectedWallet() + + if (NETWORK !== DEFAULT_NETWORK) { + network.selectNetwork(NETWORK) + cy.allowMetamaskToAddAndSwitchNetwork().then(approved => { + expect(approved).to.be.true + }) + } + }) - describe(`E2E Token Catalog`, () => { - it('Should be selected tokenIn and tokenOut to swap', { tags: TAG.smoke }, () => { + describe(`Swap > Limit > Cross-Chain`, () => { + it('Should be selected tokenIn and tokenOut to swap', () => { tokenCatalog.importNewTokens([arrAddress[2]]) SwapPage.getCurrentTokenIn(text => { expect(text).to.equal(arrSymbol[2]) }) SwapPage.selectTokenOut().getFavoriteTokens(arr => { - tokenCatalog.selectFavoriteToken(arr[1]) + tokenCatalog.selectFavoriteToken(arr[3]) SwapPage.getCurrentTokenOut(text => { - expect(text).to.equal(arr[1]) + expect(text).to.equal(arr[3]) }) }) - SwapPage.selectTokenOut() - tokenCatalog.deleteImportedToken(arrSymbol[2]) - tokenCatalog.getNoResultsFound(text => { - expect(text).to.equal(NORESULTS_TEXT) + SwapPage.goToLimitOrder() + LimitOder.checkGetStartedDisplay().then((checked) => { + if (checked === true) { + LimitOder.clickGetStarted() + } }) - SwapPage.getCurrentTokenIn(text => { - expect(text).to.equal(NOTOKENS_TEXT) + LimitOder.selectTokenSell().selectTokenBySymbol(tokenSymbols[0]) + LimitOder.getCurrentTokenSell((text) => { + expect(text).to.equal(tokenSymbols[0]) + }) + + LimitOder.selectTokenBuy().addFavoriteToken([tokenSymbols[0], tokenSymbols[4]]) + tokenCatalog.getFavoriteTokens((list) => { + expect(list).to.include.members([tokenSymbols[4]]) + }) + + tokenCatalog.selectFavoriteToken(tokenSymbols[4]) + LimitOder.getCurrentTokenBuy((text) => { + expect(text).to.equal(tokenSymbols[4]) + }) + + SwapPage.goToCrossChain() + CrossChain.checkLoadedPage().then((checked) => { + if (checked === true) { + CrossChain.closeUnderstandPopup() + } + }) + CrossChain.selectTokenIn().selectTokenBySymbol(tokenSymbols[0]) + CrossChain.getCurrentTokenIn((text) => { + expect(text).to.equal(tokenSymbols[0]) }) + + SwapPage.selectTokenOut().getFavoriteTokens(arr => { + tokenCatalog.selectFavoriteToken(arr[0]) + CrossChain.getCurrentTokenOut(text => { + expect(text).to.equal(arr[0]) + }) + }) + }) }) + }) diff --git a/cypress/e2e/specs/zap-in-simulator-test.mjs b/cypress/e2e/specs/zap-in-simulator-test.mjs deleted file mode 100644 index a951e60ccb..0000000000 --- a/cypress/e2e/specs/zap-in-simulator-test.mjs +++ /dev/null @@ -1,27 +0,0 @@ -import test from 'node:test' -import assert from 'node:assert/strict' - -import output from '../../../target/cypress-logs/zap.e2e.cy.json' assert {type: 'json'} -import { simulateTenderly,getTokenInFromZapEncodeData } from '../../support/tenderly.js'; -import 'dotenv/config' -const suite = output['cypress/e2e/specs/zap.e2e.cy.ts']; -const testcases = Object.keys(suite) - -testcases.forEach((testcase)=>{ - test(testcase, async () => { - const zapInData = suite[testcase] - .filter(log => { - return log.type == 'cons:debug' && log.message.includes('zap data') && log.severity.includes('success') - }) - .slice(-1) - .pop()['message'].replace('zap data,\n', '') - - const data = JSON.parse(zapInData) - data.chainId = process.env.CHAIN_ID - data.tokenIn = getTokenInFromZapEncodeData(data) - - const result = await simulateTenderly(data) - console.log(result) - assert.equal(result.success, true) - }) -}) \ No newline at end of file diff --git a/cypress/e2e/specs/zap.e2e.cy.ts b/cypress/e2e/specs/zap.e2e.cy.ts deleted file mode 100644 index d713ce4f81..0000000000 --- a/cypress/e2e/specs/zap.e2e.cy.ts +++ /dev/null @@ -1,40 +0,0 @@ -import arbitrumTestCases from '../../fixtures/zap/arbitrum.json' -import avalancheTestCases from '../../fixtures/zap/avalanche.json' -import bscTestCases from '../../fixtures/zap/bsc.json' -import ethereumTestCases from '../../fixtures/zap/ethereum.json' -import optimismTestCases from '../../fixtures/zap/optimism.json' -import { CustomRange, FarmingRange, PoolsPage } from '../pages/pools-page.po.cy' -import { Network, SwapPage } from '../pages/swap-page.po.cy' -import { DEFAULT_NETWORK, DEFAULT_URL, NETWORK, TAG } from '../selectors/constants.cy' - -const wallet = new Network() - -const DataSet = { - Arbitrum: arbitrumTestCases, - Ethereum: ethereumTestCases, - Avalanche: avalancheTestCases, - 'BNB Chain': bscTestCases, - Optimism: optimismTestCases, -} -describe('Zap In', { tags: TAG.zap }, () => { - const zapTestData = DataSet[NETWORK] - before(() => { - SwapPage.open(DEFAULT_URL) - SwapPage.connectWallet() - if (NETWORK !== DEFAULT_NETWORK) { - cy.acceptMetamaskAccess() - SwapPage.getStatusConnectedWallet() - wallet.selectNetwork(NETWORK) - cy.allowMetamaskToAddAndSwitchNetwork().then(approved => { - expect(approved).to.be.true - }) - SwapPage.goToPoolPage() - } - }) - - zapTestData.forEach(testData => { - it(`${NETWORK}: ${testData.pair} ${testData.feeTier}`, function () { - PoolsPage.addLiquidity(testData.id, testData.amountIn, testData.customRange as CustomRange, testData.farmingRange) - }) - }) -}) diff --git a/src/components/CurrencyInputPanel/CurrencyInputPanelBridge.tsx b/src/components/CurrencyInputPanel/CurrencyInputPanelBridge.tsx index 337f24c5f8..1da0687a1f 100644 --- a/src/components/CurrencyInputPanel/CurrencyInputPanelBridge.tsx +++ b/src/components/CurrencyInputPanel/CurrencyInputPanelBridge.tsx @@ -147,6 +147,7 @@ export default function CurrencyInputPanelBridge({ !disabledSelect && !loadingToken && setModalOpen(true)} style={{ cursor: disabledSelect ? 'default' : 'pointer', paddingRight: disabledSelect ? '8px' : 0 }} >