fix(app): normalize e2e workspace path checks

This commit is contained in:
Kit Langton 2026-03-25 15:01:43 -04:00
commit 31e92f1454
2 changed files with 21 additions and 10 deletions

View file

@ -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 },
)

View file

@ -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}`
}