
























@@ -373,6 +373,17 @@ function expectLoaderCall(overrides: Record<string, unknown>) {
373373expect(loadOpenClawPluginsMock).not.toHaveBeenCalled();
374374}
375375376+function mockCallParams(
377+mock: { mock: { calls: unknown[][] } },
378+index = 0,
379+): Record<string, unknown> {
380+const call = mock.mock.calls[index];
381+if (!call) {
382+throw new Error(`expected mock call ${index}`);
383+}
384+return call[0] as Record<string, unknown>;
385+}
386+376387function expectLoaderSelectedOnlyPluginIds(expectedPluginIds: readonly string[]) {
377388const selectedPluginIds = loadOpenClawPluginsMock.mock.calls.map(
378389([params]) => (params as { onlyPluginIds?: string[] }).onlyPluginIds,
@@ -628,14 +639,16 @@ describe("resolvePluginTools optional tools", () => {
628639);
629640630641expectResolvedToolNames(tools, ["other_tool", "optional_tool"]);
631-expect(loadOpenClawPluginsMock).toHaveBeenCalledWith(
632-expect.objectContaining({
633-activate: false,
634-cache: false,
635-onlyPluginIds: ["multi", "optional-demo"],
636-toolDiscovery: true,
637-}),
638-);
642+const loaderParams = mockCallParams(loadOpenClawPluginsMock) as {
643+activate?: unknown;
644+cache?: unknown;
645+onlyPluginIds?: unknown;
646+toolDiscovery?: unknown;
647+};
648+expect(loaderParams.activate).toBe(false);
649+expect(loaderParams.cache).toBe(false);
650+expect(loaderParams.onlyPluginIds).toEqual(["multi", "optional-demo"]);
651+expect(loaderParams.toolDiscovery).toBe(true);
639652});
640653641654it("warns when cold registry load still does not provide the selected plugin tools", () => {
@@ -1254,9 +1267,9 @@ describe("resolvePluginTools optional tools", () => {
12541267);
12551268const { loadManifestContractSnapshot } = await import("./manifest-contract-eligibility.js");
12561269const snapshot = loadManifestContractSnapshot({ config, workspaceDir: "/tmp" });
1257-expect(
1258-snapshot.plugins.find((plugin) => plugin.id === "multi")?.toolMetadata?.optional_tool,
1259-).toMatchObject({ optional: true });
1270+const optionalToolMetadata = snapshot.plugins.find((plugin) => plugin.id === "multi")
1271+?.toolMetadata?.optional_tool;
1272+expect(optionalToolMetadata?.optional).toBe(true);
1260127312611274const tools = resolvePluginTools(
12621275createResolveToolsParams({
@@ -1859,17 +1872,13 @@ describe("resolvePluginTools optional tools", () => {
18591872] as const)("$name", ({ expectedToolNames }) => {
18601873const { rawContext, autoEnabledConfig, tools } = resolveAutoEnabledOptionalDemoTools();
186118741862-expect(applyPluginAutoEnableMock).toHaveBeenCalledWith(
1863-expect.objectContaining({
1864-config: expect.objectContaining({
1865-plugins: expect.objectContaining({
1866-allow: rawContext.config.plugins?.allow,
1867-load: rawContext.config.plugins?.load,
1868-}),
1869-}),
1870-env: process.env,
1871-}),
1872-);
1875+const autoEnableParams = mockCallParams(applyPluginAutoEnableMock) as {
1876+config?: { plugins?: { allow?: unknown; load?: unknown } };
1877+env?: unknown;
1878+};
1879+expect(autoEnableParams.config?.plugins?.allow).toEqual(rawContext.config.plugins?.allow);
1880+expect(autoEnableParams.config?.plugins?.load).toEqual(rawContext.config.plugins?.load);
1881+expect(autoEnableParams.env).toBe(process.env);
18731882if (expectedToolNames) {
18741883expectResolvedToolNames(tools, expectedToolNames);
18751884}
@@ -2157,13 +2166,14 @@ describe("resolvePluginTools optional tools", () => {
2157216621582167expectResolvedToolNames(tools, ["memory_search", "memory_get"]);
21592168expect(memorySearchFactory).toHaveBeenCalledTimes(1);
2160-expect(loadOpenClawPluginsMock).toHaveBeenCalledWith(
2161-expect.objectContaining({
2162-activate: false,
2163-onlyPluginIds: ["memory-core"],
2164-toolDiscovery: true,
2165-}),
2166-);
2169+const loaderParams = mockCallParams(loadOpenClawPluginsMock) as {
2170+activate?: unknown;
2171+onlyPluginIds?: unknown;
2172+toolDiscovery?: unknown;
2173+};
2174+expect(loaderParams.activate).toBe(false);
2175+expect(loaderParams.onlyPluginIds).toEqual(["memory-core"]);
2176+expect(loaderParams.toolDiscovery).toBe(true);
21672177});
2168217821692179it("adds enabled non-startup tool plugins to the active tool runtime scope", () => {
@@ -2216,18 +2226,18 @@ describe("resolvePluginTools optional tools", () => {
22162226toolAllowlist: ["*", "tavily"],
22172227allowGatewaySubagentBinding: true,
22182228});
2219-expect(resolveRuntimePluginRegistryMock).toHaveBeenCalledWith(
2220-expect.objectContaining({
2221- onlyPluginIds: expect.arrayContaining(["tavily"]),
2222- toolDiscovery: true,
2223- }),
2224-);
2225-expect(loadOpenClawPluginsMock).toHaveBeenCalledWith(
2226-expect.objectContaining({
2227- onlyPluginIds: expect.arrayContaining(["tavily"]),
2228- toolDiscovery: true,
2229- }),
2230-);
2229+const runtimeRegistryParams = mockCallParams(resolveRuntimePluginRegistryMock) as {
2230+onlyPluginIds?: string[];
2231+toolDiscovery?: unknown;
2232+};
2233+expect(runtimeRegistryParams.onlyPluginIds).toContain("tavily");
2234+expect(runtimeRegistryParams.toolDiscovery).toBe(true);
2235+const loaderParams = mockCallParams(loadOpenClawPluginsMock) as {
2236+onlyPluginIds?: string[];
2237+toolDiscovery?: unknown;
2238+};
2239+expect(loaderParams.onlyPluginIds).toContain("tavily");
2240+expect(loaderParams.toolDiscovery).toBe(true);
22312241});
2232224222332243it("reuses the pinned gateway channel registry after provider runtime loads replace active registry", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。