|
|
@@ -0,0 +1,101 @@
|
|
|
+import { expect, test } from "@playwright/test"
|
|
|
+import { mockOpenCodeServer } from "../utils/mock-server"
|
|
|
+import { expectAppVisible } from "../utils/waits"
|
|
|
+
|
|
|
+const directory = "C:/OpenCode/NewProject"
|
|
|
+
|
|
|
+test("creates a session in a new project, connects OpenCode Go, and selects its model", async ({ page }) => {
|
|
|
+ let connectedGo = false
|
|
|
+ let pendingGo = false
|
|
|
+ const connections: Array<{ integrationID: string; body: unknown }> = []
|
|
|
+
|
|
|
+ await mockOpenCodeServer(page, {
|
|
|
+ directory,
|
|
|
+ project: {
|
|
|
+ id: "proj_model_selection_flow",
|
|
|
+ worktree: directory,
|
|
|
+ vcs: "git",
|
|
|
+ name: "NewProject",
|
|
|
+ time: { created: 1_700_000_000_000, updated: 1_700_000_000_000 },
|
|
|
+ sandboxes: [],
|
|
|
+ },
|
|
|
+ provider: () => ({
|
|
|
+ all: [
|
|
|
+ {
|
|
|
+ id: "opencode",
|
|
|
+ name: "OpenCode",
|
|
|
+ models: {
|
|
|
+ "free-model": {
|
|
|
+ id: "free-model",
|
|
|
+ name: "Free Model",
|
|
|
+ cost: { input: 0, output: 0 },
|
|
|
+ limit: { context: 200_000 },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: "opencode-go",
|
|
|
+ name: "OpenCode Go",
|
|
|
+ models: {
|
|
|
+ "go-model-1": {
|
|
|
+ id: "go-model-1",
|
|
|
+ name: "Go Model 1",
|
|
|
+ cost: { input: 1, output: 1 },
|
|
|
+ limit: { context: 200_000 },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ connected: connectedGo ? ["opencode", "opencode-go"] : ["opencode"],
|
|
|
+ default: { providerID: "opencode", modelID: "free-model" },
|
|
|
+ }),
|
|
|
+ integrationMethods: { "opencode-go": [{ type: "api", label: "API key" }] },
|
|
|
+ onConnectKey: (input) => {
|
|
|
+ connections.push(input)
|
|
|
+ if (input.integrationID === "opencode-go") pendingGo = true
|
|
|
+ },
|
|
|
+ onInstanceDispose: () => {
|
|
|
+ if (pendingGo) connectedGo = true
|
|
|
+ },
|
|
|
+ sessions: [],
|
|
|
+ pageMessages: () => ({ items: [] }),
|
|
|
+ fileList: (path) =>
|
|
|
+ path
|
|
|
+ ? []
|
|
|
+ : [{ name: "NewProject", path: "NewProject", absolute: directory, type: "directory", ignored: false }],
|
|
|
+ findFiles: () => ["NewProject"],
|
|
|
+ })
|
|
|
+ await page.addInitScript(() => {
|
|
|
+ localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: true } }))
|
|
|
+ localStorage.setItem("opencode.global.dat:server", JSON.stringify({ projects: { local: [] } }))
|
|
|
+ })
|
|
|
+
|
|
|
+ await page.goto("/")
|
|
|
+ const addProject = page.locator('[data-action="home-add-project-row"]')
|
|
|
+ await expectAppVisible(addProject)
|
|
|
+ await addProject.click()
|
|
|
+ await page.locator("[data-directory-path]").click()
|
|
|
+
|
|
|
+ await page.locator('[data-action="home-new-session"]').click()
|
|
|
+ await expectAppVisible(page.locator('[data-component="prompt-input-v2"]'))
|
|
|
+
|
|
|
+ const modelControl = page.locator('[data-action="prompt-model"]')
|
|
|
+ await modelControl.click()
|
|
|
+ await expect(page.locator('[data-section="free-models"]')).toContainText("Free models provided by OpenCode")
|
|
|
+
|
|
|
+ await page.locator('[data-provider-id="opencode-go"]').click()
|
|
|
+ await page.locator('[data-input="provider-api-key"]').fill("mock-go-api-key")
|
|
|
+ await page.locator('[data-action="provider-connect-submit"]').click()
|
|
|
+ await expect(page.locator('[data-component="dialog-v2"]')).toHaveCount(0)
|
|
|
+ expect(connections).toEqual([
|
|
|
+ { integrationID: "opencode-go", body: { type: "api", key: "mock-go-api-key" } },
|
|
|
+ ])
|
|
|
+
|
|
|
+ await expect(modelControl).toHaveAttribute("data-control-type", "popover")
|
|
|
+ await modelControl.click()
|
|
|
+ const goModel = page.locator('[data-option-key="opencode-go:go-model-1"]')
|
|
|
+ await expect(goModel).toBeVisible()
|
|
|
+ await goModel.click()
|
|
|
+
|
|
|
+ await expect(modelControl).toContainText("Go Model 1")
|
|
|
+})
|