






















@@ -174,6 +174,65 @@ function firstCallArg<T>(mock: { mock: { calls: unknown[][] } }, _type?: (value:
174174return call[0] as T;
175175}
176176177+function mockDeferredSlackStartupPlugins(): void {
178+loadPluginLookUpTable.mockReturnValueOnce({
179+manifestRegistry: pluginManifestRegistry,
180+startup: {
181+configuredDeferredChannelPluginIds: ["slack"] as string[],
182+pluginIds: ["slack", "memory-core"] as string[],
183+},
184+metrics: {
185+ ...pluginLookUpTableMetrics,
186+startupPluginCount: 2,
187+deferredChannelPluginCount: 1,
188+},
189+});
190+}
191+192+function slackConfig(): OpenClawConfig {
193+return {
194+channels: {
195+slack: { enabled: true, token: "token" },
196+},
197+} as OpenClawConfig;
198+}
199+200+async function prepareBootstrapWithRuntimeConfig(
201+cfg: OpenClawConfig,
202+options: {
203+loadRuntimePlugins?: boolean;
204+loadSetupRuntimePlugins?: boolean;
205+} = {},
206+) {
207+const log = createLog();
208+const { prepareGatewayPluginBootstrap } = await import("./server-startup-plugins.js");
209+210+return await prepareGatewayPluginBootstrap({
211+cfgAtStart: cfg,
212+startupRuntimeConfig: cfg,
213+minimalTestGateway: false,
214+ log,
215+ ...options,
216+});
217+}
218+219+function expectStartupPluginLoad(params: {
220+pluginIds: string[];
221+preferSetupRuntimeForChannelPlugins: boolean;
222+suppressPluginInfoLogs: boolean;
223+}): void {
224+const startupInput = firstCallArg<{
225+pluginIds?: string[];
226+preferSetupRuntimeForChannelPlugins?: boolean;
227+suppressPluginInfoLogs?: boolean;
228+}>(loadGatewayStartupPlugins);
229+expect(startupInput.pluginIds).toEqual(params.pluginIds);
230+expect(startupInput.preferSetupRuntimeForChannelPlugins).toBe(
231+params.preferSetupRuntimeForChannelPlugins,
232+);
233+expect(startupInput.suppressPluginInfoLogs).toBe(params.suppressPluginInfoLogs);
234+}
235+177236describe("prepareGatewayPluginBootstrap startup plugins", () => {
178237beforeEach(() => {
179238applyPluginAutoEnable.mockClear();
@@ -308,83 +367,32 @@ describe("prepareGatewayPluginBootstrap startup plugins", () => {
308367});
309368310369it("loads only deferred setup-runtime plugins during pre-bind bootstrap", async () => {
311-loadPluginLookUpTable.mockReturnValueOnce({
312-manifestRegistry: pluginManifestRegistry,
313-startup: {
314-configuredDeferredChannelPluginIds: ["slack"] as string[],
315-pluginIds: ["slack", "memory-core"] as string[],
316-},
317-metrics: {
318- ...pluginLookUpTableMetrics,
319-startupPluginCount: 2,
320-deferredChannelPluginCount: 1,
321-},
322-});
323-const cfg = {
324-channels: {
325-slack: { enabled: true, token: "token" },
326-},
327-} as OpenClawConfig;
328-const log = createLog();
329-const { prepareGatewayPluginBootstrap } = await import("./server-startup-plugins.js");
370+mockDeferredSlackStartupPlugins();
330371331-const result = await prepareGatewayPluginBootstrap({
332-cfgAtStart: cfg,
333-startupRuntimeConfig: cfg,
334-minimalTestGateway: false,
335- log,
372+const result = await prepareBootstrapWithRuntimeConfig(slackConfig(), {
336373loadRuntimePlugins: false,
337374loadSetupRuntimePlugins: true,
338375});
339376340377expect(result.runtimePluginsLoaded).toBe(false);
341-const startupInput = firstCallArg<{
342-pluginIds?: string[];
343-preferSetupRuntimeForChannelPlugins?: boolean;
344-suppressPluginInfoLogs?: boolean;
345-}>(loadGatewayStartupPlugins);
346-expect(startupInput.pluginIds).toEqual(["slack"]);
347-expect(startupInput.preferSetupRuntimeForChannelPlugins).toBe(true);
348-expect(startupInput.suppressPluginInfoLogs).toBe(true);
378+expectStartupPluginLoad({
379+pluginIds: ["slack"],
380+preferSetupRuntimeForChannelPlugins: true,
381+suppressPluginInfoLogs: true,
382+});
349383});
350384351385it("does not use setup-runtime preference for full bootstrap loads", async () => {
352-loadPluginLookUpTable.mockReturnValueOnce({
353-manifestRegistry: pluginManifestRegistry,
354-startup: {
355-configuredDeferredChannelPluginIds: ["slack"] as string[],
356-pluginIds: ["slack", "memory-core"] as string[],
357-},
358-metrics: {
359- ...pluginLookUpTableMetrics,
360-startupPluginCount: 2,
361-deferredChannelPluginCount: 1,
362-},
363-});
364-const cfg = {
365-channels: {
366-slack: { enabled: true, token: "token" },
367-},
368-} as OpenClawConfig;
369-const log = createLog();
370-const { prepareGatewayPluginBootstrap } = await import("./server-startup-plugins.js");
386+mockDeferredSlackStartupPlugins();
371387372-const result = await prepareGatewayPluginBootstrap({
373-cfgAtStart: cfg,
374-startupRuntimeConfig: cfg,
375-minimalTestGateway: false,
376- log,
377-});
388+const result = await prepareBootstrapWithRuntimeConfig(slackConfig());
378389379390expect(result.runtimePluginsLoaded).toBe(true);
380-const startupInput = firstCallArg<{
381-pluginIds?: string[];
382-preferSetupRuntimeForChannelPlugins?: boolean;
383-suppressPluginInfoLogs?: boolean;
384-}>(loadGatewayStartupPlugins);
385-expect(startupInput.pluginIds).toEqual(["slack", "memory-core"]);
386-expect(startupInput.preferSetupRuntimeForChannelPlugins).toBe(false);
387-expect(startupInput.suppressPluginInfoLogs).toBe(false);
391+expectStartupPluginLoad({
392+pluginIds: ["slack", "memory-core"],
393+preferSetupRuntimeForChannelPlugins: false,
394+suppressPluginInfoLogs: false,
395+});
388396});
389397390398it("bypasses plugin lookup when plugins are globally disabled", async () => {
@@ -402,15 +410,8 @@ describe("prepareGatewayPluginBootstrap startup plugins", () => {
402410},
403411},
404412} as OpenClawConfig;
405-const log = createLog();
406-const { prepareGatewayPluginBootstrap } = await import("./server-startup-plugins.js");
407413408-const result = await prepareGatewayPluginBootstrap({
409-cfgAtStart: cfg,
410-startupRuntimeConfig: cfg,
411-minimalTestGateway: false,
412- log,
413-});
414+const result = await prepareBootstrapWithRuntimeConfig(cfg);
414415expect(result.startupPluginIds).toEqual([]);
415416expect(result.deferredConfiguredChannelPluginIds).toEqual([]);
416417expect(result.pluginLookUpTable).toBeUndefined();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。