From 2376bfe58f960a065ff27c27d7004cb19ca5d50d Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 16 Oct 2023 19:44:37 +0100 Subject: [PATCH] chore(trading): deposit test to jest (#5036) --- .../trading-e2e/src/integration/deposit.cy.ts | 201 ------------------ libs/accounts/src/lib/accounts-table.spec.tsx | 43 ++++ libs/deposits/src/lib/deposit-form.spec.tsx | 2 +- 3 files changed, 44 insertions(+), 202 deletions(-) delete mode 100644 apps/trading-e2e/src/integration/deposit.cy.ts diff --git a/apps/trading-e2e/src/integration/deposit.cy.ts b/apps/trading-e2e/src/integration/deposit.cy.ts deleted file mode 100644 index b1947c2d6..000000000 --- a/apps/trading-e2e/src/integration/deposit.cy.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { removeDecimal } from '@vegaprotocol/cypress'; -import { ethers } from 'ethers'; -import { connectEthereumWallet } from '../support/ethereum-wallet'; -import { selectAsset } from '../support/helpers'; - -const assetSelectField = 'select[name="asset"]'; -const toAddressField = 'input[name="to"]'; -const amountField = 'input[name="amount"]'; -const formFieldError = 'input-error-text'; - -const ASSET_EURO = 1; - -describe('deposit form validation', { tags: '@smoke' }, () => { - function openDepositForm() { - cy.mockWeb3Provider(); - cy.mockSubscription(); - cy.mockTradingPage(); - cy.setVegaWallet(); - cy.visit('/#/portfolio'); - cy.get('[data-testid="pathname-/portfolio"]').should('exist'); - cy.getByTestId('Deposits').click(); - cy.getByTestId('deposit-button').click(); - connectEthereumWallet('MetaMask'); - cy.wait('@Assets'); - } - - before(() => { - openDepositForm(); - }); - - it('handles empty fields', () => { - cy.getByTestId('deposit-submit').click(); - cy.getByTestId(formFieldError).should('contain.text', 'Required'); - // once Ethereum wallet is connected and key selected the only field that will - // error is the asset select - cy.getByTestId(formFieldError).should('have.length', 1); - cy.get('[data-testid="input-error-text"][aria-describedby="asset"]').should( - 'have.length', - 1 - ); - }); - - it('unable to select assets not enabled', () => { - // Assets not enabled in mocks - cy.get(assetSelectField + ' option:contains(Asset 2)').should('not.exist'); - cy.get(assetSelectField + ' option:contains(Asset 3)').should('not.exist'); - cy.get(assetSelectField + ' option:contains(Asset 4)').should('not.exist'); - }); - - it('invalid public key when entering address manually', () => { - cy.getByTestId('enter-pubkey-manually').click(); - cy.get(toAddressField).clear().type('INVALID_DEPOSIT_TO_ADDRESS'); - cy.get(`[data-testid="${formFieldError}"][aria-describedby="to"]`).should( - 'have.text', - 'Invalid Vega key' - ); - }); - - it('invalid amount', () => { - mockWeb3DepositCalls({ - allowance: '1000', - depositLifetimeLimit: '1000', - balance: '800', - deposited: '0', - dps: 5, - }); - // Deposit amount smaller than minimum viable for selected asset - // Select an amount so that we have a known decimal places value to work with - selectAsset(ASSET_EURO); - - cy.get(amountField) - .clear() - .type('0.00000000000000000000000000000000001') - .next(`[data-testid="${formFieldError}"]`) - .should('have.text', 'Value is below minimum'); - }); - - it('insufficient funds', () => { - // 1001-DEPO-004 - mockWeb3DepositCalls({ - allowance: '1000', - depositLifetimeLimit: '1000', - balance: '800', - deposited: '0', - dps: 5, - }); - cy.get(amountField) - .clear() - .type('850') - .next(`[data-testid="${formFieldError}"]`) - .should( - 'have.text', - "You can't deposit more than you have in your Ethereum wallet, 800 tEURO" - ); - }); -}); - -describe('deposit actions', { tags: '@smoke' }, () => { - before(() => { - cy.mockWeb3Provider(); - cy.mockTradingPage(); - cy.mockSubscription(); - cy.setVegaWallet(); - cy.visit('/#/markets/market-1'); - }); - - it.skip('Deposit to trade is visible', () => { - cy.getByTestId('Collateral').click(); - cy.get('[row-id="asset-id"]').contains('tEURO').should('be.visible'); - cy.contains('[data-testid="deposit"]', 'Deposit').should('be.visible'); - cy.contains('[data-testid="deposit"]', 'Deposit').click(); - cy.getByTestId('deposit-submit').should('be.visible'); - }); -}); - -function mockWeb3DepositCalls({ - allowance, - depositLifetimeLimit, - balance, - deposited, - dps, -}: { - allowance: string; - depositLifetimeLimit: string; - balance: string; - deposited: string; - dps: number; -}) { - const assetContractAddress = '0x0158031158bb4df2ad02eaa31e8963e84ea978a4'; - const collateralBridgeAddress = '0x7fe27d970bc8afc3b11cc8d9737bfb66b1efd799'; - const toResult = (value: string, dps: number) => { - const rawValue = removeDecimal(value, dps); - return ethers.utils.hexZeroPad( - ethers.utils.hexlify(parseInt(rawValue)), - 32 - ); - }; - cy.intercept('POST', 'http://localhost:8545', (req) => { - // Mock chainId call - if (req.body.method === 'eth_chainId') { - req.alias = 'eth_chainId'; - req.reply({ - id: req.body.id, - jsonrpc: req.body.jsonrpc, - result: '0xaa36a7', // 11155111 for sepolia chain id - }); - } - - // Mock deposited amount - if (req.body.method === 'eth_getStorageAt') { - req.alias = 'eth_getStorageAt'; - req.reply({ - id: req.body.id, - jsonrpc: req.body.jsonrpc, - result: toResult(deposited, dps), - }); - } - - if (req.body.method === 'eth_call') { - // Mock approved amount for asset on collateral bridge - if ( - req.body.params[0].to === assetContractAddress && - req.body.params[0].data === - '0xdd62ed3e000000000000000000000000ee7d375bcb50c26d52e1a4a472d8822a2a22d94f0000000000000000000000007fe27d970bc8afc3b11cc8d9737bfb66b1efd799' - ) { - req.alias = 'eth_call_allowance'; - req.reply({ - id: req.body.id, - jsonrpc: req.body.jsonrpc, - result: toResult(allowance, dps), - }); - } - // Mock balance of asset in Ethereum wallet - else if ( - req.body.params[0].to === assetContractAddress && - req.body.params[0].data === - '0x70a08231000000000000000000000000ee7d375bcb50c26d52e1a4a472d8822a2a22d94f' - ) { - req.alias = 'eth_call_balanceOf'; - req.reply({ - id: req.body.id, - jsonrpc: req.body.jsonrpc, - result: toResult(balance, dps), - }); - } - // Mock deposit lifetime limit - else if ( - req.body.params[0].to === collateralBridgeAddress && - req.body.params[0].data === - '0x354a897a0000000000000000000000000158031158bb4df2ad02eaa31e8963e84ea978a4' - ) { - req.alias = 'eth_call_get_deposit_maximum'; // deposit lifetime limit - req.reply({ - id: req.body.id, - jsonrpc: req.body.jsonrpc, - result: toResult(depositLifetimeLimit, dps), - }); - } - } - }); -} diff --git a/libs/accounts/src/lib/accounts-table.spec.tsx b/libs/accounts/src/lib/accounts-table.spec.tsx index 737a66864..3b4155c74 100644 --- a/libs/accounts/src/lib/accounts-table.spec.tsx +++ b/libs/accounts/src/lib/accounts-table.spec.tsx @@ -45,6 +45,28 @@ const secondRow = { } as AccountFields; const multiRowData = [singleRow, secondRow]; +const zeroBalanceRow = { + __typename: 'AccountBalance', + type: Types.AccountType.ACCOUNT_TYPE_MARGIN, + balance: '0', + market: { + __typename: 'Market', + id: '10cd0a793ad2887b340940337fa6d97a212e0e517fe8e9eab2b5ef3a38633f35', + }, + asset: { + __typename: 'Asset', + id: '5cfa87844724df6069b94e4c8a6f03af21907d7bc251593d08e4251043ee9f7c', + symbol: 'tBTC', + decimals: 5, + }, + available: '0', + used: '0', + total: '0', +} as AccountFields; +const zeroBalanceRowData = [zeroBalanceRow]; + +const onClickDepositMock = jest.fn(); + describe('AccountsTable', () => { it('should render correct columns', async () => { // 7001-COLL-001 @@ -71,6 +93,27 @@ describe('AccountsTable', () => { ).toEqual(expectedHeaders); }); + it('should render deposit button', async () => { + render( + null} + isReadOnly={false} + onClickDeposit={onClickDepositMock} + pinnedAsset={{ + decimals: 5, + id: '5cfa87844724df6069b94e4c8a6f03af21907d7bc251593d08e4251043ee9f7c', + symbol: 'tBTC', + name: 'tBTC', + }} + /> + ); + const depositButton = screen.getByTestId('deposit'); + expect(depositButton).toBeVisible(); + await userEvent.click(depositButton); + expect(onClickDepositMock).toHaveBeenCalled(); + }); + it('should apply correct formatting', async () => { const { container } = render( { }); fireEvent.submit(screen.getByTestId('deposit-form')); - + // 1001-DEPO-004 expect( await screen.findByText( "You can't deposit more than you have in your Ethereum wallet, 5"