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"]); }), );});
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"]);
}),
);
});