import type { ProviderKind } from "@t3tools/contracts"; import { it, assert, vi } from "@effect/vitest"; import { assertFailure } from "@effect/vitest/utils"; import { Effect, Layer, Stream } from "effect"; import { CodexAdapter, CodexAdapterShape } from "../Services/CodexAdapter.ts"; import { ProviderAdapterRegistry } from "../Services/ProviderAdapterRegistry.ts"; import { ProviderAdapterRegistryLive } from "./ProviderAdapterRegistry.ts"; import { ProviderUnsupportedError } from "../Errors.ts"; import * as NodeServices from "@effect/platform-node/NodeServices"; const fakeCodexAdapter: CodexAdapterShape = { provider: "codex", capabilities: { sessionModelSwitch: "in-session" }, startSession: vi.fn(), sendTurn: vi.fn(), interruptTurn: vi.fn(), respondToRequest: vi.fn(), respondToUserInput: vi.fn(), stopSession: vi.fn(), listSessions: vi.fn(), hasSession: vi.fn(), readThread: vi.fn(), rollbackThread: vi.fn(), stopAll: vi.fn(), streamEvents: Stream.empty, }; const layer = it.layer( Layer.mergeAll( Layer.provide( ProviderAdapterRegistryLive, Layer.succeed(CodexAdapter, fakeCodexAdapter), ), NodeServices.layer, ), ); layer("ProviderAdapterRegistryLive", (it) => { it.effect("resolves a registered provider adapter", () => Effect.gen(function* () { const registry = yield* ProviderAdapterRegistry; const codex = yield* registry.getByProvider("codex"); assert.equal(codex, fakeCodexAdapter); const providers = yield* registry.listProviders(); assert.deepEqual(providers, ["codex"]); }), ); it.effect("fails with ProviderUnsupportedError for unknown providers", () => Effect.gen(function* () { const registry = yield* ProviderAdapterRegistry; const adapter = yield* registry.getByProvider("unknown" as ProviderKind).pipe(Effect.result); assertFailure(adapter, new ProviderUnsupportedError({ provider: "unknown" })); }), ); });