From 913ea36ae61617152ae28a092e0c4f9446dc09a2 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Tue, 12 May 2026 23:13:05 -0400 Subject: [PATCH] test(server): scope MCP HttpApi handler (#27226) --- .../opencode/test/server/httpapi-mcp.test.ts | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/opencode/test/server/httpapi-mcp.test.ts b/packages/opencode/test/server/httpapi-mcp.test.ts index 136a17d405..be11a431e5 100644 --- a/packages/opencode/test/server/httpapi-mcp.test.ts +++ b/packages/opencode/test/server/httpapi-mcp.test.ts @@ -23,13 +23,19 @@ function app() { return Server.Default().app } type TestApp = ReturnType +type TestHandler = ReturnType -const request = Effect.fnUntraced(function* (route: string, directory: string, init?: RequestInit) { +const handlerScoped = Effect.acquireRelease( + Effect.sync(() => ExperimentalHttpApiServer.webHandler()), + (handler) => Effect.promise(() => handler.dispose()).pipe(Effect.ignore), +) + +const request = Effect.fnUntraced(function* (handler: TestHandler, route: string, directory: string, init?: RequestInit) { const headers = new Headers(init?.headers) headers.set("x-opencode-directory", directory) return yield* Effect.promise(() => Promise.resolve( - ExperimentalHttpApiServer.webHandler().handler( + handler.handler( new Request(`http://localhost${route}`, { ...init, headers, @@ -58,7 +64,8 @@ describe("mcp HttpApi", () => { () => Effect.gen(function* () { const tmp = yield* TestInstance - const response = yield* request(McpPaths.status, tmp.directory) + const handler = yield* handlerScoped + const response = yield* request(handler, McpPaths.status, tmp.directory) expect(response.status).toBe(200) expect(yield* json(response)).toEqual({ demo: { status: "disabled" } }) @@ -81,7 +88,8 @@ describe("mcp HttpApi", () => { () => Effect.gen(function* () { const tmp = yield* TestInstance - const added = yield* request(McpPaths.status, tmp.directory, { + const handler = yield* handlerScoped + const added = yield* request(handler, McpPaths.status, tmp.directory, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ @@ -96,11 +104,11 @@ describe("mcp HttpApi", () => { expect(added.status).toBe(200) expect(yield* json(added)).toMatchObject({ added: { status: "disabled" } }) - const connected = yield* request("/mcp/demo/connect", tmp.directory, { method: "POST" }) + const connected = yield* request(handler, "/mcp/demo/connect", tmp.directory, { method: "POST" }) expect(connected.status).toBe(200) expect(yield* json(connected)).toBe(true) - const disconnected = yield* request("/mcp/demo/disconnect", tmp.directory, { method: "POST" }) + const disconnected = yield* request(handler, "/mcp/demo/disconnect", tmp.directory, { method: "POST" }) expect(disconnected.status).toBe(200) expect(yield* json(disconnected)).toBe(true) }), @@ -122,13 +130,14 @@ describe("mcp HttpApi", () => { () => Effect.gen(function* () { const tmp = yield* TestInstance - const start = yield* request("/mcp/demo/auth", tmp.directory, { method: "POST" }) + const handler = yield* handlerScoped + const start = yield* request(handler, "/mcp/demo/auth", tmp.directory, { method: "POST" }) expect(start.status).toBe(400) - const authenticate = yield* request("/mcp/demo/auth/authenticate", tmp.directory, { method: "POST" }) + const authenticate = yield* request(handler, "/mcp/demo/auth/authenticate", tmp.directory, { method: "POST" }) expect(authenticate.status).toBe(400) - const removed = yield* request("/mcp/demo/auth", tmp.directory, { method: "DELETE" }) + const removed = yield* request(handler, "/mcp/demo/auth", tmp.directory, { method: "DELETE" }) expect(removed.status).toBe(200) expect(yield* json(removed)).toEqual({ success: true }) }),