test(server): scope MCP HttpApi handler (#27226)

This commit is contained in:
Kit Langton 2026-05-12 23:13:05 -04:00 committed by GitHub
commit 913ea36ae6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -23,13 +23,19 @@ function app() {
return Server.Default().app return Server.Default().app
} }
type TestApp = ReturnType<typeof app> type TestApp = ReturnType<typeof app>
type TestHandler = ReturnType<typeof ExperimentalHttpApiServer.webHandler>
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) const headers = new Headers(init?.headers)
headers.set("x-opencode-directory", directory) headers.set("x-opencode-directory", directory)
return yield* Effect.promise(() => return yield* Effect.promise(() =>
Promise.resolve( Promise.resolve(
ExperimentalHttpApiServer.webHandler().handler( handler.handler(
new Request(`http://localhost${route}`, { new Request(`http://localhost${route}`, {
...init, ...init,
headers, headers,
@ -58,7 +64,8 @@ describe("mcp HttpApi", () => {
() => () =>
Effect.gen(function* () { Effect.gen(function* () {
const tmp = yield* TestInstance 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(response.status).toBe(200)
expect(yield* json(response)).toEqual({ demo: { status: "disabled" } }) expect(yield* json(response)).toEqual({ demo: { status: "disabled" } })
@ -81,7 +88,8 @@ describe("mcp HttpApi", () => {
() => () =>
Effect.gen(function* () { Effect.gen(function* () {
const tmp = yield* TestInstance 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", method: "POST",
headers: { "content-type": "application/json" }, headers: { "content-type": "application/json" },
body: JSON.stringify({ body: JSON.stringify({
@ -96,11 +104,11 @@ describe("mcp HttpApi", () => {
expect(added.status).toBe(200) expect(added.status).toBe(200)
expect(yield* json(added)).toMatchObject({ added: { status: "disabled" } }) 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(connected.status).toBe(200)
expect(yield* json(connected)).toBe(true) 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(disconnected.status).toBe(200)
expect(yield* json(disconnected)).toBe(true) expect(yield* json(disconnected)).toBe(true)
}), }),
@ -122,13 +130,14 @@ describe("mcp HttpApi", () => {
() => () =>
Effect.gen(function* () { Effect.gen(function* () {
const tmp = yield* TestInstance 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) 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) 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(removed.status).toBe(200)
expect(yield* json(removed)).toEqual({ success: true }) expect(yield* json(removed)).toEqual({ success: true })
}), }),