52 lines · 1.8 KB · TypeScript
RawDownload
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"]);    }),  );});