























@@ -1,19 +1,10 @@
1-import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
1+import { beforeEach, describe, expect, it } from "vitest";
22import type { OpenClawConfig } from "../config/types.js";
33import type { SpeechProviderPlugin } from "../plugins/types.js";
4-5-const resolvePluginCapabilityProviderMock = vi.hoisted(() => vi.fn());
6-const resolvePluginCapabilityProvidersMock = vi.hoisted(() => vi.fn());
7-8-vi.mock("../plugins/capability-provider-runtime.js", () => ({
9-resolvePluginCapabilityProvider: resolvePluginCapabilityProviderMock,
10-resolvePluginCapabilityProviders: resolvePluginCapabilityProvidersMock,
11-}));
12-13-let getSpeechProvider: typeof import("./provider-registry.js").getSpeechProvider;
14-let listSpeechProviders: typeof import("./provider-registry.js").listSpeechProviders;
15-let canonicalizeSpeechProviderId: typeof import("./provider-registry.js").canonicalizeSpeechProviderId;
16-let normalizeSpeechProviderId: typeof import("./provider-registry.js").normalizeSpeechProviderId;
4+import {
5+createSpeechProviderRegistry,
6+normalizeSpeechProviderId,
7+} from "./provider-registry-core.js";
178189function createSpeechProvider(id: string, aliases?: string[]): SpeechProviderPlugin {
1910return {
@@ -31,59 +22,57 @@ function createSpeechProvider(id: string, aliases?: string[]): SpeechProviderPlu
3122}
32233324describe("speech provider registry", () => {
34-beforeAll(async () => {
35-vi.resetModules();
36-({
37- getSpeechProvider,
38- listSpeechProviders,
39- canonicalizeSpeechProviderId,
40- normalizeSpeechProviderId,
41-} = await import("./provider-registry.js"));
42-});
25+const getProviderCalls: Array<{ providerId: string; cfg?: OpenClawConfig }> = [];
26+const listProvidersCalls: Array<{ cfg?: OpenClawConfig }> = [];
27+let providers: SpeechProviderPlugin[] = [];
28+let directProvider: SpeechProviderPlugin | undefined;
29+let registry: ReturnType<typeof createSpeechProviderRegistry>;
43304431beforeEach(() => {
45-resolvePluginCapabilityProviderMock.mockReset();
46-resolvePluginCapabilityProviderMock.mockReturnValue(undefined);
47-resolvePluginCapabilityProvidersMock.mockReset();
48-resolvePluginCapabilityProvidersMock.mockReturnValue([]);
32+providers = [];
33+directProvider = undefined;
34+getProviderCalls.length = 0;
35+listProvidersCalls.length = 0;
36+registry = createSpeechProviderRegistry({
37+getProvider: (providerId, cfg) => {
38+getProviderCalls.push({ providerId, cfg });
39+return directProvider;
40+},
41+listProviders: (cfg) => {
42+listProvidersCalls.push({ cfg });
43+return providers;
44+},
45+});
4946});
50475148it("lists providers from the speech capability runtime", () => {
5249const cfg = {} as OpenClawConfig;
53-resolvePluginCapabilityProvidersMock.mockReturnValue([createSpeechProvider("demo-speech")]);
50+providers = [createSpeechProvider("demo-speech")];
545155-expect(listSpeechProviders(cfg).map((provider) => provider.id)).toEqual(["demo-speech"]);
56-expect(resolvePluginCapabilityProvidersMock).toHaveBeenCalledWith({
57-key: "speechProviders",
58- cfg,
59-});
52+expect(registry.listSpeechProviders(cfg).map((provider) => provider.id)).toEqual([
53+"demo-speech",
54+]);
55+expect(listProvidersCalls).toEqual([{ cfg }]);
6056});
61576258it("gets providers by normalized id through the capability runtime", () => {
6359const cfg = {} as OpenClawConfig;
64-const provider = createSpeechProvider("microsoft", ["edge"]);
65-resolvePluginCapabilityProviderMock.mockReturnValue(provider);
60+directProvider = createSpeechProvider("microsoft", ["edge"]);
666167-expect(getSpeechProvider(" MICROSOFT ", cfg)).toBe(provider);
68-expect(resolvePluginCapabilityProviderMock).toHaveBeenCalledWith({
69-key: "speechProviders",
70-providerId: "microsoft",
71- cfg,
72-});
62+expect(registry.getSpeechProvider(" MICROSOFT ", cfg)).toBe(directProvider);
63+expect(getProviderCalls).toEqual([{ providerId: "microsoft", cfg }]);
7364});
74657566it("canonicalizes aliases from listed providers when direct lookup misses", () => {
76-resolvePluginCapabilityProvidersMock.mockReturnValue([
77-createSpeechProvider("microsoft", ["edge"]),
78-]);
67+providers = [createSpeechProvider("microsoft", ["edge"])];
79688069expect(normalizeSpeechProviderId("edge")).toBe("edge");
81-expect(canonicalizeSpeechProviderId("edge")).toBe("microsoft");
70+expect(registry.canonicalizeSpeechProviderId("edge")).toBe("microsoft");
8271});
83728473it("returns empty results when the capability runtime has no speech providers", () => {
85-expect(listSpeechProviders()).toEqual([]);
86-expect(getSpeechProvider("demo-speech")).toBeUndefined();
87-expect(canonicalizeSpeechProviderId("demo-speech")).toBe("demo-speech");
74+expect(registry.listSpeechProviders()).toEqual([]);
75+expect(registry.getSpeechProvider("demo-speech")).toBeUndefined();
76+expect(registry.canonicalizeSpeechProviderId("demo-speech")).toBe("demo-speech");
8877});
8978});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。