

























11import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
2-import { createEmptyPluginRegistry } from "../plugins/registry.js";
2+import type { ImageGenerationProviderPlugin } from "../plugins/types.js";
334-const { resolveRuntimePluginRegistryMock } = vi.hoisted(() => ({
5-resolveRuntimePluginRegistryMock: vi.fn<
6-(params?: unknown) => ReturnType<typeof createEmptyPluginRegistry> | undefined
7->(() => undefined),
4+const { resolvePluginCapabilityProvidersMock } = vi.hoisted(() => ({
5+resolvePluginCapabilityProvidersMock: vi.fn<() => ImageGenerationProviderPlugin[]>(() => []),
86}));
9710-vi.mock("../plugins/loader.js", () => ({
11-resolveRuntimePluginRegistry: resolveRuntimePluginRegistryMock,
8+vi.mock("../plugins/capability-provider-runtime.js", () => ({
9+resolvePluginCapabilityProviders: resolvePluginCapabilityProvidersMock,
1210}));
13111412let getImageGenerationProvider: typeof import("./provider-registry.js").getImageGenerationProvider;
1513let listImageGenerationProviders: typeof import("./provider-registry.js").listImageGenerationProviders;
161415+function createProvider(
16+params: Pick<ImageGenerationProviderPlugin, "id"> & Partial<ImageGenerationProviderPlugin>,
17+): ImageGenerationProviderPlugin {
18+return {
19+label: params.id,
20+capabilities: {
21+generate: {},
22+edit: { enabled: false },
23+},
24+generateImage: async () => ({
25+images: [{ buffer: Buffer.from("image"), mimeType: "image/png" }],
26+}),
27+ ...params,
28+};
29+}
30+1731describe("image-generation provider registry", () => {
1832beforeAll(async () => {
1933({ getImageGenerationProvider, listImageGenerationProviders } =
2034await import("./provider-registry.js"));
2135});
22362337beforeEach(() => {
24-resolveRuntimePluginRegistryMock.mockReset();
25-resolveRuntimePluginRegistryMock.mockReturnValue(undefined);
38+resolvePluginCapabilityProvidersMock.mockReset();
39+resolvePluginCapabilityProvidersMock.mockReturnValue([]);
2640});
274128-it("does not load plugins when listing without config", () => {
42+it("delegates provider resolution to the capability provider boundary", () => {
2943expect(listImageGenerationProviders()).toEqual([]);
30-expect(resolveRuntimePluginRegistryMock).toHaveBeenCalledWith();
44+expect(resolvePluginCapabilityProvidersMock).toHaveBeenCalledWith({
45+key: "imageGenerationProviders",
46+cfg: undefined,
47+});
3148});
32493350it("uses active plugin providers without loading from disk", () => {
34-const registry = createEmptyPluginRegistry();
35-registry.imageGenerationProviders.push({
36-pluginId: "custom-image",
37-pluginName: "Custom Image",
38-source: "test",
39-provider: {
40-id: "custom-image",
41-label: "Custom Image",
42-capabilities: {
43-generate: {},
44-edit: { enabled: false },
45-},
46-generateImage: async () => ({
47-images: [{ buffer: Buffer.from("image"), mimeType: "image/png" }],
48-}),
49-},
50-});
51-resolveRuntimePluginRegistryMock.mockReturnValue(registry);
51+resolvePluginCapabilityProvidersMock.mockReturnValue([createProvider({ id: "custom-image" })]);
52525353const provider = getImageGenerationProvider("custom-image");
54545555expect(provider?.id).toBe("custom-image");
56-expect(resolveRuntimePluginRegistryMock).toHaveBeenCalledWith();
56+expect(resolvePluginCapabilityProvidersMock).toHaveBeenCalledWith({
57+key: "imageGenerationProviders",
58+cfg: undefined,
59+});
5760});
58615962it("ignores prototype-like provider ids and aliases", () => {
60-const registry = createEmptyPluginRegistry();
61-registry.imageGenerationProviders.push(
62-{
63-pluginId: "blocked-image",
64-pluginName: "Blocked Image",
65-source: "test",
66-provider: {
67-id: "__proto__",
68-aliases: ["constructor", "prototype"],
69-capabilities: {
70-generate: {},
71-edit: { enabled: false },
72-},
73-generateImage: async () => ({
74-images: [{ buffer: Buffer.from("image"), mimeType: "image/png" }],
75-}),
76-},
77-},
78-{
79-pluginId: "safe-image",
80-pluginName: "Safe Image",
81-source: "test",
82-provider: {
83-id: "safe-image",
84-aliases: ["safe-alias", "constructor"],
85-capabilities: {
86-generate: {},
87-edit: { enabled: false },
88-},
89-generateImage: async () => ({
90-images: [{ buffer: Buffer.from("image"), mimeType: "image/png" }],
91-}),
92-},
93-},
94-);
95-resolveRuntimePluginRegistryMock.mockReturnValue(registry);
63+resolvePluginCapabilityProvidersMock.mockReturnValue([
64+createProvider({ id: "__proto__", aliases: ["constructor", "prototype"] }),
65+createProvider({ id: "safe-image", aliases: ["safe-alias", "constructor"] }),
66+]);
96679768expect(listImageGenerationProviders().map((provider) => provider.id)).toEqual(["safe-image"]);
9869expect(getImageGenerationProvider("__proto__")).toBeUndefined();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。