opencode/packages/core/test/plugin/websearch-fixture.ts
terry-an-investor 86755e1cea
fix(core): initialize MCP session for TinyFish web search (#54730)
Co-authored-by: Daniel Smolsky <dannysmo@gmail.com>
2026-10-15 17:06:05 +00:00

63 lines
2 KiB
TypeScript

import { Effect, Layer } from "effect"
import { HttpClient, HttpClientResponse } from "effect/http"
import { AppNodeBuilder } from "@opencode/core/effect/app-node-builder"
import { LayerNode } from "@opencode/util/effect/layer-node"
import { Credential } from "@opencode/core/credential"
import { Config } from "@opencode/core/config"
import { Bus } from "@opencode/core/bus"
import { Form } from "@opencode/core/form"
import { Integration } from "@opencode/core/integration"
import { WebSearch } from "@opencode/core/websearch"
import { testEffect } from "../lib/effect"
interface WebSearchRequest {
readonly url: string
readonly headers: Record<string, string>
readonly body: unknown
}
export const requests: WebSearchRequest[] = []
export const signals: AbortSignal[] = []
let responseBody = ""
let responseStatus = 200
let responseHeaders: Record<string, string> = {}
export function resetWebSearchFixture(body: string, status = 200) {
requests.length = 0
signals.length = 0
responseBody = body
responseStatus = status
responseHeaders = {}
}
export function setResponseHeaders(headers: Record<string, string>) {
responseHeaders = headers
}
const http = Layer.succeed(
HttpClient.HttpClient,
HttpClient.make((request, _url, signal) =>
Effect.sync(() => {
signals.push(signal)
if (request.body._tag !== "Uint8Array") throw new Error(`Unexpected request body: ${request.body._tag}`)
requests.push({
url: request.url,
headers: request.headers,
body: JSON.parse(new TextDecoder().decode(request.body.body)),
})
return HttpClientResponse.fromWeb(
request,
new Response(responseBody, { status: responseStatus, headers: responseHeaders }),
)
}),
),
)
export const webSearchIntegrationTest = testEffect(
Layer.merge(
AppNodeBuilder.build(LayerNode.group([Integration.node, Credential.node, Bus.node, Form.node, WebSearch.node]), [
Config.node.replace(Config.testLayer()),
]),
http,
),
)