Spaces:
Running
Running
File size: 2,790 Bytes
f31a721 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
import {
afterEach,
beforeEach,
describe,
expect,
it,
type MockedFunction,
vi,
} from "vitest";
import { fetchSearXNG, getWebSearchStatus } from "./webSearchService";
function createMockResponse(text: string, ok = true): Response {
return {
ok,
status: ok ? 200 : 500,
statusText: ok ? "OK" : "Internal Server Error",
headers: new Headers(),
redirected: false,
type: "basic" as ResponseType,
url: "http://test.com",
clone: function () {
return this;
},
body: null,
bodyUsed: false,
arrayBuffer: () => Promise.resolve(new ArrayBuffer(0)),
blob: () => Promise.resolve(new Blob()),
formData: () => Promise.resolve(new FormData()),
json: () => Promise.resolve(JSON.parse(text)),
text: () => Promise.resolve(text),
} as unknown as Response;
}
let originalFetch: typeof fetch;
let fetchMock: MockedFunction<typeof fetch>;
beforeEach(() => {
originalFetch = global.fetch;
fetchMock = vi.fn() as unknown as MockedFunction<typeof fetch>;
global.fetch = fetchMock;
});
afterEach(() => {
global.fetch = originalFetch;
});
describe("WebSearchService", () => {
it("should report service not available when fetch throws", async () => {
(global.fetch as MockedFunction<typeof fetch>).mockImplementation(() => {
throw new Error("Network error");
});
const status = await getWebSearchStatus();
expect(status).toBe(false);
});
it("should return false when health endpoint does not return OK", async () => {
(global.fetch as MockedFunction<typeof fetch>).mockResolvedValue(
createMockResponse("NOT_OK", false),
);
const status = await getWebSearchStatus();
expect(status).toBe(false);
});
it("should return true when health endpoint returns OK", async () => {
(global.fetch as MockedFunction<typeof fetch>)
.mockResolvedValueOnce(createMockResponse("OK"))
.mockResolvedValueOnce(
createMockResponse(
JSON.stringify({
results: [
{
title: "example",
url: "https://example.com",
content: "example content",
category: "general",
},
],
}),
),
);
const status = await getWebSearchStatus();
expect(status).toBe(true);
expect(fetchMock).toHaveBeenCalledTimes(2);
expect(fetchMock.mock.calls[1]?.[0]).toContain("/search?");
});
it("should return empty array on fetchSearXNG error", async () => {
(global.fetch as MockedFunction<typeof fetch>).mockRejectedValue(
new Error("Network failure"),
);
const results = await fetchSearXNG("test query", "text");
expect(Array.isArray(results)).toBe(true);
expect(results).toHaveLength(0);
});
});
|