31 lines
1.8 KiB
JavaScript
31 lines
1.8 KiB
JavaScript
import { test } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { createPaperTransport } from "../src/lib/paper-api.mjs";
|
|
const origin = "https://core.example.test/projects/thesisly/research/";
|
|
|
|
test("paper transport uses the anonymous no-store API without forwarding site credentials", async () => {
|
|
const transport = createPaperTransport(origin, async (url, options) => {
|
|
assert.equal(url.href, origin + "papers?q=graph&cursor=opaque");
|
|
assert.equal(options.cache, "no-store");
|
|
assert.equal(options.redirect, "error");
|
|
assert.equal(options.headers, undefined);
|
|
assert.ok(options.signal instanceof AbortSignal);
|
|
return Response.json({ items: [], nextCursor: "", previousCursor: "", topics: [], pageSize: 8 });
|
|
});
|
|
assert.deepEqual(await transport("papers?q=graph&cursor=opaque"), { ok: true, data: { items: [], nextCursor: "", previousCursor: "", topics: [], pageSize: 8 } });
|
|
});
|
|
|
|
test("HTTP errors stay distinguishable and never become empty search results", async () => {
|
|
for (const status of [400, 404, 429, 503, 504]) {
|
|
const transport = createPaperTransport(origin, async () => Response.json({ error: "private upstream detail" }, { status }));
|
|
assert.deepEqual(await transport("papers?q=graph"), { ok: false, status });
|
|
}
|
|
});
|
|
|
|
test("network, timeout and malformed responses are recoverable without sample substitution", async () => {
|
|
for (const [error, status] of [[new TypeError("private connection detail"), 503], [new DOMException("deadline", "TimeoutError"), 504], [new DOMException("aborted", "AbortError"), 504]]) {
|
|
assert.deepEqual(await createPaperTransport(origin, async () => { throw error; })("papers"), { ok: false, status });
|
|
}
|
|
assert.deepEqual(await createPaperTransport(origin, async () => new Response("invalid JSON"))("papers"), { ok: false, status: 502 });
|
|
});
|