Files
Termix/scripts/generate-appstore-notes.test.ts
T

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);
});
});