Files
2026-07-13 13:39:12 +08:00

35 lines
1.7 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
// Regression for port-from-9router#1318: the OAuth modal called `await res.json()`
// unconditionally, so a non-JSON error response (e.g. a plain-text `Internal Server
// Error` 500 from a Build-OAuth endpoint) threw `Unexpected token 'I'…` instead of
// surfacing the real failure. The shared `parseResponseBody`/`getErrorMessage`
// helpers read the body safely and produce a clean message either way.
const { parseResponseBody, getErrorMessage } = await import("../../src/shared/utils/api.ts");
test("#1318: parseResponseBody returns parsed JSON for a JSON body", async () => {
const res = new Response(JSON.stringify({ error: "nope" }), {
status: 400,
headers: { "Content-Type": "application/json" },
});
assert.deepEqual(await parseResponseBody(res), { error: "nope" });
});
test("#1318: parseResponseBody returns raw text for a non-JSON body (no throw)", async () => {
const res = new Response("Internal Server Error", { status: 500 });
assert.equal(await parseResponseBody(res), "Internal Server Error");
});
test("#1318: parseResponseBody returns null for an empty body", async () => {
const res = new Response("", { status: 200 });
assert.equal(await parseResponseBody(res), null);
});
test("#1318: getErrorMessage handles string-error, nested-error, plain-text and fallback", () => {
assert.equal(getErrorMessage({ error: "bad key" }), "bad key");
assert.equal(getErrorMessage({ error: { message: "expired" } }), "expired");
assert.equal(getErrorMessage("Internal Server Error"), "Internal Server Error");
assert.equal(getErrorMessage(null, 500, "Save failed"), "Save failed (HTTP 500)");
});