feat: migrate repo releases to manual release-please (#293)
This commit is contained in:
102
tests/release-components.test.ts
Normal file
102
tests/release-components.test.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { describe, expect, test } from "bun:test"
|
||||
import {
|
||||
applyOverride,
|
||||
bumpVersion,
|
||||
detectComponentsFromFiles,
|
||||
inferBumpFromIntent,
|
||||
parseReleaseIntent,
|
||||
resolveComponentWarnings,
|
||||
} from "../src/release/components"
|
||||
|
||||
describe("release component detection", () => {
|
||||
test("maps plugin-only changes to the matching plugin component", () => {
|
||||
const components = detectComponentsFromFiles([
|
||||
"plugins/compound-engineering/skills/ce-plan/SKILL.md",
|
||||
])
|
||||
|
||||
expect(components.get("compound-engineering")).toEqual([
|
||||
"plugins/compound-engineering/skills/ce-plan/SKILL.md",
|
||||
])
|
||||
expect(components.get("cli")).toEqual([])
|
||||
expect(components.get("coding-tutor")).toEqual([])
|
||||
expect(components.get("marketplace")).toEqual([])
|
||||
})
|
||||
|
||||
test("maps cli and plugin changes independently", () => {
|
||||
const components = detectComponentsFromFiles([
|
||||
"src/commands/install.ts",
|
||||
"plugins/coding-tutor/.claude-plugin/plugin.json",
|
||||
])
|
||||
|
||||
expect(components.get("cli")).toEqual(["src/commands/install.ts"])
|
||||
expect(components.get("coding-tutor")).toEqual([
|
||||
"plugins/coding-tutor/.claude-plugin/plugin.json",
|
||||
])
|
||||
})
|
||||
|
||||
test("maps marketplace metadata without bumping plugin components", () => {
|
||||
const components = detectComponentsFromFiles([".claude-plugin/marketplace.json"])
|
||||
expect(components.get("marketplace")).toEqual([".claude-plugin/marketplace.json"])
|
||||
expect(components.get("compound-engineering")).toEqual([])
|
||||
expect(components.get("coding-tutor")).toEqual([])
|
||||
})
|
||||
})
|
||||
|
||||
describe("release intent parsing", () => {
|
||||
test("parses conventional titles with optional scope and breaking marker", () => {
|
||||
const parsed = parseReleaseIntent("feat(coding-tutor)!: add tutor reset flow")
|
||||
expect(parsed.type).toBe("feat")
|
||||
expect(parsed.scope).toBe("coding-tutor")
|
||||
expect(parsed.breaking).toBe(true)
|
||||
expect(parsed.description).toBe("add tutor reset flow")
|
||||
})
|
||||
|
||||
test("supports conventional titles without scope", () => {
|
||||
const parsed = parseReleaseIntent("fix: adjust ce:plan-beta wording")
|
||||
expect(parsed.type).toBe("fix")
|
||||
expect(parsed.scope).toBeNull()
|
||||
expect(parsed.breaking).toBe(false)
|
||||
})
|
||||
|
||||
test("infers bump levels from parsed intent", () => {
|
||||
expect(inferBumpFromIntent(parseReleaseIntent("feat: add release preview"))).toBe("minor")
|
||||
expect(inferBumpFromIntent(parseReleaseIntent("fix: correct preview output"))).toBe("patch")
|
||||
expect(inferBumpFromIntent(parseReleaseIntent("docs: update requirements"))).toBeNull()
|
||||
expect(inferBumpFromIntent(parseReleaseIntent("refactor!: break compatibility"))).toBe("major")
|
||||
})
|
||||
})
|
||||
|
||||
describe("override handling", () => {
|
||||
test("keeps inferred bump when override is auto", () => {
|
||||
expect(applyOverride("patch", "auto")).toBe("patch")
|
||||
})
|
||||
|
||||
test("promotes inferred bump when override is explicit", () => {
|
||||
expect(applyOverride("patch", "minor")).toBe("minor")
|
||||
expect(applyOverride(null, "major")).toBe("major")
|
||||
})
|
||||
|
||||
test("increments semver versions", () => {
|
||||
expect(bumpVersion("2.42.0", "patch")).toBe("2.42.1")
|
||||
expect(bumpVersion("2.42.0", "minor")).toBe("2.43.0")
|
||||
expect(bumpVersion("2.42.0", "major")).toBe("3.0.0")
|
||||
})
|
||||
})
|
||||
|
||||
describe("scope mismatch warnings", () => {
|
||||
test("does not require scope when omitted", () => {
|
||||
const warnings = resolveComponentWarnings(
|
||||
parseReleaseIntent("fix: update ce plan copy"),
|
||||
["compound-engineering"],
|
||||
)
|
||||
expect(warnings).toEqual([])
|
||||
})
|
||||
|
||||
test("warns when explicit scope contradicts detected files", () => {
|
||||
const warnings = resolveComponentWarnings(
|
||||
parseReleaseIntent("fix(cli): update coding tutor text"),
|
||||
["coding-tutor"],
|
||||
)
|
||||
expect(warnings[0]).toContain('Optional scope "cli" does not match')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user