@mintlify/cli
Version:
The Mintlify CLI
242 lines (209 loc) • 8.7 kB
text/typescript
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' } })
);
});
});