penpot/mcp/packages/plugin/src/ErrorUtils.test.ts
2026-06-12 08:59:05 +02:00

64 lines
2.4 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import { formatTaskError } from "./ErrorUtils.ts";
test("includes ClojureScript exception data in the task error message", () => {
const keyword = (name: string) => ({ name, fqn: name });
const entries = [
{ key: keyword("type"), val: keyword("validation") },
{ key: keyword("code"), val: keyword("request-body-too-large") },
{ key: keyword("status"), val: 413 },
];
const data = {
*[Symbol.iterator]() {
yield* entries;
},
};
const error = Object.assign(new Error("http error"), { data });
assert.equal(formatTaskError(error), "http error (type: validation, code: request-body-too-large, status: 413)");
});
test("falls back to the printed representation when map internals are renamed by the Closure compiler", () => {
// In release builds MapEntry/Keyword field names are minified, so entry
// extraction finds nothing; only toString keeps the readable CLJS form.
const entries = [{ a7: { Eb: "type" }, gb: { Eb: "validation" } }];
const data = {
*[Symbol.iterator]() {
yield* entries;
},
toString: () => "{:type :validation, :code :request-body-too-large}",
};
const error = Object.assign(new Error("http error"), { data });
assert.equal(formatTaskError(error), "http error ({:type :validation, :code :request-body-too-large})");
});
test("formats plain object data and nested printable values", () => {
const data = {
status: 413,
uri: "https://example.test/api/export",
detail: { toString: () => "{:code :too-large}" },
};
const error = Object.assign(new Error("http error"), { data });
assert.equal(
formatTaskError(error),
"http error (status: 413, uri: https://example.test/api/export, detail: {:code :too-large})"
);
});
test("keeps string values verbatim", () => {
const error = Object.assign(new Error("http error"), { data: { hint: ":not-a-keyword" } });
assert.equal(formatTaskError(error), "http error (hint: :not-a-keyword)");
});
test("returns the original message when no structured data is available", () => {
assert.equal(formatTaskError(new Error("export timed out")), "export timed out");
});
test("formats non-Error values", () => {
assert.equal(formatTaskError("connection closed"), "connection closed");
});