diff options
| author | Adam <[email protected]> | 2026-02-19 11:36:32 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-02-19 11:36:37 -0600 |
| commit | f2858a42ba17fba1e3376440e8f3aae2aa64ca61 (patch) | |
| tree | 3fbc753ccb26a79f015aa7a6dd71f384348e383a /packages/app/e2e/projects | |
| parent | 3c21735b35f779d69a5458b1fa5fada49fb7decb (diff) | |
| download | opencode-f2858a42ba17fba1e3376440e8f3aae2aa64ca61.tar.gz opencode-f2858a42ba17fba1e3376440e8f3aae2aa64ca61.zip | |
chore: cleanup
Diffstat (limited to 'packages/app/e2e/projects')
| -rw-r--r-- | packages/app/e2e/projects/projects-switch.spec.ts | 109 |
1 files changed, 106 insertions, 3 deletions
diff --git a/packages/app/e2e/projects/projects-switch.spec.ts b/packages/app/e2e/projects/projects-switch.spec.ts index a817412cd..f17557a80 100644 --- a/packages/app/e2e/projects/projects-switch.spec.ts +++ b/packages/app/e2e/projects/projects-switch.spec.ts @@ -1,7 +1,19 @@ +import { base64Decode } from "@opencode-ai/util/encode" import { test, expect } from "../fixtures" -import { defocus, createTestProject, cleanupTestProject } from "../actions" -import { projectSwitchSelector } from "../selectors" -import { dirSlug } from "../utils" +import { + defocus, + createTestProject, + cleanupTestProject, + openSidebar, + setWorkspacesEnabled, + sessionIDFromUrl, +} from "../actions" +import { projectSwitchSelector, promptSelector, workspaceItemSelector, workspaceNewSessionSelector } from "../selectors" +import { createSdk, dirSlug } from "../utils" + +function slugFromUrl(url: string) { + return /\/([^/]+)\/session(?:\/|$)/.exec(url)?.[1] ?? "" +} test("can switch between projects from sidebar", async ({ page, withProject }) => { await page.setViewportSize({ width: 1400, height: 800 }) @@ -33,3 +45,94 @@ test("can switch between projects from sidebar", async ({ page, withProject }) = await cleanupTestProject(other) } }) + +test("switching back to a project opens the latest workspace session", async ({ page, withProject }) => { + await page.setViewportSize({ width: 1400, height: 800 }) + + const other = await createTestProject() + const otherSlug = dirSlug(other) + const stamp = Date.now() + let rootDir: string | undefined + let workspaceDir: string | undefined + let sessionID: string | undefined + + try { + await withProject( + async ({ directory, slug }) => { + rootDir = directory + await defocus(page) + await openSidebar(page) + await setWorkspacesEnabled(page, slug, true) + + await page.getByRole("button", { name: "New workspace" }).first().click() + + await expect + .poll( + () => { + const next = slugFromUrl(page.url()) + if (!next) return "" + if (next === slug) return "" + return next + }, + { timeout: 45_000 }, + ) + .not.toBe("") + + const workspaceSlug = slugFromUrl(page.url()) + workspaceDir = base64Decode(workspaceSlug) + await openSidebar(page) + + const workspace = page.locator(workspaceItemSelector(workspaceSlug)).first() + await expect(workspace).toBeVisible() + await workspace.hover() + + const newSession = page.locator(workspaceNewSessionSelector(workspaceSlug)).first() + await expect(newSession).toBeVisible() + await newSession.click({ force: true }) + + await expect(page).toHaveURL(new RegExp(`/${workspaceSlug}/session(?:[/?#]|$)`)) + + const prompt = page.locator(promptSelector) + await expect(prompt).toBeVisible() + await prompt.fill(`project switch remembers workspace ${stamp}`) + await prompt.press("Enter") + + await expect.poll(() => sessionIDFromUrl(page.url()) ?? "", { timeout: 30_000 }).not.toBe("") + const created = sessionIDFromUrl(page.url()) + if (!created) throw new Error(`Failed to parse session id from URL: ${page.url()}`) + sessionID = created + await expect(page).toHaveURL(new RegExp(`/${workspaceSlug}/session/${created}(?:[/?#]|$)`)) + + await openSidebar(page) + + const otherButton = page.locator(projectSwitchSelector(otherSlug)).first() + await expect(otherButton).toBeVisible() + await otherButton.click() + await expect(page).toHaveURL(new RegExp(`/${otherSlug}/session`)) + + const rootButton = page.locator(projectSwitchSelector(slug)).first() + await expect(rootButton).toBeVisible() + await rootButton.click() + + await expect(page).toHaveURL(new RegExp(`/${workspaceSlug}/session/${created}(?:[/?#]|$)`)) + }, + { 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) + } +}) |
