context.spec.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { test, expect } from "../fixtures"
  2. import type { Page } from "@playwright/test"
  3. import { promptSelector } from "../selectors"
  4. import { withSession } from "../actions"
  5. function contextButton(page: Page) {
  6. return page
  7. .locator('[data-component="button"]')
  8. .filter({ has: page.locator('[data-component="progress-circle"]').first() })
  9. .first()
  10. }
  11. async function seedContextSession(input: { sessionID: string; sdk: Parameters<typeof withSession>[0] }) {
  12. await input.sdk.session.promptAsync({
  13. sessionID: input.sessionID,
  14. noReply: true,
  15. parts: [
  16. {
  17. type: "text",
  18. text: "seed context",
  19. },
  20. ],
  21. })
  22. await expect
  23. .poll(async () => {
  24. const messages = await input.sdk.session
  25. .messages({ sessionID: input.sessionID, limit: 1 })
  26. .then((r) => r.data ?? [])
  27. return messages.length
  28. })
  29. .toBeGreaterThan(0)
  30. }
  31. test("context panel can be opened from the prompt", async ({ page, sdk, gotoSession }) => {
  32. const title = `e2e smoke context ${Date.now()}`
  33. await withSession(sdk, title, async (session) => {
  34. await seedContextSession({ sessionID: session.id, sdk })
  35. await gotoSession(session.id)
  36. const trigger = contextButton(page)
  37. await expect(trigger).toBeVisible()
  38. await trigger.click()
  39. const tabs = page.locator('[data-component="tabs"][data-variant="normal"]')
  40. await expect(tabs.getByRole("tab", { name: "Context" })).toBeVisible()
  41. })
  42. })
  43. test("context panel can be closed from the context tab close action", async ({ page, sdk, gotoSession }) => {
  44. await withSession(sdk, `e2e context toggle ${Date.now()}`, async (session) => {
  45. await seedContextSession({ sessionID: session.id, sdk })
  46. await gotoSession(session.id)
  47. await page.locator(promptSelector).click()
  48. const trigger = contextButton(page)
  49. await expect(trigger).toBeVisible()
  50. await trigger.click()
  51. const tabs = page.locator('[data-component="tabs"][data-variant="normal"]')
  52. const context = tabs.getByRole("tab", { name: "Context" })
  53. await expect(context).toBeVisible()
  54. await page.getByRole("button", { name: "Close tab" }).first().click()
  55. await expect(context).toHaveCount(0)
  56. })
  57. })
  58. test("context panel can open file picker from context actions", async ({ page, sdk, gotoSession }) => {
  59. await withSession(sdk, `e2e context tabs ${Date.now()}`, async (session) => {
  60. await seedContextSession({ sessionID: session.id, sdk })
  61. await gotoSession(session.id)
  62. await page.locator(promptSelector).click()
  63. const trigger = contextButton(page)
  64. await expect(trigger).toBeVisible()
  65. await trigger.click()
  66. await expect(page.getByRole("tab", { name: "Context" })).toBeVisible()
  67. await page.getByRole("button", { name: "Open file" }).first().click()
  68. const dialog = page
  69. .getByRole("dialog")
  70. .filter({ has: page.getByPlaceholder(/search files/i) })
  71. .first()
  72. await expect(dialog).toBeVisible()
  73. await page.keyboard.press("Escape")
  74. await expect(dialog).toHaveCount(0)
  75. })
  76. })
  77. test("context tooltip only appears from the session header trigger", async ({ page, sdk, gotoSession }) => {
  78. await withSession(sdk, `e2e context tooltip ${Date.now()}`, async (session) => {
  79. await seedContextSession({ sessionID: session.id, sdk })
  80. await gotoSession(session.id)
  81. const trigger = contextButton(page)
  82. await expect(trigger).toBeVisible()
  83. await trigger.click()
  84. const tab = page.getByRole("tab", { name: "Context" })
  85. await expect(tab).toBeVisible()
  86. await tab.locator('[data-component="progress-circle"]').hover()
  87. await expect(page.locator('[data-component="tooltip"]')).toHaveCount(0)
  88. await trigger.hover()
  89. await expect(page.locator('[data-component="tooltip"]')).toBeVisible()
  90. })
  91. })