mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-09 05:11:31 +00:00
107 lines
2.9 KiB
TypeScript
107 lines
2.9 KiB
TypeScript
import { describe, it, expect } from "vitest";
|
|
import { createRequire } from "module";
|
|
|
|
const require = createRequire(import.meta.url);
|
|
const {
|
|
buildNotes,
|
|
toPlainText,
|
|
truncate,
|
|
MAX_LENGTH,
|
|
} = require("./generate-appstore-notes.cjs");
|
|
|
|
function changelog(body: string, version = "26.10.0") {
|
|
return [
|
|
"# Changelog",
|
|
"",
|
|
`## ${version}`,
|
|
"",
|
|
body,
|
|
"",
|
|
"## 26.9.0",
|
|
"",
|
|
"### Added",
|
|
"- Older",
|
|
"",
|
|
].join("\n");
|
|
}
|
|
|
|
describe("toPlainText", () => {
|
|
it("strips markdown links down to their label", () => {
|
|
expect(toPlainText("- See [the docs](https://example.com)")).toBe(
|
|
"- See the docs",
|
|
);
|
|
});
|
|
|
|
it("strips backticks and bold markers", () => {
|
|
expect(toPlainText("- Fixed `npm run build` and **crashes**")).toBe(
|
|
"- Fixed npm run build and crashes",
|
|
);
|
|
});
|
|
|
|
it("keeps nested bullets indented", () => {
|
|
expect(toPlainText("- Top\n - Nested")).toBe("- Top\n - Nested");
|
|
});
|
|
|
|
it("normalizes asterisk bullets to dashes", () => {
|
|
expect(toPlainText("* One\n* Two")).toBe("- One\n- Two");
|
|
});
|
|
|
|
it("turns headings into labels", () => {
|
|
expect(toPlainText("### Added\n- One")).toBe("Added:\n- One");
|
|
});
|
|
|
|
it("collapses runs of blank lines", () => {
|
|
expect(toPlainText("- One\n\n\n\n- Two")).toBe("- One\n\n- Two");
|
|
});
|
|
});
|
|
|
|
describe("truncate", () => {
|
|
it("leaves text under the limit untouched", () => {
|
|
expect(truncate("- One\n- Two", 100)).toBe("- One\n- Two");
|
|
});
|
|
|
|
it("drops whole trailing lines rather than splitting one", () => {
|
|
const result = truncate("- One\n- Two\n- Three", 12);
|
|
expect(result).toBe("- One\n- Two");
|
|
});
|
|
|
|
it("drops a section header left with no bullets under it", () => {
|
|
const result = truncate("- One\n\nFixed:\n- Two", 14);
|
|
expect(result).toBe("- One");
|
|
});
|
|
});
|
|
|
|
describe("buildNotes", () => {
|
|
it("uses only the version's section", () => {
|
|
const notes = buildNotes(
|
|
changelog("A summary.\n\n### Added\n- A thing\n\n### Fixed\n- A bug"),
|
|
"26.10.0",
|
|
);
|
|
expect(notes).toBe("A summary.\n\nAdded:\n- A thing\n\nFixed:\n- A bug");
|
|
expect(notes).not.toContain("Older");
|
|
});
|
|
|
|
it("stays within the App Store limit and never ends mid-bullet", () => {
|
|
const bullets = Array.from(
|
|
{ length: 400 },
|
|
(_, i) => `- Added feature number ${i}`,
|
|
);
|
|
const notes = buildNotes(
|
|
changelog(`### Added\n${bullets.join("\n")}`),
|
|
"26.10.0",
|
|
);
|
|
expect(notes.length).toBeLessThanOrEqual(MAX_LENGTH);
|
|
expect(notes.split("\n").at(-1)).toMatch(/^- Added feature number \d+$/);
|
|
});
|
|
|
|
it("produces notes for the real changelog", () => {
|
|
const fs = require("fs");
|
|
const notes = buildNotes(
|
|
fs.readFileSync("CHANGELOG.md", "utf8"),
|
|
require("../package.json").version,
|
|
);
|
|
expect(notes.length).toBeGreaterThan(0);
|
|
expect(notes.length).toBeLessThanOrEqual(MAX_LENGTH);
|
|
});
|
|
});
|