/** * WebDriverIO config for Electrobun stack E2E tests. * * Extends shared config with WebKitWebDriver lifecycle and optional * PTY daemon management. Port: 9761 (per project convention). */ import { execSync } from 'node:child_process'; import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { existsSync, rmSync } from 'node:fs'; import { sharedConfig } from './wdio.shared.conf.js'; const __dirname = dirname(fileURLToPath(import.meta.url)); const projectRoot = resolve(__dirname, '../..'); const electrobunRoot = resolve(projectRoot, 'ui-electrobun'); // Use the Electrobun fixture generator (different groups.json format) let fixture; try { const { createTestFixture } = await import('../../ui-electrobun/tests/e2e/fixtures.ts'); fixture = createTestFixture('agor-ebun-unified'); } catch { // Fall back to the Tauri fixture generator if Electrobun fixtures not available const { createTestFixture } = await import('./infra/fixtures.ts'); fixture = createTestFixture('agor-ebun-unified'); } process.env.AGOR_TEST = '1'; process.env.AGOR_TEST_DATA_DIR = fixture.dataDir; process.env.AGOR_TEST_CONFIG_DIR = fixture.configDir; const WEBDRIVER_PORT = 9761; console.log(`[electrobun] Test fixture at ${fixture.rootDir ?? fixture.configDir}`); export const config = { ...sharedConfig, port: WEBDRIVER_PORT, capabilities: [{ 'wdio:enforceWebDriverClassic': true, browserName: 'webkit', }], onPrepare() { const electrobunBinary = resolve(electrobunRoot, 'build/Agent Orchestrator'); if (!existsSync(electrobunBinary) && !process.env.SKIP_BUILD) { console.log('Building Electrobun canary...'); execSync('vite build && electrobun build --env=canary', { cwd: electrobunRoot, stdio: 'inherit', }); } if (!existsSync(electrobunBinary)) { throw new Error( `Electrobun binary not found at ${electrobunBinary}. ` + "Run 'cd ui-electrobun && bun run build:canary' first." ); } }, async before() { // Wait for Electrobun app to load await browser.waitUntil( async () => { const hasEl = await browser.execute(() => document.querySelector('.app-shell') !== null || document.querySelector('.project-grid') !== null || document.querySelector('.status-bar') !== null ); return hasEl; }, { timeout: 20_000, interval: 500, timeoutMsg: 'Electrobun app did not load in 20s' }, ); console.log('[electrobun] App loaded.'); }, afterSession() { const cleanup = fixture.cleanup ?? (() => { try { if (fixture.rootDir) rmSync(fixture.rootDir, { recursive: true, force: true }); } catch { /* best-effort */ } }); cleanup(); }, };