import fs from 'fs'; import os from 'os'; import path from 'path'; import { describe, expect, it, vi } from 'vitest'; import { createUpdateCommand } from './commands-update.js'; async function withTempOpenChamberDataDir(fn) { const previous = process.env.OPENCHAMBER_DATA_DIR; const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'openchamber-update-test-')); process.env.OPENCHAMBER_DATA_DIR = dir; try { return await fn(dir); } finally { if (typeof previous === 'string') { process.env.OPENCHAMBER_DATA_DIR = previous; } else { delete process.env.OPENCHAMBER_DATA_DIR; } fs.rmSync(dir, { recursive: true, force: true }); } } describe('update command', () => { it('uses the package-manager helpers on the update-available path', async () => { await withTempOpenChamberDataDir(async () => { const originalWrite = process.stdout.write; process.stdout.write = vi.fn(() => true); const executeUpdate = vi.fn(() => ({ success: true, exitCode: 0 })); const updateCommand = createUpdateCommand({ packageManagerPath: '/fake/package-manager.js', serveCommand: vi.fn(), importFromFilePath: vi.fn(async () => ({ checkForUpdates: vi.fn(async () => ({ available: true, version: '9.9.9' })), detectPackageManager: vi.fn(() => 'npm'), executeUpdate, getCurrentVersion: vi.fn(() => '1.0.0'), })), }); try { await updateCommand({ json: true }); expect(executeUpdate).toHaveBeenCalledWith('npm', { silent: true }); } finally { process.stdout.write = originalWrite; } }); }); });