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&page=2"); 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: [], total: 0, topics: [], page: 2, pageSize: 8 }); }); assert.deepEqual(await transport("papers?q=graph&page=2"), { ok: true, data: { items: [], total: 0, topics: [], page: 2, 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 }); });