From 18e5b0e3e378304d14ed53df01e2d2c0d3b02879 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 10 Aug 2026 15:44:54 -0700 Subject: [PATCH] test(web): trim duplicate provider test surfaces (#121727) --- extensions/duckduckgo/src/ddg-client.ts | 2 - .../src/ddg-search-provider.test.ts | 20 --- .../src/exa-web-search-provider.runtime.ts | 4 - extensions/exa/test-api.ts | 2 +- extensions/firecrawl/src/firecrawl-client.ts | 2 - .../firecrawl/src/firecrawl-tools.test.ts | 152 ------------------ extensions/google/test-api.ts | 7 - .../minimax-web-search-provider.runtime.ts | 1 - .../src/kimi-web-search-provider.runtime.ts | 2 - extensions/moonshot/test-api.ts | 2 +- .../parallel-web-search-provider.runtime.ts | 5 - extensions/parallel/test-api.ts | 2 +- .../perplexity-web-search-provider.runtime.ts | 4 - extensions/perplexity/test-api.ts | 2 - extensions/searxng/src/searxng-client.ts | 1 - extensions/tavily/src/tavily-client.ts | 1 - .../xai/src/web-search-provider.runtime.ts | 4 - extensions/xai/test-api.ts | 2 - extensions/xai/web-search.test.ts | 2 +- .../lib/openai-web-search-minimal/client.mjs | 1 - scripts/firecrawl-compare.ts | 2 - 21 files changed, 4 insertions(+), 216 deletions(-) delete mode 100644 extensions/google/test-api.ts delete mode 100644 extensions/perplexity/test-api.ts delete mode 100644 extensions/xai/test-api.ts diff --git a/extensions/duckduckgo/src/ddg-client.ts b/extensions/duckduckgo/src/ddg-client.ts index 6a907750d789..212d909d3ade 100644 --- a/extensions/duckduckgo/src/ddg-client.ts +++ b/extensions/duckduckgo/src/ddg-client.ts @@ -214,10 +214,8 @@ export async function runDuckDuckGoSearch(params: { } export const testing = { - decodeDuckDuckGoUrl, decodeHtmlEntities, isBotChallenge, parseDuckDuckGoHtml, readDuckDuckGoHtmlResponse, }; -export { testing as __testing }; diff --git a/extensions/duckduckgo/src/ddg-search-provider.test.ts b/extensions/duckduckgo/src/ddg-search-provider.test.ts index 0451c9592bfb..b7c1bc07a477 100644 --- a/extensions/duckduckgo/src/ddg-search-provider.test.ts +++ b/extensions/duckduckgo/src/ddg-search-provider.test.ts @@ -254,18 +254,6 @@ describe("duckduckgo web search provider", () => { ).toBe("off"); }); - it("decodes direct and redirect urls plus common html entities", () => { - expect( - ddgClientTesting.decodeDuckDuckGoUrl( - "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com%2Fsearch%3Fq%3Dclaw", - ), - ).toBe("https://example.com/search?q=claw"); - expect(ddgClientTesting.decodeDuckDuckGoUrl("https://example.com")).toBe("https://example.com"); - expect(ddgClientTesting.decodeHtmlEntities("Fish & Chips … 'ok'")).toBe( - "Fish & Chips ... 'ok'", - ); - }); - it("leaves out-of-range numeric html entities intact instead of throwing", () => { expect(() => ddgClientTesting.decodeHtmlEntities("Result � end")).not.toThrow(); expect(ddgClientTesting.decodeHtmlEntities("Result � end")).toBe( @@ -347,14 +335,6 @@ describe("duckduckgo web search provider", () => { `; expect(ddgClientTesting.isBotChallenge(challengeHtml)).toBe(true); - expect(ddgClientTesting.parseDuckDuckGoHtml(challengeHtml)).toStrictEqual([]); expect(ddgClientTesting.isBotChallenge(normalHtml)).toBe(false); - expect(ddgClientTesting.parseDuckDuckGoHtml(normalHtml)).toEqual([ - { - title: "Coding Challenge", - url: "https://example.com/challenge", - snippet: "A fun coding challenge for interview prep.", - }, - ]); }); }); diff --git a/extensions/exa/src/exa-web-search-provider.runtime.ts b/extensions/exa/src/exa-web-search-provider.runtime.ts index 1245230bef28..dc8b76a9ff1a 100644 --- a/extensions/exa/src/exa-web-search-provider.runtime.ts +++ b/extensions/exa/src/exa-web-search-provider.runtime.ts @@ -621,12 +621,9 @@ export async function executeExaWebSearchProviderTool( } export const testing = { - normalizeExaResults, - normalizeExaFreshness, parseExaContents, buildExaCacheKey, resolveExaApiKey, - resolveExaConfig, resolveExaDescription, resolveExaSearchCount, resolveExaSearchEndpoint, @@ -634,4 +631,3 @@ export const testing = { readExaErrorDetail, readExaSearchResults, } as const; -export { testing as __testing }; diff --git a/extensions/exa/test-api.ts b/extensions/exa/test-api.ts index a479ec3fe237..ccb95a00d7ae 100644 --- a/extensions/exa/test-api.ts +++ b/extensions/exa/test-api.ts @@ -1,2 +1,2 @@ // Exa API module exposes the plugin public contract. -export { testing, testing as __testing } from "./src/exa-web-search-provider.runtime.js"; +export { testing } from "./src/exa-web-search-provider.runtime.js"; diff --git a/extensions/firecrawl/src/firecrawl-client.ts b/extensions/firecrawl/src/firecrawl-client.ts index 772b4ff55ebf..f67eff9b4d11 100644 --- a/extensions/firecrawl/src/firecrawl-client.ts +++ b/extensions/firecrawl/src/firecrawl-client.ts @@ -729,7 +729,5 @@ export const testing = { postFirecrawlJson, readFirecrawlJsonResponse, resolveEndpoint, - validateFirecrawlBaseUrl, resolveSearchItems, }; -export { testing as __testing }; diff --git a/extensions/firecrawl/src/firecrawl-tools.test.ts b/extensions/firecrawl/src/firecrawl-tools.test.ts index f3af0e8e0246..d677d49a3117 100644 --- a/extensions/firecrawl/src/firecrawl-tools.test.ts +++ b/extensions/firecrawl/src/firecrawl-tools.test.ts @@ -124,85 +124,6 @@ describe("firecrawl tools", () => { expect(preservedFetchProvider.tools?.web?.fetch?.provider).toBe("other"); }); - it("parses scrape payloads into wrapped external-content results", () => { - const result = firecrawlClientTesting.parseFirecrawlScrapePayload({ - payload: { - success: true, - data: { - markdown: "# Hello\n\nWorld", - metadata: { - title: "Example page", - sourceURL: "https://example.com/final", - statusCode: 200, - }, - }, - }, - url: "https://example.com/start", - extractMode: "text", - maxChars: 1000, - }); - - expect(result.finalUrl).toBe("https://example.com/final"); - expect(result.status).toBe(200); - expect(result.extractor).toBe("firecrawl"); - expect(String(result.text)).toContain("Hello"); - expect(String(result.text)).toContain("World"); - expect(result.truncated).toBe(false); - }); - - it("extracts search items from flexible Firecrawl payload shapes", () => { - const items = firecrawlClientTesting.resolveSearchItems({ - success: true, - data: [ - { - title: "Docs", - url: "https://docs.example.com/path", - description: "Reference docs", - markdown: "Body", - }, - ], - }); - - expect(items).toEqual([ - { - title: "Docs", - url: "https://docs.example.com/path", - description: "Reference docs", - content: "Body", - published: undefined, - siteName: "docs.example.com", - }, - ]); - }); - - it("extracts search items from Firecrawl v2 data.web payloads", () => { - const items = firecrawlClientTesting.resolveSearchItems({ - success: true, - data: { - web: [ - { - title: "API Platform - OpenAI", - url: "https://openai.com/api/", - description: "Build on the OpenAI API platform.", - markdown: "# API Platform", - position: 1, - }, - ], - }, - }); - - expect(items).toEqual([ - { - title: "API Platform - OpenAI", - url: "https://openai.com/api/", - description: "Build on the OpenAI API platform.", - content: "# API Platform", - published: undefined, - siteName: "openai.com", - }, - ]); - }); - it("bounds canonical provider URLs after percent-encoding hostile Unicode", () => { const expandedUrl = `https://example.com/${"🦀".repeat(1_000)}`; expect(expandedUrl.length).toBeLessThan(2_048); @@ -1623,78 +1544,5 @@ describe("firecrawl tools", () => { expect(resolveFirecrawlScrapeTimeoutSeconds(cfg, 0)).toBe(42); expect(resolveFirecrawlSearchTimeoutSeconds(0.5)).toBe(1); }); - - it("normalizes mixed search payload shapes into search items", () => { - expect( - firecrawlClientTesting.resolveSearchItems({ - data: { - results: [ - { - sourceURL: "https://www.example.com/post", - snippet: "Snippet text", - markdown: "# Title\nBody", - metadata: { - title: "Example title", - publishedDate: "2026-03-22", - }, - }, - { - url: "", - }, - ], - }, - }), - ).toEqual([ - { - title: "Example title", - url: "https://www.example.com/post", - description: "Snippet text", - content: "# Title\nBody", - published: "2026-03-22", - siteName: "example.com", - }, - ]); - }); - - it("parses scrape payloads, extracts text, and marks truncation", () => { - const result = firecrawlClientTesting.parseFirecrawlScrapePayload({ - payload: { - data: { - markdown: "# Hello\n\nThis is a long body for scraping.", - metadata: { - title: "Example page", - sourceURL: "https://docs.example.com/page", - statusCode: 200, - }, - }, - warning: "cached result", - }, - url: "https://docs.example.com/page", - extractMode: "text", - maxChars: 12, - }); - - expect(result.finalUrl).toBe("https://docs.example.com/page"); - expect(result.status).toBe(200); - expect(result.extractMode).toBe("text"); - expect(result.truncated).toBe(true); - expect(result.rawLength).toBeGreaterThan(12); - expect(String(result.text)).toContain("Hello"); - expect(String(result.title)).toContain("Example page"); - expect(String(result.warning)).toContain("cached result"); - }); - - it("throws when scrape payload has no usable content", () => { - expect(() => - firecrawlClientTesting.parseFirecrawlScrapePayload({ - payload: { - data: {}, - }, - url: "https://docs.example.com/page", - extractMode: "markdown", - maxChars: 100, - }), - ).toThrow("Firecrawl scrape returned no content."); - }); }); /* oxlint-disable max-lines -- TODO: split this grandfathered oversized file. */ diff --git a/extensions/google/test-api.ts b/extensions/google/test-api.ts deleted file mode 100644 index c6199dbab7a9..000000000000 --- a/extensions/google/test-api.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Google API module exposes the plugin public contract. -export { buildGoogleGeminiCliBackend } from "./cli-backend.js"; -export { buildGoogleImageGenerationProvider } from "./image-generation-provider.js"; -export { buildGoogleMusicGenerationProvider } from "./music-generation-provider.js"; -export { buildGoogleSpeechProvider } from "./speech-provider.js"; -export { googleMediaUnderstandingProvider } from "./media-understanding-provider.js"; -export { buildGoogleVideoGenerationProvider } from "./video-generation-provider.js"; diff --git a/extensions/minimax/src/minimax-web-search-provider.runtime.ts b/extensions/minimax/src/minimax-web-search-provider.runtime.ts index c900c79680af..61657d45e2f7 100644 --- a/extensions/minimax/src/minimax-web-search-provider.runtime.ts +++ b/extensions/minimax/src/minimax-web-search-provider.runtime.ts @@ -281,4 +281,3 @@ export const testing = { resolveMiniMaxRegion, readMiniMaxSearchJsonResponse: readProviderJsonResponse, } as const; -export { testing as __testing }; diff --git a/extensions/moonshot/src/kimi-web-search-provider.runtime.ts b/extensions/moonshot/src/kimi-web-search-provider.runtime.ts index 7ab5e266f092..51989059ba73 100644 --- a/extensions/moonshot/src/kimi-web-search-provider.runtime.ts +++ b/extensions/moonshot/src/kimi-web-search-provider.runtime.ts @@ -515,7 +515,5 @@ export const testing = { resolveKimiModel, resolveKimiBaseUrl, extractKimiCitations, - hasKimiSearchResults, extractKimiToolResultContent, } as const; -export { testing as __testing }; diff --git a/extensions/moonshot/test-api.ts b/extensions/moonshot/test-api.ts index 3aca7e291d02..a0313698dac8 100644 --- a/extensions/moonshot/test-api.ts +++ b/extensions/moonshot/test-api.ts @@ -1,3 +1,3 @@ // Moonshot API module exposes the plugin public contract. -export { testing, testing as __testing } from "./src/kimi-web-search-provider.runtime.js"; +export { testing } from "./src/kimi-web-search-provider.runtime.js"; export { moonshotMediaUnderstandingProvider } from "./media-understanding-provider.js"; diff --git a/extensions/parallel/src/parallel-web-search-provider.runtime.ts b/extensions/parallel/src/parallel-web-search-provider.runtime.ts index 6f12d8ce6678..a039b20fd032 100644 --- a/extensions/parallel/src/parallel-web-search-provider.runtime.ts +++ b/extensions/parallel/src/parallel-web-search-provider.runtime.ts @@ -279,7 +279,6 @@ export async function executeParallelWebSearchProviderTool( export const testing = { buildParallelCacheKey, - invalidSearchQueriesPayload, missingParallelKeyPayload, normalizeParallelClientModel, normalizeParallelObjective, @@ -287,12 +286,8 @@ export const testing = { normalizeParallelSearchQueries, normalizeParallelSessionId, resolveParallelApiKey, - resolveParallelConfig, resolveParallelSearchCount, resolveParallelSearchEndpoint, - PARALLEL_ERROR_BODY_LIMIT_BYTES, PARALLEL_SEARCH_RESPONSE_LIMIT_BYTES, USER_AGENT, } as const; - -export { testing as __testing }; diff --git a/extensions/parallel/test-api.ts b/extensions/parallel/test-api.ts index 2eba18dd2b63..17b87148d0f9 100644 --- a/extensions/parallel/test-api.ts +++ b/extensions/parallel/test-api.ts @@ -1 +1 @@ -export { testing, testing as __testing } from "./src/parallel-web-search-provider.runtime.js"; +export { testing } from "./src/parallel-web-search-provider.runtime.js"; diff --git a/extensions/perplexity/src/perplexity-web-search-provider.runtime.ts b/extensions/perplexity/src/perplexity-web-search-provider.runtime.ts index cf76aed0c653..5ea911d92245 100644 --- a/extensions/perplexity/src/perplexity-web-search-provider.runtime.ts +++ b/extensions/perplexity/src/perplexity-web-search-provider.runtime.ts @@ -558,11 +558,7 @@ export const testing = { resolvePerplexityBaseUrl, resolvePerplexityModel, resolvePerplexityTransport, - isDirectPerplexityBaseUrl, resolvePerplexityRequestModel, resolvePerplexityApiKey, readPerplexityJsonResponse, - normalizeToIsoDate, - isoToPerplexityDate, } as const; -export { testing as __testing }; diff --git a/extensions/perplexity/test-api.ts b/extensions/perplexity/test-api.ts deleted file mode 100644 index ed109179168b..000000000000 --- a/extensions/perplexity/test-api.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Perplexity API module exposes the plugin public contract. -export { testing, testing as __testing } from "./src/perplexity-web-search-provider.runtime.js"; diff --git a/extensions/searxng/src/searxng-client.ts b/extensions/searxng/src/searxng-client.ts index 20c7d385a9b8..f3f8f2337a38 100644 --- a/extensions/searxng/src/searxng-client.ts +++ b/extensions/searxng/src/searxng-client.ts @@ -332,4 +332,3 @@ export const testing = { validateSearxngBaseUrl, SEARXNG_SEARCH_CACHE, }; -export { testing as __testing }; diff --git a/extensions/tavily/src/tavily-client.ts b/extensions/tavily/src/tavily-client.ts index 2c39ea3e0942..39cf2d113b1c 100644 --- a/extensions/tavily/src/tavily-client.ts +++ b/extensions/tavily/src/tavily-client.ts @@ -413,4 +413,3 @@ export const testing = { readTavilyJsonResponse, resolveEndpoint, }; -export { testing as __testing }; diff --git a/extensions/xai/src/web-search-provider.runtime.ts b/extensions/xai/src/web-search-provider.runtime.ts index 35a50ae15bcb..7295f3022137 100644 --- a/extensions/xai/src/web-search-provider.runtime.ts +++ b/extensions/xai/src/web-search-provider.runtime.ts @@ -424,12 +424,8 @@ export const testing = { buildXaiWebSearchPayload, extractXaiWebSearchContent, resolveXaiToolSearchConfig, - resolveXaiWebSearchAuth, resolveXaiInlineCitations, resolveXaiWebSearchCredential, - resolveXaiWebSearchEndpoint, resolveXaiWebSearchModel, resolveXaiWebSearchTimeoutSeconds, - requestXaiWebSearch, }; -export { testing as __testing }; diff --git a/extensions/xai/test-api.ts b/extensions/xai/test-api.ts deleted file mode 100644 index bac4983fa6f3..000000000000 --- a/extensions/xai/test-api.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Xai API module exposes the plugin public contract. -export { testing, testing as __testing } from "./src/web-search-provider.runtime.js"; diff --git a/extensions/xai/web-search.test.ts b/extensions/xai/web-search.test.ts index c24b07216959..d5e9c1452601 100644 --- a/extensions/xai/web-search.test.ts +++ b/extensions/xai/web-search.test.ts @@ -7,8 +7,8 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { buildXaiCatalogModels, resolveXaiCatalogEntry } from "./model-definitions.js"; import { isModernXaiModel, resolveXaiForwardCompatModel } from "./provider-models.js"; import { resolveFallbackXaiAuth } from "./src/tool-auth-shared.js"; +import { testing } from "./src/web-search-provider.runtime.js"; import { requestXaiWebSearch } from "./src/web-search-shared.js"; -import { testing } from "./test-api.js"; import { createXaiWebSearchProvider as createXaiWebSearchContractProvider } from "./web-search-contract-api.js"; import { createXaiWebSearchProvider } from "./web-search.js"; diff --git a/scripts/e2e/lib/openai-web-search-minimal/client.mjs b/scripts/e2e/lib/openai-web-search-minimal/client.mjs index e3d4f40b409f..e35c3904d0c4 100644 --- a/scripts/e2e/lib/openai-web-search-minimal/client.mjs +++ b/scripts/e2e/lib/openai-web-search-minimal/client.mjs @@ -194,7 +194,6 @@ export const testing = { DEFAULT_GATEWAY_SCHEMA_ERROR, DEFAULT_RAW_SCHEMA_ERROR, SUCCESS_MARKER, - extractSuccessReplyTexts, resolveGatewayPort, validateSuccessResult, validateRejectResult, diff --git a/scripts/firecrawl-compare.ts b/scripts/firecrawl-compare.ts index 27d4c4a345a2..c17335dfeed9 100644 --- a/scripts/firecrawl-compare.ts +++ b/scripts/firecrawl-compare.ts @@ -174,8 +174,6 @@ if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) { } export const testing = { - FETCH_HTML_MAX_BYTES, fetchHtml, - readBoundedResponseText, truncate, };