import { afterEach, describe, expect, test } from "bun:test" import path from "path" import { Server } from "../../src/server/server" import * as Log from "@opencode-ai/core/util/log" import { resetDatabase } from "../fixture/db" import { disposeAllInstances, tmpdir } from "../fixture/fixture" import { waitGlobalBusEventPromise } from "./global-bus" void Log.init({ print: false }) function app() { return Server.Default().app } async function waitDisposed(directory: string) { await waitGlobalBusEventPromise({ message: "timed out waiting for instance disposal", predicate: (event) => event.payload.type === "server.instance.disposed" && event.directory === directory, }) } afterEach(async () => { await disposeAllInstances() await resetDatabase() }) describe("config HttpApi", () => { test("serves config update through Hono bridge", async () => { await using tmp = await tmpdir({ config: { formatter: false, lsp: false } }) const disposed = waitDisposed(tmp.path) const response = await app().request("/config", { method: "PATCH", headers: { "content-type": "application/json", "x-opencode-directory": tmp.path, }, body: JSON.stringify({ username: "patched-user", formatter: false, lsp: false }), }) expect(response.status).toBe(200) expect(await response.json()).toMatchObject({ username: "patched-user", formatter: false, lsp: false }) await disposed expect(await Bun.file(path.join(tmp.path, "config.json")).json()).toMatchObject({ username: "patched-user", formatter: false, lsp: false, }) }) test("serves config with active provider model status", async () => { await using tmp = await tmpdir({ config: { formatter: false, lsp: false, provider: { omniroute: { models: { "gpt-4o": { status: "active", }, }, }, }, }, }) const response = await app().request("/config", { headers: { "x-opencode-directory": tmp.path, }, }) expect(response.status).toBe(200) expect(await response.json()).toMatchObject({ provider: { omniroute: { models: { "gpt-4o": { status: "active", }, }, }, }, }) }) })