60 lines
2.4 KiB
TypeScript
60 lines
2.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { markdownToSlackMrkdwn } from "./format.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",
|
|
);
|
|
});
|
|
});
|