From e5a4c164e000b23a9f7ae0d538f9898fbff892d2 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Tue, 31 Mar 2026 23:17:50 -0400 Subject: [PATCH] test(app): revert unstable mock prompt routing --- packages/app/e2e/prompt/prompt.spec.ts | 187 ++++++++++--------------- 1 file changed, 75 insertions(+), 112 deletions(-) diff --git a/packages/app/e2e/prompt/prompt.spec.ts b/packages/app/e2e/prompt/prompt.spec.ts index 80c05ce662..1acf17f5bf 100644 --- a/packages/app/e2e/prompt/prompt.spec.ts +++ b/packages/app/e2e/prompt/prompt.spec.ts @@ -1,66 +1,44 @@ +import fs from "node:fs/promises" +import path from "node:path" import { test, expect } from "../fixtures" import { promptSelector } from "../selectors" import { sessionIDFromUrl } from "../actions" +import { createSdk } from "../utils" -const mdl = { providerID: "openai", modelID: "gpt-5.3-chat-latest" } - -async function pickModel(page: Parameters[0]["page"], value: { providerID: string; modelID: string }) { - await expect - .poll( - () => - page.evaluate(() => { - const win = window as Window & { - __opencode_e2e?: { - model?: { - controls?: { - setModel?: (value: { providerID: string; modelID: string } | undefined) => void - } - } - } - } - return !!win.__opencode_e2e?.model?.controls?.setModel - }), - { timeout: 30_000 }, - ) - .toBe(true) - - await page.evaluate((value) => { - const win = window as Window & { - __opencode_e2e?: { - model?: { - controls?: { - setModel?: (value: { providerID: string; modelID: string } | undefined) => void - } - } - } - } - const fn = win.__opencode_e2e?.model?.controls?.setModel - if (!fn) throw new Error("Model e2e model control is not enabled") - fn(value) - }, value) - - await expect - .poll( - () => - page.evaluate(() => { - const win = window as Window & { - __opencode_e2e?: { - model?: { - current?: { - model?: { providerID: string; modelID: string } - } - } - } - } - const model = win.__opencode_e2e?.model?.current?.model - return model ? `${model.providerID}/${model.modelID}` : null - }), - { timeout: 30_000 }, - ) - .toBe(`${value.providerID}/${value.modelID}`) +async function config(dir: string, url: string) { + await fs.writeFile( + path.join(dir, "opencode.json"), + JSON.stringify({ + $schema: "https://opencode.ai/config.json", + enabled_providers: ["e2e-llm"], + provider: { + "e2e-llm": { + name: "E2E LLM", + npm: "@ai-sdk/openai-compatible", + env: [], + models: { + "test-model": { + name: "Test Model", + tool_call: true, + limit: { context: 128000, output: 32000 }, + }, + }, + options: { + apiKey: "test-key", + baseURL: url, + }, + }, + }, + agent: { + build: { + model: "e2e-llm/test-model", + }, + }, + }), + ) } -test("can send a prompt and receive a reply", async ({ page, llm, sdk, gotoSession }) => { +test("can send a prompt and receive a reply", async ({ page, llm, withProject }) => { test.setTimeout(120_000) const pageErrors: string[] = [] @@ -69,65 +47,50 @@ test("can send a prompt and receive a reply", async ({ page, llm, sdk, gotoSessi } page.on("pageerror", onPageError) - const prev = await sdk.global.config.get().then((res) => res.data ?? {}) - try { - await sdk.global.config.update({ - config: { - ...prev, - model: `${mdl.providerID}/${mdl.modelID}`, - enabled_providers: ["openai"], - provider: { - ...prev.provider, - openai: { - ...prev.provider?.openai, - options: { - ...prev.provider?.openai?.options, - apiKey: "test-key", - baseURL: llm.url, + await withProject( + async (project) => { + const sdk = createSdk(project.directory) + const token = `E2E_OK_${Date.now()}` + + await llm.text(token) + await project.gotoSession() + + const prompt = page.locator(promptSelector) + await prompt.click() + await page.keyboard.type(`Reply with exactly: ${token}`) + await page.keyboard.press("Enter") + + await expect(page).toHaveURL(/\/session\/[^/?#]+/, { timeout: 30_000 }) + + const sessionID = (() => { + const id = sessionIDFromUrl(page.url()) + if (!id) throw new Error(`Failed to parse session id from url: ${page.url()}`) + return id + })() + project.trackSession(sessionID) + + await expect + .poll( + async () => { + const messages = await sdk.session.messages({ sessionID, limit: 50 }).then((r) => r.data ?? []) + return messages + .filter((m) => m.info.role === "assistant") + .flatMap((m) => m.parts) + .filter((p) => p.type === "text") + .map((p) => p.text) + .join("\n") }, - }, - }, + { timeout: 30_000 }, + ) + .toContain(token) }, - }) - - const token = `E2E_OK_${Date.now()}` - await llm.text("E2E Title") - await llm.text(token) - await gotoSession() - await pickModel(page, mdl) - - const prompt = page.locator(promptSelector) - await prompt.click() - await page.keyboard.type(`Reply with exactly: ${token}`) - await page.keyboard.press("Enter") - - await expect(page).toHaveURL(/\/session\/[^/?#]+/, { timeout: 30_000 }) - - const sessionID = (() => { - const id = sessionIDFromUrl(page.url()) - if (!id) throw new Error(`Failed to parse session id from url: ${page.url()}`) - return id - })() - - await expect.poll(() => llm.calls()).toBeGreaterThanOrEqual(2) - - await expect - .poll( - async () => { - const messages = await sdk.session.messages({ sessionID, limit: 50 }).then((r) => r.data ?? []) - return messages - .filter((m) => m.info.role === "assistant") - .flatMap((m) => m.parts) - .filter((p) => p.type === "text") - .map((p) => p.text) - .join("\n") - }, - { timeout: 30_000 }, - ) - .toContain(token) + { + model: { providerID: "e2e-llm", modelID: "test-model" }, + setup: (dir) => config(dir, llm.url), + }, + ) } finally { - await sdk.global.config.update({ config: prev }) page.off("pageerror", onPageError) }