prompt-thinking-level.spec.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { expect, test, type Page } from "@playwright/test"
  2. import { base64Encode } from "@opencode-ai/core/util/encode"
  3. import { mockOpenCodeServer } from "../utils/mock-server"
  4. import { expectAppVisible } from "../utils/waits"
  5. const directory = "C:/OpenCode/PromptThinkingLevelRegression"
  6. const projectID = "proj_prompt_thinking_level_regression"
  7. const sessionID = "ses_prompt_thinking_level_regression"
  8. test("shows the V2 thinking level control while relevant", async ({ page }) => {
  9. await mockOpenCodeServer(page, {
  10. directory,
  11. project: {
  12. id: projectID,
  13. worktree: directory,
  14. vcs: "git",
  15. name: "prompt-thinking-level-regression",
  16. time: { created: 1700000000000, updated: 1700000000000 },
  17. sandboxes: [],
  18. },
  19. provider: {
  20. all: [
  21. {
  22. id: "opencode",
  23. name: "OpenCode",
  24. models: {
  25. "thinking-model": {
  26. id: "thinking-model",
  27. name: "Thinking Model",
  28. limit: { context: 200_000 },
  29. variants: { high: {} },
  30. },
  31. },
  32. },
  33. ],
  34. connected: ["opencode"],
  35. default: { providerID: "opencode", modelID: "thinking-model" },
  36. },
  37. sessions: [
  38. {
  39. id: sessionID,
  40. slug: "prompt-thinking-level-regression",
  41. projectID,
  42. directory,
  43. title: "Prompt thinking level regression",
  44. version: "dev",
  45. time: { created: 1700000000000, updated: 1700000000000 },
  46. },
  47. ],
  48. pageMessages: () => ({ items: [] }),
  49. })
  50. await page.addInitScript(() => {
  51. localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: true } }))
  52. })
  53. await page.goto(`/${base64Encode(directory)}/session/${sessionID}`)
  54. const composer = page.locator('[data-component="prompt-input-v2"]')
  55. const input = composer.locator('[data-component="prompt-input"]')
  56. const control = composer.getByRole("button", { name: "Choose model variant" })
  57. await expectAppVisible(composer)
  58. await idleComposer(page)
  59. await expect(control).toBeVisible()
  60. await control.click()
  61. const high = page.getByRole("menuitemradio", { name: "high" })
  62. await expect(high).toBeVisible()
  63. await page.mouse.move(0, 0)
  64. await expect(control).toBeVisible()
  65. await expect(high).toBeVisible()
  66. await high.click()
  67. await idleComposer(page)
  68. await input.focus()
  69. await expect(control).toBeVisible()
  70. await idleComposer(page)
  71. await expect(control).toBeVisible()
  72. })
  73. async function idleComposer(page: Page) {
  74. await page.mouse.move(0, 0)
  75. await page.evaluate(() => (document.activeElement as HTMLElement | null)?.blur())
  76. }