From 93592702c33c5105b25f177c4db967a8db53cb69 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Wed, 4 Feb 2026 10:10:16 -0600 Subject: [PATCH] test(app): fix dated e2e tests --- packages/app/e2e/actions.ts | 23 +++++++- packages/app/e2e/session/session.spec.ts | 70 +++++++++++++++++++----- 2 files changed, 76 insertions(+), 17 deletions(-) diff --git a/packages/app/e2e/actions.ts b/packages/app/e2e/actions.ts index 5f80d67c2..ebcc9effd 100644 --- a/packages/app/e2e/actions.ts +++ b/packages/app/e2e/actions.ts @@ -182,13 +182,30 @@ export async function hoverSessionItem(page: Page, sessionID: string) { } export async function openSessionMoreMenu(page: Page, sessionID: string) { - const sessionEl = await hoverSessionItem(page, sessionID) + await expect(page).toHaveURL(new RegExp(`/session/${sessionID}(?:[/?#]|$)`)) - const menuTrigger = sessionEl.locator(dropdownMenuTriggerSelector).first() + const scroller = page.locator(".session-scroller").first() + await expect(scroller).toBeVisible() + await expect(scroller.getByRole("heading", { level: 1 }).first()).toBeVisible({ timeout: 30_000 }) + + const menu = page + .locator(dropdownMenuContentSelector) + .filter({ has: page.getByRole("menuitem", { name: /rename/i }) }) + .filter({ has: page.getByRole("menuitem", { name: /archive/i }) }) + .filter({ has: page.getByRole("menuitem", { name: /delete/i }) }) + .first() + + const opened = await menu + .isVisible() + .then((x) => x) + .catch(() => false) + + if (opened) return menu + + const menuTrigger = scroller.getByRole("button", { name: /more options/i }).first() await expect(menuTrigger).toBeVisible() await menuTrigger.click() - const menu = page.locator(dropdownMenuContentSelector).first() await expect(menu).toBeVisible() return menu } diff --git a/packages/app/e2e/session/session.spec.ts b/packages/app/e2e/session/session.spec.ts index 05984bbee..4610fb331 100644 --- a/packages/app/e2e/session/session.spec.ts +++ b/packages/app/e2e/session/session.spec.ts @@ -11,57 +11,98 @@ import { sessionItemSelector, inlineInputSelector } from "../selectors" const shareDisabled = process.env.OPENCODE_DISABLE_SHARE === "true" || process.env.OPENCODE_DISABLE_SHARE === "1" -test("sidebar session can be renamed", async ({ page, sdk, gotoSession }) => { +type Sdk = Parameters[0] + +async function seedMessage(sdk: Sdk, sessionID: string) { + await sdk.session.promptAsync({ + sessionID, + noReply: true, + parts: [{ type: "text", text: "e2e seed" }], + }) + + await expect + .poll( + async () => { + const messages = await sdk.session.messages({ sessionID, limit: 1 }).then((r) => r.data ?? []) + return messages.length + }, + { timeout: 30_000 }, + ) + .toBeGreaterThan(0) +} + +test("session can be renamed via header menu", async ({ page, sdk, gotoSession }) => { const stamp = Date.now() const originalTitle = `e2e rename test ${stamp}` const newTitle = `e2e renamed ${stamp}` await withSession(sdk, originalTitle, async (session) => { + await seedMessage(sdk, session.id) await gotoSession(session.id) - await openSidebar(page) const menu = await openSessionMoreMenu(page, session.id) await clickMenuItem(menu, /rename/i) - const input = page.locator(sessionItemSelector(session.id)).locator(inlineInputSelector).first() + const input = page.locator(".session-scroller").locator(inlineInputSelector).first() await expect(input).toBeVisible() await input.fill(newTitle) await input.press("Enter") - await expect(page.locator(sessionItemSelector(session.id)).locator("a").first()).toContainText(newTitle) + await expect(page.getByRole("heading", { level: 1 }).first()).toContainText(newTitle) }) }) -test("sidebar session can be archived", async ({ page, sdk, gotoSession }) => { +test("session can be archived via header menu", async ({ page, sdk, gotoSession }) => { const stamp = Date.now() const title = `e2e archive test ${stamp}` await withSession(sdk, title, async (session) => { + await seedMessage(sdk, session.id) await gotoSession(session.id) - await openSidebar(page) - - const sessionEl = page.locator(sessionItemSelector(session.id)) const menu = await openSessionMoreMenu(page, session.id) await clickMenuItem(menu, /archive/i) - await expect(sessionEl).not.toBeVisible() + await expect + .poll( + async () => { + const data = await sdk.session.get({ sessionID: session.id }).then((r) => r.data) + return data?.time?.archived + }, + { timeout: 30_000 }, + ) + .not.toBeUndefined() + + await openSidebar(page) + await expect(page.locator(sessionItemSelector(session.id))).toHaveCount(0) }) }) -test("sidebar session can be deleted", async ({ page, sdk, gotoSession }) => { +test("session can be deleted via header menu", async ({ page, sdk, gotoSession }) => { const stamp = Date.now() const title = `e2e delete test ${stamp}` await withSession(sdk, title, async (session) => { + await seedMessage(sdk, session.id) await gotoSession(session.id) - await openSidebar(page) - - const sessionEl = page.locator(sessionItemSelector(session.id)) const menu = await openSessionMoreMenu(page, session.id) await clickMenuItem(menu, /delete/i) await confirmDialog(page, /delete/i) - await expect(sessionEl).not.toBeVisible() + await expect + .poll( + async () => { + const data = await sdk.session + .get({ sessionID: session.id }) + .then((r) => r.data) + .catch(() => undefined) + return data?.id + }, + { timeout: 30_000 }, + ) + .toBeUndefined() + + await openSidebar(page) + await expect(page.locator(sessionItemSelector(session.id))).toHaveCount(0) }) }) @@ -72,6 +113,7 @@ test("session can be shared and unshared via header button", async ({ page, sdk, const title = `e2e share test ${stamp}` await withSession(sdk, title, async (session) => { + await seedMessage(sdk, session.id) await gotoSession(session.id) const { rightSection, popoverBody } = await openSharePopover(page)