summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/projects
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-19 11:36:32 -0600
committerAdam <[email protected]>2026-02-19 11:36:37 -0600
commitf2858a42ba17fba1e3376440e8f3aae2aa64ca61 (patch)
tree3fbc753ccb26a79f015aa7a6dd71f384348e383a /packages/app/e2e/projects
parent3c21735b35f779d69a5458b1fa5fada49fb7decb (diff)
downloadopencode-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.ts109
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)
+ }
+})