@mintlify/previewing
Version: 
Preview Mintlify docs locally
92 lines (91 loc) • 3.67 kB
JavaScript
import { prebuild } from '@mintlify/prebuild';
import fse from 'fs-extra';
import isOnline from 'is-online';
import { mockProcessExit } from 'vitest-mock-process';
import { dev } from '../index.js';
import { run } from '../local-preview/run.js';
import { silentUpdateClient } from '../local-preview/update.js';
import * as logs from '../logging-state.js';
const originalChdir = process.chdir;
vi.mock('fs-extra', () => {
    const mocks = {
        ensureDir: vi.fn().mockResolvedValue(undefined),
        pathExists: vi.fn().mockResolvedValue(true),
        readFileSync: vi.fn().mockReturnValue('0.0.100'),
        emptyDirSync: vi.fn().mockResolvedValue(undefined),
    };
    return {
        ...mocks,
        default: mocks,
    };
});
vi.mock('../local-preview/update.js', () => ({
    silentUpdateClient: vi.fn().mockResolvedValue({ needsUpdate: false, error: undefined }),
}));
vi.mock('is-online', () => ({
    default: vi.fn().mockResolvedValue(true),
}));
vi.mock('@mintlify/prebuild', () => ({
    prebuild: vi.fn().mockResolvedValue(undefined),
}));
vi.mock('../local-preview/run.js', () => ({
    run: vi.fn().mockResolvedValue(undefined),
}));
vi.mock('../util.js', () => {
    return {
        maybeFixMissingWindowsEnvVar: vi.fn(),
    };
});
const prebuildMock = vi.mocked(prebuild);
const runMock = vi.mocked(run);
const silentUpdateClientMock = vi.mocked(silentUpdateClient);
const defaultYargs = {
    _: [],
    $0: '',
    packageName: 'mintlify',
    cliVersion: '1.0.0',
};
const addLogSpy = vi.spyOn(logs, 'addLog');
const processExitMock = mockProcessExit();
describe('dev', () => {
    beforeEach(() => {
        process.chdir = vi.fn();
        vi.clearAllMocks();
    });
    afterEach(() => {
        process.chdir = originalChdir;
    });
    it('happy path', async () => {
        await dev(defaultYargs);
        expect(addLogSpy).toHaveBeenCalledWith(expect.objectContaining({ props: { message: 'preparing local preview...' } }));
        expect(silentUpdateClientMock).toHaveBeenCalled();
        expect(prebuildMock).toHaveBeenCalled();
        expect(runMock).toHaveBeenCalled();
    });
    it('prebuild fails', async () => {
        const errorText = 'Some OpenAPI or docs.json schema error';
        prebuildMock.mockRejectedValueOnce(new Error(errorText));
        await dev(defaultYargs);
        expect(addLogSpy).toHaveBeenCalledWith(expect.objectContaining({ props: { message: 'preparing local preview...' } }));
        expect(addLogSpy).toHaveBeenCalledWith(expect.objectContaining({ props: { message: errorText } }));
        expect(processExitMock).toHaveBeenCalledWith(1);
    });
    it('fails if no existing client version and no internet', async () => {
        vi.mocked(isOnline).mockResolvedValueOnce(false);
        vi.mocked(fse.pathExists).mockResolvedValueOnce();
        await dev(defaultYargs).catch(() => { });
        expect(addLogSpy).toHaveBeenCalledWith(expect.objectContaining({
            props: { message: 'running mintlify dev after updating requires an internet connection.' },
        }));
        expect(processExitMock).toHaveBeenCalledWith(1);
    });
    it('fails if no existing client version and no internet - mint command', async () => {
        vi.mocked(isOnline).mockResolvedValueOnce(false);
        vi.mocked(fse.pathExists).mockResolvedValueOnce();
        await dev({ ...defaultYargs, packageName: 'mint' }).catch(() => { });
        expect(addLogSpy).toHaveBeenCalledWith(expect.objectContaining({
            props: { message: 'running mint dev after updating requires an internet connection.' },
        }));
        expect(processExitMock).toHaveBeenCalledWith(1);
    });
});