Files
Thesisly/tests/paper-api.test.mjs
T

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 });
});