name: E2E Tests on: push: branches: ['master', 'develop'] pull_request: types: [opened, synchronize] workflow_call: env: METAMASK_VERSION: '13.18.1' jobs: e2e: name: E2E Tests runs-on: ubuntu-latest timeout-minutes: 25 steps: - name: Check out code uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: 9.12.3 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22.x cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile # Build the Hub's workspace deps (dist/) so the Next dev server the e2e # webServer starts can resolve them. Cached, so the webServer's own build # step is then a no-op. - name: Build Hub dependencies run: pnpm exec turbo run build --filter=hub^... - name: Install Playwright browsers run: cd e2e && pnpm exec playwright install chromium --with-deps - name: Cache MetaMask extension id: metamask-cache uses: actions/cache@v4 with: path: e2e/.extensions/metamask key: metamask-v${{ env.METAMASK_VERSION }}-${{ hashFiles('e2e/download-metamask-extension.ts') }} - name: Download MetaMask extension if: steps.metamask-cache.outputs.cache-hit != 'true' run: cd e2e && pnpm setup:metamask # Local Anvil forks for the @anvil on-chain tests. - name: Start Anvil forks run: cd e2e && pnpm anvil:up # No BASE_URL → Playwright's webServer builds + serves this branch's Hub # on localhost:3003, so all projects exercise local code. - name: Run E2E tests run: cd e2e && xvfb-run --auto-servernum -- pnpm test env: WALLET_SEED_PHRASE: ${{ secrets.E2E_WALLET_SEED_PHRASE }} WALLET_PASSWORD: ${{ secrets.E2E_WALLET_PASSWORD }} CI: true - name: Stop Anvil forks if: always() run: cd e2e && pnpm anvil:down - name: Upload test report uses: actions/upload-artifact@v4 if: always() with: name: e2e-report path: e2e/test-results/ retention-days: 14 - name: Upload test artifacts uses: actions/upload-artifact@v4 if: failure() with: name: e2e-artifacts path: | e2e/test-results/artifacts/ retention-days: 7 e2e-wallet: name: E2E Tests (Wallet extension) runs-on: ubuntu-latest timeout-minutes: 20 # The wallet-send flow needs the local status-api backend (apps/api), but no # real API keys: chain calls go through the rpc-router to the Anvil fork, and # the enhanced/CoinGecko-backed endpoints are mocked by the data seam. Dummy # values just satisfy apps/api's env validation. ETH_RPC_PROXY_URL is set by # the Playwright webServer (-> rpc-router). For lower flakiness, point the fork # at an archive RPC by adding an E2E_MAINNET_FORK_URL secret (see below). env: ALCHEMY_API_KEYS: test INFURA_API_KEY: test COINGECKO_API_KEY: test ETH_RPC_PROXY_AUTH_USERNAME: test ETH_RPC_PROXY_AUTH_PASSWORD: test MARKET_PROXY_URL: http://localhost:9999 MARKET_PROXY_AUTH_USERNAME: test MARKET_PROXY_AUTH_PASSWORD: test steps: - name: Check out code uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: 9.12.3 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22.x cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile - name: Install Playwright browsers run: cd e2e && pnpm exec playwright install chromium --with-deps # Build the wallet's workspace deps (dist/), then the extension itself in # dev mode so WXT_STATUS_API_URL points at the local apps/api (:3030). - name: Build wallet dependencies run: pnpm exec turbo run build --filter=wallet^... - name: Build wallet extension run: cd e2e && pnpm setup:wallet # Local mainnet + Linea Anvil forks. To reduce archive-related flakiness, # set MAINNET_FORK_URL to an archive RPC via the E2E_MAINNET_FORK_URL secret. - name: Start Anvil forks run: cd e2e && pnpm anvil:up env: MAINNET_FORK_URL: ${{ secrets.E2E_MAINNET_FORK_URL || 'https://ethereum-rpc.publicnode.com' }} # Playwright's webServer starts apps/api (:3030) + rpc-router (:8548) for the # wallet projects (no Hub, no MetaMask). Headed extension tests need xvfb. - name: Run wallet E2E tests run: cd e2e && xvfb-run --auto-servernum -- pnpm exec playwright test --project=wallet-send --project=wallet-swap env: RUN_WALLET_E2E: '1' WALLET_SEED_PHRASE: ${{ secrets.E2E_WALLET_SEED_PHRASE }} CI: true - name: Stop Anvil forks if: always() run: cd e2e && pnpm anvil:down - name: Upload test report uses: actions/upload-artifact@v4 if: always() with: name: e2e-wallet-report path: e2e/test-results/ retention-days: 14 - name: Upload test artifacts uses: actions/upload-artifact@v4 if: failure() with: name: e2e-wallet-artifacts path: | e2e/test-results/artifacts/ retention-days: 7