From 31e92f1454af22e5b902164005ff845895942716 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 25 Mar 2026 15:01:43 -0400 Subject: [PATCH] fix(app): normalize e2e workspace path checks --- packages/app/e2e/actions.ts | 18 ++++++++++-------- packages/app/e2e/utils.ts | 13 +++++++++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/app/e2e/actions.ts b/packages/app/e2e/actions.ts index 90af177ed1..e798797c7c 100644 --- a/packages/app/e2e/actions.ts +++ b/packages/app/e2e/actions.ts @@ -5,7 +5,7 @@ import os from "node:os" import path from "node:path" import { execSync } from "node:child_process" import { terminalAttr, type E2EWindow } from "../src/testing/terminal" -import { createSdk, modKey, resolveDirectory, serverUrl } from "./utils" +import { createSdk, modKey, resolveDirectory, serverUrl, workspaceKey } from "./utils" import { dropdownMenuTriggerSelector, dropdownMenuContentSelector, @@ -438,7 +438,7 @@ export async function resolveSlug(slug: string) { } export async function waitDir(page: Page, directory: string) { - const target = await resolveDirectory(directory) + const target = workspaceKey(await resolveDirectory(directory)) await expect .poll( async () => { @@ -446,7 +446,7 @@ export async function waitDir(page: Page, directory: string) { const slug = slugFromUrl(page.url()) if (!slug) return "" return resolveSlug(slug) - .then((item) => item.directory) + .then((item) => workspaceKey(item.directory)) .catch(() => "") }, { timeout: 45_000 }, @@ -456,7 +456,7 @@ export async function waitDir(page: Page, directory: string) { } export async function waitSession(page: Page, input: { directory: string; sessionID?: string }) { - const target = await resolveDirectory(input.directory) + const target = workspaceKey(await resolveDirectory(input.directory)) await expect .poll( async () => { @@ -464,14 +464,14 @@ export async function waitSession(page: Page, input: { directory: string; sessio const slug = slugFromUrl(page.url()) if (!slug) return false const resolved = await resolveSlug(slug).catch(() => undefined) - if (!resolved || resolved.directory !== target) return false + if (!resolved || workspaceKey(resolved.directory) !== target) return false if (input.sessionID && sessionIDFromUrl(page.url()) !== input.sessionID) return false const state = await probeSession(page) if (input.sessionID && (!state || state.sessionID !== input.sessionID)) return false if (state?.dir) { const dir = await resolveDirectory(state.dir).catch(() => state.dir ?? "") - if (dir !== target) return false + if (workspaceKey(dir) !== target) return false } return page @@ -488,7 +488,7 @@ export async function waitSession(page: Page, input: { directory: string; sessio export async function waitSessionSaved(directory: string, sessionID: string, timeout = 30_000) { const sdk = createSdk(directory) - const target = await resolveDirectory(directory) + const target = workspaceKey(await resolveDirectory(directory)) await expect .poll( @@ -498,7 +498,9 @@ export async function waitSessionSaved(directory: string, sessionID: string, tim .then((x) => x.data) .catch(() => undefined) if (!data?.directory) return "" - return resolveDirectory(data.directory).catch(() => data.directory) + return resolveDirectory(data.directory) + .then(workspaceKey) + .catch(() => workspaceKey(data.directory)) }, { timeout }, ) diff --git a/packages/app/e2e/utils.ts b/packages/app/e2e/utils.ts index f07a8d3f11..0cedf93e93 100644 --- a/packages/app/e2e/utils.ts +++ b/packages/app/e2e/utils.ts @@ -36,6 +36,14 @@ export async function resolveDirectory(directory: string) { .then((x) => x.data?.directory ?? directory) } +export function workspaceKey(dir: string) { + const value = dir.replaceAll("\\", "/") + const drive = value.match(/^([A-Za-z]:)\/+$/) + if (drive) return `${drive[1]}/` + if (/^\/+$/i.test(value)) return "/" + return value.replace(/\/+$/, "") +} + export async function getWorktree() { const sdk = createSdk() const result = await sdk.path.get() @@ -57,7 +65,8 @@ export function sessionPath(directory: string, sessionID?: string) { } export function workspacePersistKey(directory: string, key: string) { - const head = (directory.slice(0, 12) || "workspace").replace(/[^a-zA-Z0-9._-]/g, "-") - const sum = checksum(directory) ?? "0" + const dir = workspaceKey(directory) + const head = (dir.slice(0, 12) || "workspace").replace(/[^a-zA-Z0-9._-]/g, "-") + const sum = checksum(dir) ?? "0" return `opencode.workspace.${head}.${sum}.dat:workspace:${key}` }