Skip to content

Commit 66fcab7

Browse files
authored
fix(app): preserve file tree tab on reopen + fix e2e test regressions (anomalyco#16482)
1 parent 641e178 commit 66fcab7

7 files changed

Lines changed: 50 additions & 39 deletions

File tree

packages/app/e2e/app/home.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { test, expect } from "../fixtures"
2-
import { serverName } from "../utils"
2+
import { serverNamePattern } from "../utils"
33

44
test("home renders and shows core entrypoints", async ({ page }) => {
55
await page.goto("/")
66

77
await expect(page.getByRole("button", { name: "Open project" }).first()).toBeVisible()
8-
await expect(page.getByRole("button", { name: serverName })).toBeVisible()
8+
await expect(page.getByRole("button", { name: serverNamePattern })).toBeVisible()
99
})
1010

1111
test("server picker dialog opens from home", async ({ page }) => {
1212
await page.goto("/")
1313

14-
const trigger = page.getByRole("button", { name: serverName })
14+
const trigger = page.getByRole("button", { name: serverNamePattern })
1515
await expect(trigger).toBeVisible()
1616
await trigger.click()
1717

packages/app/e2e/app/server-default.spec.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { test, expect } from "../fixtures"
2-
import { serverName, serverUrl } from "../utils"
3-
import { clickListItem, closeDialog, clickMenuItem } from "../actions"
2+
import { serverNamePattern, serverUrls } from "../utils"
3+
import { closeDialog, clickMenuItem } from "../actions"
44

55
const DEFAULT_SERVER_URL_KEY = "opencode.settings.dat:defaultServerUrl"
66

@@ -31,25 +31,28 @@ test("can set a default server on web", async ({ page, gotoSession }) => {
3131
const dialog = page.getByRole("dialog")
3232
await expect(dialog).toBeVisible()
3333

34-
const row = dialog.locator('[data-slot="list-item"]').filter({ hasText: serverName }).first()
35-
await expect(row).toBeVisible()
34+
await expect(dialog.getByText(serverNamePattern).first()).toBeVisible()
3635

37-
const menuTrigger = row.locator('[data-slot="dropdown-menu-trigger"]').first()
36+
const menuTrigger = dialog.locator('[data-slot="dropdown-menu-trigger"]').first()
3837
await expect(menuTrigger).toBeVisible()
3938
await menuTrigger.click({ force: true })
4039

4140
const menu = page.locator('[data-component="dropdown-menu-content"]').first()
4241
await expect(menu).toBeVisible()
4342
await clickMenuItem(menu, /set as default/i)
4443

45-
await expect.poll(() => page.evaluate((key) => localStorage.getItem(key), DEFAULT_SERVER_URL_KEY)).toBe(serverUrl)
46-
await expect(row.getByText("Default", { exact: true })).toBeVisible()
44+
await expect
45+
.poll(async () =>
46+
serverUrls.includes((await page.evaluate((key) => localStorage.getItem(key), DEFAULT_SERVER_URL_KEY)) ?? ""),
47+
)
48+
.toBe(true)
49+
await expect(dialog.getByText("Default", { exact: true })).toBeVisible()
4750

4851
await closeDialog(page, dialog)
4952

5053
await ensurePopoverOpen()
5154

52-
const serverRow = popover.locator("button").filter({ hasText: serverName }).first()
55+
const serverRow = popover.locator("button").filter({ hasText: serverNamePattern }).first()
5356
await expect(serverRow).toBeVisible()
5457
await expect(serverRow.getByText("Default", { exact: true })).toBeVisible()
5558
})

packages/app/e2e/commands/panels.spec.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ const expanded = async (el: { getAttribute: (name: string) => Promise<string | n
1010
test("review panel can be toggled via keybind", async ({ page, gotoSession }) => {
1111
await gotoSession()
1212

13+
const reviewPanel = page.locator("#review-panel")
14+
1315
const treeToggle = page.getByRole("button", { name: "Toggle file tree" }).first()
1416
await expect(treeToggle).toBeVisible()
1517
if (await expanded(treeToggle)) await treeToggle.click()
@@ -19,13 +21,13 @@ test("review panel can be toggled via keybind", async ({ page, gotoSession }) =>
1921
await expect(reviewToggle).toBeVisible()
2022
if (await expanded(reviewToggle)) await reviewToggle.click()
2123
await expect(reviewToggle).toHaveAttribute("aria-expanded", "false")
22-
await expect(page.locator("#review-panel")).toHaveCount(0)
24+
await expect(reviewPanel).toHaveAttribute("aria-hidden", "true")
2325

2426
await page.keyboard.press(`${modKey}+Shift+R`)
2527
await expect(reviewToggle).toHaveAttribute("aria-expanded", "true")
26-
await expect(page.locator("#review-panel")).toBeVisible()
28+
await expect(reviewPanel).toHaveAttribute("aria-hidden", "false")
2729

2830
await page.keyboard.press(`${modKey}+Shift+R`)
2931
await expect(reviewToggle).toHaveAttribute("aria-expanded", "false")
30-
await expect(page.locator("#review-panel")).toHaveCount(0)
32+
await expect(reviewPanel).toHaveAttribute("aria-hidden", "true")
3133
})

packages/app/e2e/files/file-tree.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ test("file tree can expand folders and open a file", async ({ page, gotoSession
4343
await tab.click()
4444
await expect(tab).toHaveAttribute("aria-selected", "true")
4545

46+
await toggle.click()
47+
await expect(toggle).toHaveAttribute("aria-expanded", "false")
48+
49+
await toggle.click()
50+
await expect(toggle).toHaveAttribute("aria-expanded", "true")
51+
await expect(allTab).toHaveAttribute("aria-selected", "true")
52+
4653
const viewer = page.locator('[data-component="file"][data-mode="text"]').first()
4754
await expect(viewer).toBeVisible()
4855
await expect(viewer).toContainText("export default function FileTree")

packages/app/e2e/session/session-undo-redo.spec.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ async function seedConversation(input: {
4545
.toBe(true)
4646

4747
if (!userMessageID) throw new Error("Expected a user message id")
48-
await expect(input.page.locator(`[data-message-id="${userMessageID}"]`).first()).toBeVisible({ timeout: 30_000 })
48+
await expect(input.page.locator(`[data-message-id="${userMessageID}"]`)).toHaveCount(1, { timeout: 30_000 })
4949
return { prompt, userMessageID }
5050
}
5151

@@ -123,7 +123,7 @@ test("slash redo clears revert and restores latest state", async ({ page, withPr
123123
.toBeUndefined()
124124

125125
await expect(seeded.prompt).not.toContainText(token)
126-
await expect(page.locator(`[data-message-id="${seeded.userMessageID}"]`).first()).toBeVisible()
126+
await expect(page.locator(`[data-message-id="${seeded.userMessageID}"]`)).toHaveCount(1)
127127
})
128128
})
129129
})
@@ -158,8 +158,8 @@ test("slash undo/redo traverses multi-step revert stack", async ({ page, withPro
158158
const firstMessage = page.locator(`[data-message-id="${first.userMessageID}"]`)
159159
const secondMessage = page.locator(`[data-message-id="${second.userMessageID}"]`)
160160

161-
await expect(firstMessage.first()).toBeVisible()
162-
await expect(secondMessage.first()).toBeVisible()
161+
await expect(firstMessage).toHaveCount(1)
162+
await expect(secondMessage).toHaveCount(1)
163163

164164
await second.prompt.click()
165165
await page.keyboard.press(`${modKey}+A`)
@@ -176,7 +176,7 @@ test("slash undo/redo traverses multi-step revert stack", async ({ page, withPro
176176
})
177177
.toBe(second.userMessageID)
178178

179-
await expect(firstMessage.first()).toBeVisible()
179+
await expect(firstMessage).toHaveCount(1)
180180
await expect(secondMessage).toHaveCount(0)
181181

182182
await second.prompt.click()
@@ -210,7 +210,7 @@ test("slash undo/redo traverses multi-step revert stack", async ({ page, withPro
210210
})
211211
.toBe(second.userMessageID)
212212

213-
await expect(firstMessage.first()).toBeVisible()
213+
await expect(firstMessage).toHaveCount(1)
214214
await expect(secondMessage).toHaveCount(0)
215215

216216
await second.prompt.click()
@@ -226,8 +226,8 @@ test("slash undo/redo traverses multi-step revert stack", async ({ page, withPro
226226
})
227227
.toBeUndefined()
228228

229-
await expect(firstMessage.first()).toBeVisible()
230-
await expect(secondMessage.first()).toBeVisible()
229+
await expect(firstMessage).toHaveCount(1)
230+
await expect(secondMessage).toHaveCount(1)
231231
})
232232
})
233233
})

packages/app/e2e/utils.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,22 @@ export const serverPort = process.env.PLAYWRIGHT_SERVER_PORT ?? "4096"
77
export const serverUrl = `http://${serverHost}:${serverPort}`
88
export const serverName = `${serverHost}:${serverPort}`
99

10+
const localHosts = ["127.0.0.1", "localhost"]
11+
12+
const serverLabels = (() => {
13+
const url = new URL(serverUrl)
14+
if (!localHosts.includes(url.hostname)) return [serverName]
15+
return localHosts.map((host) => `${host}:${url.port}`)
16+
})()
17+
18+
export const serverNames = [...new Set(serverLabels)]
19+
20+
export const serverUrls = serverNames.map((name) => `http://${name}`)
21+
22+
const escape = (value: string) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
23+
24+
export const serverNamePattern = new RegExp(`(?:${serverNames.map(escape).join("|")})`)
25+
1026
export const modKey = process.platform === "darwin" ? "Meta" : "Control"
1127
export const terminalToggleKey = "Control+Backquote"
1228

packages/app/src/pages/session.tsx

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,23 +1038,6 @@ export default function Page() {
10381038
tabs().setActive(next)
10391039
})
10401040

1041-
createEffect(
1042-
on(
1043-
() => layout.fileTree.opened(),
1044-
(opened, prev) => {
1045-
if (prev === undefined) return
1046-
if (!isDesktop()) return
1047-
1048-
if (opened) {
1049-
const active = tabs().active()
1050-
const tab = active === "review" || (!active && hasReview()) ? "changes" : "all"
1051-
layout.fileTree.setTab(tab)
1052-
}
1053-
},
1054-
{ defer: true },
1055-
),
1056-
)
1057-
10581041
createEffect(() => {
10591042
const id = params.id
10601043
if (!id) return

0 commit comments

Comments
 (0)