87 lines
3.0 KiB
JavaScript
87 lines
3.0 KiB
JavaScript
import assert from "node:assert/strict";
|
|
|
|
import { boundFetchCollections } from "../docker/web-search/overrides/bounds.mjs";
|
|
import {
|
|
attemptProvider,
|
|
classifyProviderError
|
|
} from "../docker/web-search/overrides/diagnostics.mjs";
|
|
|
|
assert.deepEqual(classifyProviderError(new Error("HTTP 429 rate limit")), {
|
|
category: "rate_limited",
|
|
message: "HTTP 429 rate limit"
|
|
});
|
|
assert.equal(classifyProviderError(new Error("captcha challenge")).category, "blocked");
|
|
|
|
const unavailable = await attemptProvider({ name: "brave", configured: false }, "q", 3, "en");
|
|
assert.equal(unavailable.diagnostic.status, "unavailable");
|
|
assert.equal(unavailable.diagnostic.result_count, 0);
|
|
|
|
const empty = await attemptProvider({
|
|
name: "empty",
|
|
async search() { return []; }
|
|
}, "q", 3, "en");
|
|
assert.equal(empty.diagnostic.status, "empty");
|
|
|
|
const failed = await attemptProvider({
|
|
name: "failed",
|
|
async search() { throw new Error("network socket failed"); }
|
|
}, "q", 3, "en");
|
|
assert.equal(failed.diagnostic.status, "error");
|
|
assert.equal(failed.diagnostic.error.category, "network");
|
|
|
|
let underlyingAborted = false;
|
|
let underlyingCleanupFinished = false;
|
|
const timedOut = await attemptProvider({
|
|
name: "slow",
|
|
async search(_query, _limit, _lang, signal) {
|
|
await new Promise((resolve, reject) => {
|
|
signal.addEventListener("abort", () => {
|
|
underlyingAborted = true;
|
|
setTimeout(() => {
|
|
underlyingCleanupFinished = true;
|
|
reject(signal.reason);
|
|
}, 25);
|
|
}, { once: true });
|
|
});
|
|
}
|
|
}, "q", 3, "en", { timeoutMs: 20 });
|
|
assert.equal(timedOut.diagnostic.error.category, "timeout");
|
|
assert.equal(underlyingAborted, true);
|
|
assert.equal(underlyingCleanupFinished, true);
|
|
|
|
const cancellation = new AbortController();
|
|
const cancellationReason = new Error("search request cancelled");
|
|
let cancellationCleanupFinished = false;
|
|
const cancelled = attemptProvider({
|
|
name: "cancelled",
|
|
async search(_query, _limit, _lang, signal) {
|
|
await new Promise((resolve, reject) => {
|
|
signal.addEventListener("abort", () => {
|
|
setTimeout(() => {
|
|
cancellationCleanupFinished = true;
|
|
reject(signal.reason);
|
|
}, 10);
|
|
}, { once: true });
|
|
});
|
|
}
|
|
}, "q", 3, "en", { timeoutMs: 1000, signal: cancellation.signal });
|
|
cancellation.abort(cancellationReason);
|
|
await assert.rejects(cancelled, error => error === cancellationReason);
|
|
assert.equal(cancellationCleanupFinished, true);
|
|
|
|
const result = boundFetchCollections({
|
|
links: Array.from({ length: 550 }, (_, index) => ({ url: `https://example.test/${index}` })),
|
|
media: {
|
|
images: Array.from({ length: 250 }, (_, index) => ({ url: `https://example.test/${index}.png` })),
|
|
videos: [],
|
|
audio: []
|
|
},
|
|
warnings: []
|
|
});
|
|
assert.equal(result.links.length, 500);
|
|
assert.equal(result.media.images.length, 200);
|
|
assert(result.warnings.some(warning => warning.includes("links truncated")));
|
|
assert(result.warnings.some(warning => warning.includes("images truncated")));
|
|
|
|
console.log("pass web-search diagnostics and collection bounds tests");
|