61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
import { test, expect } from "../fixtures"
|
|
import { promptSelector } from "../selectors"
|
|
import { assistantText, sessionIDFromUrl } from "../actions"
|
|
import { openaiModel, promptMatch, titleMatch, withMockOpenAI } from "./mock"
|
|
|
|
test("can send a prompt and receive a reply", async ({ page, llm, backend, withBackendProject }) => {
|
|
test.setTimeout(120_000)
|
|
|
|
const pageErrors: string[] = []
|
|
const onPageError = (err: Error) => {
|
|
pageErrors.push(err.message)
|
|
}
|
|
page.on("pageerror", onPageError)
|
|
|
|
try {
|
|
await withMockOpenAI({
|
|
serverUrl: backend.url,
|
|
llmUrl: llm.url,
|
|
fn: async () => {
|
|
const token = `E2E_OK_${Date.now()}`
|
|
|
|
await llm.textMatch(titleMatch, "E2E Title")
|
|
await llm.textMatch(promptMatch(token), token)
|
|
|
|
await withBackendProject(
|
|
async (project) => {
|
|
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(() => llm.calls()).toBeGreaterThanOrEqual(1)
|
|
|
|
await expect
|
|
.poll(() => assistantText(project.sdk, sessionID), { timeout: 30_000 })
|
|
.toContain(token)
|
|
},
|
|
{
|
|
model: openaiModel,
|
|
},
|
|
)
|
|
},
|
|
})
|
|
} finally {
|
|
page.off("pageerror", onPageError)
|
|
}
|
|
|
|
if (pageErrors.length > 0) {
|
|
throw new Error(`Page error(s):\n${pageErrors.join("\n")}`)
|
|
}
|
|
})
|