import { describe, expect, it } from "@effect/vitest"; import type { LlmChunk } from "@trustgraph/base"; import { providerRuntimeError, providerStatusError, toAsyncGenerator } from "../model/text-completion/common.js"; const emptyChunkIterator = (): AsyncIterable => ({ [Symbol.asyncIterator]: () => ({ next: () => Promise.resolve({ done: true, value: undefined }), }), }); describe("text completion common helpers", () => { it("maps provider rate-limit status fields to tagged retry errors", () => { expect(providerStatusError("test-provider", { status: 429 })).toMatchObject({ _tag: "TooManyRequestsError", message: "Rate limit exceeded", }); expect(providerStatusError("test-provider", { statusCode: 429 })).toMatchObject({ _tag: "TooManyRequestsError", message: "Rate limit exceeded", }); }); it("maps fallback generator throw failures into tagged provider errors", async () => { const generator = toAsyncGenerator( emptyChunkIterator(), (error) => providerRuntimeError("test-provider", error), ); await expect(generator.throw("provider failed")).rejects.toMatchObject({ _tag: "TextCompletionProviderError", provider: "test-provider", message: "provider failed", }); }); });