File size: 3,259 Bytes
fc93158 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import { describe, expect, it } from "vitest";
import { markdownToSlackMrkdwn, normalizeSlackOutboundText } from "./format.js";
import { escapeSlackMrkdwn } from "./monitor/mrkdwn.js";
describe("markdownToSlackMrkdwn", () => {
it("handles core markdown formatting conversions", () => {
const cases = [
["converts bold from double asterisks to single", "**bold text**", "*bold text*"],
["preserves italic underscore format", "_italic text_", "_italic text_"],
[
"converts strikethrough from double tilde to single",
"~~strikethrough~~",
"~strikethrough~",
],
[
"renders basic inline formatting together",
"hi _there_ **boss** `code`",
"hi _there_ *boss* `code`",
],
["renders inline code", "use `npm install`", "use `npm install`"],
["renders fenced code blocks", "```js\nconst x = 1;\n```", "```\nconst x = 1;\n```"],
[
"renders links with Slack mrkdwn syntax",
"see [docs](https://example.com)",
"see <https://example.com|docs>",
],
["does not duplicate bare URLs", "see https://example.com", "see https://example.com"],
["escapes unsafe characters", "a & b < c > d", "a & b < c > d"],
[
"preserves Slack angle-bracket markup (mentions/links)",
"hi <@U123> see <https://example.com|docs> and <!here>",
"hi <@U123> see <https://example.com|docs> and <!here>",
],
["escapes raw HTML", "<b>nope</b>", "<b>nope</b>"],
["renders paragraphs with blank lines", "first\n\nsecond", "first\n\nsecond"],
["renders bullet lists", "- one\n- two", "• one\n• two"],
["renders ordered lists with numbering", "2. two\n3. three", "2. two\n3. three"],
["renders headings as bold text", "# Title", "*Title*"],
["renders blockquotes", "> Quote", "> Quote"],
] as const;
for (const [name, input, expected] of cases) {
expect(markdownToSlackMrkdwn(input), name).toBe(expected);
}
});
it("handles nested list items", () => {
const res = markdownToSlackMrkdwn("- item\n - nested");
// markdown-it correctly parses this as a nested list
expect(res).toBe("• item\n • nested");
});
it("handles complex message with multiple elements", () => {
const res = markdownToSlackMrkdwn(
"**Important:** Check the _docs_ at [link](https://example.com)\n\n- first\n- second",
);
expect(res).toBe(
"*Important:* Check the _docs_ at <https://example.com|link>\n\n• first\n• second",
);
});
it("does not throw when input is undefined at runtime", () => {
expect(markdownToSlackMrkdwn(undefined as unknown as string)).toBe("");
});
});
describe("escapeSlackMrkdwn", () => {
it("returns plain text unchanged", () => {
expect(escapeSlackMrkdwn("heartbeat status ok")).toBe("heartbeat status ok");
});
it("escapes slack and mrkdwn control characters", () => {
expect(escapeSlackMrkdwn("mode_*`~<&>\\")).toBe("mode\\_\\*\\`\\~<&>\\\\");
});
});
describe("normalizeSlackOutboundText", () => {
it("normalizes markdown for outbound send/update paths", () => {
expect(normalizeSlackOutboundText(" **bold** ")).toBe("*bold*");
});
});
|