mirror of
https://github.com/anomalyco/opencode.git
synced 2026-08-24 06:33:01 -04:00
82 lines
3.0 KiB
TypeScript
82 lines
3.0 KiB
TypeScript
import { expect } from "bun:test"
|
|
import { Effect } from "effect"
|
|
import { HttpServer, HttpServerError, HttpServerResponse } from "effect/unstable/http"
|
|
import { it } from "../../core/test/lib/effect"
|
|
import { ServerProcess } from "../src/process"
|
|
|
|
it.live("allows browser preflight requests without credentials", () =>
|
|
Effect.gen(function* () {
|
|
const fallback = "fallback".repeat(256)
|
|
const server = yield* ServerProcess.start<never, never>(
|
|
{
|
|
hostname: "127.0.0.1",
|
|
port: 0,
|
|
password: "secret",
|
|
app: { version: "test-version" },
|
|
database: { path: ":memory:" },
|
|
},
|
|
undefined,
|
|
(api) =>
|
|
api.pipe(
|
|
Effect.catchIf(
|
|
(error) => error instanceof HttpServerError.HttpServerError && error.reason._tag === "RouteNotFound",
|
|
() => Effect.succeed(HttpServerResponse.raw(fallback, { contentType: "text/plain" })),
|
|
),
|
|
),
|
|
)
|
|
const response = yield* Effect.promise(() =>
|
|
fetch(new URL("/api/health", HttpServer.formatAddress(server.address)), {
|
|
method: "OPTIONS",
|
|
headers: {
|
|
origin: "http://localhost:3000",
|
|
"access-control-request-method": "GET",
|
|
"access-control-request-headers": "authorization",
|
|
},
|
|
}),
|
|
)
|
|
|
|
expect(response.status).toBe(204)
|
|
expect(response.headers.get("access-control-allow-origin")).toBe("http://localhost:3000")
|
|
expect(response.headers.get("access-control-allow-headers")).toBe("authorization")
|
|
|
|
const health = yield* Effect.promise(() =>
|
|
fetch(new URL("/api/health", HttpServer.formatAddress(server.address)), {
|
|
headers: {
|
|
authorization: `Basic ${btoa("opencode:secret")}`,
|
|
origin: "http://localhost:3000",
|
|
},
|
|
}),
|
|
)
|
|
|
|
expect(health.status).toBe(200)
|
|
expect(health.headers.get("access-control-allow-origin")).toBe("http://localhost:3000")
|
|
expect(yield* Effect.promise(() => health.json())).toMatchObject({ version: "test-version" })
|
|
|
|
const event = yield* Effect.promise(() =>
|
|
fetch(new URL("/api/event", HttpServer.formatAddress(server.address)), {
|
|
headers: {
|
|
"accept-encoding": "br",
|
|
authorization: `Basic ${btoa("opencode:secret")}`,
|
|
},
|
|
}),
|
|
)
|
|
expect(event.status).toBe(200)
|
|
expect(event.headers.get("content-encoding")).toBeNull()
|
|
yield* Effect.promise(() => event.body?.cancel() ?? Promise.resolve())
|
|
|
|
const missing = yield* Effect.promise(() =>
|
|
fetch(new URL("/missing", HttpServer.formatAddress(server.address)), {
|
|
headers: {
|
|
"accept-encoding": "br",
|
|
authorization: `Basic ${btoa("opencode:secret")}`,
|
|
},
|
|
}),
|
|
)
|
|
expect(missing.status).toBe(200)
|
|
expect(missing.headers.get("content-encoding")).toBe("br")
|
|
expect(missing.headers.get("content-type")).toBe("text/plain")
|
|
expect(missing.headers.get("vary")?.toLowerCase()).toContain("accept-encoding")
|
|
expect(yield* Effect.promise(() => missing.text())).toBe(fallback)
|
|
}),
|
|
)
|