import { afterEach, beforeEach, describe, expect, it } from 'bun:test'; import { mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { parseChangeset } from '../../module/versioning/changeset-version'; import { handleModuleChangeset } from './module-changeset'; let dir: string; beforeEach(async () => { dir = await mkdtemp(join(tmpdir(), 'celilo-cs-')); await writeFile( join(dir, 'manifest.yml'), 'celilo_contract: "1.0"\nid: lunacycle\nversion: 1.0.0\n', ); }); afterEach(async () => { await rm(dir, { recursive: true, force: true }); }); describe('handleModuleChangeset', () => { it('writes a changeset keyed by the module id that the engine can parse', async () => { const res = await handleModuleChangeset([dir], { bump: 'minor', message: 'Added a view.' }); expect(res.success).toBe(true); const files = (await readdir(join(dir, '.changeset'))).filter((f) => f.endsWith('.md')); expect(files.length).toBe(1); const parsed = parseChangeset(await readFile(join(dir, '.changeset', files[0]), 'utf-8')); expect(parsed.bumps).toEqual({ lunacycle: 'minor' }); expect(parsed.summary).toBe('Added a view.'); }); it('honors an explicit --name and defaults the body', async () => { await handleModuleChangeset([dir], { bump: 'patch', name: 'fix-thing' }); const parsed = parseChangeset(await readFile(join(dir, '.changeset', 'fix-thing.md'), 'utf-8')); expect(parsed.bumps).toEqual({ lunacycle: 'patch' }); expect(parsed.summary.length).toBeGreaterThan(0); }); it('rejects a missing or invalid bump', async () => { expect((await handleModuleChangeset([dir], {})).success).toBe(false); expect((await handleModuleChangeset([dir], { bump: 'huge' })).success).toBe(false); }); it('errors when the manifest is unreadable', async () => { const empty = await mkdtemp(join(tmpdir(), 'celilo-cs-empty-')); try { expect((await handleModuleChangeset([empty], { bump: 'patch' })).success).toBe(false); } finally { await rm(empty, { recursive: true, force: true }); } }); });