summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/projects
diff options
context:
space:
mode:
authorLuke Parker <[email protected]>2026-03-07 16:33:12 +1000
committerGitHub <[email protected]>2026-03-07 16:33:12 +1000
commit0b7a5b1e7bc7619c85e7cf4e30a1a0d4885779b6 (patch)
tree6fcd11b17e890867a4c8d578452e90ed92fe7ffa /packages/app/e2e/projects
parent28bb16ca2a374439973d4f3f4b71d72f7fdae9cd (diff)
downloadopencode-0b7a5b1e7bc7619c85e7cf4e30a1a0d4885779b6.tar.gz
opencode-0b7a5b1e7bc7619c85e7cf4e30a1a0d4885779b6.zip
test(app): abort sessions and wait for idle before e2e cleanup (#16439)
Diffstat (limited to 'packages/app/e2e/projects')
-rw-r--r--packages/app/e2e/projects/projects-switch.spec.ts25
-rw-r--r--packages/app/e2e/projects/workspace-new-session.spec.ts69
2 files changed, 29 insertions, 65 deletions
diff --git a/packages/app/e2e/projects/projects-switch.spec.ts b/packages/app/e2e/projects/projects-switch.spec.ts
index 2725100f4..a942f29e0 100644
--- a/packages/app/e2e/projects/projects-switch.spec.ts
+++ b/packages/app/e2e/projects/projects-switch.spec.ts
@@ -3,7 +3,7 @@ import type { Page } from "@playwright/test"
import { test, expect } from "../fixtures"
import { defocus, createTestProject, cleanupTestProject, openSidebar, sessionIDFromUrl } from "../actions"
import { projectSwitchSelector, promptSelector, workspaceItemSelector, workspaceNewSessionSelector } from "../selectors"
-import { createSdk, dirSlug, sessionPath } from "../utils"
+import { dirSlug } from "../utils"
function slugFromUrl(url: string) {
return /\/([^/]+)\/session(?:\/|$)/.exec(url)?.[1] ?? ""
@@ -76,14 +76,10 @@ test("switching back to a project opens the latest workspace session", async ({
const other = await createTestProject()
const otherSlug = dirSlug(other)
- let rootDir: string | undefined
let workspaceDir: string | undefined
- let sessionID: string | undefined
-
try {
await withProject(
- async ({ directory, slug }) => {
- rootDir = directory
+ async ({ directory, slug, trackSession, trackDirectory }) => {
await defocus(page)
await workspaces(page, directory, true)
await page.reload()
@@ -108,6 +104,7 @@ test("switching back to a project opens the latest workspace session", async ({
const workspaceSlug = slugFromUrl(page.url())
workspaceDir = base64Decode(workspaceSlug)
if (!workspaceDir) throw new Error(`Failed to decode workspace slug: ${workspaceSlug}`)
+ trackDirectory(workspaceDir)
await openSidebar(page)
const workspace = page.locator(workspaceItemSelector(workspaceSlug)).first()
@@ -131,7 +128,7 @@ test("switching back to a project opens the latest workspace session", async ({
const created = sessionIDFromUrl(page.url())
if (!created) throw new Error(`Failed to get session ID from url: ${page.url()}`)
- sessionID = created
+ trackSession(created, workspaceDir)
await expect(page).toHaveURL(new RegExp(`/${workspaceSlug}/session/${created}(?:[/?#]|$)`))
@@ -152,20 +149,6 @@ test("switching back to a project opens the latest workspace session", async ({
{ extra: [other] },
)
} finally {
- if (sessionID) {
- const id = sessionID
- const dirs = [rootDir, workspaceDir].filter((x): x is string => !!x)
- await Promise.all(
- dirs.map((directory) =>
- createSdk(directory)
- .session.delete({ sessionID: id })
- .catch(() => undefined),
- ),
- )
- }
- if (workspaceDir) {
- await cleanupTestProject(workspaceDir)
- }
await cleanupTestProject(other)
}
})
diff --git a/packages/app/e2e/projects/workspace-new-session.spec.ts b/packages/app/e2e/projects/workspace-new-session.spec.ts
index cb1294259..621ba0f3a 100644
--- a/packages/app/e2e/projects/workspace-new-session.spec.ts
+++ b/packages/app/e2e/projects/workspace-new-session.spec.ts
@@ -1,7 +1,7 @@
import { base64Decode } from "@opencode-ai/util/encode"
import type { Page } from "@playwright/test"
import { test, expect } from "../fixtures"
-import { cleanupTestProject, openSidebar, sessionIDFromUrl, setWorkspacesEnabled } from "../actions"
+import { openSidebar, sessionIDFromUrl, setWorkspacesEnabled } from "../actions"
import { promptSelector, workspaceItemSelector, workspaceNewSessionSelector } from "../selectors"
import { createSdk } from "../utils"
@@ -105,48 +105,29 @@ async function sessionDirectory(directory: string, sessionID: string) {
test("new sessions from sidebar workspace actions stay in selected workspace", async ({ page, withProject }) => {
await page.setViewportSize({ width: 1400, height: 800 })
- await withProject(async ({ directory, slug: root }) => {
- const workspaces = [] as { slug: string; directory: string }[]
- const sessions = [] as string[]
-
- try {
- await openSidebar(page)
- await setWorkspacesEnabled(page, root, true)
-
- const first = await createWorkspace(page, root, [])
- workspaces.push(first)
- await waitWorkspaceReady(page, first.slug)
-
- const second = await createWorkspace(page, root, [first.slug])
- workspaces.push(second)
- await waitWorkspaceReady(page, second.slug)
-
- const firstSession = await createSessionFromWorkspace(page, first.slug, `workspace one ${Date.now()}`)
- sessions.push(firstSession.sessionID)
-
- const secondSession = await createSessionFromWorkspace(page, second.slug, `workspace two ${Date.now()}`)
- sessions.push(secondSession.sessionID)
-
- const thirdSession = await createSessionFromWorkspace(page, first.slug, `workspace one again ${Date.now()}`)
- sessions.push(thirdSession.sessionID)
-
- await expect.poll(() => sessionDirectory(first.directory, firstSession.sessionID)).toBe(first.directory)
- await expect.poll(() => sessionDirectory(second.directory, secondSession.sessionID)).toBe(second.directory)
- await expect.poll(() => sessionDirectory(first.directory, thirdSession.sessionID)).toBe(first.directory)
- } finally {
- const dirs = [directory, ...workspaces.map((workspace) => workspace.directory)]
- await Promise.all(
- sessions.map((sessionID) =>
- Promise.all(
- dirs.map((dir) =>
- createSdk(dir)
- .session.delete({ sessionID })
- .catch(() => undefined),
- ),
- ),
- ),
- )
- await Promise.all(workspaces.map((workspace) => cleanupTestProject(workspace.directory)))
- }
+ await withProject(async ({ directory, slug: root, trackSession, trackDirectory }) => {
+ await openSidebar(page)
+ await setWorkspacesEnabled(page, root, true)
+
+ const first = await createWorkspace(page, root, [])
+ trackDirectory(first.directory)
+ await waitWorkspaceReady(page, first.slug)
+
+ const second = await createWorkspace(page, root, [first.slug])
+ trackDirectory(second.directory)
+ await waitWorkspaceReady(page, second.slug)
+
+ const firstSession = await createSessionFromWorkspace(page, first.slug, `workspace one ${Date.now()}`)
+ trackSession(firstSession.sessionID, first.directory)
+
+ const secondSession = await createSessionFromWorkspace(page, second.slug, `workspace two ${Date.now()}`)
+ trackSession(secondSession.sessionID, second.directory)
+
+ const thirdSession = await createSessionFromWorkspace(page, first.slug, `workspace one again ${Date.now()}`)
+ trackSession(thirdSession.sessionID, first.directory)
+
+ await expect.poll(() => sessionDirectory(first.directory, firstSession.sessionID)).toBe(first.directory)
+ await expect.poll(() => sessionDirectory(second.directory, secondSession.sessionID)).toBe(second.directory)
+ await expect.poll(() => sessionDirectory(first.directory, thirdSession.sessionID)).toBe(first.directory)
})
})