import { expect, layer } from "@effect/vitest"; import { Effect, Layer } from "effect"; import { makeTestWorkspaceLayer, memoryCredentialsPlugin, OAuthTestServer, TestWorkspace, } from "./testing"; const plugins = [memoryCredentialsPlugin()] as const; const TestLayer = Layer.mergeAll(makeTestWorkspaceLayer({ plugins }), OAuthTestServer.layer()); layer(TestLayer, { timeout: "15 seconds" })("testing fixtures", (it) => { it.effect("TestWorkspace exposes the real executor bound to tenant/subject", () => Effect.gen(function* () { const workspace = yield* TestWorkspace.current(); expect(workspace.tenant).toBe("test-tenant"); expect(workspace.subject).toBe("test-subject"); // The memory credential provider is registered as the default store. expect(yield* workspace.executor.providers.list()).toEqual(["memory"]); }), ); it.effect("oauth.probe discovers an authorization server via metadata", () => Effect.gen(function* () { const workspace = yield* TestWorkspace.current(); const oauth = yield* OAuthTestServer; const probe = yield* workspace.executor.oauth.probe({ url: oauth.mcpResourceUrl, }); expect(probe.authorizationUrl).toBe(oauth.authorizationEndpoint); expect(probe.tokenUrl).toBe(oauth.tokenEndpoint); }), ); // removed: executor-driven authorization-code / existing-client / dynamic-dcr // OAuth flow cases — v1 strategy + secret-backed client material is gone, and // the v2 `oauth.start`/`oauth.complete` flow is stubbed for milestone 1. They // will be reintroduced against the v2 OAuthClient model when the flow is wired. it.effect( "OAuthTestServer can mint a bearer token through the full authorization-code flow", () => Effect.gen(function* () { const oauth = yield* OAuthTestServer; const token = yield* oauth.completeAuthorizationCodeTokenFlow({ scopes: ["read"], }); expect(token.tokenType).toBe("Bearer"); expect(token.accessToken).toMatch(/^at_/); expect(yield* oauth.acceptsAccessToken(token.accessToken)).toBe(true); }), ); });