Преглед изворни кода

test(app): fix dated e2e tests

Adam пре 2 недеља
родитељ
комит
93592702c3
2 измењених фајлова са 76 додато и 17 уклоњено
  1. 20 3
      packages/app/e2e/actions.ts
  2. 56 14
      packages/app/e2e/session/session.spec.ts

+ 20 - 3
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
 }

+ 56 - 14
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<typeof withSession>[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)