import { describe, expect, it } from "vitest"; import { CodexExecutor } from "../../open-sse/executors/codex.js"; function streamFromText(text) { const encoder = new TextEncoder(); return new ReadableStream({ start(controller) { controller.enqueue(encoder.encode(text)); controller.close(); }, }); } describe("Codex fast tier and capacity handling", () => { it("maps Codex fast tier to priority and max reasoning to xhigh", () => { const executor = new CodexExecutor(); const body = executor.transformRequest("gpt-5.5", { model: "gpt-5.5", input: "hi", reasoning_effort: "max", service_tier: "fast", }, true, {}); expect(body.service_tier).toBe("priority"); expect(body.reasoning.effort).toBe("xhigh"); }); it("uses ChatGPT workspace header fallback", () => { const executor = new CodexExecutor(); const headers = executor.buildHeaders({ accessToken: "token", connectionId: "conn_1", providerSpecificData: { chatgptAccountId: "acct_1" }, }); expect(headers["ChatGPT-Account-ID"]).toBe("acct_1"); }); it("classifies 200-SSE model capacity as account fallback", async () => { const executor = new CodexExecutor(); const response = new Response(streamFromText([ "event: error", 'data: {"error":{"message":"Selected model is at capacity. Please try a different model."}}', "", ].join("\n")), { status: 200, headers: { "Content-Type": "text/event-stream" }, }); const peek = await executor._peekSseTransientError(response); expect(peek.accountFallback).toBe(true); expect(peek.message).toBe("Selected model is at capacity. Please try a different model."); }); it("reassembles normal SSE after peeking", async () => { const executor = new CodexExecutor(); const text = [ "event: response.output_text.delta", 'data: {"type":"response.output_text.delta","delta":"OK"}', "", ].join("\n"); const response = new Response(streamFromText(text), { status: 200, headers: { "Content-Type": "text/event-stream" }, }); const peek = await executor._peekSseTransientError(response); expect(peek.matched).toBeNull(); await expect(new Response(peek.replacementBody).text()).resolves.toBe(text); }); });