54 lines · 2.0 KB · TypeScript
RawDownload
import { expect, layer } from "@effect/vitest";import { Effect, Layer, Schema } from "effect";import { OAuthTestServer } from "@executor-js/sdk/testing";import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http"; import { GraphqlTestServer, makeGreetingGraphqlSchema } from "./testing"; const TestLayer = GraphqlTestServer.layerWithOAuth({ schema: makeGreetingGraphqlSchema() }).pipe(  Layer.provideMerge(OAuthTestServer.layer()),); const GreetingResponse = Schema.Struct({  data: Schema.Struct({    hello: Schema.String,  }),});const decodeGreetingResponse = Schema.decodeUnknownEffect(GreetingResponse); const graphqlRequest = (endpoint: string) =>  HttpClientRequest.post(endpoint).pipe(    HttpClientRequest.bodyJsonUnsafe({      query: "query Greeting($name: String) { hello(name: $name) }",      operationName: "Greeting",      variables: { name: "Ada" },    }),  ); layer(TestLayer, { timeout: "15 seconds" })("GraphQL testing fixtures", (it) => {  it.effect("serves an OAuth-protected Yoga GraphQL server", () =>    Effect.gen(function* () {      const oauth = yield* OAuthTestServer;      const server = yield* GraphqlTestServer;       const unauthorized = yield* HttpClient.execute(graphqlRequest(server.endpoint)).pipe(        Effect.provide(FetchHttpClient.layer),      );      expect(unauthorized.status).toBe(401);       const token = yield* oauth.completeAuthorizationCodeTokenFlow({ scopes: ["read"] });      const authorized = yield* HttpClient.execute(        graphqlRequest(server.endpoint).pipe(          HttpClientRequest.setHeader("authorization", `Bearer ${token.accessToken}`),        ),      ).pipe(Effect.provide(FetchHttpClient.layer));       expect(authorized.status).toBe(200);      const body = yield* authorized.json.pipe(Effect.flatMap(decodeGreetingResponse));      expect(body).toEqual({ data: { hello: "Hello Ada" } });       const requests = yield* server.requests;      expect(requests.map((request) => request.payload.operationName)).toEqual(["Greeting"]);    }),  );});