From 19a6a788afacfde10781dc0d0b03d37336a5c24a Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 12 Mar 2026 03:07:38 +0100 Subject: [PATCH] ci: add E2E test workflow with xvfb and LLM-judged test gating 3 jobs (vitest, cargo, e2e), path-filtered triggers on v2 source changes, xvfb-run for headless WebKit2GTK, LLM-judged tests gated on ANTHROPIC_API_KEY secret availability. --- .github/workflows/e2e.yml | 175 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 .github/workflows/e2e.yml diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 0000000..806e193 --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,175 @@ +name: E2E Tests + +on: + push: + branches: [v2-mission-control] + paths: + - 'v2/src/**' + - 'v2/src-tauri/**' + - 'v2/bterminal-core/**' + - 'v2/tests/e2e/**' + - '.github/workflows/e2e.yml' + pull_request: + branches: [master, v2-mission-control] + paths: + - 'v2/src/**' + - 'v2/src-tauri/**' + - 'v2/bterminal-core/**' + - 'v2/tests/e2e/**' + workflow_dispatch: + +permissions: + contents: read + +env: + CARGO_TERM_COLOR: always + +jobs: + unit-tests: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: v2/package-lock.json + + - name: Install npm dependencies + working-directory: v2 + run: npm ci --legacy-peer-deps + + - name: Run Vitest + working-directory: v2 + run: npm run test + + cargo-tests: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + libwebkit2gtk-4.1-dev \ + libgtk-3-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + libssl-dev \ + build-essential \ + pkg-config + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + v2/target + key: ${{ runner.os }}-cargo-test-${{ hashFiles('v2/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-test- + + - name: Run cargo tests + working-directory: v2/src-tauri + run: cargo test + + e2e-tests: + runs-on: ubuntu-22.04 + needs: [unit-tests, cargo-tests] + steps: + - uses: actions/checkout@v4 + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + libwebkit2gtk-4.1-dev \ + libgtk-3-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + libssl-dev \ + build-essential \ + pkg-config \ + xvfb + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: v2/package-lock.json + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + v2/target + key: ${{ runner.os }}-cargo-e2e-${{ hashFiles('v2/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-e2e- + + - name: Install tauri-driver + run: cargo install tauri-driver + + - name: Install npm dependencies + working-directory: v2 + run: npm ci --legacy-peer-deps + + - name: Build debug binary + working-directory: v2 + run: npx tauri build --debug --no-bundle + + - name: Run E2E tests (Phase A — deterministic) + working-directory: v2 + env: + BTERMINAL_TEST: '1' + SKIP_BUILD: '1' + run: | + xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" \ + npx wdio tests/e2e/wdio.conf.js \ + --spec tests/e2e/specs/bterminal.test.ts \ + --spec tests/e2e/specs/agent-scenarios.test.ts + + - name: Run E2E tests (Phase B — multi-project) + if: success() + working-directory: v2 + env: + BTERMINAL_TEST: '1' + SKIP_BUILD: '1' + run: | + xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" \ + npx wdio tests/e2e/wdio.conf.js \ + --spec tests/e2e/specs/phase-b.test.ts + + # LLM-judged tests only run when API key is available (manual/dispatch) + - name: Run E2E tests (Phase B — LLM-judged) + if: success() && env.ANTHROPIC_API_KEY != '' + working-directory: v2 + env: + BTERMINAL_TEST: '1' + SKIP_BUILD: '1' + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + run: | + xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" \ + npx wdio tests/e2e/wdio.conf.js \ + --spec tests/e2e/specs/phase-b.test.ts + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: e2e-results + path: v2/test-results/ + if-no-files-found: ignore