import assert from "node:assert/strict";
import { describe, it } from "node:test";
import {
buildDraftCommandArgs,
buildSetVersionCommandArgs,
parsePrepareOptions,
resolveStableReleaseAction,
} from "./release-prepare.ts";
import {
CHANGELOG_REVIEW_TODO,
docsChangelogEntryHasGeneratedTodo,
hasGeneratedChangelogTodo,
} from "./set-version.ts";
describe("release prepare arguments", () => {
it("parses changelog draft and set-version options", () => {
assert.deepEqual(
parsePrepareOptions([
"v1.2.3",
"--from",
"v1.2.2",
"--to=HEAD",
"--date",
"2026-06-02",
"--force",
"--no-tag",
"--skip-changelog-check",
]),
{
version: "1.2.3",
from: "v1.2.2",
to: "HEAD",
date: "2026-06-02",
force: true,
skipTag: true,
skipChangelogCheck: true,
},
);
});
});
describe("release prepare actions", () => {
it("drafts when reviewed changelog artifacts are missing", () => {
assert.equal(
resolveStableReleaseAction({
missingArtifacts: ["releases/v1.2.3.md"],
unreviewedArtifacts: [],
}),
"draft",
);
});
it("blocks on review when generated TODOs are still present", () => {
assert.equal(
resolveStableReleaseAction({
missingArtifacts: [],
unreviewedArtifacts: ["docs/changelog.mdx#HyperFrames v1.2.3"],
}),
"review",
);
});
it("delegates to set-version after artifacts are reviewed", () => {
assert.equal(
resolveStableReleaseAction({
missingArtifacts: [],
unreviewedArtifacts: [],
}),
"set-version",
);
});
});
describe("release prepare command builders", () => {
it("passes only changelog options to changelog:draft", () => {
assert.deepEqual(
buildDraftCommandArgs({
version: "1.2.3",
from: "v1.2.2",
to: "HEAD",
date: "2026-06-02",
force: true,
skipTag: true,
skipChangelogCheck: true,
}),
[
"run",
"changelog:draft",
"1.2.3",
"--write",
"--force",
"--from",
"v1.2.2",
"--to",
"HEAD",
"--date",
"2026-06-02",
],
);
});
it("passes only release options to set-version", () => {
assert.deepEqual(
buildSetVersionCommandArgs({
version: "1.2.3",
from: "v1.2.2",
to: "HEAD",
date: "2026-06-02",
force: true,
skipTag: true,
skipChangelogCheck: true,
}),
["run", "set-version", "1.2.3", "--no-tag", "--skip-changelog-check"],
);
});
});
describe("reviewed changelog detection", () => {
it("detects the generated TODO marker", () => {
assert.equal(hasGeneratedChangelogTodo(CHANGELOG_REVIEW_TODO), true);
assert.equal(hasGeneratedChangelogTodo("Polished user-facing summary."), false);
});
it("checks only the matching docs changelog entry", () => {
const docs = `
Reviewed summary.
${CHANGELOG_REVIEW_TODO}
`;
assert.equal(docsChangelogEntryHasGeneratedTodo(docs, "HyperFrames v1.2.3"), true);
assert.equal(docsChangelogEntryHasGeneratedTodo(docs, "HyperFrames v1.2.4"), false);
});
});