@debriefer/sources 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +59 -0
  2. package/dist/__tests__/archives/chronicling-america.test.d.ts +8 -0
  3. package/dist/__tests__/archives/chronicling-america.test.d.ts.map +1 -0
  4. package/dist/__tests__/archives/chronicling-america.test.js +151 -0
  5. package/dist/__tests__/archives/chronicling-america.test.js.map +1 -0
  6. package/dist/__tests__/archives/europeana.test.d.ts +8 -0
  7. package/dist/__tests__/archives/europeana.test.d.ts.map +1 -0
  8. package/dist/__tests__/archives/europeana.test.js +200 -0
  9. package/dist/__tests__/archives/europeana.test.js.map +1 -0
  10. package/dist/__tests__/archives/internet-archive.test.d.ts +8 -0
  11. package/dist/__tests__/archives/internet-archive.test.d.ts.map +1 -0
  12. package/dist/__tests__/archives/internet-archive.test.js +189 -0
  13. package/dist/__tests__/archives/internet-archive.test.js.map +1 -0
  14. package/dist/__tests__/archives/trove.test.d.ts +8 -0
  15. package/dist/__tests__/archives/trove.test.d.ts.map +1 -0
  16. package/dist/__tests__/archives/trove.test.js +202 -0
  17. package/dist/__tests__/archives/trove.test.js.map +1 -0
  18. package/dist/__tests__/books/google-books.test.d.ts +8 -0
  19. package/dist/__tests__/books/google-books.test.d.ts.map +1 -0
  20. package/dist/__tests__/books/google-books.test.js +221 -0
  21. package/dist/__tests__/books/google-books.test.js.map +1 -0
  22. package/dist/__tests__/books/open-library.test.d.ts +8 -0
  23. package/dist/__tests__/books/open-library.test.d.ts.map +1 -0
  24. package/dist/__tests__/books/open-library.test.js +159 -0
  25. package/dist/__tests__/books/open-library.test.js.map +1 -0
  26. package/dist/__tests__/news/guardian.test.d.ts +9 -0
  27. package/dist/__tests__/news/guardian.test.d.ts.map +1 -0
  28. package/dist/__tests__/news/guardian.test.js +224 -0
  29. package/dist/__tests__/news/guardian.test.js.map +1 -0
  30. package/dist/__tests__/news/nytimes.test.d.ts +9 -0
  31. package/dist/__tests__/news/nytimes.test.d.ts.map +1 -0
  32. package/dist/__tests__/news/nytimes.test.js +271 -0
  33. package/dist/__tests__/news/nytimes.test.js.map +1 -0
  34. package/dist/__tests__/news/site-search-source.test.d.ts +9 -0
  35. package/dist/__tests__/news/site-search-source.test.d.ts.map +1 -0
  36. package/dist/__tests__/news/site-search-source.test.js +342 -0
  37. package/dist/__tests__/news/site-search-source.test.js.map +1 -0
  38. package/dist/__tests__/obituary/find-a-grave.test.d.ts +8 -0
  39. package/dist/__tests__/obituary/find-a-grave.test.d.ts.map +1 -0
  40. package/dist/__tests__/obituary/find-a-grave.test.js +238 -0
  41. package/dist/__tests__/obituary/find-a-grave.test.js.map +1 -0
  42. package/dist/__tests__/shared/duckduckgo-search.test.d.ts +9 -0
  43. package/dist/__tests__/shared/duckduckgo-search.test.d.ts.map +1 -0
  44. package/dist/__tests__/shared/duckduckgo-search.test.js +218 -0
  45. package/dist/__tests__/shared/duckduckgo-search.test.js.map +1 -0
  46. package/dist/__tests__/shared/fetch-page.test.d.ts +9 -0
  47. package/dist/__tests__/shared/fetch-page.test.d.ts.map +1 -0
  48. package/dist/__tests__/shared/fetch-page.test.js +281 -0
  49. package/dist/__tests__/shared/fetch-page.test.js.map +1 -0
  50. package/dist/__tests__/shared/html-utils.test.d.ts +2 -0
  51. package/dist/__tests__/shared/html-utils.test.d.ts.map +1 -0
  52. package/dist/__tests__/shared/html-utils.test.js +169 -0
  53. package/dist/__tests__/shared/html-utils.test.js.map +1 -0
  54. package/dist/__tests__/shared/readability-extract.test.d.ts +2 -0
  55. package/dist/__tests__/shared/readability-extract.test.d.ts.map +1 -0
  56. package/dist/__tests__/shared/readability-extract.test.js +107 -0
  57. package/dist/__tests__/shared/readability-extract.test.js.map +1 -0
  58. package/dist/__tests__/shared/sanitize-text.test.d.ts +2 -0
  59. package/dist/__tests__/shared/sanitize-text.test.d.ts.map +1 -0
  60. package/dist/__tests__/shared/sanitize-text.test.js +77 -0
  61. package/dist/__tests__/shared/sanitize-text.test.js.map +1 -0
  62. package/dist/__tests__/shared/search-utils.test.d.ts +2 -0
  63. package/dist/__tests__/shared/search-utils.test.d.ts.map +1 -0
  64. package/dist/__tests__/shared/search-utils.test.js +26 -0
  65. package/dist/__tests__/shared/search-utils.test.js.map +1 -0
  66. package/dist/__tests__/structured/wikidata.test.d.ts +9 -0
  67. package/dist/__tests__/structured/wikidata.test.d.ts.map +1 -0
  68. package/dist/__tests__/structured/wikidata.test.js +509 -0
  69. package/dist/__tests__/structured/wikidata.test.js.map +1 -0
  70. package/dist/__tests__/structured/wikipedia.test.d.ts +9 -0
  71. package/dist/__tests__/structured/wikipedia.test.d.ts.map +1 -0
  72. package/dist/__tests__/structured/wikipedia.test.js +643 -0
  73. package/dist/__tests__/structured/wikipedia.test.js.map +1 -0
  74. package/dist/__tests__/web-search/base.test.d.ts +9 -0
  75. package/dist/__tests__/web-search/base.test.d.ts.map +1 -0
  76. package/dist/__tests__/web-search/base.test.js +622 -0
  77. package/dist/__tests__/web-search/base.test.js.map +1 -0
  78. package/dist/__tests__/web-search/bing.test.d.ts +10 -0
  79. package/dist/__tests__/web-search/bing.test.d.ts.map +1 -0
  80. package/dist/__tests__/web-search/bing.test.js +277 -0
  81. package/dist/__tests__/web-search/bing.test.js.map +1 -0
  82. package/dist/__tests__/web-search/brave.test.d.ts +10 -0
  83. package/dist/__tests__/web-search/brave.test.d.ts.map +1 -0
  84. package/dist/__tests__/web-search/brave.test.js +264 -0
  85. package/dist/__tests__/web-search/brave.test.js.map +1 -0
  86. package/dist/__tests__/web-search/duckduckgo.test.d.ts +10 -0
  87. package/dist/__tests__/web-search/duckduckgo.test.d.ts.map +1 -0
  88. package/dist/__tests__/web-search/duckduckgo.test.js +107 -0
  89. package/dist/__tests__/web-search/duckduckgo.test.js.map +1 -0
  90. package/dist/__tests__/web-search/google.test.d.ts +9 -0
  91. package/dist/__tests__/web-search/google.test.d.ts.map +1 -0
  92. package/dist/__tests__/web-search/google.test.js +189 -0
  93. package/dist/__tests__/web-search/google.test.js.map +1 -0
  94. package/dist/archives/chronicling-america.d.ts +33 -0
  95. package/dist/archives/chronicling-america.d.ts.map +1 -0
  96. package/dist/archives/chronicling-america.js +85 -0
  97. package/dist/archives/chronicling-america.js.map +1 -0
  98. package/dist/archives/europeana.d.ts +37 -0
  99. package/dist/archives/europeana.d.ts.map +1 -0
  100. package/dist/archives/europeana.js +92 -0
  101. package/dist/archives/europeana.js.map +1 -0
  102. package/dist/archives/internet-archive.d.ts +32 -0
  103. package/dist/archives/internet-archive.d.ts.map +1 -0
  104. package/dist/archives/internet-archive.js +90 -0
  105. package/dist/archives/internet-archive.js.map +1 -0
  106. package/dist/archives/trove.d.ts +37 -0
  107. package/dist/archives/trove.d.ts.map +1 -0
  108. package/dist/archives/trove.js +97 -0
  109. package/dist/archives/trove.js.map +1 -0
  110. package/dist/books/google-books.d.ts +48 -0
  111. package/dist/books/google-books.d.ts.map +1 -0
  112. package/dist/books/google-books.js +111 -0
  113. package/dist/books/google-books.js.map +1 -0
  114. package/dist/books/open-library.d.ts +44 -0
  115. package/dist/books/open-library.d.ts.map +1 -0
  116. package/dist/books/open-library.js +103 -0
  117. package/dist/books/open-library.js.map +1 -0
  118. package/dist/index.d.ts +45 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +35 -0
  121. package/dist/index.js.map +1 -0
  122. package/dist/news/guardian.d.ts +51 -0
  123. package/dist/news/guardian.d.ts.map +1 -0
  124. package/dist/news/guardian.js +131 -0
  125. package/dist/news/guardian.js.map +1 -0
  126. package/dist/news/nytimes.d.ts +27 -0
  127. package/dist/news/nytimes.d.ts.map +1 -0
  128. package/dist/news/nytimes.js +104 -0
  129. package/dist/news/nytimes.js.map +1 -0
  130. package/dist/news/site-search-source.d.ts +89 -0
  131. package/dist/news/site-search-source.d.ts.map +1 -0
  132. package/dist/news/site-search-source.js +182 -0
  133. package/dist/news/site-search-source.js.map +1 -0
  134. package/dist/news/sources.d.ts +52 -0
  135. package/dist/news/sources.d.ts.map +1 -0
  136. package/dist/news/sources.js +276 -0
  137. package/dist/news/sources.js.map +1 -0
  138. package/dist/obituary/find-a-grave.d.ts +43 -0
  139. package/dist/obituary/find-a-grave.d.ts.map +1 -0
  140. package/dist/obituary/find-a-grave.js +173 -0
  141. package/dist/obituary/find-a-grave.js.map +1 -0
  142. package/dist/shared/duckduckgo-search.d.ts +86 -0
  143. package/dist/shared/duckduckgo-search.d.ts.map +1 -0
  144. package/dist/shared/duckduckgo-search.js +218 -0
  145. package/dist/shared/duckduckgo-search.js.map +1 -0
  146. package/dist/shared/fetch-page.d.ts +50 -0
  147. package/dist/shared/fetch-page.d.ts.map +1 -0
  148. package/dist/shared/fetch-page.js +212 -0
  149. package/dist/shared/fetch-page.js.map +1 -0
  150. package/dist/shared/html-utils.d.ts +99 -0
  151. package/dist/shared/html-utils.d.ts.map +1 -0
  152. package/dist/shared/html-utils.js +246 -0
  153. package/dist/shared/html-utils.js.map +1 -0
  154. package/dist/shared/readability-extract.d.ts +33 -0
  155. package/dist/shared/readability-extract.d.ts.map +1 -0
  156. package/dist/shared/readability-extract.js +45 -0
  157. package/dist/shared/readability-extract.js.map +1 -0
  158. package/dist/shared/sanitize-text.d.ts +24 -0
  159. package/dist/shared/sanitize-text.d.ts.map +1 -0
  160. package/dist/shared/sanitize-text.js +49 -0
  161. package/dist/shared/sanitize-text.js.map +1 -0
  162. package/dist/shared/search-utils.d.ts +18 -0
  163. package/dist/shared/search-utils.d.ts.map +1 -0
  164. package/dist/shared/search-utils.js +20 -0
  165. package/dist/shared/search-utils.js.map +1 -0
  166. package/dist/structured/wikidata.d.ts +128 -0
  167. package/dist/structured/wikidata.d.ts.map +1 -0
  168. package/dist/structured/wikidata.js +361 -0
  169. package/dist/structured/wikidata.js.map +1 -0
  170. package/dist/structured/wikipedia.d.ts +184 -0
  171. package/dist/structured/wikipedia.d.ts.map +1 -0
  172. package/dist/structured/wikipedia.js +275 -0
  173. package/dist/structured/wikipedia.js.map +1 -0
  174. package/dist/web-search/base.d.ts +128 -0
  175. package/dist/web-search/base.d.ts.map +1 -0
  176. package/dist/web-search/base.js +251 -0
  177. package/dist/web-search/base.js.map +1 -0
  178. package/dist/web-search/bing.d.ts +21 -0
  179. package/dist/web-search/bing.d.ts.map +1 -0
  180. package/dist/web-search/bing.js +53 -0
  181. package/dist/web-search/bing.js.map +1 -0
  182. package/dist/web-search/brave.d.ts +21 -0
  183. package/dist/web-search/brave.d.ts.map +1 -0
  184. package/dist/web-search/brave.js +56 -0
  185. package/dist/web-search/brave.js.map +1 -0
  186. package/dist/web-search/duckduckgo.d.ts +15 -0
  187. package/dist/web-search/duckduckgo.d.ts.map +1 -0
  188. package/dist/web-search/duckduckgo.js +21 -0
  189. package/dist/web-search/duckduckgo.js.map +1 -0
  190. package/dist/web-search/google.d.ts +24 -0
  191. package/dist/web-search/google.d.ts.map +1 -0
  192. package/dist/web-search/google.js +48 -0
  193. package/dist/web-search/google.js.map +1 -0
  194. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.test.js","sourceRoot":"","sources":["../../../src/__tests__/web-search/base.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tests for BingSearchSource.
