





















@@ -5,6 +5,7 @@ import {
55} from "./image-generation-provider.js";
66import {
77buildComfyConfig,
8+buildLegacyComfyConfig,
89mockComfyCloudJobResponses,
910mockComfyProviderApiKey,
1011parseComfyJsonBody,
@@ -25,6 +26,7 @@ describe("comfy image-generation provider", () => {
25262627afterEach(() => {
2728_setComfyFetchGuardForTesting(null);
29+vi.unstubAllEnvs();
2830vi.restoreAllMocks();
2931});
3032@@ -42,6 +44,57 @@ describe("comfy image-generation provider", () => {
4244).toBe(true);
4345});
444647+it("falls back to legacy models.providers comfy config when plugin config is absent", () => {
48+const provider = buildComfyImageGenerationProvider();
49+expect(
50+provider.isConfigured?.({
51+cfg: buildLegacyComfyConfig({
52+workflow: {
53+"6": { inputs: { text: "" } },
54+},
55+promptNodeId: "6",
56+}),
57+}),
58+).toBe(true);
59+});
60+61+it("treats cloud comfy workflows as configured with a plugin config API key", () => {
62+const provider = buildComfyImageGenerationProvider();
63+expect(
64+provider.isConfigured?.({
65+cfg: buildComfyConfig({
66+mode: "cloud",
67+apiKey: "comfy-test-key",
68+image: {
69+workflow: {
70+"6": { inputs: { text: "" } },
71+},
72+promptNodeId: "6",
73+},
74+}),
75+}),
76+).toBe(true);
77+});
78+79+it("treats cloud comfy workflows as configured with a plugin config env SecretRef", () => {
80+vi.stubEnv("COMFY_TEST_API_KEY", "comfy-secret-ref-key");
81+const provider = buildComfyImageGenerationProvider();
82+expect(
83+provider.isConfigured?.({
84+cfg: buildComfyConfig({
85+mode: "cloud",
86+apiKey: { source: "env", provider: "default", id: "COMFY_TEST_API_KEY" },
87+image: {
88+workflow: {
89+"6": { inputs: { text: "" } },
90+},
91+promptNodeId: "6",
92+},
93+}),
94+}),
95+).toBe(true);
96+});
97+4598it("submits a local workflow, waits for history, and downloads images", async () => {
4699_setComfyFetchGuardForTesting(fetchWithSsrFGuardMock);
47100fetchWithSsrFGuardMock
@@ -301,4 +354,82 @@ describe("comfy image-generation provider", () => {
301354outputNodeIds: ["9"],
302355});
303356});
357+358+it("uses plugin config env SecretRef auth for cloud workflows", async () => {
359+vi.stubEnv("COMFY_TEST_API_KEY", "comfy-secret-ref-key");
360+_setComfyFetchGuardForTesting(fetchWithSsrFGuardMock);
361+mockComfyCloudJobResponses(fetchWithSsrFGuardMock, {
362+body: Buffer.from("cloud-data"),
363+contentType: "image/png",
364+filename: "cloud.png",
365+outputKind: "images",
366+promptId: "cloud-secret-ref-1",
367+redirectLocation: "https://cdn.example.com/cloud.png",
368+});
369+370+const provider = buildComfyImageGenerationProvider();
371+await provider.generateImage({
372+provider: "comfy",
373+model: "workflow",
374+prompt: "cloud workflow prompt",
375+cfg: buildComfyConfig({
376+mode: "cloud",
377+apiKey: { source: "env", provider: "default", id: "COMFY_TEST_API_KEY" },
378+workflow: {
379+"6": { inputs: { text: "" } },
380+"9": { inputs: {} },
381+},
382+promptNodeId: "6",
383+outputNodeId: "9",
384+}),
385+});
386+387+const submitRequest = fetchWithSsrFGuardMock.mock.calls[0]?.[0];
388+const submitHeaders = new Headers(submitRequest?.init?.headers);
389+expect(submitHeaders.get("x-api-key")).toBe("comfy-secret-ref-key");
390+expect(parseJsonBody(1)).toMatchObject({
391+extra_data: {
392+api_key_comfy_org: "comfy-secret-ref-key",
393+},
394+});
395+});
396+397+it("uses provider auth fallback for cloud workflows without plugin config API keys", async () => {
398+vi.stubEnv("COMFY_API_KEY", "stale-env-key");
399+mockComfyProviderApiKey("profile-key");
400+_setComfyFetchGuardForTesting(fetchWithSsrFGuardMock);
401+mockComfyCloudJobResponses(fetchWithSsrFGuardMock, {
402+body: Buffer.from("cloud-data"),
403+contentType: "image/png",
404+filename: "cloud.png",
405+outputKind: "images",
406+promptId: "cloud-profile-1",
407+redirectLocation: "https://cdn.example.com/cloud.png",
408+});
409+410+const provider = buildComfyImageGenerationProvider();
411+await provider.generateImage({
412+provider: "comfy",
413+model: "workflow",
414+prompt: "cloud workflow prompt",
415+cfg: buildComfyConfig({
416+mode: "cloud",
417+workflow: {
418+"6": { inputs: { text: "" } },
419+"9": { inputs: {} },
420+},
421+promptNodeId: "6",
422+outputNodeId: "9",
423+}),
424+});
425+426+const submitRequest = fetchWithSsrFGuardMock.mock.calls[0]?.[0];
427+const submitHeaders = new Headers(submitRequest?.init?.headers);
428+expect(submitHeaders.get("x-api-key")).toBe("profile-key");
429+expect(parseJsonBody(1)).toMatchObject({
430+extra_data: {
431+api_key_comfy_org: "profile-key",
432+},
433+});
434+});
304435});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。