UNPKG

@mintlify/cli

Version:

The Mintlify CLI

242 lines (209 loc) 8.7 kB
import * as previewing from '@mintlify/previewing'; import { getLatestCliVersion, getVersions, execAsync } from '../src/helpers.js'; import { update } from '../src/update.js'; vi.mock('@mintlify/previewing', async () => { const originalModule = await vi.importActual<typeof import('@mintlify/previewing')>('@mintlify/previewing'); return { ...originalModule, getClientVersion: vi.fn(), getTargetMintVersion: vi.fn(), downloadTargetMint: vi.fn(), }; }); vi.mock('../src/helpers.js', async () => { const originalModule = await vi.importActual<typeof import('../src/helpers.js')>('../src/helpers.js'); return { ...originalModule, execAsync: vi.fn(), getLatestCliVersion: vi.fn(), getVersions: vi.fn().mockReturnValue({ cli: '1.0.0', client: '1.0.0', }), }; }); const addLogSpy = vi.spyOn(previewing, 'addLog'); describe('update', () => { beforeEach(() => { vi.clearAllMocks(); }); afterEach(() => { vi.resetAllMocks(); }); it('should update the cli and client successfully', async () => { vi.mocked(getVersions).mockReturnValue({ cli: '1.0.0', client: '1.0.0', }); vi.mocked(previewing.getTargetMintVersion).mockResolvedValue('2.0.0'); vi.mocked(getLatestCliVersion).mockReturnValue('2.0.0'); vi.mocked(execAsync).mockResolvedValue({ stdout: '', stderr: '' }); vi.mocked(previewing.downloadTargetMint).mockResolvedValue(); await update({ packageName: 'mintlify' }); expect(addLogSpy).toHaveBeenCalledTimes(4); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating mintlify package...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating mintlify client to 2.0.0...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updated mintlify to the latest version: 2.0.0' }, }) ); expect(execAsync).toHaveBeenCalledWith('npm install -g mintlify@latest --silent'); expect(previewing.downloadTargetMint).toHaveBeenCalledWith({ targetVersion: '2.0.0', existingVersion: '1.0.0', }); }); it('should update the cli and client successfully - silently', async () => { vi.mocked(getVersions).mockReturnValue({ cli: '1.0.0', client: '1.0.0', }); vi.mocked(previewing.getTargetMintVersion).mockResolvedValue('2.0.0'); vi.mocked(getLatestCliVersion).mockReturnValue('2.0.0'); vi.mocked(execAsync).mockResolvedValue({ stdout: '', stderr: '' }); vi.mocked(previewing.downloadTargetMint).mockResolvedValue(); await update({ packageName: 'mintlify', silent: true }); expect(addLogSpy).not.toHaveBeenCalled(); expect(execAsync).toHaveBeenCalledWith('npm install -g mintlify@latest --silent'); expect(previewing.downloadTargetMint).toHaveBeenCalledWith({ targetVersion: '2.0.0', existingVersion: '1.0.0', }); }); it('should return when already up to date', async () => { vi.mocked(getVersions).mockReturnValue({ cli: '1.0.0', client: '1.0.0', }); vi.mocked(getLatestCliVersion).mockReturnValue('1.0.0'); vi.mocked(previewing.getTargetMintVersion).mockResolvedValue('1.0.0'); vi.mocked(execAsync).mockResolvedValue({ stdout: '', stderr: '' }); vi.mocked(previewing.downloadTargetMint).mockResolvedValue(); await update({ packageName: 'mintlify' }); expect(addLogSpy).toHaveBeenCalledTimes(2); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'already up to date' } }) ); expect(execAsync).not.toHaveBeenCalled(); expect(previewing.downloadTargetMint).not.toHaveBeenCalled(); }); it('should return when already up to date - silently', async () => { vi.mocked(getVersions).mockReturnValue({ cli: '1.0.0', client: '1.0.0', }); vi.mocked(getLatestCliVersion).mockReturnValue('1.0.0'); vi.mocked(previewing.getTargetMintVersion).mockResolvedValue('1.0.0'); vi.mocked(execAsync).mockResolvedValue({ stdout: '', stderr: '' }); vi.mocked(previewing.downloadTargetMint).mockResolvedValue(); await update({ packageName: 'mintlify', silent: true }); expect(addLogSpy).not.toHaveBeenCalled(); expect(execAsync).not.toHaveBeenCalled(); expect(previewing.downloadTargetMint).not.toHaveBeenCalled(); }); it('should only update cli if client version is up to date', async () => { vi.mocked(getVersions).mockReturnValue({ cli: '1.0.0', client: '2.0.0', }); vi.mocked(getLatestCliVersion).mockReturnValue('2.0.0'); vi.mocked(previewing.getTargetMintVersion).mockResolvedValue('2.0.0'); vi.mocked(execAsync).mockResolvedValue({ stdout: '', stderr: '' }); await update({ packageName: 'mintlify' }); expect(addLogSpy).toHaveBeenCalledTimes(3); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating mintlify package...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updated mintlify to the latest version: 2.0.0' }, }) ); expect(execAsync).toHaveBeenCalledWith('npm install -g mintlify@latest --silent'); expect(previewing.downloadTargetMint).not.toHaveBeenCalled(); }); it('should only update client if cli version is up to date', async () => { vi.mocked(getVersions).mockReturnValue({ cli: '2.0.0', client: '1.0.0', }); vi.mocked(getLatestCliVersion).mockReturnValue('2.0.0'); vi.mocked(previewing.getTargetMintVersion).mockResolvedValue('2.0.0'); vi.mocked(execAsync).mockResolvedValue({ stdout: '', stderr: '' }); await update({ packageName: 'mintlify' }); expect(addLogSpy).toHaveBeenCalledTimes(3); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating mintlify client to 2.0.0...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updated mintlify to the latest version: 2.0.0' }, }) ); expect(execAsync).not.toHaveBeenCalled(); expect(previewing.downloadTargetMint).toHaveBeenCalledWith({ targetVersion: '2.0.0', existingVersion: '1.0.0', }); }); it('should handle cli update failure', async () => { vi.mocked(getVersions).mockReturnValue({ cli: '1.0.0', client: '1.0.0', }); vi.mocked(getLatestCliVersion).mockReturnValue('2.0.0'); vi.mocked(previewing.getTargetMintVersion).mockResolvedValue('2.0.0'); vi.mocked(execAsync).mockRejectedValue(new Error('Update failed')); await update({ packageName: 'mintlify' }); expect(addLogSpy).toHaveBeenCalledTimes(3); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating mintlify package...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'failed to update mintlify@latest' } }) ); }); it('should handle client update failure', async () => { vi.mocked(getVersions).mockReturnValue({ cli: '1.0.0', client: '1.0.0', }); vi.mocked(getLatestCliVersion).mockReturnValue('2.0.0'); vi.mocked(previewing.getTargetMintVersion).mockResolvedValue('2.0.0'); vi.mocked(execAsync).mockResolvedValue({ stdout: '', stderr: '' }); vi.mocked(previewing.downloadTargetMint).mockRejectedValue(new Error('Download failed')); await update({ packageName: 'mintlify' }); expect(addLogSpy).toHaveBeenCalledTimes(4); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'updating mintlify client to 2.0.0...' } }) ); expect(addLogSpy).toHaveBeenCalledWith( expect.objectContaining({ props: { message: 'failed to update mintlify client to 2.0.0' } }) ); }); });