import { describe, expect, test } from 'bun:test'; import { performSelfUpdate } from './self-update'; const okUpdater = async () => ({ ok: true, stderr: '' }); const failUpdater = async () => ({ ok: false, stderr: 'EACCES on /usr/local' }); describe('performSelfUpdate', () => { test('skips when devMode flag is set', async () => { const result = await performSelfUpdate({ installedVersion: '0.0.1', fetcher: async () => '99.0.0', updater: okUpdater, devMode: true, }); expect(result).toEqual({ performed: false, reason: 'dev-mode' }); }); test('skips when fetcher returns null (no network)', async () => { const result = await performSelfUpdate({ installedVersion: '0.1.5', fetcher: async () => null, updater: okUpdater, }); expect(result).toEqual({ performed: false, reason: 'no-network' }); }); test('skips when running version >= latest', async () => { const result = await performSelfUpdate({ installedVersion: '0.1.5', fetcher: async () => '0.1.5', updater: okUpdater, }); expect(result).toEqual({ performed: false, reason: 'already-current' }); }); test('skips when running version is ahead of latest (dev build)', async () => { const result = await performSelfUpdate({ installedVersion: '0.2.0', fetcher: async () => '0.1.7', updater: okUpdater, }); expect(result).toEqual({ performed: false, reason: 'already-current' }); }); test('runs the updater and returns from/to when newer is available', async () => { let updaterCalled = false; const result = await performSelfUpdate({ installedVersion: '0.1.5', fetcher: async () => '0.1.7', updater: async () => { updaterCalled = true; return { ok: true, stderr: '' }; }, }); expect(updaterCalled).toBe(true); expect(result).toEqual({ performed: true, from: '0.1.5', to: '0.1.7' }); }); test('throws with stderr when the updater fails', async () => { await expect( performSelfUpdate({ installedVersion: '0.1.5', fetcher: async () => '0.1.7', updater: failUpdater, }), ).rejects.toThrow(/bun update failed: EACCES on \/usr\/local/); }); });