summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/projects
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-12 09:49:14 -0600
committerGitHub <[email protected]>2026-02-12 09:49:14 -0600
commitff4414bb152acfddb5c0eb073c38bedc1df4ae14 (patch)
tree78381c67d21ef6f089647f6b19e7aa2976840dbc /packages/app/e2e/projects
parent56ad2db02055955f926fda0e4a89055b22ead6f9 (diff)
downloadopencode-ff4414bb152acfddb5c0eb073c38bedc1df4ae14.tar.gz
opencode-ff4414bb152acfddb5c0eb073c38bedc1df4ae14.zip
chore: refactor packages/app files (#13236)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Frank <[email protected]>
Diffstat (limited to 'packages/app/e2e/projects')
-rw-r--r--packages/app/e2e/projects/workspace-new-session.spec.ts10
-rw-r--r--packages/app/e2e/projects/workspaces.spec.ts86
2 files changed, 67 insertions, 29 deletions
diff --git a/packages/app/e2e/projects/workspace-new-session.spec.ts b/packages/app/e2e/projects/workspace-new-session.spec.ts
index 5af314caf..f33972cc3 100644
--- a/packages/app/e2e/projects/workspace-new-session.spec.ts
+++ b/packages/app/e2e/projects/workspace-new-session.spec.ts
@@ -69,15 +69,19 @@ async function createSessionFromWorkspace(page: Page, slug: string, text: string
const prompt = page.locator(promptSelector)
await expect(prompt).toBeVisible()
+ await expect(prompt).toBeEditable()
await prompt.click()
- await page.keyboard.type(text)
- await page.keyboard.press("Enter")
+ await expect(prompt).toBeFocused()
+ await prompt.fill(text)
+ await expect.poll(async () => ((await prompt.textContent()) ?? "").trim()).toContain(text)
+ await prompt.press("Enter")
await expect.poll(() => slugFromUrl(page.url())).toBe(slug)
- await expect(page).toHaveURL(new RegExp(`/${slug}/session/[^/?#]+`), { timeout: 30_000 })
+ await expect.poll(() => sessionIDFromUrl(page.url()) ?? "", { timeout: 30_000 }).not.toBe("")
const sessionID = sessionIDFromUrl(page.url())
if (!sessionID) throw new Error(`Failed to parse session id from url: ${page.url()}`)
+ await expect(page).toHaveURL(new RegExp(`/${slug}/session/${sessionID}(?:[/?#]|$)`))
return sessionID
}
diff --git a/packages/app/e2e/projects/workspaces.spec.ts b/packages/app/e2e/projects/workspaces.spec.ts
index 071c398b2..386739526 100644
--- a/packages/app/e2e/projects/workspaces.spec.ts
+++ b/packages/app/e2e/projects/workspaces.spec.ts
@@ -11,18 +11,12 @@ import {
cleanupTestProject,
clickMenuItem,
confirmDialog,
- openProjectMenu,
openSidebar,
openWorkspaceMenu,
setWorkspacesEnabled,
} from "../actions"
-import {
- inlineInputSelector,
- projectSwitchSelector,
- projectWorkspacesToggleSelector,
- workspaceItemSelector,
-} from "../selectors"
-import { dirSlug } from "../utils"
+import { dropdownMenuContentSelector, inlineInputSelector, workspaceItemSelector } from "../selectors"
+import { createSdk, dirSlug } from "../utils"
function slugFromUrl(url: string) {
return /\/([^/]+)\/session(?:\/|$)/.exec(url)?.[1] ?? ""
@@ -143,26 +137,35 @@ test("non-git projects keep workspace mode disabled", async ({ page, withProject
await fs.writeFile(path.join(nonGit, "README.md"), "# e2e nongit\n")
try {
- await withProject(
- async () => {
- await openSidebar(page)
+ await withProject(async () => {
+ await page.goto(`/${nonGitSlug}/session`)
+
+ await expect.poll(() => slugFromUrl(page.url()), { timeout: 30_000 }).not.toBe("")
- const nonGitButton = page.locator(projectSwitchSelector(nonGitSlug)).first()
- await expect(nonGitButton).toBeVisible()
- await nonGitButton.click()
- await expect(page).toHaveURL(new RegExp(`/${nonGitSlug}/session`))
+ const activeDir = base64Decode(slugFromUrl(page.url()))
+ expect(path.basename(activeDir)).toContain("opencode-e2e-project-nongit-")
- const menu = await openProjectMenu(page, nonGitSlug)
- const toggle = menu.locator(projectWorkspacesToggleSelector(nonGitSlug)).first()
+ await openSidebar(page)
+ await expect(page.getByRole("button", { name: "New workspace" })).toHaveCount(0)
- await expect(toggle).toBeVisible()
- await expect(toggle).toBeDisabled()
+ const trigger = page.locator('[data-action="project-menu"]').first()
+ const hasMenu = await trigger
+ .isVisible()
+ .then((x) => x)
+ .catch(() => false)
+ if (!hasMenu) return
- await expect(menu.getByRole("menuitem", { name: "New workspace" })).toHaveCount(0)
- await expect(page.getByRole("button", { name: "New workspace" })).toHaveCount(0)
- },
- { extra: [nonGit] },
- )
+ await trigger.click({ force: true })
+
+ const menu = page.locator(dropdownMenuContentSelector).first()
+ await expect(menu).toBeVisible()
+
+ const toggle = menu.locator('[data-action="project-workspaces-toggle"]').first()
+
+ await expect(toggle).toBeVisible()
+ await expect(toggle).toBeDisabled()
+ await expect(menu.getByRole("menuitem", { name: "New workspace" })).toHaveCount(0)
+ })
} finally {
await cleanupTestProject(nonGit)
}
@@ -256,14 +259,45 @@ test("can delete a workspace", async ({ page, withProject }) => {
await page.setViewportSize({ width: 1400, height: 800 })
await withProject(async (project) => {
- const { rootSlug, slug } = await setupWorkspaceTest(page, project)
+ const sdk = createSdk(project.directory)
+ const { rootSlug, slug, directory } = await setupWorkspaceTest(page, project)
+
+ await expect
+ .poll(
+ async () => {
+ const worktrees = await sdk.worktree
+ .list()
+ .then((r) => r.data ?? [])
+ .catch(() => [] as string[])
+ return worktrees.includes(directory)
+ },
+ { timeout: 30_000 },
+ )
+ .toBe(true)
const menu = await openWorkspaceMenu(page, slug)
await clickMenuItem(menu, /^Delete$/i, { force: true })
await confirmDialog(page, /^Delete workspace$/i)
await expect(page).toHaveURL(new RegExp(`/${rootSlug}/session`))
- await expect(page.locator(workspaceItemSelector(slug))).toHaveCount(0)
+
+ await expect
+ .poll(
+ async () => {
+ const worktrees = await sdk.worktree
+ .list()
+ .then((r) => r.data ?? [])
+ .catch(() => [] as string[])
+ return worktrees.includes(directory)
+ },
+ { timeout: 60_000 },
+ )
+ .toBe(false)
+
+ await project.gotoSession()
+
+ await openSidebar(page)
+ await expect(page.locator(workspaceItemSelector(slug))).toHaveCount(0, { timeout: 60_000 })
await expect(page.locator(workspaceItemSelector(rootSlug)).first()).toBeVisible()
})
})