mirror of
https://github.com/kennethnym/aris.git
synced 2026-06-14 03:21:18 +01:00
feat: add exa web search source (#124)
This commit is contained in:
97
packages/freya-source-web-search/src/exa-client.test.ts
Normal file
97
packages/freya-source-web-search/src/exa-client.test.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
import { describe, expect, test } from "bun:test"
|
||||
|
||||
import { ExaSearchClient } from "./exa-client.ts"
|
||||
|
||||
describe("ExaSearchClient", () => {
|
||||
test("maps request and response", async () => {
|
||||
const originalFetch = globalThis.fetch
|
||||
let requestUrl = ""
|
||||
let requestHeaders: Headers
|
||||
let requestBody: unknown
|
||||
|
||||
globalThis.fetch = (async (
|
||||
input: Parameters<typeof fetch>[0],
|
||||
init?: Parameters<typeof fetch>[1],
|
||||
) => {
|
||||
requestUrl = String(input)
|
||||
requestHeaders = new Headers(init?.headers)
|
||||
requestBody = JSON.parse(String(init?.body))
|
||||
|
||||
return new Response(
|
||||
JSON.stringify({
|
||||
requestId: "exa-request-1",
|
||||
results: [
|
||||
{
|
||||
id: "result-1",
|
||||
url: "https://example.com",
|
||||
title: "Example",
|
||||
publishedDate: "2026-01-01T00:00:00.000Z",
|
||||
author: "Author",
|
||||
image: "https://example.com/image.png",
|
||||
favicon: "https://example.com/favicon.ico",
|
||||
highlights: ["A useful passage"],
|
||||
highlightScores: [0.7],
|
||||
summary: "Summary",
|
||||
},
|
||||
],
|
||||
}),
|
||||
{ status: 200 },
|
||||
)
|
||||
}) as unknown as typeof fetch
|
||||
|
||||
try {
|
||||
const client = new ExaSearchClient("api-key", "https://api.example.test")
|
||||
const result = await client.search({
|
||||
query: "test query",
|
||||
numResults: 3,
|
||||
includeDomains: ["example.com"],
|
||||
highlights: false,
|
||||
})
|
||||
|
||||
expect(requestUrl).toBe("https://api.example.test/search")
|
||||
expect(requestHeaders!.get("x-api-key")).toBe("api-key")
|
||||
expect(requestBody).toEqual({
|
||||
query: "test query",
|
||||
numResults: 3,
|
||||
includeDomains: ["example.com"],
|
||||
contents: { highlights: false },
|
||||
})
|
||||
expect(result).toEqual({
|
||||
query: "test query",
|
||||
requestId: "exa-request-1",
|
||||
results: [
|
||||
{
|
||||
id: "result-1",
|
||||
url: "https://example.com",
|
||||
title: "Example",
|
||||
publishedDate: "2026-01-01T00:00:00.000Z",
|
||||
author: "Author",
|
||||
image: "https://example.com/image.png",
|
||||
favicon: "https://example.com/favicon.ico",
|
||||
text: null,
|
||||
highlights: ["A useful passage"],
|
||||
highlightScores: [0.7],
|
||||
summary: "Summary",
|
||||
},
|
||||
],
|
||||
})
|
||||
} finally {
|
||||
globalThis.fetch = originalFetch
|
||||
}
|
||||
})
|
||||
|
||||
test("throws on non-ok response", async () => {
|
||||
const originalFetch = globalThis.fetch
|
||||
globalThis.fetch = (async () =>
|
||||
new Response("nope", { status: 401, statusText: "Unauthorized" })) as unknown as typeof fetch
|
||||
|
||||
try {
|
||||
const client = new ExaSearchClient("bad-key")
|
||||
await expect(client.search({ query: "test" })).rejects.toThrow(
|
||||
"Exa API error: 401 Unauthorized",
|
||||
)
|
||||
} finally {
|
||||
globalThis.fetch = originalFetch
|
||||
}
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user