websearch-fixture.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { Effect, Layer, Stream } from "effect"
  2. import { HttpClient, HttpClientResponse } from "effect/unstable/http"
  3. import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
  4. import { LayerNode } from "@opencode-ai/util/effect/layer-node"
  5. import { Credential } from "@opencode-ai/core/credential"
  6. import { Config } from "@opencode-ai/core/config"
  7. import { Bus } from "@opencode-ai/core/bus"
  8. import { Form } from "@opencode-ai/core/form"
  9. import { Integration } from "@opencode-ai/core/integration"
  10. import { WebSearch } from "@opencode-ai/core/websearch"
  11. import { testEffect } from "../lib/effect"
  12. interface WebSearchRequest {
  13. readonly url: string
  14. readonly headers: Record<string, string>
  15. readonly body: unknown
  16. }
  17. export const requests: WebSearchRequest[] = []
  18. let responseBody = ""
  19. export function resetWebSearchFixture(body: string) {
  20. requests.length = 0
  21. responseBody = body
  22. }
  23. const http = Layer.succeed(
  24. HttpClient.HttpClient,
  25. HttpClient.make((request) =>
  26. Effect.sync(() => {
  27. if (request.body._tag !== "Uint8Array") throw new Error(`Unexpected request body: ${request.body._tag}`)
  28. requests.push({
  29. url: request.url,
  30. headers: request.headers,
  31. body: JSON.parse(new TextDecoder().decode(request.body.body)),
  32. })
  33. return HttpClientResponse.fromWeb(request, new Response(responseBody, { status: 200 }))
  34. }),
  35. ),
  36. )
  37. export const webSearchIntegrationTest = testEffect(
  38. Layer.merge(
  39. AppNodeBuilder.build(
  40. LayerNode.group([Integration.node, Credential.node, Bus.node, Form.node, WebSearch.node]),
  41. [
  42. [
  43. Config.node,
  44. Config.testLayer(),
  45. ],
  46. ],
  47. ),
  48. http,
  49. ),
  50. )