test(server): scope MCP HttpApi handler (#27226)
This commit is contained in:
parent
68c4951318
commit
913ea36ae6
1 changed files with 18 additions and 9 deletions
|
|
@ -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 })
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue