summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/fixtures.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/app/e2e/fixtures.ts')
-rw-r--r--packages/app/e2e/fixtures.ts44
1 files changed, 39 insertions, 5 deletions
diff --git a/packages/app/e2e/fixtures.ts b/packages/app/e2e/fixtures.ts
index 7bc994e50..7232df687 100644
--- a/packages/app/e2e/fixtures.ts
+++ b/packages/app/e2e/fixtures.ts
@@ -1,7 +1,16 @@
import { test as base, expect, type Page } from "@playwright/test"
import type { E2EWindow } from "../src/testing/terminal"
-import { cleanupSession, cleanupTestProject, createTestProject, seedProjects, sessionIDFromUrl } from "./actions"
-import { promptSelector } from "./selectors"
+import {
+ healthPhase,
+ cleanupSession,
+ cleanupTestProject,
+ createTestProject,
+ setHealthPhase,
+ seedProjects,
+ sessionIDFromUrl,
+ waitSlug,
+ waitSession,
+} from "./actions"
import { createSdk, dirSlug, getWorktree, sessionPath } from "./utils"
export const settingsKey = "settings.v3"
@@ -27,6 +36,29 @@ type WorkerFixtures = {
}
export const test = base.extend<TestFixtures, WorkerFixtures>({
+ page: async ({ page }, use) => {
+ let boundary: string | undefined
+ setHealthPhase(page, "test")
+ const consoleHandler = (msg: { text(): string }) => {
+ const text = msg.text()
+ if (!text.includes("[e2e:error-boundary]")) return
+ if (healthPhase(page) === "cleanup") {
+ console.warn(`[e2e:error-boundary][cleanup-warning]\n${text}`)
+ return
+ }
+ boundary ||= text
+ console.log(text)
+ }
+ const pageErrorHandler = (err: Error) => {
+ console.log(`[e2e:pageerror] ${err.stack || err.message}`)
+ }
+ page.on("console", consoleHandler)
+ page.on("pageerror", pageErrorHandler)
+ await use(page)
+ page.off("console", consoleHandler)
+ page.off("pageerror", pageErrorHandler)
+ if (boundary) throw new Error(boundary)
+ },
directory: [
async ({}, use) => {
const directory = await getWorktree()
@@ -48,21 +80,20 @@ export const test = base.extend<TestFixtures, WorkerFixtures>({
const gotoSession = async (sessionID?: string) => {
await page.goto(sessionPath(directory, sessionID))
- await expect(page.locator(promptSelector)).toBeVisible()
+ await waitSession(page, { directory, sessionID })
}
await use(gotoSession)
},
withProject: async ({ page }, use) => {
await use(async (callback, options) => {
const root = await createTestProject()
- const slug = dirSlug(root)
const sessions = new Map<string, string>()
const dirs = new Set<string>()
await seedStorage(page, { directory: root, extra: options?.extra })
const gotoSession = async (sessionID?: string) => {
await page.goto(sessionPath(root, sessionID))
- await expect(page.locator(promptSelector)).toBeVisible()
+ await waitSession(page, { directory: root, sessionID })
const current = sessionIDFromUrl(page.url())
if (current) trackSession(current)
}
@@ -77,13 +108,16 @@ export const test = base.extend<TestFixtures, WorkerFixtures>({
try {
await gotoSession()
+ const slug = await waitSlug(page)
return await callback({ directory: root, slug, gotoSession, trackSession, trackDirectory })
} finally {
+ setHealthPhase(page, "cleanup")
await Promise.allSettled(
Array.from(sessions, ([sessionID, directory]) => cleanupSession({ sessionID, directory })),
)
await Promise.allSettled(Array.from(dirs, (directory) => cleanupTestProject(directory)))
await cleanupTestProject(root)
+ setHealthPhase(page, "test")
}
})
},