model-selection-flow.spec.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { expect, test } from "@playwright/test"
  2. import { mockOpenCodeServer } from "../utils/mock-server"
  3. import { expectAppVisible } from "../utils/waits"
  4. const directory = "C:/OpenCode/NewProject"
  5. test("creates a session in a new project and selects its model", async ({ page }) => {
  6. await mockOpenCodeServer(page, {
  7. protocol: "v2",
  8. directory,
  9. project: {
  10. id: "proj_model_selection_flow",
  11. worktree: directory,
  12. vcs: "git",
  13. name: "NewProject",
  14. time: { created: 1_700_000_000_000, updated: 1_700_000_000_000 },
  15. sandboxes: [],
  16. },
  17. provider: () => ({
  18. all: [
  19. {
  20. id: "opencode",
  21. name: "OpenCode",
  22. models: {
  23. "free-model": {
  24. id: "free-model",
  25. name: "Free Model",
  26. cost: { input: 0, output: 0 },
  27. limit: { context: 200_000 },
  28. },
  29. },
  30. },
  31. {
  32. id: "opencode-go",
  33. name: "OpenCode Go",
  34. models: {
  35. "go-model-1": {
  36. id: "go-model-1",
  37. name: "Go Model 1",
  38. cost: { input: 1, output: 1 },
  39. limit: { context: 200_000 },
  40. },
  41. },
  42. },
  43. ],
  44. connected: ["opencode", "opencode-go"],
  45. default: { providerID: "opencode", modelID: "free-model" },
  46. }),
  47. sessions: [],
  48. pageMessages: () => ({ items: [] }),
  49. fileList: (path) =>
  50. path ? [] : [{ name: "NewProject", path: "NewProject", absolute: directory, type: "directory", ignored: false }],
  51. findFiles: () => ["NewProject"],
  52. })
  53. await page.addInitScript(() => {
  54. localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: true } }))
  55. localStorage.setItem("opencode.global.dat:server", JSON.stringify({ projects: { local: [] } }))
  56. localStorage.setItem(
  57. "opencode.global.dat:model",
  58. JSON.stringify({
  59. user: [
  60. { providerID: "opencode", modelID: "free-model", visibility: "show" },
  61. { providerID: "opencode-go", modelID: "go-model-1", visibility: "show" },
  62. ],
  63. recent: [],
  64. variant: {},
  65. }),
  66. )
  67. })
  68. await page.goto("/")
  69. const addProject = page.locator('[data-action="home-add-project-row"]')
  70. await expectAppVisible(addProject)
  71. await addProject.click()
  72. await page.locator("[data-directory-path]").click()
  73. await page.locator('[data-action="home-new-session"]').click()
  74. await expectAppVisible(page.locator('[data-component="prompt-input-v2"]'))
  75. const modelControl = page.locator('[data-action="prompt-model"]')
  76. await modelControl.click()
  77. await expect(page.locator('[data-option-key="opencode:free-model"]')).toBeVisible()
  78. const goModel = page.locator('[data-option-key="opencode-go:go-model-1"]')
  79. await expect(goModel).toBeVisible()
  80. await goModel.click()
  81. await expect(modelControl).toContainText("Go Model 1")
  82. })