import { describe, expect, it } from "vitest"; import { formatConfigIssueLine, formatConfigIssueLines, normalizeConfigIssue, normalizeConfigIssuePath, normalizeConfigIssues, } from "./issue-format.js"; describe("config issue format", () => { it("normalizes empty paths to ", () => { expect(normalizeConfigIssuePath("")).toBe(""); expect(normalizeConfigIssuePath(" ")).toBe(""); expect(normalizeConfigIssuePath(null)).toBe(""); expect(normalizeConfigIssuePath(undefined)).toBe(""); }); it("formats issue lines with and without markers", () => { expect(formatConfigIssueLine({ path: "", message: "broken" }, "-")).toBe("- : broken"); expect( formatConfigIssueLine({ path: "", message: "broken" }, "-", { normalizeRoot: true }), ).toBe("- : broken"); expect(formatConfigIssueLine({ path: "gateway.bind", message: "invalid" }, "")).toBe( "gateway.bind: invalid", ); expect( formatConfigIssueLines( [ { path: "", message: "first" }, { path: "channels.signal.dmPolicy", message: "second" }, ], "×", { normalizeRoot: true }, ), ).toEqual(["× : first", "× channels.signal.dmPolicy: second"]); }); it("sanitizes control characters and ANSI sequences in formatted lines", () => { expect( formatConfigIssueLine( { path: "gateway.\nbind\x1b[31m", message: "bad\r\n\tvalue\x1b[0m\u0007", }, "-", ), ).toBe("- gateway.\\nbind: bad\\r\\n\\tvalue"); }); it("normalizes issue metadata for machine output", () => { expect( normalizeConfigIssue({ path: "", message: "invalid", allowedValues: ["stable", "beta"], allowedValuesHiddenCount: 0, }), ).toEqual({ path: "", message: "invalid", allowedValues: ["stable", "beta"], }); expect( normalizeConfigIssues([ { path: "update.channel", message: "invalid", allowedValues: [], allowedValuesHiddenCount: 2, }, ]), ).toEqual([ { path: "update.channel", message: "invalid", }, ]); expect( normalizeConfigIssue({ path: "update.channel", message: "invalid", allowedValues: ["stable"], allowedValuesHiddenCount: 2, }), ).toEqual({ path: "update.channel", message: "invalid", allowedValues: ["stable"], allowedValuesHiddenCount: 2, }); }); });