diff --git a/.github/workflows/cypress-live-test.yml b/.github/workflows/cypress-live-test.yml deleted file mode 100644 index 4c39a6e28..000000000 --- a/.github/workflows/cypress-live-test.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Cypress Console tests -- live environment - -# This workflow runs using provided url - -on: - workflow_dispatch: - inputs: - url: - description: 'Url' - required: true - type: string - -jobs: - cypress-run: - name: Run Cypress Trading tests -- live environment - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Use Node.js 20 - id: Node - uses: actions/setup-node@v4 - with: - node-version-file: '.nvmrc' - - - name: Run Cypress tests - uses: cypress-io/github-action@v4 - with: - browser: chrome - record: true - project: ./apps/trading-e2e - config: baseUrl=${{ github.event.inputs.url }} - env: grepTags=@live - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/cypress-manual-trigger.yml b/.github/workflows/cypress-manual-trigger.yml index 090089c15..c1f46c011 100644 --- a/.github/workflows/cypress-manual-trigger.yml +++ b/.github/workflows/cypress-manual-trigger.yml @@ -12,7 +12,6 @@ on: options: - explorer-e2e - governance-e2e - - trading-e2e tags: description: 'Test tags to run' required: true diff --git a/.github/workflows/cypress-nightly.yml b/.github/workflows/cypress-nightly.yml index 16269f1b5..3ddbb0891 100644 --- a/.github/workflows/cypress-nightly.yml +++ b/.github/workflows/cypress-nightly.yml @@ -10,5 +10,5 @@ jobs: uses: ./.github/workflows/cypress-run.yml secrets: inherit with: - projects: '["explorer-e2e","governance-e2e","trading-e2e"]' + projects: '["explorer-e2e","governance-e2e"]' tags: '@smoke @regression @slow' diff --git a/apps/trading-e2e/.env b/apps/trading-e2e/.env deleted file mode 100644 index 95b8d5c19..000000000 --- a/apps/trading-e2e/.env +++ /dev/null @@ -1,41 +0,0 @@ -NX_ETHEREUM_PROVIDER_URL=http://localhost:8545 -NX_ETHERSCAN_URL=https://sepolia.etherscan.io -NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions -NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz -NX_VEGA_CONFIG_URL='' -NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet -NX_VEGA_ENV=CUSTOM -NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf -NX_VEGA_CONSOLE_URL=https://console.fairground.wtf -NX_VEGA_NETWORKS={\"TESTNET\":\"https://console.fairground.wtf\",\"STAGNET1\":\"https://trading.stagnet1.vega.rocks\"} -NX_VEGA_TOKEN_URL=https://governance.fairground.wtf -NX_VEGA_URL=http://localhost:3008/graphql -NX_VEGA_WALLET_URL=http://localhost:1789 -NX_ETH_LOCAL_PROVIDER_URL=http://localhost:8545/ -NX_ETH_WALLET_MNEMONIC="ozone access unlock valid olympic save include omit supply green clown session" -NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72 -NX_SENTRY_DSN=https://dummy@o999999.ingest.sentry.io/9999999 -NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json - - -# Expose some env vars to cypress environment for market setup -CYPRESS_ETH_WALLET_MNEMONIC=ozone access unlock valid olympic save include omit supply green clown session -CYPRESS_ETHEREUM_WALLET_ADDRESS=0xEe7D375bcB50C26d52E1A4a472D8822A2A22d94F -CYPRESS_ETHEREUM_PROVIDER_URL=http://localhost:8545 -CYPRESS_EXPLORER_URL=https://explorer.fairground.wtf -CYPRESS_CONSOLE_URL=https://console.fairground.wtf -CYPRESS_FAUCET_URL=http://localhost:1790/api/v1/mint -CYPRESS_ORACLE_PUBKEY=6d9d35f657589e40ddfb448b7ad4a7463b66efb307527fedd2aa7df1bbd5ea61 -CYPRESS_TRUNCATED_VEGA_PUBLIC_KEY=02ecea…342f65 -CYPRESS_TRUNCATED_VEGA_PUBLIC_KEY2=7f9cf0…c25535 -CYPRESS_VEGA_ENV=CUSTOM -CYPRESS_VEGA_PUBLIC_KEY=02eceaba4df2bef76ea10caf728d8a099a2aa846cced25737cccaa9812342f65 -CYPRESS_VEGA_PUBLIC_KEY2=7f9cf07d3a9905b1a61a1069f7a758855da428bc0f4a97de87f48644bfc25535 -CYPRESS_VEGA_TOKEN_URL=https://governance.fairground.wtf -CYPRESS_VEGA_URL=http://localhost:3008/graphql -CYPRESS_VEGA_WALLET_URL=http://localhost:1789 -CYPRESS_VEGA_WALLET_API_TOKEN= - -# Cosmic elevator flags (MUST be doubled with CYPRESS_ prefix) -NX_SUCCESSOR_MARKETS=true -CYPRESS_NX_SUCCESSOR_MARKETS=true diff --git a/apps/trading-e2e/.env.capsule b/apps/trading-e2e/.env.capsule deleted file mode 100644 index cf2ef8201..000000000 --- a/apps/trading-e2e/.env.capsule +++ /dev/null @@ -1,33 +0,0 @@ -NX_ETHEREUM_PROVIDER_URL=http://localhost:8545 -NX_ETHERSCAN_URL=https://sepolia.etherscan.io -NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz -NX_VEGA_CONFIG_URL='' -NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet -NX_VEGA_ENV=CUSTOM -NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf -NX_VEGA_CONSOLE_URL=https://console.fairground.wtf -NX_VEGA_NETWORKS={\"TESTNET\":\"https://console.fairground.wtf\",\"STAGNET1\":\"https://trading.stagnet1.vega.rocks\"} -NX_VEGA_TOKEN_URL=https://governance.fairground.wtf -NX_VEGA_URL=http://localhost:3008/graphql -NX_VEGA_WALLET_URL=http://localhost:1789 -NX_ETH_LOCAL_PROVIDER_URL=http://localhost:8545/ -NX_ETH_WALLET_MNEMONIC="ozone access unlock valid olympic save include omit supply green clown session" -NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json - - -# Expose some env vars to cypress environment for market setup -CYPRESS_ETH_WALLET_MNEMONIC=ozone access unlock valid olympic save include omit supply green clown session -CYPRESS_ETHEREUM_WALLET_ADDRESS=0xEe7D375bcB50C26d52E1A4a472D8822A2A22d94F -CYPRESS_ETHEREUM_PROVIDER_URL=http://localhost:8545 -CYPRESS_EXPLORER_URL=https://explorer.fairground.wtf -CYPRESS_CONSOLE_URL=https://console.fairground.wtf -CYPRESS_FAUCET_URL=http://localhost:1790/api/v1/mint -CYPRESS_TRUNCATED_VEGA_PUBLIC_KEY=02ecea…342f65 -CYPRESS_TRUNCATED_VEGA_PUBLIC_KEY2=7f9cf0…c25535 -CYPRESS_VEGA_ENV=CUSTOM -CYPRESS_VEGA_PUBLIC_KEY=02eceaba4df2bef76ea10caf728d8a099a2aa846cced25737cccaa9812342f65 -CYPRESS_VEGA_PUBLIC_KEY2=7f9cf07d3a9905b1a61a1069f7a758855da428bc0f4a97de87f48644bfc25535 -CYPRESS_VEGA_TOKEN_URL=https://governance.fairground.wtf -CYPRESS_VEGA_URL=http://localhost:3008/graphql -CYPRESS_VEGA_WALLET_URL=http://localhost:1789 -CYPRESS_VEGA_WALLET_API_TOKEN= diff --git a/apps/trading-e2e/.eslintrc.json b/apps/trading-e2e/.eslintrc.json deleted file mode 100644 index e680c3db5..000000000 --- a/apps/trading-e2e/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": ["plugin:cypress/recommended", "../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": { - "cypress/unsafe-to-chain-command": 0 - } - }, - { - "files": ["src/plugins/index.js"], - "rules": { - "@typescript-eslint/no-var-requires": "off", - "no-undef": "off" - } - } - ] -} diff --git a/apps/trading-e2e/cypress.config.js b/apps/trading-e2e/cypress.config.js deleted file mode 100644 index b74c9d4fd..000000000 --- a/apps/trading-e2e/cypress.config.js +++ /dev/null @@ -1,41 +0,0 @@ -const { defineConfig } = require('cypress'); - -module.exports = defineConfig({ - reporter: '../../node_modules/cypress-mochawesome-reporter', - e2e: { - setupNodeEvents(on, config) { - require('cypress-mochawesome-reporter/plugin')(on); - require('@cypress/grep/src/plugin')(config); - return config; - }, - baseUrl: 'http://localhost:4200', - fileServerFolder: '.', - fixturesFolder: false, - specPattern: '**/*.cy.{js,jsx,ts,tsx}', - supportFile: './src/support/index.js', - video: false, - videosFolder: '../../dist/cypress/apps/trading-e2e/videos', - videoUploadOnPasses: false, - screenshotsFolder: '../../dist/cypress/apps/trading-e2e/screenshots', - chromeWebSecurity: false, - projectId: 'et4snf', - defaultCommandTimeout: 10000, - viewportWidth: 1800, - viewportHeight: 900, - responseTimeout: 50000, - requestTimeout: 20000, - retries: 1, - testIsolation: false, - experimentalMemoryManagement: true, - }, - env: { - ETHERSCAN_URL: 'https://sepolia.etherscan.io', - ETHEREUM_CHAIN_ID: 11155111, - TRADING_MODE_LINK: - 'https://docs.vega.xyz/testnet/concepts/trading-on-vega/trading-modes#auction-type-liquidity-monitoring', - grepTags: '@regression @smoke @slow', - grepFilterSpecs: true, - grepOmitFiltered: true, - txTimeout: { timeout: 70000 }, - }, -}); diff --git a/apps/trading-e2e/declaration.d.ts b/apps/trading-e2e/declaration.d.ts deleted file mode 100644 index d5cf927a7..000000000 --- a/apps/trading-e2e/declaration.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module '*.scss'; diff --git a/apps/trading-e2e/project.json b/apps/trading-e2e/project.json deleted file mode 100644 index 513754f96..000000000 --- a/apps/trading-e2e/project.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "trading-e2e", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/trading-e2e/src", - "projectType": "application", - "targets": { - "e2e": { - "executor": "@nx/cypress:cypress", - "options": { - "cypressConfig": "apps/trading-e2e/cypress.config.js", - "devServerTarget": "trading:serve" - }, - "configurations": { - "production": { - "devServerTarget": "trading:serve:production" - }, - "live": { - "devServerTarget": "" - } - } - }, - "lint": { - "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": ["apps/trading-e2e/**/*.{js,ts}"] - } - }, - "build": { - "executor": "nx:run-commands", - "outputs": [], - "options": { - "command": "yarn tsc --project ./apps/trading-e2e/" - } - } - }, - "tags": [], - "implicitDependencies": ["trading"] -} diff --git a/apps/trading-e2e/src/index.d.ts b/apps/trading-e2e/src/index.d.ts deleted file mode 100644 index 0ef79cee8..000000000 --- a/apps/trading-e2e/src/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -/// - -declare namespace Cypress { - // specify additional properties in the TestConfig object - // in our case we will add "tags" property - interface SuiteConfigOverrides { - /** - * List of tags for this test - * @example a single tag - * it('logs in', { tags: '@smoke' }, () => { ... }) - * @example multiple tags - * it('works', { tags: ['@smoke', '@slow'] }, () => { ... }) - */ - tags?: string | string[]; - } - - interface Cypress { - grep?: (grep?: string, tags?: string, burn?: string) => void; - } -} diff --git a/apps/trading-e2e/src/integration/capsule.cy.ts b/apps/trading-e2e/src/integration/capsule.cy.ts deleted file mode 100644 index 704ce2b1d..000000000 --- a/apps/trading-e2e/src/integration/capsule.cy.ts +++ /dev/null @@ -1,337 +0,0 @@ -import { connectEthereumWallet } from '../support/ethereum-wallet'; -import { selectAsset } from '../support/helpers'; - -const amountField = 'input[name="amount"]'; -const txTimeout = Cypress.env('txTimeout'); -const sepoliaUrl = Cypress.env('ETHERSCAN_URL'); -const btcName = 0; -const vegaName = 4; -const btcSymbol = 'tBTC'; -const vegaSymbol = 'VEGA'; -const toastContent = 'toast-content'; -const depositsTab = 'Deposits'; -const toastCloseBtn = 'toast-close'; -const completeWithdrawalBtn = 'complete-withdrawal'; -const depositSubmit = 'deposit-submit'; -const approveSubmit = 'approve-submit'; -const dialogContent = 'dialog-content'; - -// Because the tests are run on a live network to optimize time, the tests are interdependent and must be run in the given order. -describe('capsule - without MultiSign', { tags: '@slow' }, () => { - before(() => { - cy.createMarket(); - cy.get('@markets').then((markets) => { - cy.wrap(markets[0]).as('market'); - }); - cy.setOnBoardingViewed(); - cy.visit('/#/portfolio'); - }); - - it('can deposit', function () { - cy.visit('/#/portfolio'); - cy.get('[data-testid="pathname-/portfolio"]').should('exist'); - - // 1001-DEPO-001 - // 1001-DEPO-002 - // 1001-DEPO-003 - // 1001-DEPO-005 - // 1001-DEPO-006 - // 1001-DEPO-007 - // 1001-DEPO-008 - // 1001-DEPO-009 - // 1001-DEPO-010 - - cy.getByTestId(depositsTab).click(); - cy.getByTestId('deposit-button').click(); - connectEthereumWallet('Unknown'); - selectAsset(btcName); - cy.get('[data-testid="rich-select-option"]').eq(btcName).click(); - - cy.getByTestId('approve-default').should( - 'contain.text', - `Before you can make a deposit of your chosen asset, ${btcSymbol}, you need to approve its use in your Ethereum wallet` - ); - cy.getByTestId(approveSubmit).click(); - cy.getByTestId('approve-pending').should('exist'); - cy.getByTestId('approve-confirmed').should('exist'); - cy.get(amountField).focus(); - cy.get(amountField).clear().type('10'); - cy.getByTestId(depositSubmit).click(); - cy.getByTestId(toastContent, txTimeout).should( - 'contain.text', - `Transaction confirmedYour transaction has been confirmed.View on EtherscanDeposit 10.00 ${btcSymbol}`, - { matchCase: false } - ); - cy.getByTestId(toastCloseBtn).click(); - cy.getByTestId('Collateral').click(); - - cy.highlight('deposit verification'); - - cy.get('[col-id="asset.symbol"]', txTimeout).should( - 'contain.text', - btcSymbol - ); - cy.getByTestId(depositsTab).click(); - cy.get('.ag-cell-value', txTimeout).should('contain.text', btcSymbol); - cy.get('[col-id="status"]').should('not.have.text', 'Open', txTimeout); - - cy.get('[col-id="txHash"]') - .should('have.length.above', 2) - .eq(1) - .parent() - .within(() => { - cy.get('[col-id="asset.symbol"]').should('have.text', btcSymbol); - cy.get('[col-id="amount"]').should('have.text', '10.00'); - cy.get('[col-id="createdTimestamp"]').should('not.be.empty'); - cy.get('[col-id="status"]').should('have.text', 'Finalized'); - cy.get('[col-id="txHash"]') - .find('a') - .should('have.attr', 'href') - .and('contain', `${sepoliaUrl}/tx/0x`); - }); - }); - - it('can not withdrawal because of no MultiSign', function () { - // 1002-WITH-022 - // 1002-WITH-023 - // 0003-WTXN-011 - cy.getByTestId('Withdrawals').click(); - cy.getByTestId('withdraw-dialog-button').click(); - selectAsset(btcName); - cy.get('[data-testid="rich-select-option"]').eq(btcName).click(); - cy.get(amountField).focus(); - cy.get(amountField).clear().type('1'); - cy.getByTestId('submit-withdrawal').click(); - cy.getByTestId(toastContent, txTimeout).should( - 'contain.text', - 'Funds unlocked' - ); - // cy.getByTestId(toastCloseBtn).click(); - cy.highlight('withdrawals verification'); - cy.getByTestId('toast-complete-withdrawal').last().click(); - - cy.getByTestId(toastContent, txTimeout).should( - 'contain.text', - 'Error occurredcannot estimate gas' - ); - cy.getByTestId(completeWithdrawalBtn).should( - 'contain.text', - 'Complete withdrawal' - ); - }); -}); - -describe('capsule', { tags: '@slow', testIsolation: true }, () => { - before(() => { - cy.updateCapsuleMultiSig(); - }); - - beforeEach(() => { - cy.createMarket(); - cy.get('@markets').then((markets) => { - cy.wrap(markets[0]).as('market'); - }); - cy.setOnBoardingViewed(); - cy.setVegaWallet(); - }); - - it('can withdrawal', function () { - // 1002-WITH-0014 - // 1002-WITH-006 - // 1002-WITH-009 - // 1002-WITH-011 - // 1002-WITH-024 - // 1002-WITH-012 - // 1002-WITH-013 - // 1002-WITH-014 - // 1002-WITH-015 - // 1002-WITH-016 - // 1002-WITH-017 - // 1002-WITH-019 - // 1002-WITH-020 - // 1002-WITH-021 - const ethWalletAddress = Cypress.env('ETHEREUM_WALLET_ADDRESS'); - - cy.visit('/#/portfolio'); - cy.get('[data-testid="pathname-/portfolio"]').should('exist'); - cy.getByTestId(toastCloseBtn, txTimeout).click(); - cy.getByTestId('Withdrawals').click(); - cy.getByTestId('withdraw-dialog-button').click(); - connectEthereumWallet('Unknown'); - selectAsset(btcName); - cy.get('[data-testid="rich-select-option"]').eq(btcName).click(); - cy.get(amountField).clear().type('1'); - cy.getByTestId('submit-withdrawal').click(); - cy.getByTestId(toastContent, txTimeout).should( - 'contain.text', - 'Funds unlocked' - ); - - cy.highlight('withdrawals verification'); - cy.getByTestId('toast-complete-withdrawal').click(); - - cy.getByTestId(toastContent, txTimeout).should( - 'contain.text', - 'Transaction confirmed' - ); - cy.getByTestId(toastContent, txTimeout) - .should('contain.text', 'Funds unlocked') - .and('contain.text', 'Your funds have been unlocked for withdrawal.') - .and( - 'contain.text', - 'View in block explorerYou can save your withdrawal details for extra security.' - ) - .and('contain.text', 'Withdraw 1.00 tBTCComplete withdrawal'); - cy.getByTestId('toast-withdrawal-details').click(); - cy.getByTestId(dialogContent) - .last() - .within(() => { - cy.getByTestId('dialog-title').should( - 'contain.text', - 'Save withdrawal details' - ); - cy.getByTestId('copy-button').should('be.visible'); - cy.getByTestId('assetSource_value').should( - 'have.text', - '0xb63D135B0a6854EEb765d69ca36210cC70BECAE0' - ); - cy.getByTestId('amount_value').should('have.text', '100000'); - cy.getByTestId('nonce_value').invoke('text').should('not.be.empty'); - cy.getByTestId('signatures_value') - .invoke('text') - .should('not.be.empty'); - cy.getByTestId('targetAddress_value').should( - 'have.text', - ethWalletAddress - ); - cy.getByTestId('creation_value').invoke('text').should('not.be.empty'); - }); - cy.getByTestId('close-withdrawal-approval-dialog').click(); - - cy.get('.ag-center-cols-container') - .find('[col-id="status"]') - .eq(0, txTimeout) - .should('contain.text', 'Completed'); - - cy.get('[col-id="txHash"]', txTimeout) - .should('have.length.above', 1) - .eq(1) - .parent() - .within(() => { - cy.get('[col-id="asset.symbol"]').should('have.text', btcSymbol); - cy.get('[col-id="amount"]').should('have.text', '1.00'); - cy.get('[col-id="details.receiverAddress"]') - .find('a') - .should('have.attr', 'href') - .and('contain', `${sepoliaUrl}/address/`); - cy.get('[col-id="createdTimestamp"]').should('not.be.empty'); - cy.get('[col-id="withdrawnTimestamp"]').should('not.be.empty'); - cy.get('[col-id="status"]').should('have.text', 'Completed'); - cy.get('[col-id="txHash"]') - .find('a') - .should('have.attr', 'href') - .and('contain', `${sepoliaUrl}/tx/0x`); - }); - - cy.getByTestId('withdraw-dialog-button').click({ force: true }); - // cy.getByTestId('BALANCE_AVAILABLE_value').should('have.text', '6.999'); - }); - - it('approved amount is less than deposit', function () { - // 1001-DEPO-006 - // 1001-DEPO-007 - cy.visit('/#/portfolio'); - cy.get('[data-testid="pathname-/portfolio"]').should('exist'); - cy.getByTestId(toastCloseBtn, txTimeout).click(); - cy.getByTestId(depositsTab).click(); - cy.getByTestId('deposit-button').click(); - connectEthereumWallet('Unknown'); - selectAsset(btcName); - cy.get('[data-testid="rich-select-option"]').eq(btcName).click(); - cy.contains('Deposits of tBTC not approved').should('not.exist'); - cy.contains('Use maximum').should('be.visible'); - cy.get(amountField).clear().type('20000000'); - cy.getByTestId(depositSubmit).should('be.visible'); - cy.getByTestId(depositSubmit).click(); - cy.getByTestId('input-error-text').should( - 'contain.text', - `You can't deposit more than you have in your Ethereum wallet` - ); - }); - - it('withdraw - delay verification', function () { - // 1001-DEPO-024 - // 1002-WITH-007 - - cy.visit('/#/portfolio'); - cy.get('[data-testid="pathname-/portfolio"]', txTimeout).should('exist'); - cy.getByTestId(toastCloseBtn, txTimeout).click(); - cy.getByTestId(depositsTab).click(); - cy.getByTestId('deposit-button').click(); - connectEthereumWallet('Unknown'); - selectAsset(vegaName); - cy.getByTestId('approve-submit').click(); - cy.getByTestId('approve-confirmed').should( - 'contain.text', - 'You approved deposits of up to VEGA' - ); - cy.get(amountField).clear().type('10000'); - cy.getByTestId('deposit-submit').click(); - cy.getByTestId(toastContent, txTimeout).should( - 'contain.text', - `Your transaction has been confirmed.`, - { matchCase: false } - ); - cy.getByTestId(toastCloseBtn).click({ multiple: true }); - cy.getByTestId('Collateral').click(); - - cy.highlight('deposit verification'); - - cy.get('[col-id="asset.symbol"]', txTimeout).should( - 'contain.text', - vegaSymbol - ); - cy.getByTestId(depositsTab).click(); - cy.get('.ag-cell-value', txTimeout).should('contain.text', vegaSymbol); - cy.get('[col-id="status"]').should('not.have.text', 'Open', txTimeout); - - cy.get('[col-id="txHash"]') - .should('have.length.above', 2) - .eq(1) - .parent() - .within(() => { - cy.get('[col-id="asset.symbol"]').should('have.text', vegaSymbol); - cy.get('[col-id="amount"]').should('have.text', '10,000.00'); - cy.get('[col-id="createdTimestamp"]').should('not.be.empty'); - cy.get('[col-id="status"]').should('have.text', 'Finalized'); - cy.get('[col-id="txHash"]') - .find('a') - .should('have.attr', 'href') - .and('contain', `${sepoliaUrl}/tx/0x`); - }); - - cy.getByTestId('Withdrawals').click(txTimeout); - cy.getByTestId('withdraw-dialog-button').click(); - selectAsset(1); - cy.get(amountField).clear().type('10000'); - cy.getByTestId('DELAY_TIME_value').should('have.text', '5 days'); - cy.getByTestId('submit-withdrawal').click(); - cy.getByTestId(toastContent, txTimeout).should( - 'contain.text', - 'Your funds have been unlocked' - ); - cy.getByTestId(toastCloseBtn).click(); - cy.getByTestId(completeWithdrawalBtn).first().should('be.visible').click(); - cy.getByTestId(toastContent, txTimeout).should('contain.text', 'Delayed'); - cy.getByTestId('tab-withdrawals').within(() => { - cy.get('.ag-center-cols-container') - .children() - .first() - .within(() => { - cy.get('[col-id="status"]').contains( - /Delayed \(ready in (\d{1,2}:\d{2}:\d{2}:\d{2})\)/ - ); - }); - }); - }); -}); diff --git a/apps/trading-e2e/src/integration/wallet-eth.cy.ts b/apps/trading-e2e/src/integration/wallet-eth.cy.ts deleted file mode 100644 index 9f10ce504..000000000 --- a/apps/trading-e2e/src/integration/wallet-eth.cy.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { connectEthereumWallet } from '../support/ethereum-wallet'; - -const connectEthWalletBtn = 'connect-eth-wallet-btn'; - -describe('ethereum wallet', { tags: '@smoke', testIsolation: true }, () => { - beforeEach(() => { - cy.mockWeb3Provider(); - // Using portfolio withdrawals tab is it requires Ethereum wallet connection - cy.mockTradingPage(); - cy.mockSubscription(); - cy.setVegaWallet(); - cy.visit('/#/portfolio'); - cy.get('[data-testid="pathname-/portfolio"]').should('exist'); - cy.getByTestId('Withdrawals').click(); - }); - - it('can connect', () => { - // 0004-EWAL-001 - - cy.getByTestId('Deposits').click(); - cy.getByTestId('deposit-button').click(); - cy.getByTestId('connect-eth-wallet-btn').click(); - cy.getByTestId('web3-connector-list').should('exist'); - cy.getByTestId('web3-connector-MetaMask').click(); - cy.getByTestId('web3-connector-list').should('not.exist'); - cy.getByTestId('tab-deposits').should('not.be.empty'); - }); - - it('able to disconnect eth wallet', () => { - // 0004-EWAL-004 - // 0004-EWAL-005 - // 0004-EWAL-006 - - cy.getByTestId('Deposits').click(); - cy.getByTestId('deposit-button').click(); - connectEthereumWallet('MetaMask'); - cy.getByTestId('ethereum-address').should('have.text', '0xEe7D…d94F'); - cy.getByTestId('disconnect-ethereum-wallet') - .should('have.text', 'Disconnect') - .click(); - cy.getByTestId(connectEthWalletBtn).should('exist'); - }); -}); diff --git a/apps/trading-e2e/src/support/create-order.ts b/apps/trading-e2e/src/support/create-order.ts deleted file mode 100644 index 17a7b0ede..000000000 --- a/apps/trading-e2e/src/support/create-order.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { OrderType } from '@vegaprotocol/types'; -import type { OrderSubmission } from '@vegaprotocol/wallet'; - -const orderSizeField = 'order-size'; -const orderPriceField = 'order-price'; -const orderTIFDropDown = 'order-tif'; -const placeOrderBtn = 'place-order'; - -export const createOrder = (order: OrderSubmission): void => { - cy.log('Placing order', order); - const { type, side, size, price, timeInForce, expiresAt } = order; - - cy.getByTestId( - `order-type-${type === OrderType.TYPE_LIMIT ? 'Limit' : 'Market'}` - ).click(); - cy.getByTestId(`order-side-${side}`).click(); - cy.getByTestId(orderSizeField).clear().type(size); - if (price) { - cy.getByTestId(orderPriceField).clear().type(price); - } - cy.getByTestId(orderTIFDropDown).select(timeInForce); - if (timeInForce === 'TIME_IN_FORCE_GTT') { - if (!expiresAt) { - throw new Error('Specify expiresAt if using GTT'); - } - cy.getByTestId('date-picker-field').type(expiresAt); - } - cy.getByTestId(placeOrderBtn).click(); -}; diff --git a/apps/trading-e2e/src/support/deal-ticket.ts b/apps/trading-e2e/src/support/deal-ticket.ts deleted file mode 100644 index 02902226e..000000000 --- a/apps/trading-e2e/src/support/deal-ticket.ts +++ /dev/null @@ -1,18 +0,0 @@ -import * as Schema from '@vegaprotocol/types'; - -export const orderSizeField = 'order-size'; -export const orderPriceField = 'order-price'; -export const orderTIFDropDown = 'order-tif'; -export const placeOrderBtn = 'place-order'; -export const toggleShort = 'order-side-SIDE_SELL'; -export const toggleLong = 'order-side-SIDE_BUY'; -export const toggleLimit = 'order-type-Limit'; -export const toggleMarket = 'order-type-Market'; - -export const TIFlist = Object.values(Schema.OrderTimeInForce).map((value) => { - return { - code: Schema.OrderTimeInForceCode[value], - value, - text: Schema.OrderTimeInForceMapping[value], - }; -}); diff --git a/apps/trading-e2e/src/support/ethereum-wallet.ts b/apps/trading-e2e/src/support/ethereum-wallet.ts deleted file mode 100644 index 16f5b970b..000000000 --- a/apps/trading-e2e/src/support/ethereum-wallet.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const connectEthereumWallet = (connectorName: string) => { - cy.getByTestId('connect-eth-wallet-btn').should('be.enabled').click(); - cy.getByTestId('web3-connector-list').should('be.visible'); - cy.getByTestId(`web3-connector-${connectorName}`).click(); -}; diff --git a/apps/trading-e2e/src/support/helpers.ts b/apps/trading-e2e/src/support/helpers.ts deleted file mode 100644 index 85fa22a68..000000000 --- a/apps/trading-e2e/src/support/helpers.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const selectAsset = (assetIndex: number) => { - cy.log(`selecting asset: ${assetIndex}`); - cy.getByTestId('select-asset').click(); - cy.get('[data-testid="rich-select-option"]').eq(assetIndex).click(); - - // The asset only gets set once the queries (getWithdrawThreshold, getDelay) - // against the Ethereum change resolve, we should fix this but for now just force - // some wait time - // eslint-disable-next-line - cy.wait(100); -}; diff --git a/apps/trading-e2e/src/support/index.js b/apps/trading-e2e/src/support/index.js deleted file mode 100644 index 06a4e4b14..000000000 --- a/apps/trading-e2e/src/support/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import '@vegaprotocol/cypress'; -import 'cypress-real-events/support'; -import registerCypressGrep from '@cypress/grep'; -import { addMockTradingPage } from './trading'; -import 'cypress-mochawesome-reporter/register'; - -registerCypressGrep(); -addMockTradingPage(); diff --git a/apps/trading-e2e/src/support/order-update-subscription.ts b/apps/trading-e2e/src/support/order-update-subscription.ts deleted file mode 100644 index 3d9095324..000000000 --- a/apps/trading-e2e/src/support/order-update-subscription.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { - OrdersUpdateSubscription, - OrdersUpdateSubscriptionVariables, - OrderUpdateFieldsFragment, -} from '@vegaprotocol/orders'; -import type { onMessage } from '@vegaprotocol/cypress'; -import type { PartialDeep } from 'type-fest'; -import { orderUpdateSubscription } from '@vegaprotocol/mock'; - -const sendOrderUpdate: ((data: OrdersUpdateSubscription) => void)[] = []; -const getOnOrderUpdate = () => { - const onOrderUpdate: onMessage< - OrdersUpdateSubscription, - OrdersUpdateSubscriptionVariables - > = (send) => { - sendOrderUpdate.push(send); - }; - return onOrderUpdate; -}; - -export const getSubscriptionMocks = () => ({ - OrdersUpdate: getOnOrderUpdate(), -}); - -export function updateOrder( - override?: PartialDeep -): void { - const update: OrdersUpdateSubscription = orderUpdateSubscription({ - // @ts-ignore partial deep check failing - orders: [override], - }); - if (!sendOrderUpdate) { - throw new Error('OrderSub not called'); - } - sendOrderUpdate.forEach((send) => send(update)); -} diff --git a/apps/trading-e2e/src/support/order-validation.ts b/apps/trading-e2e/src/support/order-validation.ts deleted file mode 100644 index 8e2389433..000000000 --- a/apps/trading-e2e/src/support/order-validation.ts +++ /dev/null @@ -1,81 +0,0 @@ -import type { - OrderAmendment, - OrderAmendmentBody, - OrderCancellation, - OrderCancellationBody, - OrderSubmission, - OrderSubmissionBody, - Transaction, -} from '@vegaprotocol/wallet'; - -export const testOrderSubmission = ( - order: OrderSubmission, - expected?: Partial -) => { - const expectedOrder = { - ...order, - ...expected, - }; - - const transaction: OrderSubmissionBody = { - orderSubmission: expectedOrder, - }; - vegaWalletTransaction(transaction); - verifyToast(); -}; - -export const testOrderAmendment = ( - order: OrderAmendment, - expected?: Partial -) => { - const expectedOrder = { - ...order, - ...expected, - }; - - const transaction: OrderAmendmentBody = { - orderAmendment: expectedOrder, - }; - vegaWalletTransaction(transaction); - verifyToast(); -}; - -export const testOrderCancellation = ( - order: OrderCancellation, - expected?: Partial -) => { - const expectedOrder = { - ...order, - ...expected, - }; - - const transaction: OrderCancellationBody = { - orderCancellation: expectedOrder, - }; - vegaWalletTransaction(transaction); - verifyToast(); -}; - -const vegaWalletTransaction = (transaction: Transaction) => { - cy.wait('@VegaWalletTransaction') - .its('request') - .then((req) => { - expect(req.body.params).to.deep.equal({ - publicKey: Cypress.env('VEGA_PUBLIC_KEY'), - sendingMode: 'TYPE_SYNC', - transaction, - }); - expect(req.headers.authorization).to.equal( - `VWT ${Cypress.env('VEGA_WALLET_API_TOKEN')}` - ); - }); -}; - -const verifyToast = () => { - cy.getByTestId('toast').should('contain.text', 'Awaiting confirmation'); - cy.getByTestId('toast') - .find('a') - .invoke('attr', 'href') - .should('include', `${Cypress.env('EXPLORER_URL')}/txs/test-tx-hash`); - cy.getByTestId('toast-close').click(); -}; diff --git a/apps/trading-e2e/src/support/trading.ts b/apps/trading-e2e/src/support/trading.ts deleted file mode 100644 index 4cf8a2dde..000000000 --- a/apps/trading-e2e/src/support/trading.ts +++ /dev/null @@ -1,252 +0,0 @@ -import { aliasGQLQuery } from '@vegaprotocol/cypress'; -import * as Schema from '@vegaprotocol/types'; -import type { CyHttpMessages } from 'cypress/types/net-stubbing'; -import type { Provider, Status } from '@vegaprotocol/markets'; -import { - accountsQuery, - assetQuery, - assetsQuery, - candlesQuery, - chartQuery, - depositsQuery, - estimateFeesQuery, - marginsQuery, - marketCandlesQuery, - marketDataQuery, - marketDepthQuery, - marketInfoQuery, - marketsCandlesQuery, - marketsDataQuery, - marketsQuery, - networkParamsQuery, - nodeGuardQuery, - ordersQuery, - estimatePositionQuery, - positionsQuery, - proposalListQuery, - tradesQuery, - withdrawalsQuery, - protocolUpgradeProposalsQuery, - blockStatisticsQuery, - networkParamQuery, - liquidityProvisionsQuery, - successorMarketQuery, - parentMarketIdQuery, - successorMarketIdsQuery, - successorMarketProposalDetailsQuery, - liquidityProvidersQuery, -} from '@vegaprotocol/mock'; -import type { PartialDeep } from 'type-fest'; -import type { MarketDataQuery, MarketsQuery } from '@vegaprotocol/markets'; - -type MarketPageMockData = { - state: Schema.MarketState; - tradingMode?: Schema.MarketTradingMode; - trigger?: Schema.AuctionTrigger; -}; - -const ORACLE_PUBKEY = Cypress.env('ORACLE_PUBKEY'); - -const marketDataOverride = ( - data: MarketPageMockData -): PartialDeep => ({ - marketsConnection: { - edges: [ - { - node: { - data: { - // @ts-ignore conflict between incoming and outgoing types - trigger: data.trigger, - // @ts-ignore same as above - marketTradingMode: data.tradingMode, - marketState: data.state, - }, - }, - }, - ], - }, -}); - -const marketsDataOverride = ( - data: MarketPageMockData -): PartialDeep => ({ - marketsConnection: { - edges: [ - { - node: { - // @ts-ignore conflict between incoming and outgoing types - tradingMode: data.tradingMode, - state: data.state, - }, - }, - ], - }, -}); - -const mockTradingPage = ( - req: CyHttpMessages.IncomingHttpRequest, - state: Schema.MarketState = Schema.MarketState.STATE_ACTIVE, - tradingMode?: Schema.MarketTradingMode, - trigger?: Schema.AuctionTrigger -) => { - aliasGQLQuery(req, 'NodeGuard', nodeGuardQuery()); - aliasGQLQuery( - req, - 'Markets', - marketsQuery(marketsDataOverride({ state, tradingMode, trigger })) - ); - aliasGQLQuery( - req, - 'MarketData', - marketDataQuery(marketDataOverride({ state, tradingMode, trigger })) - ); - aliasGQLQuery(req, 'MarketsData', marketsDataQuery()); - aliasGQLQuery(req, 'MarketsCandles', marketsCandlesQuery()); - aliasGQLQuery(req, 'MarketCandles', marketCandlesQuery()); - aliasGQLQuery(req, 'MarketDepth', marketDepthQuery()); - aliasGQLQuery(req, 'Orders', ordersQuery()); - aliasGQLQuery(req, 'Accounts', accountsQuery()); - aliasGQLQuery(req, 'Positions', positionsQuery()); - aliasGQLQuery(req, 'Margins', marginsQuery()); - aliasGQLQuery(req, 'Assets', assetsQuery()); - aliasGQLQuery(req, 'Asset', assetQuery()); - aliasGQLQuery( - req, - 'MarketInfo', - marketInfoQuery({ - market: { - tradableInstrument: { - instrument: { - product: { - __typename: 'Future', - dataSourceSpecForSettlementData: { - data: { - sourceType: { - sourceType: { - signers: [ - { - __typename: 'Signer', - signer: { - __typename: 'PubKey', - key: ORACLE_PUBKEY, - }, - }, - ], - }, - }, - }, - }, - dataSourceSpecForTradingTermination: { - data: { - sourceType: { - sourceType: { - signers: [ - { - __typename: 'Signer', - signer: { - __typename: 'PubKey', - key: ORACLE_PUBKEY, - }, - }, - ], - }, - }, - }, - }, - }, - }, - }, - }, - }) - ); - aliasGQLQuery(req, 'Trades', tradesQuery()); - aliasGQLQuery(req, 'Chart', chartQuery()); - aliasGQLQuery(req, 'LiquidityProvisions', liquidityProvisionsQuery()); - aliasGQLQuery(req, 'LiquidityProviders', liquidityProvidersQuery()); - aliasGQLQuery(req, 'Candles', candlesQuery()); - aliasGQLQuery(req, 'Withdrawals', withdrawalsQuery()); - aliasGQLQuery(req, 'NetworkParams', networkParamsQuery()); - aliasGQLQuery(req, 'NetworkParam', networkParamQuery); - aliasGQLQuery(req, 'EstimateFees', estimateFeesQuery()); - aliasGQLQuery(req, 'EstimatePosition', estimatePositionQuery()); - aliasGQLQuery(req, 'ProposalsList', proposalListQuery()); - aliasGQLQuery(req, 'Deposits', depositsQuery()); - aliasGQLQuery( - req, - 'ProtocolUpgradeProposals', - protocolUpgradeProposalsQuery() - ); - aliasGQLQuery(req, 'BlockStatistics', blockStatisticsQuery()); - aliasGQLQuery(req, 'SuccessorMarket', successorMarketQuery()); - aliasGQLQuery(req, 'ParentMarketId', parentMarketIdQuery()); - aliasGQLQuery(req, 'SuccessorMarketIds', successorMarketIdsQuery()); - aliasGQLQuery( - req, - 'SuccessorMarketProposalDetails', - successorMarketProposalDetailsQuery() - ); -}; -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace Cypress { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface Chainable { - mockTradingPage( - state?: Schema.MarketState, - tradingMode?: Schema.MarketTradingMode, - trigger?: Schema.AuctionTrigger, - oracleStatus?: Status - ): void; - } - } -} - -export const addMockTradingPage = () => { - Cypress.Commands.add( - 'mockTradingPage', - ( - state = Schema.MarketState.STATE_ACTIVE, - tradingMode, - trigger, - oracleStatus - ) => { - cy.mockChainId(); - cy.mockGQL((req) => { - mockTradingPage(req, state, tradingMode, trigger); - }); - - const oracle: Provider = { - name: 'Another oracle', - url: 'https://zombo.com', - description_markdown: - 'Some markdown describing the oracle provider.\n\nTwitter: @FacesPics2\n', - oracle: { - status: oracleStatus || 'GOOD', - status_reason: '', - first_verified: '2022-01-01T00:00:00.000Z', - last_verified: '2022-12-31T00:00:00.000Z', - type: 'public_key', - public_key: ORACLE_PUBKEY, - }, - proofs: [ - { - format: 'signed_message', - available: true, - type: 'public_key', - public_key: ORACLE_PUBKEY, - message: 'SOMEHEX', - }, - ], - github_link: `https://github.com/vegaprotocol/well-known/blob/main/oracle-providers/public_key-${ORACLE_PUBKEY}.toml`, - }; - // Prevent request to github, return some dummy content - cy.intercept( - 'GET', - /^https:\/\/raw.githubusercontent.com\/vegaprotocol\/well-known/, - { - body: [oracle], - } - ); - } - ); -}; diff --git a/apps/trading-e2e/tsconfig.json b/apps/trading-e2e/tsconfig.json deleted file mode 100644 index b05c02c2f..000000000 --- a/apps/trading-e2e/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "jsx": "react-jsx", - "sourceMap": false, - "outDir": "../../dist/out-tsc", - "allowJs": true, - "types": ["cypress", "node", "cypress-real-events", "@cypress/grep"], - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src/**/*.ts", "src/**/*.js", "./declaration.d.ts"] -} diff --git a/apps/trading/README.md b/apps/trading/README.md index a2d26e06c..244b92f55 100644 --- a/apps/trading/README.md +++ b/apps/trading/README.md @@ -49,10 +49,4 @@ To run the minimal set of unit tests, run the following: yarn nx test trading ``` -To run the UI automation tests with a mocked API, run: - -```bash -yarn nx run trading-e2e:e2e -``` - -To run tests with market sim please read [the readme](e2e/README.md). +To run the UI automation tests please read [e2e/README.md](e2e/README.md) diff --git a/tools/ci/check-affected.py b/tools/ci/check-affected.py index e3ee84ff9..6e35f3f98 100644 --- a/tools/ci/check-affected.py +++ b/tools/ci/check-affected.py @@ -84,6 +84,9 @@ if 'release' in args.github_ref: projects = json.dumps(projects) + +# The trading project does not use the deafult NX e2e setup (cypress) +projects_e2e.remove('trading-e2e') projects_e2e = json.dumps(projects_e2e) print(f'Projects: {projects}')