prompt.spec.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { test, expect } from "../fixtures"
  2. import { promptSelector } from "../selectors"
  3. import { sessionIDFromUrl, withSession } from "../actions"
  4. test("can send a prompt and receive a reply", async ({ page, sdk, gotoSession }) => {
  5. test.setTimeout(120_000)
  6. const pageErrors: string[] = []
  7. const onPageError = (err: Error) => {
  8. pageErrors.push(err.message)
  9. }
  10. page.on("pageerror", onPageError)
  11. await gotoSession()
  12. const token = `E2E_OK_${Date.now()}`
  13. const prompt = page.locator(promptSelector)
  14. await prompt.click()
  15. await page.keyboard.type(`Reply with exactly: ${token}`)
  16. await page.keyboard.press("Enter")
  17. await expect(page).toHaveURL(/\/session\/[^/?#]+/, { timeout: 30_000 })
  18. const sessionID = (() => {
  19. const id = sessionIDFromUrl(page.url())
  20. if (!id) throw new Error(`Failed to parse session id from url: ${page.url()}`)
  21. return id
  22. })()
  23. try {
  24. await expect
  25. .poll(
  26. async () => {
  27. const messages = await sdk.session.messages({ sessionID, limit: 50 }).then((r) => r.data ?? [])
  28. return messages
  29. .filter((m) => m.info.role === "assistant")
  30. .flatMap((m) => m.parts)
  31. .filter((p) => p.type === "text")
  32. .map((p) => p.text)
  33. .join("\n")
  34. },
  35. { timeout: 90_000 },
  36. )
  37. .toContain(token)
  38. } finally {
  39. page.off("pageerror", onPageError)
  40. await sdk.session.delete({ sessionID }).catch(() => undefined)
  41. }
  42. if (pageErrors.length > 0) {
  43. throw new Error(`Page error(s):\n${pageErrors.join("\n")}`)
  44. }
  45. })