


























@@ -2,12 +2,14 @@ import { afterEach, describe, expect, it, vi } from "vitest";
22import { buildOpenAIImageGenerationProvider } from "./image-generation-provider.js";
3344const {
5+ isProviderApiKeyConfiguredMock,
56 resolveApiKeyForProviderMock,
67 postJsonRequestMock,
78 postMultipartRequestMock,
89 assertOkOrThrowHttpErrorMock,
910 resolveProviderHttpRequestConfigMock,
1011} = vi.hoisted(() => ({
12+isProviderApiKeyConfiguredMock: vi.fn(() => false),
1113resolveApiKeyForProviderMock: vi.fn(
1214async (_params?: {
1315provider?: string;
@@ -26,6 +28,10 @@ const {
2628})),
2729}));
283031+vi.mock("openclaw/plugin-sdk/provider-auth", () => ({
32+isProviderApiKeyConfigured: isProviderApiKeyConfiguredMock,
33+}));
34+2935vi.mock("openclaw/plugin-sdk/provider-auth-runtime", () => ({
3036resolveApiKeyForProvider: resolveApiKeyForProviderMock,
3137}));
@@ -90,6 +96,8 @@ function mockCodexAuthOnly() {
90969197describe("openai image generation provider", () => {
9298afterEach(() => {
99+isProviderApiKeyConfiguredMock.mockReset();
100+isProviderApiKeyConfiguredMock.mockReturnValue(false);
93101resolveApiKeyForProviderMock.mockReset();
94102resolveApiKeyForProviderMock.mockResolvedValue({ apiKey: "openai-key" });
95103postJsonRequestMock.mockReset();
@@ -109,6 +117,36 @@ describe("openai image generation provider", () => {
109117);
110118});
111119120+it("reports configured when either OpenAI API key auth or Codex OAuth auth is available", () => {
121+const provider = buildOpenAIImageGenerationProvider();
122+123+isProviderApiKeyConfiguredMock.mockImplementation(
124+(params: { provider: string }) => params.provider === "openai",
125+);
126+expect(provider.isConfigured?.({ agentDir: "/tmp/agent" })).toBe(true);
127+expect(isProviderApiKeyConfiguredMock).toHaveBeenCalledWith({
128+provider: "openai",
129+agentDir: "/tmp/agent",
130+});
131+132+isProviderApiKeyConfiguredMock.mockClear();
133+isProviderApiKeyConfiguredMock.mockImplementation(
134+(params: { provider: string }) => params.provider === "openai-codex",
135+);
136+expect(provider.isConfigured?.({ agentDir: "/tmp/agent" })).toBe(true);
137+expect(isProviderApiKeyConfiguredMock).toHaveBeenCalledWith({
138+provider: "openai",
139+agentDir: "/tmp/agent",
140+});
141+expect(isProviderApiKeyConfiguredMock).toHaveBeenCalledWith({
142+provider: "openai-codex",
143+agentDir: "/tmp/agent",
144+});
145+146+isProviderApiKeyConfiguredMock.mockReturnValue(false);
147+expect(provider.isConfigured?.({ agentDir: "/tmp/agent" })).toBe(false);
148+});
149+112150it("does not auto-allow local baseUrl overrides for image requests", async () => {
113151mockGeneratedPngResponse();
114152此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。