
















@@ -110,6 +110,17 @@ function createGoogleSearchProvider(
110110});
111111}
112112113+function requireRecord(value: unknown): Record<string, unknown> {
114+expect(value).toBeTruthy();
115+expect(typeof value).toBe("object");
116+expect(Array.isArray(value)).toBe(false);
117+return value as Record<string, unknown>;
118+}
119+120+function mockCallParam(mock: ReturnType<typeof vi.fn>, index = 0): Record<string, unknown> {
121+return requireRecord(mock.mock.calls[index]?.[0]);
122+}
123+113124function createDuckDuckGoSearchProvider(
114125overrides: Partial<WebSearchTestProviderParams> = {},
115126): PluginWebSearchProviderEntry {
@@ -568,35 +579,27 @@ describe("web search runtime", () => {
568579);
569580resolveRuntimeWebSearchProvidersMock.mockReturnValue([createDuckDuckGoSearchProvider()]);
570581571-await expect(
572-runWebSearch({
573-config: {
574-tools: {
575-web: {
576-search: {
577-provider: "duckduckgo",
578-},
582+const result = await runWebSearch({
583+config: {
584+tools: {
585+web: {
586+search: {
587+provider: "duckduckgo",
579588},
580589},
581590},
582-args: { query: "configured-duck" },
583-}),
584-).resolves.toMatchObject({
585-provider: "duckduckgo",
591+},
592+args: { query: "configured-duck" },
586593});
587-588-expect(resolveManifestContractOwnerPluginIdMock).toHaveBeenCalledWith(
589-expect.objectContaining({
590-contract: "webSearchProviders",
591-origin: "bundled",
592-value: "duckduckgo",
593-}),
594-);
595-expect(resolveRuntimeWebSearchProvidersMock).toHaveBeenCalledWith(
596-expect.objectContaining({
597-onlyPluginIds: ["duckduckgo"],
598-}),
599-);
594+expect(result.provider).toBe("duckduckgo");
595+596+const ownerCall = mockCallParam(resolveManifestContractOwnerPluginIdMock);
597+expect(ownerCall.contract).toBe("webSearchProviders");
598+expect(ownerCall.origin).toBe("bundled");
599+expect(ownerCall.value).toBe("duckduckgo");
600+expect(mockCallParam(resolveRuntimeWebSearchProvidersMock).onlyPluginIds).toEqual([
601+"duckduckgo",
602+]);
600603});
601604602605it("scopes runtime provider loading through manifest ownership when provider id differs from plugin id", async () => {
@@ -610,26 +613,19 @@ describe("web search runtime", () => {
610613}),
611614]);
612615613-await expect(
614-runWebSearch({
615-config: {},
616-runtimeWebSearch: {
617-providerConfigured: "gemini",
618-selectedProvider: "gemini",
619-providerSource: "configured",
620-diagnostics: [],
621-},
622-args: { query: "configured-gemini" },
623-}),
624-).resolves.toMatchObject({
625-provider: "gemini",
616+const result = await runWebSearch({
617+config: {},
618+runtimeWebSearch: {
619+providerConfigured: "gemini",
620+selectedProvider: "gemini",
621+providerSource: "configured",
622+diagnostics: [],
623+},
624+args: { query: "configured-gemini" },
626625});
626+expect(result.provider).toBe("gemini");
627627628-expect(resolveRuntimeWebSearchProvidersMock).toHaveBeenCalledWith(
629-expect.objectContaining({
630-onlyPluginIds: ["google"],
631-}),
632-);
628+expect(mockCallParam(resolveRuntimeWebSearchProvidersMock).onlyPluginIds).toEqual(["google"]);
633629});
634630635631it("keeps runtime provider loading unscoped when configured provider ownership is unknown", async () => {
@@ -642,28 +638,21 @@ describe("web search runtime", () => {
642638}),
643639]);
644640645-await expect(
646-runWebSearch({
647-config: {
648-tools: {
649-web: {
650-search: {
651-provider: "external-search",
652-},
641+const result = await runWebSearch({
642+config: {
643+tools: {
644+web: {
645+search: {
646+provider: "external-search",
653647},
654648},
655649},
656-args: { query: "external-provider" },
657-}),
658-).resolves.toMatchObject({
659-provider: "external-search",
650+},
651+args: { query: "external-provider" },
660652});
653+expect(result.provider).toBe("external-search");
661654662-expect(resolveRuntimeWebSearchProvidersMock).toHaveBeenCalledWith(
663-expect.not.objectContaining({
664-onlyPluginIds: expect.anything(),
665-}),
666-);
655+expect(mockCallParam(resolveRuntimeWebSearchProvidersMock).onlyPluginIds).toBeUndefined();
667656});
668657669658it("does not fall back when the caller explicitly selects a provider", async () => {
@@ -731,26 +720,22 @@ describe("web search runtime", () => {
731720createDuckDuckGoSearchProvider(),
732721]);
733722734-await expect(
735-runWebSearch({
736-config: {
737-tools: {
738-web: {
739-search: {
740-provider: "missing-id",
741-},
723+const result = await runWebSearch({
724+config: {
725+tools: {
726+web: {
727+search: {
728+provider: "missing-id",
742729},
743730},
744731},
745-args: { query: "config-typo" },
746-}),
747-).resolves.toMatchObject({
748-provider: "duckduckgo",
749-result: expect.objectContaining({
750-provider: "duckduckgo",
751-query: "config-typo",
752-}),
732+},
733+args: { query: "config-typo" },
753734});
735+expect(result.provider).toBe("duckduckgo");
736+const searchResult = requireRecord(result.result);
737+expect(searchResult.provider).toBe("duckduckgo");
738+expect(searchResult.query).toBe("config-typo");
754739});
755740756741it("honors preferRuntimeProviders during execution", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。