Files
ccs/tests/unit/github/stable-release-issue-cleanup.test.mjs
T

85 lines
2.6 KiB
JavaScript

import { describe, expect, it } from 'bun:test';
import {
buildReleaseIssueSet,
extractIssueNumbers,
extractPrNumbers,
planIssueCleanup,
} from '../../../scripts/github/stable-release-issue-cleanup-lib.mjs';
describe('stable release issue cleanup', () => {
it('extracts issue numbers from release action verbs', () => {
const text = [
'feat: promote dev to main (#1351), closes #1340 #1341',
'fix: support aliases (#1197)',
'Refs #760',
].join('\n');
expect(extractIssueNumbers(text, { includeRefs: true })).toEqual([760, 1340, 1341]);
expect(extractIssueNumbers(text, { includeRefs: false })).toEqual([1340, 1341]);
});
it('extracts PR numbers from merge and squash commit subjects', () => {
const text = [
'Merge pull request #1392 from kaitranntt/kai/fix/foo',
'fix(analytics): tighten top-bar layout (#1391)',
].join('\n');
expect(extractPrNumbers(text)).toEqual([1391, 1392]);
});
it('combines release body, commit text, and PR body issue references', () => {
const result = buildReleaseIssueSet({
releaseBody: 'closes #100',
commitText: 'fix: thing (#10)',
prText: 'Refs #200\nResolves #300',
});
expect(result.releaseIssues).toEqual([100, 200, 300]);
expect(result.resolvedIssues).toEqual([100, 300]);
});
it('closes dev-released issues when promoted to stable even if the PR used refs', () => {
const actions = planIssueCleanup({
releaseIssues: [760],
resolvedIssues: [],
issueStates: new Map([[760, { state: 'OPEN', labels: ['released-dev'] }]]),
});
expect(actions[0]).toMatchObject({
number: 760,
addReleasedLabel: true,
close: true,
reason: 'promoted from dev to stable',
});
});
it('does not close weak refs unless the issue was already marked released-dev', () => {
const actions = planIssueCleanup({
releaseIssues: [42],
resolvedIssues: [],
issueStates: new Map([[42, { state: 'OPEN', labels: ['enhancement'] }]]),
});
expect(actions[0]).toMatchObject({
number: 42,
addReleasedLabel: false,
close: false,
});
});
it('closes explicitly resolved issues without requiring a manual released label', () => {
const actions = planIssueCleanup({
releaseIssues: [1340],
resolvedIssues: [1340],
issueStates: new Map([[1340, { state: 'OPEN', labels: ['bug'] }]]),
});
expect(actions[0]).toMatchObject({
number: 1340,
addReleasedLabel: true,
close: true,
reason: 'resolved by stable release',
});
});
});