Files
oh-my-pi/scripts/fix-changelogs.test.ts
T
roboomp 1d931506d6 fix(changelog): preserved released sections during auto-fix
Restored the released coding-agent changelog sections that the previous pre-publish fix run flattened into Unreleased. The local checkout only had tags through v15.5.15, so fix-changelogs compared against an old tag and promoted entire newly-added release sections.

- Kept newly-added release-section hunks out of collectPromotableAddedItemLines so the fixer still promotes individual new items added under an existing released section, but does not rewrite whole release blocks.
- Added regression coverage for the release-section case.
- Restored the coding-agent changelog history and kept only the #2582 entry under Unreleased.

Fixes #2582
2026-06-14 20:44:45 +02:00

109 lines
2.6 KiB
TypeScript

import { describe, expect, it } from "bun:test";
import { collectPromotableAddedItemLines, fixChangelogContent } from "./fix-changelogs";
describe("collectPromotableAddedItemLines", () => {
it("keeps new changelog item additions while ignoring moves and edits", () => {
const diff = [
"diff --git a/packages/example/CHANGELOG.md b/packages/example/CHANGELOG.md",
"--- a/packages/example/CHANGELOG.md",
"+++ b/packages/example/CHANGELOG.md",
"@@ -10,0 +11,2 @@",
"+",
"+- Added after the latest tag in a released section.",
"@@ -20 +22 @@",
"-- Moved historical entry.",
"+- Moved historical entry.",
"@@ -30 +32,2 @@",
"-- Historical entry with old wording.",
"+- Historical entry with new wording.",
"+- Another brand-new item in the same hunk.",
].join("\n");
const lines = collectPromotableAddedItemLines(diff);
expect(lines.get("packages/example/CHANGELOG.md")).toEqual(new Set([12, 33]));
});
it("does not promote items from newly added release sections", () => {
const diff = [
"diff --git a/packages/example/CHANGELOG.md b/packages/example/CHANGELOG.md",
"--- a/packages/example/CHANGELOG.md",
"+++ b/packages/example/CHANGELOG.md",
"@@ -1,0 +1,8 @@",
"+# Changelog",
"+",
"+## [1.0.0] - 2026-01-01",
"+",
"+### Fixed",
"+",
"+- Released fix.",
"+- Another released fix.",
].join("\n");
const lines = collectPromotableAddedItemLines(diff);
expect(lines.get("packages/example/CHANGELOG.md")).toBeUndefined();
});
});
describe("fixChangelogContent", () => {
it("moves added released-section items to Unreleased and merges duplicate category headings", () => {
const content = [
"# Changelog",
"",
"## [Unreleased]",
"### Fixed",
"",
"- Existing fix.",
"",
"### Fixed",
"",
"- Second fix.",
"",
"## [1.0.0] - 2026-01-01",
"",
"### Added",
"",
"- Historical addition.",
"- New addition in released section.",
"",
"### Fixed",
"",
"- Historical fix.",
"- New fix in released section.",
"",
].join("\n");
const result = fixChangelogContent(content, new Set([17, 22]));
expect(result.promotedItems).toBe(2);
expect(result.mergedDuplicateHeadings).toBe(1);
expect(result.content).toBe([
"# Changelog",
"",
"## [Unreleased]",
"",
"### Added",
"",
"- New addition in released section.",
"",
"### Fixed",
"",
"- Existing fix.",
"- Second fix.",
"- New fix in released section.",
"",
"## [1.0.0] - 2026-01-01",
"",
"### Added",
"",
"- Historical addition.",
"",
"### Fixed",
"",
"- Historical fix.",
"",
].join("\n"));
});
});