3
+ *
4
+ * Mocks global fetch to simulate Bing Search API v7 responses.
5
+ * Also mocks shared utilities (fetchPage, extractArticleContent) since
6
+ * WebSearchBase uses them in the full pipeline, but we only test
7
+ * performSearch() behavior here.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=bing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bing.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/web-search/bing.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Tests for BingSearchSource.
3
+ *
4
+ * Mocks global fetch to simulate Bing Search API v7 responses.
5
+ * Also mocks shared utilities (fetchPage, extractArticleContent) since
6
+ * WebSearchBase uses them in the full pipeline, but we only test
7
+ * performSearch() behavior here.
8
+ */
9
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
10
+ import { ReliabilityTier } from "@debriefer/core";
11
+ // ============================================================================
12
+ // Mocks — must come before imports of the module under test
13
+ // ============================================================================
14
+ vi.mock("../../shared/fetch-page.js", () => ({
15
+ fetchPage: vi.fn().mockResolvedValue({ content: "", url: "", fetchMethod: "none" }),
16
+ }));
17
+ vi.mock("../../shared/readability-extract.js", () => ({
18
+ extractArticleContent: vi.fn().mockReturnValue(null),
19
+ }));
20
+ import { BingSearchSource, bingSearch } from "../../web-search/bing.js";
21
+ // ============================================================================
22
+ // Helpers
23
+ // ============================================================================
24
+ const ORIGINAL_ENV = process.env.BING_SEARCH_API_KEY;
25
+ function makeBingResponse(options) {
26
+ const result = {};
27
+ if (options?.webPages) {
28
+ result.webPages = { value: options.webPages };
29
+ }
30
+ if (options?.news) {
31
+ result.news = { value: options.news };
32
+ }
33
+ return result;
34
+ }
35
+ function mockFetchOk(body) {
36
+ vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(new Response(JSON.stringify(body), {
37
+ status: 200,
38
+ headers: { "Content-Type": "application/json" },
39
+ }));
40
+ }
41
+ function mockFetchError(status, statusText) {
42
+ vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(new Response(null, { status, statusText }));
43
+ }
44
+ beforeEach(() => {
45
+ delete process.env.BING_SEARCH_API_KEY;
46
+ });
47
+ afterEach(() => {
48
+ vi.restoreAllMocks();
49
+ if (ORIGINAL_ENV !== undefined) {
50
+ process.env.BING_SEARCH_API_KEY = ORIGINAL_ENV;
51
+ }
52
+ else {
53
+ delete process.env.BING_SEARCH_API_KEY;
54
+ }
55
+ });
56
+ // ============================================================================
57
+ // Tests
58
+ // ============================================================================
59
+ describe("BingSearchSource", () => {
60
+ // ==========================================================================
61
+ // Metadata
62
+ // ==========================================================================
63
+ describe("metadata", () => {
64
+ it("has correct name, type, reliabilityTier, isFree, and estimatedCostPerQuery", () => {
65
+ const source = new BingSearchSource({ apiKey: "test-key" });
66
+ expect(source.name).toBe("Bing Search");
67
+ expect(source.type).toBe("bing-search");
68
+ expect(source.reliabilityTier).toBe(ReliabilityTier.SEARCH_AGGREGATOR);
69
+ expect(source.domain).toBe("api.bing.microsoft.com");
70
+ expect(source.isFree).toBe(false);
71
+ expect(source.estimatedCostPerQuery).toBe(0.003);
72
+ });
73
+ });
74
+ // ==========================================================================
75
+ // isAvailable
76
+ // ==========================================================================
77
+ describe("isAvailable", () => {
78
+ it("returns true when apiKey is provided via constructor", () => {
79
+ const source = new BingSearchSource({ apiKey: "test-key" });
80
+ expect(source.isAvailable()).toBe(true);
81
+ });
82
+ it("returns true when BING_SEARCH_API_KEY env var is set", () => {
83
+ process.env.BING_SEARCH_API_KEY = "env-key";
84
+ const source = new BingSearchSource();
85
+ expect(source.isAvailable()).toBe(true);
86
+ });
87
+ it("returns false when no apiKey is provided and env var is unset", () => {
88
+ const source = new BingSearchSource();
89
+ expect(source.isAvailable()).toBe(false);
90
+ });
91
+ });
92
+ // ==========================================================================
93
+ // Request format — URL, query params, headers
94
+ // ==========================================================================
95
+ describe("request format", () => {
96
+ it("sends correct URL, query params, and Ocp-Apim-Subscription-Key header", async () => {
97
+ const source = new BingSearchSource({ apiKey: "my-api-key", maxResults: 10 });
98
+ mockFetchOk(makeBingResponse({
99
+ webPages: [{ name: "Result", url: "https://example.com", snippet: "A result" }],
100
+ }));
101
+ const signal = AbortSignal.timeout(5000);
102
+ // Access performSearch via lookup which calls fetchResult which calls performSearch
103
+ // We need to call the source's lookup method to trigger the pipeline
104
+ await source.lookup({ id: 1, name: "test query" }, signal);
105
+ expect(globalThis.fetch).toHaveBeenCalledTimes(1);
106
+ const [calledUrl, calledOptions] = vi.mocked(globalThis.fetch).mock.calls[0];
107
+ // Verify URL structure
108
+ const parsedUrl = new URL(calledUrl);
109
+ expect(parsedUrl.origin + parsedUrl.pathname).toBe("https://api.bing.microsoft.com/v7.0/search");
110
+ expect(parsedUrl.searchParams.get("q")).toBe("test query");
111
+ expect(parsedUrl.searchParams.get("count")).toBe("10");
112
+ expect(parsedUrl.searchParams.get("mkt")).toBe("en-US");
113
+ expect(parsedUrl.searchParams.get("responseFilter")).toBe("Webpages,News");
114
+ // Verify subscription key header
115
+ const headers = calledOptions.headers;
116
+ expect(headers["Ocp-Apim-Subscription-Key"]).toBe("my-api-key");
117
+ });
118
+ });
119
+ // ==========================================================================
120
+ // Merges webPages and news, deduplicates by URL
121
+ // ==========================================================================
122
+ describe("result merging and deduplication", () => {
123
+ it("correctly deduplicates URLs across webPages and news", async () => {
124
+ // Create a subclass that exposes performSearch for direct testing
125
+ class TestBingSource extends BingSearchSource {
126
+ async testPerformSearch(query, signal) {
127
+ return this.performSearch(query, signal);
128
+ }
129
+ }
130
+ const source = new TestBingSource({ apiKey: "test-key" });
131
+ const duplicateUrl = "https://example.com/shared";
132
+ mockFetchOk(makeBingResponse({
133
+ webPages: [
134
+ { name: "Web Result 1", url: "https://example.com/web1", snippet: "Web snippet 1" },
135
+ { name: "Web Duplicate", url: duplicateUrl, snippet: "Web version of duplicate" },
136
+ ],
137
+ news: [
138
+ { name: "News Duplicate", url: duplicateUrl, description: "News version of duplicate" },
139
+ {
140
+ name: "News Result 1",
141
+ url: "https://example.com/news1",
142
+ description: "News snippet",
143
+ },
144
+ ],
145
+ }));
146
+ const results = await source.testPerformSearch("test", AbortSignal.timeout(5000));
147
+ // Should have 3 results: web1, shared (from webPages), news1
148
+ // The news duplicate of "shared" should be excluded
149
+ expect(results).toHaveLength(3);
150
+ expect(results[0]).toEqual({
151
+ url: "https://example.com/web1",
152
+ title: "Web Result 1",
153
+ snippet: "Web snippet 1",
154
+ });
155
+ expect(results[1]).toEqual({
156
+ url: duplicateUrl,
157
+ title: "Web Duplicate",
158
+ snippet: "Web version of duplicate",
159
+ });
160
+ expect(results[2]).toEqual({
161
+ url: "https://example.com/news1",
162
+ title: "News Result 1",
163
+ snippet: "News snippet",
164
+ });
165
+ });
166
+ it("handles response with only webPages (no news)", async () => {
167
+ class TestBingSource extends BingSearchSource {
168
+ async testPerformSearch(query, signal) {
169
+ return this.performSearch(query, signal);
170
+ }
171
+ }
172
+ const source = new TestBingSource({ apiKey: "test-key" });
173
+ mockFetchOk(makeBingResponse({
174
+ webPages: [{ name: "Only Web", url: "https://example.com/web", snippet: "Web only" }],
175
+ }));
176
+ const results = await source.testPerformSearch("test", AbortSignal.timeout(5000));
177
+ expect(results).toHaveLength(1);
178
+ expect(results[0].title).toBe("Only Web");
179
+ });
180
+ it("handles response with only news (no webPages)", async () => {
181
+ class TestBingSource extends BingSearchSource {
182
+ async testPerformSearch(query, signal) {
183
+ return this.performSearch(query, signal);
184
+ }
185
+ }
186
+ const source = new TestBingSource({ apiKey: "test-key" });
187
+ mockFetchOk(makeBingResponse({
188
+ news: [{ name: "Only News", url: "https://example.com/news", description: "News only" }],
189
+ }));
190
+ const results = await source.testPerformSearch("test", AbortSignal.timeout(5000));
191
+ expect(results).toHaveLength(1);
192
+ expect(results[0].title).toBe("Only News");
193
+ expect(results[0].snippet).toBe("News only");
194
+ });
195
+ it("handles empty response (no webPages, no news)", async () => {
196
+ class TestBingSource extends BingSearchSource {
197
+ async testPerformSearch(query, signal) {
198
+ return this.performSearch(query, signal);
199
+ }
200
+ }
201
+ const source = new TestBingSource({ apiKey: "test-key" });
202
+ mockFetchOk({});
203
+ const results = await source.testPerformSearch("test", AbortSignal.timeout(5000));
204
+ expect(results).toHaveLength(0);
205
+ });
206
+ });
207
+ // ==========================================================================
208
+ // API error handling
209
+ // ==========================================================================
210
+ describe("API error handling", () => {
211
+ it("returns null from lookup when API returns an HTTP error", async () => {
212
+ const source = new BingSearchSource({ apiKey: "test-key" });
213
+ mockFetchError(403, "Forbidden");
214
+ // BaseResearchSource.lookup() catches errors from fetchResult and returns null
215
+ const result = await source.lookup({ id: 1, name: "test query" }, AbortSignal.timeout(5000));
216
+ expect(result).toBeNull();
217
+ });
218
+ it("throws an error with status details when API returns non-OK response", async () => {
219
+ class TestBingSource extends BingSearchSource {
220
+ async testPerformSearch(query, signal) {
221
+ return this.performSearch(query, signal);
222
+ }
223
+ }
224
+ const source = new TestBingSource({ apiKey: "test-key" });
225
+ mockFetchError(429, "Too Many Requests");
226
+ await expect(source.testPerformSearch("test", AbortSignal.timeout(5000))).rejects.toThrow("Bing Search error: HTTP 429 Too Many Requests");
227
+ });
228
+ });
229
+ // ==========================================================================
230
+ // No API key → empty results
231
+ // ==========================================================================
232
+ describe("no API key", () => {
233
+ it("returns empty array from performSearch when no API key is set", async () => {
234
+ class TestBingSource extends BingSearchSource {
235
+ async testPerformSearch(query, signal) {
236
+ return this.performSearch(query, signal);
237
+ }
238
+ }
239
+ const source = new TestBingSource(); // no apiKey
240
+ const fetchSpy = vi.spyOn(globalThis, "fetch");
241
+ const results = await source.testPerformSearch("test", AbortSignal.timeout(5000));
242
+ expect(results).toEqual([]);
243
+ // fetch should never have been called
244
+ expect(fetchSpy).not.toHaveBeenCalled();
245
+ });
246
+ });
247
+ // ==========================================================================
248
+ // Factory function
249
+ // ==========================================================================
250
+ describe("factory function", () => {
251
+ it("bingSearch() creates a BingSearchSource instance", () => {
252
+ const source = bingSearch({ apiKey: "factory-key" });
253
+ expect(source).toBeInstanceOf(BingSearchSource);
254
+ expect(source.name).toBe("Bing Search");
255
+ expect(source.isAvailable()).toBe(true);
256
+ });
257
+ it("bingSearch() with no options creates instance (unavailable without key)", () => {
258
+ const source = bingSearch();
259
+ expect(source).toBeInstanceOf(BingSearchSource);
260
+ expect(source.isAvailable()).toBe(false);
261
+ });
262
+ });
263
+ // ==========================================================================
264
+ // Default maxResults
265
+ // ==========================================================================
266
+ describe("default maxResults", () => {
267
+ it("uses maxResults=20 by default", async () => {
268
+ const source = new BingSearchSource({ apiKey: "test-key" });
269
+ mockFetchOk(makeBingResponse());
270
+ await source.lookup({ id: 1, name: "test" }, AbortSignal.timeout(5000));
271
+ const [calledUrl] = vi.mocked(globalThis.fetch).mock.calls[0];
272
+ const parsedUrl = new URL(calledUrl);
273
+ expect(parsedUrl.searchParams.get("count")).toBe("20");
274
+ });
275
+ });
276
+ });
277
+ //# sourceMappingURL=bing.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bing.test.js","sourceRoot":"","sources":["../../../src/__tests__/web-search/bing.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tests for BraveSearchSource.
3
+ *
4
+ * Mocks global fetch to simulate Brave Search API v1 responses.
5
+ * Also mocks shared utilities (fetchPage, extractArticleContent) since
6
+ * WebSearchBase uses them in the full pipeline, but we only test
7
+ * performSearch() behavior here.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=brave.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brave.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/web-search/brave.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * Tests for BraveSearchSource.
3
+ *
4
+ * Mocks global fetch to simulate Brave Search API v1 responses.
5
+ * Also mocks shared utilities (fetchPage, extractArticleContent) since
6
+ * WebSearchBase uses them in the full pipeline, but we only test
7
+ * performSearch() behavior here.
8
+ */
9
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
10
+ import { ReliabilityTier } from "@debriefer/core";
11
+ // ============================================================================
12
+ // Mocks — must come before imports of the module under test
13
+ // ============================================================================
14
+ vi.mock("../../shared/fetch-page.js", () => ({
15
+ fetchPage: vi.fn().mockResolvedValue({ content: "", url: "", fetchMethod: "none" }),
16
+ }));
17
+ vi.mock("../../shared/readability-extract.js", () => ({
18
+ extractArticleContent: vi.fn().mockReturnValue(null),
19
+ }));
20
+ import { BraveSearchSource, braveSearch } from "../../web-search/brave.js";
21
+ // ============================================================================
22
+ // Helpers
23
+ // ============================================================================
24
+ const ORIGINAL_ENV = process.env.BRAVE_SEARCH_API_KEY;
25
+ function makeBraveResponse(options) {
26
+ const result = {};
27
+ if (options?.web) {
28
+ result.web = { results: options.web };
29
+ }
30
+ if (options?.news) {
31
+ result.news = { results: options.news };
32
+ }
33
+ return result;
34
+ }
35
+ function mockFetchOk(body) {
36
+ vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(new Response(JSON.stringify(body), {
37
+ status: 200,
38
+ headers: { "Content-Type": "application/json" },
39
+ }));
40
+ }
41
+ function mockFetchError(status, statusText) {
42
+ vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(new Response(null, { status, statusText }));
43
+ }
44
+ beforeEach(() => {
45
+ delete process.env.BRAVE_SEARCH_API_KEY;
46
+ });
47
+ afterEach(() => {
48
+ vi.restoreAllMocks();
49
+ if (ORIGINAL_ENV !== undefined) {
50
+ process.env.BRAVE_SEARCH_API_KEY = ORIGINAL_ENV;
51
+ }
52
+ else {
53
+ delete process.env.BRAVE_SEARCH_API_KEY;
54
+ }
55
+ });
56
+ // ============================================================================
57
+ // Tests
58
+ // ============================================================================
59
+ describe("BraveSearchSource", () => {
60
+ // ==========================================================================
61
+ // Metadata
62
+ // ==========================================================================
63
+ describe("metadata", () => {
64
+ it("has correct name, type, reliabilityTier, isFree, and estimatedCostPerQuery", () => {
65
+ const source = new BraveSearchSource({ apiKey: "test-key" });
66
+ expect(source.name).toBe("Brave Search");
67
+ expect(source.type).toBe("brave-search");
68
+ expect(source.reliabilityTier).toBe(ReliabilityTier.SEARCH_AGGREGATOR);
69
+ expect(source.domain).toBe("api.search.brave.com");
70
+ expect(source.isFree).toBe(false);
71
+ expect(source.estimatedCostPerQuery).toBe(0.005);
72
+ });
73
+ });
74
+ // ==========================================================================
75
+ // isAvailable
76
+ // ==========================================================================
77
+ describe("isAvailable", () => {
78
+ it("returns true when apiKey is provided via constructor", () => {
79
+ const source = new BraveSearchSource({ apiKey: "test-key" });
80
+ expect(source.isAvailable()).toBe(true);
81
+ });
82
+ it("returns true when BRAVE_SEARCH_API_KEY env var is set", () => {
83
+ process.env.BRAVE_SEARCH_API_KEY = "env-key";
84
+ const source = new BraveSearchSource();
85
+ expect(source.isAvailable()).toBe(true);
86
+ });
87
+ it("returns false when no apiKey is provided and env var is unset", () => {
88
+ const source = new BraveSearchSource();
89
+ expect(source.isAvailable()).toBe(false);
90
+ });
91
+ });
92
+ // ==========================================================================
93
+ // Request format — URL, query params, headers
94
+ // ==========================================================================
95
+ describe("request format", () => {
96
+ it("sends correct URL, query params, X-Subscription-Token header, and Accept header", async () => {
97
+ const source = new BraveSearchSource({ apiKey: "my-api-key", maxResults: 10 });
98
+ mockFetchOk(makeBraveResponse({
99
+ web: [{ title: "Result", url: "https://example.com", description: "A result" }],
100
+ }));
101
+ const signal = AbortSignal.timeout(5000);
102
+ await source.lookup({ id: 1, name: "test query" }, signal);
103
+ expect(globalThis.fetch).toHaveBeenCalledTimes(1);
104
+ const [calledUrl, calledOptions] = vi.mocked(globalThis.fetch).mock.calls[0];
105
+ // Verify URL structure
106
+ const parsedUrl = new URL(calledUrl);
107
+ expect(parsedUrl.origin + parsedUrl.pathname).toBe("https://api.search.brave.com/res/v1/web/search");
108
+ expect(parsedUrl.searchParams.get("q")).toBe("test query");
109
+ expect(parsedUrl.searchParams.get("count")).toBe("10");
110
+ expect(parsedUrl.searchParams.get("search_lang")).toBe("en");
111
+ // Verify headers
112
+ const headers = calledOptions.headers;
113
+ expect(headers["X-Subscription-Token"]).toBe("my-api-key");
114
+ expect(headers["Accept"]).toBe("application/json");
115
+ });
116
+ });
117
+ // ==========================================================================
118
+ // Merges web and news results, deduplicates by URL
119
+ // ==========================================================================
120
+ describe("result merging and deduplication", () => {
121
+ it("correctly deduplicates URLs across web and news results", async () => {
122
+ class TestBraveSource extends BraveSearchSource {
123
+ async testPerformSearch(query, signal) {
124
+ return this.performSearch(query, signal);
125
+ }
126
+ }
127
+ const source = new TestBraveSource({ apiKey: "test-key" });
128
+ const duplicateUrl = "https://example.com/shared";
129
+ mockFetchOk(makeBraveResponse({
130
+ web: [
131
+ {
132
+ title: "Web Result 1",
133
+ url: "https://example.com/web1",
134
+ description: "Web snippet 1",
135
+ },
136
+ { title: "Web Duplicate", url: duplicateUrl, description: "Web version of duplicate" },
137
+ ],
138
+ news: [
139
+ {
140
+ title: "News Duplicate",
141
+ url: duplicateUrl,
142
+ description: "News version of duplicate",
143
+ },
144
+ {
145
+ title: "News Result 1",
146
+ url: "https://example.com/news1",
147
+ description: "News snippet 1",
148
+ },
149
+ ],
150
+ }));
151
+ const results = await source.testPerformSearch("test", AbortSignal.timeout(5000));
152
+ // Should have 3 results: web1, shared (from web), news1
153
+ // The news duplicate of "shared" should be excluded
154
+ expect(results).toHaveLength(3);
155
+ expect(results[0]).toEqual({
156
+ url: "https://example.com/web1",
157
+ title: "Web Result 1",
158
+ snippet: "Web snippet 1",
159
+ });
160
+ expect(results[1]).toEqual({
161
+ url: duplicateUrl,
162
+ title: "Web Duplicate",
163
+ snippet: "Web version of duplicate",
164
+ });
165
+ expect(results[2]).toEqual({
166
+ url: "https://example.com/news1",
167
+ title: "News Result 1",
168
+ snippet: "News snippet 1",
169
+ });
170
+ });
171
+ it("handles response with only web results (no news)", async () => {
172
+ class TestBraveSource extends BraveSearchSource {
173
+ async testPerformSearch(query, signal) {
174
+ return this.performSearch(query, signal);
175
+ }
176
+ }
177
+ const source = new TestBraveSource({ apiKey: "test-key" });
178
+ mockFetchOk(makeBraveResponse({
179
+ web: [{ title: "Only Web", url: "https://example.com/web", description: "Web only" }],
180
+ }));
181
+ const results = await source.testPerformSearch("test", AbortSignal.timeout(5000));
182
+ expect(results).toHaveLength(1);
183
+ expect(results[0].title).toBe("Only Web");
184
+ });
185
+ it("handles response with only news results (no web)", async () => {
186
+ class TestBraveSource extends BraveSearchSource {
187
+ async testPerformSearch(query, signal) {
188
+ return this.performSearch(query, signal);
189
+ }
190
+ }
191
+ const source = new TestBraveSource({ apiKey: "test-key" });
192
+ mockFetchOk(makeBraveResponse({
193
+ news: [{ title: "Only News", url: "https://example.com/news", description: "News only" }],
194
+ }));
195
+ const results = await source.testPerformSearch("test", AbortSignal.timeout(5000));
196
+ expect(results).toHaveLength(1);
197
+ expect(results[0].title).toBe("Only News");
198
+ expect(results[0].snippet).toBe("News only");
199
+ });
200
+ it("handles empty response (no web, no news)", async () => {
201
+ class TestBraveSource extends BraveSearchSource {
202
+ async testPerformSearch(query, signal) {
203
+ return this.performSearch(query, signal);
204
+ }
205
+ }
206
+ const source = new TestBraveSource({ apiKey: "test-key" });
207
+ mockFetchOk({});
208
+ const results = await source.testPerformSearch("test", AbortSignal.timeout(5000));
209
+ expect(results).toHaveLength(0);
210
+ });
211
+ });
212
+ // ==========================================================================
213
+ // API error handling
214
+ // ==========================================================================
215
+ describe("API error handling", () => {
216
+ it("returns null from lookup when API returns an HTTP error", async () => {
217
+ const source = new BraveSearchSource({ apiKey: "test-key" });
218
+ mockFetchError(403, "Forbidden");
219
+ // BaseResearchSource.lookup() catches errors from fetchResult and returns null
220
+ const result = await source.lookup({ id: 1, name: "test query" }, AbortSignal.timeout(5000));
221
+ expect(result).toBeNull();
222
+ });
223
+ it("throws an error with status details when API returns non-OK response", async () => {
224
+ class TestBraveSource extends BraveSearchSource {
225
+ async testPerformSearch(query, signal) {
226
+ return this.performSearch(query, signal);
227
+ }
228
+ }
229
+ const source = new TestBraveSource({ apiKey: "test-key" });
230
+ mockFetchError(429, "Too Many Requests");
231
+ await expect(source.testPerformSearch("test", AbortSignal.timeout(5000))).rejects.toThrow("Brave Search error: HTTP 429 Too Many Requests");
232
+ });
233
+ });
234
+ // ==========================================================================
235
+ // Factory function
236
+ // ==========================================================================
237
+ describe("factory function", () => {
238
+ it("braveSearch() creates a BraveSearchSource instance", () => {
239
+ const source = braveSearch({ apiKey: "factory-key" });
240
+ expect(source).toBeInstanceOf(BraveSearchSource);
241
+ expect(source.name).toBe("Brave Search");
242
+ expect(source.isAvailable()).toBe(true);
243
+ });
244
+ it("braveSearch() with no options creates instance (unavailable without key)", () => {
245
+ const source = braveSearch();
246
+ expect(source).toBeInstanceOf(BraveSearchSource);
247
+ expect(source.isAvailable()).toBe(false);
248
+ });
249
+ });
250
+ // ==========================================================================
251
+ // Default maxResults
252
+ // ==========================================================================
253
+ describe("default maxResults", () => {
254
+ it("uses maxResults=20 by default", async () => {
255
+ const source = new BraveSearchSource({ apiKey: "test-key" });
256
+ mockFetchOk(makeBraveResponse());
257
+ await source.lookup({ id: 1, name: "test" }, AbortSignal.timeout(5000));
258
+ const [calledUrl] = vi.mocked(globalThis.fetch).mock.calls[0];
259
+ const parsedUrl = new URL(calledUrl);
260
+ expect(parsedUrl.searchParams.get("count")).toBe("20");
261
+ });
262
+ });
263
+ });
264
+ //# sourceMappingURL=brave.test.js.map