diff --git a/extensions/brave/src/brave-web-search-provider.test.ts b/extensions/brave/src/brave-web-search-provider.test.ts index 31462b2d5da..a4bc115aaa3 100644 --- a/extensions/brave/src/brave-web-search-provider.test.ts +++ b/extensions/brave/src/brave-web-search-provider.test.ts @@ -72,6 +72,22 @@ function readHeader(init: unknown, name: string): string | null { return new Headers(headers).get(name); } +function fetchCall(mockFetch: { mock: { calls: Array> } }, index = 0) { + const call = mockFetch.mock.calls.at(index); + if (!call) { + throw new Error(`Expected fetch call ${index + 1}`); + } + return call; +} + +function fetchRequestUrl(mockFetch: { mock: { calls: Array> } }, index = 0) { + return new URL(String(fetchCall(mockFetch, index)[0])); +} + +function fetchRequestInit(mockFetch: { mock: { calls: Array> } }, index = 0) { + return fetchCall(mockFetch, index)[1]; +} + describe("brave web search provider", () => { const priorFetch = global.fetch; @@ -220,7 +236,7 @@ describe("brave web search provider", () => { await tool.execute({ query: "latest ai news" }); - const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0])); + const requestUrl = fetchRequestUrl(mockFetch); expect(requestUrl.origin).toBe("https://api.search.brave.com"); expect(requestUrl.pathname).toBe("/proxy/res/v1/web/search"); }); @@ -245,7 +261,7 @@ describe("brave web search provider", () => { await tool.execute({ query: "latest ai news" }); - const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0])); + const requestUrl = fetchRequestUrl(mockFetch); expect(requestUrl.pathname).toBe("/proxy/res/v1/llm/context"); }); @@ -288,12 +304,8 @@ describe("brave web search provider", () => { await secondTool.execute({ query: "base url cache identity" }); expect(mockFetch).toHaveBeenCalledTimes(2); - expect(new URL(String(mockFetch.mock.calls[0]?.[0])).pathname).toBe( - "/proxy-one/res/v1/web/search", - ); - expect(new URL(String(mockFetch.mock.calls[1]?.[0])).pathname).toBe( - "/proxy-two/res/v1/web/search", - ); + expect(fetchRequestUrl(mockFetch).pathname).toBe("/proxy-one/res/v1/web/search"); + expect(fetchRequestUrl(mockFetch, 1).pathname).toBe("/proxy-two/res/v1/web/search"); }); it("rejects invalid Brave mode values in the plugin config schema", () => { @@ -393,7 +405,7 @@ describe("brave web search provider", () => { await tool.execute({ query: "latest ai news", freshness: "week" }); - const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0])); + const requestUrl = fetchRequestUrl(mockFetch); expect(requestUrl.pathname).toBe("/res/v1/llm/context"); expect(requestUrl.searchParams.get("freshness")).toBe("pw"); }); @@ -422,10 +434,10 @@ describe("brave web search provider", () => { await tool.execute({ query: "latest ai news" }); - const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0])); + const requestUrl = fetchRequestUrl(mockFetch); expect(requestUrl.searchParams.get("apikey")).toBeNull(); expect(requestUrl.searchParams.get("key")).toBeNull(); - expect(readHeader(mockFetch.mock.calls[0]?.[1], "X-Subscription-Token")).toBe("brave-test-key"); + expect(readHeader(fetchRequestInit(mockFetch), "X-Subscription-Token")).toBe("brave-test-key"); }); it("sends Brave llm-context auth in the X-Subscription-Token header", async () => { @@ -445,10 +457,10 @@ describe("brave web search provider", () => { await tool.execute({ query: "latest ai news" }); - const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0])); + const requestUrl = fetchRequestUrl(mockFetch); expect(requestUrl.searchParams.get("apikey")).toBeNull(); expect(requestUrl.searchParams.get("key")).toBeNull(); - expect(readHeader(mockFetch.mock.calls[0]?.[1], "X-Subscription-Token")).toBe("brave-test-key"); + expect(readHeader(fetchRequestInit(mockFetch), "X-Subscription-Token")).toBe("brave-test-key"); }); it("passes bounded date ranges to Brave llm-context endpoint", async () => { @@ -472,7 +484,7 @@ describe("brave web search provider", () => { date_before: "2025-01-31", }); - const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0])); + const requestUrl = fetchRequestUrl(mockFetch); expect(requestUrl.pathname).toBe("/res/v1/llm/context"); expect(requestUrl.searchParams.get("freshness")).toBe("2025-01-01to2025-01-31"); }); @@ -495,7 +507,7 @@ describe("brave web search provider", () => { await tool.execute({ query: "latest ai news", date_after: "2025-01-01" }); const today = new Date().toISOString().slice(0, 10); - const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0])); + const requestUrl = fetchRequestUrl(mockFetch); expect(requestUrl.pathname).toBe("/res/v1/llm/context"); expect(requestUrl.searchParams.get("freshness")).toBe(`2025-01-01to${today}`); }); @@ -584,7 +596,7 @@ describe("brave web search provider", () => { country: "VN", }); - const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0])); + const requestUrl = fetchRequestUrl(mockFetch); expect(requestUrl.searchParams.get("country")).toBe("ALL"); });