1import { assert, describe, it } from "@effect/vitest"
2import { Effect } from "effect"
3import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/http"
4
5describe("FetchHttpClient", () => {
6 it.effect("sends bodies from Web requests", () =>
7 Effect.gen(function*() {
8 const request = HttpClientRequest.fromWeb(
9 new Request("https://example.test/?existing=1#fragment", { method: "POST", body: "hello" })
10 ).pipe(HttpClientRequest.setUrlParam("value", "a#b"))
11 const client = yield* HttpClient.HttpClient
12 const response = yield* client.execute(request)
13 assert.strictEqual(response.url, "https://example.test/?existing=1&value=a%23b")
14 assert.strictEqual(yield* response.text, "hello")
15 }).pipe(
16 Effect.provide(FetchHttpClient.layer),
17 Effect.provideService(
18 FetchHttpClient.Fetch,
19 Object.assign(
20 async (...args: Parameters<typeof globalThis.fetch>) => new Response(await new Request(...args).text()),
21 { preconnect: () => {} }
22 )
23 )
24 ))
25})