import { afterEach, beforeEach, describe, expect, test } from 'bun:test'; import { mkdtempSync, rmSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { resetTestDbPath } from '../../test-utils/db-path'; import { moduleAudit } from './module-audit'; import { moduleVerify } from './module-verify'; describe('moduleVerify', () => { test('returns error when module ID is missing', async () => { const result = await moduleVerify([]); expect(result.success).toBe(false); if (!result.success) { expect(result.error).toContain('Module ID is required'); expect(result.error).toContain('module verify'); } }); }); describe('moduleAudit (deprecation alias)', () => { let dataDir: string; const originalDataDir = process.env.CELILO_DATA_DIR; beforeEach(() => { dataDir = mkdtempSync(join(tmpdir(), 'celilo-audit-alias-')); process.env.CELILO_DATA_DIR = dataDir; process.env.CELILO_DB_PATH = join(dataDir, 'celilo.db'); }); afterEach(() => { rmSync(dataDir, { recursive: true, force: true }); resetTestDbPath(); if (originalDataDir === undefined) delete process.env.CELILO_DATA_DIR; else process.env.CELILO_DATA_DIR = originalDataDir; }); test('writes a deprecation warning to stderr and delegates to verify', async () => { const writes: Buffer[] = []; const originalWrite = process.stderr.write.bind(process.stderr); // Narrower override is fine for the duration of the test; cast to // bypass the overload set on Process['stderr']['write']. process.stderr.write = ((chunk: string | Buffer) => { writes.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk); return true; }) as typeof process.stderr.write; try { const result = await moduleAudit([]); // no args triggers the same arg-error expect(result.success).toBe(false); } finally { process.stderr.write = originalWrite; } const stderr = Buffer.concat(writes).toString('utf-8'); expect(stderr).toContain('deprecated'); expect(stderr).toContain('module verify'); }); });