/** * decidePhases — the pure phase-gating decision behind `celilo publish`. * * The module-phase flags (`--skip-modules` / `--modules-only`) exist so * the release pipeline can deliver the CLI independently of the module * sweep (celilo#1369). Their gating lives in one pure function so the * combinations are testable without npm, git or the registry. */ import { describe, expect, test } from 'bun:test'; import { decidePhases } from './plan'; describe('decidePhases', () => { test('normal mode, default phase: everything runs', () => { expect(decidePhases({ kind: 'normal' }, 'run')).toEqual({ workspace: true, consumerPins: true, globalUpdate: true, modulePublish: true, }); }); test('--skip-modules plans no module sweep, keeps the npm phases', () => { expect(decidePhases({ kind: 'normal' }, 'skip')).toEqual({ workspace: true, consumerPins: true, globalUpdate: true, modulePublish: false, }); }); test('--modules-only plans the module sweep and nothing else', () => { expect(decidePhases({ kind: 'normal' }, 'only')).toEqual({ workspace: false, consumerPins: false, globalUpdate: false, modulePublish: true, }); }); test('promote is a real release — same shape as normal', () => { expect( decidePhases({ kind: 'promote', target: { name: '@celilo/cli', version: '1.0.0' } }, 'run'), ).toEqual(decidePhases({ kind: 'normal' }, 'run')); }); test('alpha still suppresses pins and the sweep without --alpha-modules', () => { expect(decidePhases({ kind: 'alpha', trackAlpha: false, alphaModules: false }, 'run')).toEqual({ workspace: true, consumerPins: false, globalUpdate: false, modulePublish: false, }); }); test('alpha with --track-alpha and --alpha-modules runs its phases', () => { expect(decidePhases({ kind: 'alpha', trackAlpha: true, alphaModules: true }, 'run')).toEqual({ workspace: true, consumerPins: false, globalUpdate: true, modulePublish: true, }); }); });