
























@@ -72,6 +72,22 @@ function readHeader(init: unknown, name: string): string | null {
7272return new Headers(headers).get(name);
7373}
747475+function fetchCall(mockFetch: { mock: { calls: Array<Array<unknown>> } }, index = 0) {
76+const call = mockFetch.mock.calls.at(index);
77+if (!call) {
78+throw new Error(`Expected fetch call ${index + 1}`);
79+}
80+return call;
81+}
82+83+function fetchRequestUrl(mockFetch: { mock: { calls: Array<Array<unknown>> } }, index = 0) {
84+return new URL(String(fetchCall(mockFetch, index)[0]));
85+}
86+87+function fetchRequestInit(mockFetch: { mock: { calls: Array<Array<unknown>> } }, index = 0) {
88+return fetchCall(mockFetch, index)[1];
89+}
90+7591describe("brave web search provider", () => {
7692const priorFetch = global.fetch;
7793@@ -220,7 +236,7 @@ describe("brave web search provider", () => {
220236221237await tool.execute({ query: "latest ai news" });
222238223-const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0]));
239+const requestUrl = fetchRequestUrl(mockFetch);
224240expect(requestUrl.origin).toBe("https://api.search.brave.com");
225241expect(requestUrl.pathname).toBe("/proxy/res/v1/web/search");
226242});
@@ -245,7 +261,7 @@ describe("brave web search provider", () => {
245261246262await tool.execute({ query: "latest ai news" });
247263248-const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0]));
264+const requestUrl = fetchRequestUrl(mockFetch);
249265expect(requestUrl.pathname).toBe("/proxy/res/v1/llm/context");
250266});
251267@@ -288,12 +304,8 @@ describe("brave web search provider", () => {
288304await secondTool.execute({ query: "base url cache identity" });
289305290306expect(mockFetch).toHaveBeenCalledTimes(2);
291-expect(new URL(String(mockFetch.mock.calls[0]?.[0])).pathname).toBe(
292-"/proxy-one/res/v1/web/search",
293-);
294-expect(new URL(String(mockFetch.mock.calls[1]?.[0])).pathname).toBe(
295-"/proxy-two/res/v1/web/search",
296-);
307+expect(fetchRequestUrl(mockFetch).pathname).toBe("/proxy-one/res/v1/web/search");
308+expect(fetchRequestUrl(mockFetch, 1).pathname).toBe("/proxy-two/res/v1/web/search");
297309});
298310299311it("rejects invalid Brave mode values in the plugin config schema", () => {
@@ -393,7 +405,7 @@ describe("brave web search provider", () => {
393405394406await tool.execute({ query: "latest ai news", freshness: "week" });
395407396-const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0]));
408+const requestUrl = fetchRequestUrl(mockFetch);
397409expect(requestUrl.pathname).toBe("/res/v1/llm/context");
398410expect(requestUrl.searchParams.get("freshness")).toBe("pw");
399411});
@@ -422,10 +434,10 @@ describe("brave web search provider", () => {
422434423435await tool.execute({ query: "latest ai news" });
424436425-const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0]));
437+const requestUrl = fetchRequestUrl(mockFetch);
426438expect(requestUrl.searchParams.get("apikey")).toBeNull();
427439expect(requestUrl.searchParams.get("key")).toBeNull();
428-expect(readHeader(mockFetch.mock.calls[0]?.[1], "X-Subscription-Token")).toBe("brave-test-key");
440+expect(readHeader(fetchRequestInit(mockFetch), "X-Subscription-Token")).toBe("brave-test-key");
429441});
430442431443it("sends Brave llm-context auth in the X-Subscription-Token header", async () => {
@@ -445,10 +457,10 @@ describe("brave web search provider", () => {
445457446458await tool.execute({ query: "latest ai news" });
447459448-const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0]));
460+const requestUrl = fetchRequestUrl(mockFetch);
449461expect(requestUrl.searchParams.get("apikey")).toBeNull();
450462expect(requestUrl.searchParams.get("key")).toBeNull();
451-expect(readHeader(mockFetch.mock.calls[0]?.[1], "X-Subscription-Token")).toBe("brave-test-key");
463+expect(readHeader(fetchRequestInit(mockFetch), "X-Subscription-Token")).toBe("brave-test-key");
452464});
453465454466it("passes bounded date ranges to Brave llm-context endpoint", async () => {
@@ -472,7 +484,7 @@ describe("brave web search provider", () => {
472484date_before: "2025-01-31",
473485});
474486475-const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0]));
487+const requestUrl = fetchRequestUrl(mockFetch);
476488expect(requestUrl.pathname).toBe("/res/v1/llm/context");
477489expect(requestUrl.searchParams.get("freshness")).toBe("2025-01-01to2025-01-31");
478490});
@@ -495,7 +507,7 @@ describe("brave web search provider", () => {
495507await tool.execute({ query: "latest ai news", date_after: "2025-01-01" });
496508497509const today = new Date().toISOString().slice(0, 10);
498-const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0]));
510+const requestUrl = fetchRequestUrl(mockFetch);
499511expect(requestUrl.pathname).toBe("/res/v1/llm/context");
500512expect(requestUrl.searchParams.get("freshness")).toBe(`2025-01-01to${today}`);
501513});
@@ -584,7 +596,7 @@ describe("brave web search provider", () => {
584596country: "VN",
585597});
586598587-const requestUrl = new URL(String(mockFetch.mock.calls[0]?.[0]));
599+const requestUrl = fetchRequestUrl(mockFetch);
588600expect(requestUrl.searchParams.get("country")).toBe("ALL");
589601});
590602此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。