import { expect, layer } from "@effect/vitest";import { Effect, Layer, Schema } from "effect";import { OAuthTestServer } from "@executor-js/sdk/testing";import { HttpClient, HttpClientRequest } from "effect/unstable/http"; import { OpenApiEchoTestServer } from "./testing"; const TestLayer = OpenApiEchoTestServer.layerWithOAuth().pipe( Layer.provideMerge(OAuthTestServer.layer()),); const ItemsResponse = Schema.Array( Schema.Struct({ id: Schema.Number, name: Schema.String, }),);const decodeItemsResponse = Schema.decodeUnknownEffect(ItemsResponse); layer(TestLayer, { timeout: "15 seconds" })("OpenAPI testing fixtures", (it) => { it.effect("serves an OAuth-protected HttpApi-backed OpenAPI echo server", () => Effect.gen(function* () { const oauth = yield* OAuthTestServer; const server = yield* OpenApiEchoTestServer; const unauthorized = yield* HttpClient.execute(HttpClientRequest.get("/items")).pipe( Effect.provide(server.httpClientLayer), ); expect(unauthorized.status).toBe(401); const token = yield* oauth.completeAuthorizationCodeTokenFlow({ resource: server.baseUrl, scopes: ["read"], }); const authorized = yield* HttpClient.execute( HttpClientRequest.get("/items").pipe( HttpClientRequest.setHeader("authorization", `Bearer ${token.accessToken}`), ), ).pipe(Effect.provide(server.httpClientLayer)); expect(authorized.status).toBe(200); const items = yield* authorized.json.pipe(Effect.flatMap(decodeItemsResponse)); expect(items).toEqual([ { id: 1, name: "Widget" }, { id: 2, name: "Gadget" }, ]); const requests = yield* server.requests; expect(requests.map((request) => request.path)).toEqual(["/items", "/items"]); }), );});
import { expect, layer } from "@effect/vitest";
import { Effect, Layer, Schema } from "effect";
import { OAuthTestServer } from "@executor-js/sdk/testing";
import { HttpClient, HttpClientRequest } from "effect/unstable/http";
import { OpenApiEchoTestServer } from "./testing";
const TestLayer = OpenApiEchoTestServer.layerWithOAuth().pipe(
Layer.provideMerge(OAuthTestServer.layer()),
);
const ItemsResponse = Schema.Array(
Schema.Struct({
id: Schema.Number,
name: Schema.String,
}),
);
const decodeItemsResponse = Schema.decodeUnknownEffect(ItemsResponse);
layer(TestLayer, { timeout: "15 seconds" })("OpenAPI testing fixtures", (it) => {
it.effect("serves an OAuth-protected HttpApi-backed OpenAPI echo server", () =>
Effect.gen(function* () {
const oauth = yield* OAuthTestServer;
const server = yield* OpenApiEchoTestServer;
const unauthorized = yield* HttpClient.execute(HttpClientRequest.get("/items")).pipe(
Effect.provide(server.httpClientLayer),
);
expect(unauthorized.status).toBe(401);
const token = yield* oauth.completeAuthorizationCodeTokenFlow({
resource: server.baseUrl,
scopes: ["read"],
});
const authorized = yield* HttpClient.execute(
HttpClientRequest.get("/items").pipe(
HttpClientRequest.setHeader("authorization", `Bearer ${token.accessToken}`),
),
).pipe(Effect.provide(server.httpClientLayer));
expect(authorized.status).toBe(200);
const items = yield* authorized.json.pipe(Effect.flatMap(decodeItemsResponse));
expect(items).toEqual([
{ id: 1, name: "Widget" },
{ id: 2, name: "Gadget" },
]);
const requests = yield* server.requests;
expect(requests.map((request) => request.path)).toEqual(["/items", "/items"]);
}),
);
});