summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/session
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-11 09:11:41 -0600
committeropencode <[email protected]>2026-02-11 15:12:28 +0000
commitfc88dde63f1c4a7f547bbe0634c68c5ce9fc787c (patch)
tree4e6aaad7afb646348c3b676a6269455dac63a7d8 /packages/app/e2e/session
parent4619e9d183d036f2f7234046927ec2f72d426168 (diff)
downloadopencode-fc88dde63f1c4a7f547bbe0634c68c5ce9fc787c.tar.gz
opencode-fc88dde63f1c4a7f547bbe0634c68c5ce9fc787c.zip
test(app): more e2e tests (#13162)
Diffstat (limited to 'packages/app/e2e/session')
-rw-r--r--packages/app/e2e/session/session-undo-redo.spec.ts113
1 files changed, 111 insertions, 2 deletions
diff --git a/packages/app/e2e/session/session-undo-redo.spec.ts b/packages/app/e2e/session/session-undo-redo.spec.ts
index c7af038c2..2a250dd86 100644
--- a/packages/app/e2e/session/session-undo-redo.spec.ts
+++ b/packages/app/e2e/session/session-undo-redo.spec.ts
@@ -23,10 +23,15 @@ async function seedConversation(input: {
const messages = await input.sdk.session
.messages({ sessionID: input.sessionID, limit: 50 })
.then((r) => r.data ?? [])
- const users = messages.filter((m) => m.info.role === "user")
+ const users = messages.filter(
+ (m) =>
+ m.info.role === "user" &&
+ m.parts.filter((p) => p.type === "text").some((p) => p.text.includes(input.token)),
+ )
if (users.length === 0) return false
- const user = users.reduce((acc, item) => (item.info.id > acc.info.id ? item : acc))
+ const user = users[users.length - 1]
+ if (!user) return false
userMessageID = user.info.id
const assistantText = messages
@@ -124,3 +129,107 @@ test("slash redo clears revert and restores latest state", async ({ page, withPr
})
})
})
+
+test("slash undo/redo traverses multi-step revert stack", async ({ page, withProject }) => {
+ test.setTimeout(120_000)
+
+ const firstToken = `undo_redo_first_${Date.now()}`
+ const secondToken = `undo_redo_second_${Date.now()}`
+
+ await withProject(async (project) => {
+ const sdk = createSdk(project.directory)
+
+ await withSession(sdk, `e2e undo redo stack ${Date.now()}`, async (session) => {
+ await project.gotoSession(session.id)
+
+ const first = await seedConversation({
+ page,
+ sdk,
+ sessionID: session.id,
+ token: firstToken,
+ })
+ const second = await seedConversation({
+ page,
+ sdk,
+ sessionID: session.id,
+ token: secondToken,
+ })
+
+ expect(first.userMessageID).not.toBe(second.userMessageID)
+
+ const firstMessage = page.locator(`[data-message-id="${first.userMessageID}"]`)
+ const secondMessage = page.locator(`[data-message-id="${second.userMessageID}"]`)
+
+ await expect(firstMessage.first()).toBeVisible()
+ await expect(secondMessage.first()).toBeVisible()
+
+ await second.prompt.click()
+ await page.keyboard.press(`${modKey}+A`)
+ await page.keyboard.press("Backspace")
+ await page.keyboard.type("/undo")
+
+ const undo = page.locator('[data-slash-id="session.undo"]').first()
+ await expect(undo).toBeVisible()
+ await page.keyboard.press("Enter")
+
+ await expect
+ .poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
+ timeout: 30_000,
+ })
+ .toBe(second.userMessageID)
+
+ await expect(firstMessage.first()).toBeVisible()
+ await expect(secondMessage).toHaveCount(0)
+
+ await second.prompt.click()
+ await page.keyboard.press(`${modKey}+A`)
+ await page.keyboard.press("Backspace")
+ await page.keyboard.type("/undo")
+ await expect(undo).toBeVisible()
+ await page.keyboard.press("Enter")
+
+ await expect
+ .poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
+ timeout: 30_000,
+ })
+ .toBe(first.userMessageID)
+
+ await expect(firstMessage).toHaveCount(0)
+ await expect(secondMessage).toHaveCount(0)
+
+ await second.prompt.click()
+ await page.keyboard.press(`${modKey}+A`)
+ await page.keyboard.press("Backspace")
+ await page.keyboard.type("/redo")
+
+ const redo = page.locator('[data-slash-id="session.redo"]').first()
+ await expect(redo).toBeVisible()
+ await page.keyboard.press("Enter")
+
+ await expect
+ .poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
+ timeout: 30_000,
+ })
+ .toBe(second.userMessageID)
+
+ await expect(firstMessage.first()).toBeVisible()
+ await expect(secondMessage).toHaveCount(0)
+
+ await second.prompt.click()
+ await page.keyboard.press(`${modKey}+A`)
+ await page.keyboard.press("Backspace")
+ await page.keyboard.type("/redo")
+ await expect(redo).toBeVisible()
+ await page.keyboard.press("Enter")
+
+ await expect
+ .poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
+ timeout: 30_000,
+ })
+ .toBeUndefined()
+
+ await expect(firstMessage.first()).toBeVisible()
+ await expect(secondMessage.first()).toBeVisible()
+ })
+ })
+})