summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/projects
diff options
context:
space:
mode:
authorLuke Parker <[email protected]>2026-03-07 15:42:14 +1000
committerGitHub <[email protected]>2026-03-07 15:42:14 +1000
commit8a95be492d460050ab53161be7185dc1c1783eef (patch)
tree5ca0897716d089d8d61250d252e49aff4c444089 /packages/app/e2e/projects
parentc42c5a0cc6742078bdc7484fdbbba5013d1841d7 (diff)
downloadopencode-8a95be492d460050ab53161be7185dc1c1783eef.tar.gz
opencode-8a95be492d460050ab53161be7185dc1c1783eef.zip
fix(windows): git path resolution for modified files across Git Bash, MSYS2, and Cygwin (#16422)
Diffstat (limited to 'packages/app/e2e/projects')
-rw-r--r--packages/app/e2e/projects/workspace-new-session.spec.ts60
-rw-r--r--packages/app/e2e/projects/workspaces.spec.ts45
2 files changed, 56 insertions, 49 deletions
diff --git a/packages/app/e2e/projects/workspace-new-session.spec.ts b/packages/app/e2e/projects/workspace-new-session.spec.ts
index f33972cc3..cb1294259 100644
--- a/packages/app/e2e/projects/workspace-new-session.spec.ts
+++ b/packages/app/e2e/projects/workspace-new-session.spec.ts
@@ -9,6 +9,26 @@ function slugFromUrl(url: string) {
return /\/([^/]+)\/session(?:\/|$)/.exec(url)?.[1] ?? ""
}
+async function waitSlug(page: Page, skip: string[] = []) {
+ let prev = ""
+ await expect
+ .poll(
+ () => {
+ const slug = slugFromUrl(page.url())
+ if (!slug) return ""
+ if (skip.includes(slug)) return ""
+ if (slug !== prev) {
+ prev = slug
+ return ""
+ }
+ return slug
+ },
+ { timeout: 45_000 },
+ )
+ .not.toBe("")
+ return slugFromUrl(page.url())
+}
+
async function waitWorkspaceReady(page: Page, slug: string) {
await openSidebar(page)
await expect
@@ -31,20 +51,7 @@ async function createWorkspace(page: Page, root: string, seen: string[]) {
await openSidebar(page)
await page.getByRole("button", { name: "New workspace" }).first().click()
- await expect
- .poll(
- () => {
- const slug = slugFromUrl(page.url())
- if (!slug) return ""
- if (slug === root) return ""
- if (seen.includes(slug)) return ""
- return slug
- },
- { timeout: 45_000 },
- )
- .not.toBe("")
-
- const slug = slugFromUrl(page.url())
+ const slug = await waitSlug(page, [root, ...seen])
const directory = base64Decode(slug)
if (!directory) throw new Error(`Failed to decode workspace slug: ${slug}`)
return { slug, directory }
@@ -60,12 +67,13 @@ async function openWorkspaceNewSession(page: Page, slug: string) {
await expect(button).toBeVisible()
await button.click({ force: true })
- await expect.poll(() => slugFromUrl(page.url())).toBe(slug)
- await expect(page).toHaveURL(new RegExp(`/${slug}/session(?:[/?#]|$)`))
+ const next = await waitSlug(page)
+ await expect(page).toHaveURL(new RegExp(`/${next}/session(?:[/?#]|$)`))
+ return next
}
async function createSessionFromWorkspace(page: Page, slug: string, text: string) {
- await openWorkspaceNewSession(page, slug)
+ const next = await openWorkspaceNewSession(page, slug)
const prompt = page.locator(promptSelector)
await expect(prompt).toBeVisible()
@@ -76,13 +84,13 @@ async function createSessionFromWorkspace(page: Page, slug: string, text: string
await expect.poll(async () => ((await prompt.textContent()) ?? "").trim()).toContain(text)
await prompt.press("Enter")
- await expect.poll(() => slugFromUrl(page.url())).toBe(slug)
+ await expect.poll(() => slugFromUrl(page.url())).toBe(next)
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
+ await expect(page).toHaveURL(new RegExp(`/${next}/session/${sessionID}(?:[/?#]|$)`))
+ return { sessionID, slug: next }
}
async function sessionDirectory(directory: string, sessionID: string) {
@@ -114,17 +122,17 @@ test("new sessions from sidebar workspace actions stay in selected workspace", a
await waitWorkspaceReady(page, second.slug)
const firstSession = await createSessionFromWorkspace(page, first.slug, `workspace one ${Date.now()}`)
- sessions.push(firstSession)
+ sessions.push(firstSession.sessionID)
const secondSession = await createSessionFromWorkspace(page, second.slug, `workspace two ${Date.now()}`)
- sessions.push(secondSession)
+ sessions.push(secondSession.sessionID)
const thirdSession = await createSessionFromWorkspace(page, first.slug, `workspace one again ${Date.now()}`)
- sessions.push(thirdSession)
+ sessions.push(thirdSession.sessionID)
- await expect.poll(() => sessionDirectory(first.directory, firstSession)).toBe(first.directory)
- await expect.poll(() => sessionDirectory(second.directory, secondSession)).toBe(second.directory)
- await expect.poll(() => sessionDirectory(first.directory, thirdSession)).toBe(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)
} finally {
const dirs = [directory, ...workspaces.map((workspace) => workspace.directory)]
await Promise.all(
diff --git a/packages/app/e2e/projects/workspaces.spec.ts b/packages/app/e2e/projects/workspaces.spec.ts
index 41c6bea8f..805b45e98 100644
--- a/packages/app/e2e/projects/workspaces.spec.ts
+++ b/packages/app/e2e/projects/workspaces.spec.ts
@@ -22,24 +22,34 @@ function slugFromUrl(url: string) {
return /\/([^/]+)\/session(?:\/|$)/.exec(url)?.[1] ?? ""
}
-async function setupWorkspaceTest(page: Page, project: { slug: string }) {
- const rootSlug = project.slug
- await openSidebar(page)
-
- await setWorkspacesEnabled(page, rootSlug, true)
-
- await page.getByRole("button", { name: "New workspace" }).first().click()
+async function waitSlug(page: Page, skip: string[] = []) {
+ let prev = ""
await expect
.poll(
() => {
const slug = slugFromUrl(page.url())
- return slug.length > 0 && slug !== rootSlug
+ if (!slug) return ""
+ if (skip.includes(slug)) return ""
+ if (slug !== prev) {
+ prev = slug
+ return ""
+ }
+ return slug
},
{ timeout: 45_000 },
)
- .toBe(true)
+ .not.toBe("")
+ return slugFromUrl(page.url())
+}
+
+async function setupWorkspaceTest(page: Page, project: { slug: string }) {
+ const rootSlug = project.slug
+ await openSidebar(page)
+
+ await setWorkspacesEnabled(page, rootSlug, true)
- const slug = slugFromUrl(page.url())
+ await page.getByRole("button", { name: "New workspace" }).first().click()
+ const slug = await waitSlug(page, [rootSlug])
const dir = base64Decode(slug)
await openSidebar(page)
@@ -91,18 +101,7 @@ test("can create a workspace", async ({ page, withProject }) => {
await expect(page.getByRole("button", { name: "New workspace" }).first()).toBeVisible()
await page.getByRole("button", { name: "New workspace" }).first().click()
-
- await expect
- .poll(
- () => {
- const currentSlug = slugFromUrl(page.url())
- return currentSlug.length > 0 && currentSlug !== slug
- },
- { timeout: 45_000 },
- )
- .toBe(true)
-
- const workspaceSlug = slugFromUrl(page.url())
+ const workspaceSlug = await waitSlug(page, [slug])
const workspaceDir = base64Decode(workspaceSlug)
await openSidebar(page)
@@ -279,7 +278,7 @@ test("can delete a workspace", async ({ page, withProject }) => {
await clickMenuItem(menu, /^Delete$/i, { force: true })
await confirmDialog(page, /^Delete workspace$/i)
- await expect(page).toHaveURL(new RegExp(`/${rootSlug}/session`))
+ await expect.poll(() => base64Decode(slugFromUrl(page.url()))).toBe(project.directory)
await expect
.poll(