






















@@ -162,6 +162,12 @@ function createLog() {
162162};
163163}
164164165+function firstCallArg<T>(mock: { mock: { calls: unknown[][] } }): T {
166+const call = mock.mock.calls[0];
167+expect(call).toBeDefined();
168+return call?.[0] as T;
169+}
170+165171describe("prepareGatewayPluginBootstrap startup plugins", () => {
166172beforeEach(() => {
167173applyPluginAutoEnable.mockClear();
@@ -254,71 +260,41 @@ describe("prepareGatewayPluginBootstrap startup plugins", () => {
254260env: process.env,
255261manifestRegistry: pluginManifestRegistry,
256262});
257-expect(loadPluginLookUpTable).toHaveBeenCalledWith(
258-expect.objectContaining({
259-activationSourceConfig: sourceConfig,
260-metadataSnapshot: pluginMetadataSnapshot,
261-config: expect.objectContaining({
262-channels: expect.objectContaining({
263-telegram: expect.objectContaining({
264-enabled: true,
265-dmPolicy: "pairing",
266-groupPolicy: "allowlist",
267-}),
268-}),
269-plugins: expect.objectContaining({
270-allow: ["bench-plugin"],
271-entries: expect.objectContaining({
272-"bench-plugin": expect.objectContaining({
273-enabled: true,
274-config: {
275-runtimeDefault: true,
276-},
277-}),
278-"memory-core": {
279-config: {
280-dreaming: {
281-enabled: false,
282-},
283-},
284-},
285-}),
286-}),
287-}),
288-}),
289-);
290-expect(loadGatewayStartupPlugins).toHaveBeenCalledWith(
291-expect.objectContaining({
292-activationSourceConfig: sourceConfig,
293-cfg: expect.objectContaining({
294-channels: expect.objectContaining({
295-telegram: expect.objectContaining({
296-enabled: true,
297-dmPolicy: "pairing",
298-groupPolicy: "allowlist",
299-}),
300-}),
301-plugins: expect.objectContaining({
302-allow: ["bench-plugin"],
303-entries: expect.objectContaining({
304-"bench-plugin": expect.objectContaining({
305-enabled: true,
306-config: {
307-runtimeDefault: true,
308-},
309-}),
310-"memory-core": {
311-config: {
312-dreaming: {
313-enabled: false,
314-},
315-},
316-},
317-}),
318-}),
319-}),
320-}),
321-);
263+const lookupInput = firstCallArg<{
264+activationSourceConfig?: OpenClawConfig;
265+metadataSnapshot?: PluginMetadataSnapshot;
266+config?: OpenClawConfig;
267+}>(loadPluginLookUpTable);
268+expect(lookupInput.activationSourceConfig).toBe(sourceConfig);
269+expect(lookupInput.metadataSnapshot).toBe(pluginMetadataSnapshot);
270+expect(lookupInput.config?.channels?.telegram?.enabled).toBe(true);
271+expect(lookupInput.config?.channels?.telegram?.dmPolicy).toBe("pairing");
272+expect(lookupInput.config?.channels?.telegram?.groupPolicy).toBe("allowlist");
273+expect(lookupInput.config?.plugins?.allow).toEqual(["bench-plugin"]);
274+expect(lookupInput.config?.plugins?.entries?.["bench-plugin"]?.enabled).toBe(true);
275+expect(lookupInput.config?.plugins?.entries?.["bench-plugin"]?.config).toEqual({
276+runtimeDefault: true,
277+});
278+expect(lookupInput.config?.plugins?.entries?.["memory-core"]?.config).toEqual({
279+dreaming: { enabled: false },
280+});
281+282+const startupInput = firstCallArg<{
283+activationSourceConfig?: OpenClawConfig;
284+cfg?: OpenClawConfig;
285+}>(loadGatewayStartupPlugins);
286+expect(startupInput.activationSourceConfig).toBe(sourceConfig);
287+expect(startupInput.cfg?.channels?.telegram?.enabled).toBe(true);
288+expect(startupInput.cfg?.channels?.telegram?.dmPolicy).toBe("pairing");
289+expect(startupInput.cfg?.channels?.telegram?.groupPolicy).toBe("allowlist");
290+expect(startupInput.cfg?.plugins?.allow).toEqual(["bench-plugin"]);
291+expect(startupInput.cfg?.plugins?.entries?.["bench-plugin"]?.enabled).toBe(true);
292+expect(startupInput.cfg?.plugins?.entries?.["bench-plugin"]?.config).toEqual({
293+runtimeDefault: true,
294+});
295+expect(startupInput.cfg?.plugins?.entries?.["memory-core"]?.config).toEqual({
296+dreaming: { enabled: false },
297+});
322298});
323299it("bypasses plugin lookup when plugins are globally disabled", async () => {
324300const cfg = {
@@ -338,29 +314,29 @@ describe("prepareGatewayPluginBootstrap startup plugins", () => {
338314const log = createLog();
339315const { prepareGatewayPluginBootstrap } = await import("./server-startup-plugins.js");
340316341-await expect(
342-prepareGatewayPluginBootstrap({
343-cfgAtStart: cfg,
344-startupRuntimeConfig: cfg,
345-minimalTestGateway: false,
346- log,
347-}),
348-).resolves.toMatchObject({
349-startupPluginIds: [],
350-deferredConfiguredChannelPluginIds: [],
351-pluginLookUpTable: undefined,
352-baseGatewayMethods: ["ping"],
317+const result = await prepareGatewayPluginBootstrap({
318+cfgAtStart: cfg,
319+startupRuntimeConfig: cfg,
320+minimalTestGateway: false,
321+ log,
353322});
323+expect(result.startupPluginIds).toEqual([]);
324+expect(result.deferredConfiguredChannelPluginIds).toEqual([]);
325+expect(result.pluginLookUpTable).toBeUndefined();
326+expect(result.baseGatewayMethods).toEqual(["ping"]);
354327355328expect(loadPluginLookUpTable).not.toHaveBeenCalled();
356-expect(loadGatewayStartupPlugins).toHaveBeenCalledWith(
357-expect.objectContaining({
358- cfg,
359-pluginIds: [],
360-pluginLookUpTable: undefined,
361-preferSetupRuntimeForChannelPlugins: false,
362-suppressPluginInfoLogs: false,
363-}),
364-);
329+const startupInput = firstCallArg<{
330+cfg?: OpenClawConfig;
331+pluginIds?: string[];
332+pluginLookUpTable?: unknown;
333+preferSetupRuntimeForChannelPlugins?: boolean;
334+suppressPluginInfoLogs?: boolean;
335+}>(loadGatewayStartupPlugins);
336+expect(startupInput.cfg).toStrictEqual(cfg);
337+expect(startupInput.pluginIds).toEqual([]);
338+expect(startupInput.pluginLookUpTable).toBeUndefined();
339+expect(startupInput.preferSetupRuntimeForChannelPlugins).toBe(false);
340+expect(startupInput.suppressPluginInfoLogs).toBe(false);
365341});
366342});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。