-
Notifications
You must be signed in to change notification settings - Fork 4.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test(e2e): attempt to de-flake (#6611)
* test(e2e): improve memory mgmt * test(e2e): record flakes * test(e2e): simplify tests in attempt to de-flake * test(e2e): more simplification * test(e2e): disable transaction popup checks * test(e2e): better wrap assertions * test(e2e): always assert both inputs
- Loading branch information
Showing
7 changed files
with
214 additions
and
256 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,89 +1,114 @@ | ||
import { BigNumber } from '@ethersproject/bignumber' | ||
import { parseEther } from '@ethersproject/units' | ||
|
||
import { USDC_MAINNET } from '../../../src/constants/tokens' | ||
import { getTestSelector } from '../../utils' | ||
|
||
describe('Swap', () => { | ||
it('should render and dismiss the wallet rejection modal', () => { | ||
cy.visit('/swap', { ethereum: 'hardhat' }) | ||
.hardhat() | ||
.then((hardhat) => { | ||
cy.stub(hardhat.wallet, 'sendTransaction').log(false).rejects(new Error('user cancelled')) | ||
|
||
cy.get('#swap-currency-output .open-currency-select-button').click() | ||
cy.get(getTestSelector('token-search-input')).clear().type(USDC_MAINNET.address) | ||
cy.contains('USDC').click() | ||
cy.get('#swap-currency-output .token-amount-input').clear().type('1') | ||
cy.get('#swap-currency-input .token-amount-input').should('not.equal', '') | ||
cy.get('#swap-button').click() | ||
cy.get('#confirm-swap-or-send').click() | ||
cy.contains('Transaction rejected').should('exist') | ||
cy.contains('Dismiss').click() | ||
cy.contains('Transaction rejected').should('not.exist') | ||
}) | ||
import { SupportedChainId } from '@uniswap/sdk-core' | ||
|
||
import { UNI, USDC_MAINNET } from '../../../src/constants/tokens' | ||
import { getBalance, getTestSelector } from '../../utils' | ||
|
||
const UNI_MAINNET = UNI[SupportedChainId.MAINNET] | ||
|
||
describe('Swap errors', () => { | ||
it('wallet rejection', () => { | ||
cy.visit(`/swap?inputCurrency=ETH&outputCurrency=${USDC_MAINNET.address}`, { ethereum: 'hardhat' }) | ||
cy.hardhat().then((hardhat) => { | ||
// Stub the wallet to reject any transaction. | ||
cy.stub(hardhat.wallet, 'sendTransaction').log(false).rejects(new Error('user cancelled')) | ||
|
||
// Attempt to swap. | ||
cy.get('#swap-currency-output .token-amount-input').clear().type('1').should('have.value', '1') | ||
cy.get('#swap-currency-input .token-amount-input').should('not.have.value', '') | ||
cy.get('#swap-button').click() | ||
cy.get('#confirm-swap-or-send').click() | ||
|
||
cy.contains('Transaction rejected').should('exist') | ||
cy.contains('Dismiss').click() | ||
cy.contains('Transaction rejected').should('not.exist') | ||
}) | ||
}) | ||
|
||
it('transaction past deadline', () => { | ||
cy.visit(`/swap?inputCurrency=ETH&outputCurrency=${USDC_MAINNET.address}`, { ethereum: 'hardhat' }) | ||
cy.hardhat({ automine: false }) | ||
getBalance(USDC_MAINNET).then((initialBalance) => { | ||
// Set deadline to minimum. (1 minute) | ||
cy.get(getTestSelector('open-settings-dialog-button')).click() | ||
cy.get(getTestSelector('transaction-deadline-settings')).click() | ||
cy.get(getTestSelector('deadline-input')).clear().type('1') // 1 minute | ||
|
||
// Click outside of modal to dismiss it. | ||
cy.get('body').click('topRight') | ||
cy.get(getTestSelector('deadline-input')).should('not.exist') | ||
|
||
// Attempt to swap. | ||
cy.get('#swap-currency-output .token-amount-input').clear().type('1').should('have.value', '1') | ||
cy.get('#swap-currency-input .token-amount-input').should('not.have.value', '') | ||
cy.get('#swap-button').click() | ||
cy.get('#confirm-swap-or-send').click() | ||
cy.get(getTestSelector('dismiss-tx-confirmation')).click() | ||
|
||
// The pending transaction indicator should reflect the state. | ||
cy.get(getTestSelector('web3-status-connected')).should('contain', '1 Pending') | ||
cy.hardhat().then((hardhat) => hardhat.mine(1, /* 10 minutes */ 1000 * 60 * 10)) // mines past the deadline | ||
cy.get(getTestSelector('web3-status-connected')).should('not.contain', 'Pending') | ||
|
||
// TODO(WEB-2085): Fix this test - transaction popups are flakey. | ||
// cy.get(getTestSelector('transaction-popup')).contains('Swap failed') | ||
|
||
// Verify the balance is unchanged. | ||
cy.get('#swap-currency-output [data-testid="balance-text"]').should('have.text', `Balance: ${initialBalance}`) | ||
getBalance(USDC_MAINNET).should('eq', initialBalance) | ||
}) | ||
}) | ||
|
||
it.skip('should render an error for slippage failure', () => { | ||
cy.visit('/swap', { ethereum: 'hardhat' }) | ||
.hardhat({ automine: false }) | ||
.then((hardhat) => { | ||
cy.then(() => hardhat.provider.getBalance(hardhat.wallet.address)).then((initialBalance) => { | ||
// Gas estimation fails for this transaction (that would normally fail), so we stub it. | ||
const send = cy.stub(hardhat.provider, 'send').log(false) | ||
send.withArgs('eth_estimateGas').resolves(BigNumber.from(2_000_000)) | ||
send.callThrough() | ||
|
||
// Set slippage to a very low value. | ||
cy.get(getTestSelector('open-settings-dialog-button')).click() | ||
cy.get(getTestSelector('max-slippage-settings')).click() | ||
cy.get(getTestSelector('slippage-input')).clear().type('0.01') | ||
cy.get('body').click('topRight') | ||
cy.get(getTestSelector('slippage-input')).should('not.exist') | ||
|
||
// Open the currency select modal. | ||
cy.get('#swap-currency-output .open-currency-select-button').click() | ||
|
||
// Select UNI as output token | ||
cy.get(getTestSelector('token-search-input')).clear().type('Uniswap') | ||
cy.get(getTestSelector('currency-list-wrapper')) | ||
.contains(/^Uniswap$/) | ||
.first() | ||
// Our scrolling library (react-window) seems to freeze when acted on by cypress, with this element set to | ||
// `pointer-events: none`. This can be ignored using `{force: true}`. | ||
.click({ force: true }) | ||
|
||
// Swap 2 times. | ||
const AMOUNT_TO_SWAP = 400 | ||
const NUMBER_OF_SWAPS = 2 | ||
const INDIVIDUAL_SWAP_INPUT = AMOUNT_TO_SWAP / NUMBER_OF_SWAPS | ||
cy.get('#swap-currency-input .token-amount-input').clear().type(INDIVIDUAL_SWAP_INPUT.toString()) | ||
cy.get('#swap-currency-output .token-amount-input').should('not.equal', '') | ||
cy.get('#swap-button').click() | ||
cy.get('#confirm-swap-or-send').click() | ||
cy.get(getTestSelector('dismiss-tx-confirmation')).click() | ||
cy.get('#swap-currency-input .token-amount-input').clear().type(INDIVIDUAL_SWAP_INPUT.toString()) | ||
cy.get('#swap-currency-output .token-amount-input').should('not.equal', '') | ||
cy.get('#swap-button').click() | ||
cy.get('#confirm-swap-or-send').click() | ||
cy.get(getTestSelector('dismiss-tx-confirmation')).click() | ||
|
||
// The pending transaction indicator should be visible. | ||
cy.contains('Pending').should('exist') | ||
|
||
cy.then(() => hardhat.mine()).then(() => { | ||
// The pending transaction indicator should not be visible. | ||
cy.contains('Pending').should('not.exist') | ||
|
||
// Check for a failed transaction notification. | ||
cy.contains('Swap failed').should('exist') | ||
|
||
// Assert that at least one of the swaps failed due to slippage. | ||
cy.then(() => hardhat.provider.getBalance(hardhat.wallet.address)).then((finalBalance) => { | ||
expect(finalBalance.gt(initialBalance.sub(parseEther(AMOUNT_TO_SWAP.toString())))).to.be.true | ||
}) | ||
}) | ||
}) | ||
it('slippage failure', () => { | ||
cy.visit(`/swap?inputCurrency=ETH&outputCurrency=${UNI_MAINNET.address}`, { ethereum: 'hardhat' }) | ||
cy.hardhat({ automine: false }) | ||
getBalance(USDC_MAINNET).then((initialBalance) => { | ||
// Gas estimation fails for this transaction (that would normally fail), so we stub it. | ||
cy.hardhat().then((hardhat) => { | ||
const send = cy.stub(hardhat.provider, 'send').log(false) | ||
send.withArgs('eth_estimateGas').resolves(BigNumber.from(2_000_000)) | ||
send.callThrough() | ||
}) | ||
|
||
// Set slippage to a very low value. | ||
cy.get(getTestSelector('open-settings-dialog-button')).click() | ||
cy.get(getTestSelector('max-slippage-settings')).click() | ||
cy.get(getTestSelector('slippage-input')).clear().type('0.01') | ||
|
||
// Click outside of modal to dismiss it. | ||
cy.get('body').click('topRight') | ||
cy.get(getTestSelector('slippage-input')).should('not.exist') | ||
|
||
// Swap 2 times. | ||
const AMOUNT_TO_SWAP = 200 | ||
cy.get('#swap-currency-input .token-amount-input') | ||
.clear() | ||
.type(AMOUNT_TO_SWAP.toString()) | ||
.should('have.value', AMOUNT_TO_SWAP.toString()) | ||
cy.get('#swap-currency-output .token-amount-input').should('not.have.value', '') | ||
cy.get('#swap-button').click() | ||
cy.get('#confirm-swap-or-send').click() | ||
cy.get(getTestSelector('dismiss-tx-confirmation')).click() | ||
|
||
cy.get('#swap-currency-input .token-amount-input') | ||
.clear() | ||
.type(AMOUNT_TO_SWAP.toString()) | ||
.should('have.value', AMOUNT_TO_SWAP.toString()) | ||
cy.get('#swap-currency-output .token-amount-input').should('not.have.value', '') | ||
cy.get('#swap-button').click() | ||
cy.get('#confirm-swap-or-send').click() | ||
cy.get(getTestSelector('dismiss-tx-confirmation')).click() | ||
|
||
// The pending transaction indicator should reflect the state. | ||
cy.get(getTestSelector('web3-status-connected')).should('contain', '2 Pending') | ||
cy.hardhat().then((hardhat) => hardhat.mine()) | ||
cy.get(getTestSelector('web3-status-connected')).should('not.contain', 'Pending') | ||
|
||
// TODO(WEB-2085): Fix this test - transaction popups are flakey. | ||
// cy.get(getTestSelector('transaction-popup')).contains('Swap failed') | ||
|
||
// Assert that the transactions were unsuccessful by checking on-chain balance. | ||
getBalance(UNI_MAINNET).should('equal', initialBalance) | ||
}) | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
import { getTestSelector } from '../../utils' | ||
|
||
describe('Swap settings', () => { | ||
it('Opens and closes the settings menu', () => { | ||
cy.visit('/swap') | ||
cy.contains('Settings').should('not.exist') | ||
cy.get(getTestSelector('open-settings-dialog-button')).click() | ||
cy.contains('Max slippage').should('exist') | ||
cy.contains('Transaction deadline').should('exist') | ||
cy.contains('Auto Router API').should('exist') | ||
cy.get(getTestSelector('open-settings-dialog-button')).click() | ||
cy.contains('Settings').should('not.exist') | ||
}) | ||
}) |
Oops, something went wrong.
b89ee36
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Successfully deployed to the following URLs:
interface – ./
interface-git-main-uniswap.vercel.app
interface-uniswap.vercel.app