import { afterEach, beforeEach, describe, expect, test } from 'bun:test'; import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import type { ModuleManifest } from '../../manifest/schema'; import { missingBuildOutputs } from './module-generate'; const DECLARED = join('ansible', 'roles', 'fixture', 'files', 'binary'); function manifestWithArtifacts(artifacts: string[]): ModuleManifest { return { celilo_contract: '1.0', id: 'fixture', name: 'Fixture', version: '1.0.0', description: 'fixture', build: { command: 'true', artifacts }, } as ModuleManifest; } describe('missingBuildOutputs', () => { let payload: string; beforeEach(() => { payload = mkdtempSync(join(tmpdir(), 'celilo-missing-outputs-')); }); afterEach(() => { rmSync(payload, { recursive: true, force: true }); }); test('names the declared output the payload is missing', () => { expect(missingBuildOutputs(payload, manifestWithArtifacts([DECLARED]))).toEqual([DECLARED]); }); test('reports nothing when the payload carries its declared outputs', () => { mkdirSync(join(payload, 'ansible', 'roles', 'fixture', 'files'), { recursive: true }); writeFileSync(join(payload, DECLARED), 'built-bytes'); expect(missingBuildOutputs(payload, manifestWithArtifacts([DECLARED]))).toEqual([]); }); test('reports nothing for a module with no build block', () => { expect( missingBuildOutputs(payload, { celilo_contract: '1.0', id: 'fixture', name: 'Fixture', version: '1.0.0', description: 'fixture', } as ModuleManifest), ).toEqual([]); }); });