From b72230bc243451639ac7feca178ea71b6536fd22 Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Sun, 28 Jun 2026 09:58:45 +0300 Subject: [PATCH] fix: restore update command helpers (#1857) Exported package-manager helpers used by openchamber update Added regression coverage for the update-available path --- packages/web/bin/lib/commands-update.test.js | 50 +++++++++++++++++++ packages/web/server/lib/package-manager.js | 4 +- .../web/server/lib/package-manager.test.js | 14 +++++- 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 packages/web/bin/lib/commands-update.test.js diff --git a/packages/web/bin/lib/commands-update.test.js b/packages/web/bin/lib/commands-update.test.js new file mode 100644 index 00000000..f4e11492 --- /dev/null +++ b/packages/web/bin/lib/commands-update.test.js @@ -0,0 +1,50 @@ +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; + } + }); + }); +}); diff --git a/packages/web/server/lib/package-manager.js b/packages/web/server/lib/package-manager.js index fc92af10..ec482a8e 100644 --- a/packages/web/server/lib/package-manager.js +++ b/packages/web/server/lib/package-manager.js @@ -483,7 +483,7 @@ export function detectPackageManagerDetails() { }; } -function detectPackageManager() { +export function detectPackageManager() { return detectPackageManagerDetails().packageManager; } @@ -769,7 +769,7 @@ export async function checkForUpdates(options = {}) { /** * Execute the update (used by CLI) */ -function executeUpdate(pm = detectPackageManager(), options = {}) { +export function executeUpdate(pm = detectPackageManager(), options = {}) { const command = getUpdateCommand(pm); if (!options?.silent) { console.log(`Updating ${PACKAGE_NAME} using ${pm}...`); diff --git a/packages/web/server/lib/package-manager.test.js b/packages/web/server/lib/package-manager.test.js index d64bf541..a8b962e6 100644 --- a/packages/web/server/lib/package-manager.test.js +++ b/packages/web/server/lib/package-manager.test.js @@ -6,7 +6,12 @@ vi.mock('node:child_process', () => ({ spawnSync: vi.fn(() => ({ status: 0, stdout: '/usr/local/bin', stderr: '' })), })); -const { checkForUpdates, getCurrentVersion } = await import('./package-manager.js'); +const { + checkForUpdates, + detectPackageManager, + executeUpdate, + getCurrentVersion, +} = await import('./package-manager.js'); /** Helper: create a fetch mock that routes by URL pattern */ function createFetchMock() { @@ -251,3 +256,10 @@ describe('getCurrentVersion', () => { expect(getCurrentVersion()).toMatch(/^\d+\.\d+\.\d+|unknown$/); }); }); + +describe('CLI update exports', () => { + it('exports package-manager helpers used by the update command', () => { + expect(typeof detectPackageManager).toBe('function'); + expect(typeof executeUpdate).toBe('function'); + }); +});