summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/prompt
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-04-01 13:43:19 -0400
committerGitHub <[email protected]>2026-04-01 17:43:19 +0000
commitf3f728ec27b2b2fc67470a2acec0072a5f1badd0 (patch)
treed8d36b7721d3e48965cc6fd84587fc533a0349b5 /packages/app/e2e/prompt
parentc619caefdd1d184cae549749240c5f77f63b150a (diff)
downloadopencode-f3f728ec27b2b2fc67470a2acec0072a5f1badd0.tar.gz
opencode-f3f728ec27b2b2fc67470a2acec0072a5f1badd0.zip
test(app): fix isolated backend follow-ups (#20513)
Diffstat (limited to 'packages/app/e2e/prompt')
-rw-r--r--packages/app/e2e/prompt/prompt-history.spec.ts144
-rw-r--r--packages/app/e2e/prompt/prompt-slash-share.spec.ts1
2 files changed, 52 insertions, 93 deletions
diff --git a/packages/app/e2e/prompt/prompt-history.spec.ts b/packages/app/e2e/prompt/prompt-history.spec.ts
index 6420534e0..f2d15914d 100644
--- a/packages/app/e2e/prompt/prompt-history.spec.ts
+++ b/packages/app/e2e/prompt/prompt-history.spec.ts
@@ -3,9 +3,11 @@ import type { Page } from "@playwright/test"
import { test, expect } from "../fixtures"
import { assistantText, sessionIDFromUrl } from "../actions"
import { promptSelector } from "../selectors"
+import { createSdk } from "../utils"
import { openaiModel, promptMatch, titleMatch, withMockOpenAI } from "./mock"
const text = (value: string | null) => (value ?? "").replace(/\u200B/g, "").trim()
+type Sdk = ReturnType<typeof createSdk>
const isBash = (part: unknown): part is ToolPart => {
if (!part || typeof part !== "object") return false
@@ -14,47 +16,15 @@ const isBash = (part: unknown): part is ToolPart => {
return "state" in part
}
-async function edge(page: Page, pos: "start" | "end") {
- await page.locator(promptSelector).evaluate((el: HTMLDivElement, pos: "start" | "end") => {
- const selection = window.getSelection()
- if (!selection) return
-
- const walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT)
- const nodes: Text[] = []
- for (let node = walk.nextNode(); node; node = walk.nextNode()) {
- nodes.push(node as Text)
- }
-
- if (nodes.length === 0) {
- const node = document.createTextNode("")
- el.appendChild(node)
- nodes.push(node)
- }
-
- const node = pos === "start" ? nodes[0]! : nodes[nodes.length - 1]!
- const range = document.createRange()
- range.setStart(node, pos === "start" ? 0 : (node.textContent ?? "").length)
- range.collapse(true)
- selection.removeAllRanges()
- selection.addRange(range)
- }, pos)
-}
-
async function wait(page: Page, value: string) {
await expect.poll(async () => text(await page.locator(promptSelector).textContent())).toBe(value)
}
-async function reply(
- sdk: { session: { messages: Parameters<typeof assistantText>[0]["session"] } },
- sessionID: string,
- token: string,
-) {
- await expect
- .poll(() => assistantText(sdk as Parameters<typeof assistantText>[0], sessionID), { timeout: 90_000 })
- .toContain(token)
+async function reply(sdk: Sdk, sessionID: string, token: string) {
+ await expect.poll(() => assistantText(sdk, sessionID), { timeout: 90_000 }).toContain(token)
}
-async function shell(sdk: Parameters<typeof withSession>[0], sessionID: string, cmd: string, token: string) {
+async function shell(sdk: Sdk, sessionID: string, cmd: string, token: string) {
await expect
.poll(
async () => {
@@ -142,76 +112,64 @@ test("prompt history restores unsent draft with arrow navigation", async ({
})
})
-test("shell history stays separate from normal prompt history", async ({ page, llm, backend, withBackendProject }) => {
+test.fixme("shell history stays separate from normal prompt history", async ({ page, sdk, gotoSession }) => {
test.setTimeout(120_000)
- await withMockOpenAI({
- serverUrl: backend.url,
- llmUrl: llm.url,
- fn: async () => {
- const firstToken = `E2E_SHELL_ONE_${Date.now()}`
- const secondToken = `E2E_SHELL_TWO_${Date.now()}`
- const normalToken = `E2E_NORMAL_${Date.now()}`
- const first = `echo ${firstToken}`
- const second = `echo ${secondToken}`
- const normal = `Reply with exactly: ${normalToken}`
+ const firstToken = `E2E_SHELL_ONE_${Date.now()}`
+ const secondToken = `E2E_SHELL_TWO_${Date.now()}`
+ const normalToken = `E2E_NORMAL_${Date.now()}`
+ const first = `echo ${firstToken}`
+ const second = `echo ${secondToken}`
+ const normal = `Reply with exactly: ${normalToken}`
- await llm.textMatch(titleMatch, "E2E Title")
- await llm.textMatch(promptMatch(normalToken), normalToken)
+ await gotoSession()
- await withBackendProject(
- async (project) => {
- const prompt = page.locator(promptSelector)
+ const prompt = page.locator(promptSelector)
- await prompt.click()
- await page.keyboard.type("!")
- await page.keyboard.type(first)
- await page.keyboard.press("Enter")
- await wait(page, "")
+ await prompt.click()
+ await page.keyboard.type("!")
+ await page.keyboard.type(first)
+ await page.keyboard.press("Enter")
+ await wait(page, "")
- await expect(page).toHaveURL(/\/session\/[^/?#]+/, { timeout: 30_000 })
- const sessionID = sessionIDFromUrl(page.url())!
- project.trackSession(sessionID)
- await shell(project.sdk, sessionID, first, firstToken)
+ await expect(page).toHaveURL(/\/session\/[^/?#]+/, { timeout: 30_000 })
+ const sessionID = sessionIDFromUrl(page.url())!
+ await shell(sdk, sessionID, first, firstToken)
- await prompt.click()
- await page.keyboard.type("!")
- await page.keyboard.type(second)
- await page.keyboard.press("Enter")
- await wait(page, "")
- await shell(project.sdk, sessionID, second, secondToken)
+ await prompt.click()
+ await page.keyboard.type("!")
+ await page.keyboard.type(second)
+ await page.keyboard.press("Enter")
+ await wait(page, "")
+ await shell(sdk, sessionID, second, secondToken)
- await prompt.click()
- await page.keyboard.type("!")
- await page.keyboard.press("ArrowUp")
- await wait(page, second)
+ await page.keyboard.press("Escape")
+ await wait(page, "")
- await page.keyboard.press("ArrowUp")
- await wait(page, first)
+ await prompt.click()
+ await page.keyboard.type("!")
+ await page.keyboard.press("ArrowUp")
+ await wait(page, second)
- await page.keyboard.press("ArrowDown")
- await wait(page, second)
+ await page.keyboard.press("ArrowUp")
+ await wait(page, first)
- await page.keyboard.press("ArrowDown")
- await wait(page, "")
+ await page.keyboard.press("ArrowDown")
+ await wait(page, second)
- await page.keyboard.press("Escape")
- await wait(page, "")
+ await page.keyboard.press("ArrowDown")
+ await wait(page, "")
- await prompt.click()
- await page.keyboard.type(normal)
- await page.keyboard.press("Enter")
- await wait(page, "")
- await reply(project.sdk, sessionID, normalToken)
+ await page.keyboard.press("Escape")
+ await wait(page, "")
- await prompt.click()
- await page.keyboard.press("ArrowUp")
- await wait(page, normal)
- },
- {
- model: openaiModel,
- },
- )
- },
- })
+ await prompt.click()
+ await page.keyboard.type(normal)
+ await page.keyboard.press("Enter")
+ await wait(page, "")
+ await reply(sdk, sessionID, normalToken)
+
+ await prompt.click()
+ await page.keyboard.press("ArrowUp")
+ await wait(page, normal)
})
diff --git a/packages/app/e2e/prompt/prompt-slash-share.spec.ts b/packages/app/e2e/prompt/prompt-slash-share.spec.ts
index efb0272b5..5371d8a91 100644
--- a/packages/app/e2e/prompt/prompt-slash-share.spec.ts
+++ b/packages/app/e2e/prompt/prompt-slash-share.spec.ts
@@ -27,6 +27,7 @@ test("/share and /unshare update session share state", async ({ page, withBacken
await withBackendProject(async (project) => {
await withSession(project.sdk, `e2e slash share ${Date.now()}`, async (session) => {
+ project.trackSession(session.id)
const prompt = page.locator(promptSelector)
await seed(project.sdk, session.id)