diff --git a/packages/app/e2e/fixtures.ts b/packages/app/e2e/fixtures.ts index 0ea346fb0..a05a5e680 100644 --- a/packages/app/e2e/fixtures.ts +++ b/packages/app/e2e/fixtures.ts @@ -1,4 +1,8 @@ import { test as base, expect, type Page } from '@playwright/test'; +import { + buildCreateAgentPreferences, + buildSeededHost, +} from './helpers/daemon-registry'; // Extend base test to provide dynamic baseURL from global-setup const test = base.extend({ @@ -58,31 +62,12 @@ test.beforeEach(async ({ page }) => { if (!serverId) { throw new Error('E2E_SERVER_ID is not set - expected from Playwright globalSetup.'); } - const testDaemon = { + const testDaemon = buildSeededHost({ serverId, - label: 'localhost', - connections: [ - { - id: `direct:127.0.0.1:${daemonPort}`, - type: 'direct', - endpoint: `127.0.0.1:${daemonPort}`, - }, - ], - preferredConnectionId: `direct:127.0.0.1:${daemonPort}`, - createdAt: nowIso, - updatedAt: nowIso, - }; - - const createAgentPreferences = { - // Ensure create flow never uses a remembered host from the developer's real app. - serverId: testDaemon.serverId, - // Keep e2e fast/cheap by default. - provider: 'codex', - providerPreferences: { - claude: { model: 'haiku' }, - codex: { model: 'gpt-5.1-codex-mini', thinkingOptionId: 'low' }, - }, - }; + endpoint: `127.0.0.1:${daemonPort}`, + nowIso, + }); + const createAgentPreferences = buildCreateAgentPreferences(testDaemon.serverId); await page.addInitScript( ({ daemon, preferences, seedNonce }) => { diff --git a/packages/app/e2e/helpers/app.ts b/packages/app/e2e/helpers/app.ts index bc7ba3b9d..014e1efd6 100644 --- a/packages/app/e2e/helpers/app.ts +++ b/packages/app/e2e/helpers/app.ts @@ -1,4 +1,8 @@ import { expect, type Page } from '@playwright/test'; +import { + buildCreateAgentPreferences, + buildSeededHost, +} from './daemon-registry'; function escapeRegex(value: string): string { return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); @@ -33,8 +37,8 @@ async function ensureE2EStorageSeeded(page: Page): Promise { if (entry?.serverId !== expectedServerId) return true; const connections = entry?.connections; if (!Array.isArray(connections)) return true; - if (connections.some((c: any) => c?.type === 'direct' && typeof c?.endpoint === 'string' && /:6767\b/.test(c.endpoint))) return true; - return !connections.some((c: any) => c?.type === 'direct' && c?.endpoint === expectedEndpoint); + if (connections.some((c: any) => c?.type === 'directTcp' && typeof c?.endpoint === 'string' && /:6767\b/.test(c.endpoint))) return true; + return !connections.some((c: any) => c?.type === 'directTcp' && c?.endpoint === expectedEndpoint); } catch { return true; } @@ -45,42 +49,20 @@ async function ensureE2EStorageSeeded(page: Page): Promise { } const nowIso = new Date().toISOString(); + const daemon = buildSeededHost({ + serverId: expectedServerId, + endpoint: expectedEndpoint, + nowIso, + }); + const preferences = buildCreateAgentPreferences(expectedServerId); await page.evaluate( - ({ expectedEndpoint, nowIso, expectedServerId }) => { + ({ daemon, preferences }) => { localStorage.setItem('@paseo:e2e', '1'); - localStorage.setItem( - '@paseo:daemon-registry', - JSON.stringify([ - { - serverId: expectedServerId, - label: 'localhost', - connections: [ - { - id: `direct:${expectedEndpoint}`, - type: 'direct', - endpoint: expectedEndpoint, - }, - ], - preferredConnectionId: `direct:${expectedEndpoint}`, - createdAt: nowIso, - updatedAt: nowIso, - }, - ]) - ); - localStorage.setItem( - '@paseo:create-agent-preferences', - JSON.stringify({ - serverId: expectedServerId, - provider: 'codex', - providerPreferences: { - claude: { model: 'haiku' }, - codex: { model: 'gpt-5.1-codex-mini', thinkingOptionId: 'low' }, - }, - }) - ); + localStorage.setItem('@paseo:daemon-registry', JSON.stringify([daemon])); + localStorage.setItem('@paseo:create-agent-preferences', JSON.stringify(preferences)); localStorage.removeItem('@paseo:settings'); }, - { expectedEndpoint, nowIso, expectedServerId } + { daemon, preferences } ); await page.reload(); @@ -128,13 +110,13 @@ async function assertE2EUsesSeededTestDaemon(page: Page): Promise { const connections: unknown = daemon?.connections; if ( !Array.isArray(connections) || - !connections.some((c: any) => c?.type === 'direct' && c?.endpoint === expectedEndpoint) + !connections.some((c: any) => c?.type === 'directTcp' && c?.endpoint === expectedEndpoint) ) { throw new Error( - `E2E expected seeded daemon connections to include direct ${expectedEndpoint} (got ${JSON.stringify(connections)}).` + `E2E expected seeded daemon connections to include directTcp ${expectedEndpoint} (got ${JSON.stringify(connections)}).` ); } - if (Array.isArray(connections) && connections.some((c: any) => c?.type === 'direct' && typeof c?.endpoint === 'string' && /:6767\b/.test(c.endpoint))) { + if (Array.isArray(connections) && connections.some((c: any) => c?.type === 'directTcp' && typeof c?.endpoint === 'string' && /:6767\b/.test(c.endpoint))) { throw new Error(`E2E detected a daemon endpoint pointing at :6767 (${JSON.stringify(connections)}).`); } diff --git a/packages/app/e2e/helpers/daemon-registry.ts b/packages/app/e2e/helpers/daemon-registry.ts new file mode 100644 index 000000000..dd0146890 --- /dev/null +++ b/packages/app/e2e/helpers/daemon-registry.ts @@ -0,0 +1,39 @@ +export const TEST_HOST_LABEL = "localhost"; + +export const TEST_PROVIDER_PREFERENCES = { + claude: { model: "haiku" }, + codex: { model: "gpt-5.1-codex-mini", thinkingOptionId: "low" }, +} as const; + +export function buildDirectTcpConnection(endpoint: string) { + return { + id: `direct:${endpoint}`, + type: "directTcp" as const, + endpoint, + }; +} + +export function buildSeededHost(input: { + serverId: string; + endpoint: string; + label?: string; + nowIso: string; +}) { + const connection = buildDirectTcpConnection(input.endpoint); + return { + serverId: input.serverId, + label: input.label ?? TEST_HOST_LABEL, + connections: [connection], + preferredConnectionId: connection.id, + createdAt: input.nowIso, + updatedAt: input.nowIso, + }; +} + +export function buildCreateAgentPreferences(serverId: string) { + return { + serverId, + provider: "codex" as const, + providerPreferences: TEST_PROVIDER_PREFERENCES, + }; +}