@yanhe-su/cli
Version:
CLI tool for DAO Style projects - providing project scaffolding, template generation and dependency management
105 lines (104 loc) • 4.07 kB
JavaScript
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { create } from '../create';
import inquirer from 'inquirer';
import ora from 'ora';
import * as fs from 'fs-extra';
import * as path from 'path';
import { getMultiplePackageVersions } from '../../utils/npm';
// Mock dependencies
vi.mock('inquirer');
vi.mock('ora', () => ({
default: vi.fn(() => ({
start: vi.fn().mockReturnThis(),
succeed: vi.fn().mockReturnThis(),
fail: vi.fn().mockReturnThis(),
text: '',
})),
}));
vi.mock('fs-extra');
vi.mock('../../utils/npm');
describe('create command', () => {
const testDir = path.join(process.cwd(), 'test-project');
beforeEach(() => {
// Mock process.cwd()
const cwdSpy = vi.spyOn(process, 'cwd');
cwdSpy.mockImplementation(() => '/test');
// Mock inquirer.prompt
vi.mocked(inquirer.prompt).mockResolvedValue({
packages: ['@dao-style/core', '@dao-style/extend'],
port: '8160',
});
// Mock getMultiplePackageVersions
vi.mocked(getMultiplePackageVersions).mockResolvedValue({
'@dao-style/core': { latest: '1.0.0' },
'@dao-style/extend': { latest: '1.0.0' },
});
// Mock fs-extra methods
vi.mocked(fs.pathExists).mockResolvedValue(false);
vi.mocked(fs.ensureDir).mockResolvedValue(undefined);
});
afterEach(() => {
vi.clearAllMocks();
});
it('should create project successfully', async () => {
await create('test-project', { template: 'vue' });
// Verify directory checks
expect(fs.pathExists).toHaveBeenCalledWith(expect.stringContaining('test-project'));
// Verify package version checks
expect(getMultiplePackageVersions).toHaveBeenCalledWith([
'@dao-style/core',
'@dao-style/extend',
]);
// Verify ora spinner usage
expect(ora).toHaveBeenCalled();
// Verify template rendering
expect(fs.ensureDir).toHaveBeenCalled();
});
it('should fail if project directory already exists', async () => {
// Mock directory exists
fs.pathExists.mockResolvedValue(true);
// Mock process.exit
const exitMock = vi
.spyOn(process, 'exit')
.mockImplementation(() => undefined);
await create('test-project', { template: 'vue' });
// Verify error handling
expect(exitMock).toHaveBeenCalledWith(1);
expect(ora().fail).toHaveBeenCalled();
});
it('should handle package version fetch errors', async () => {
// Mock getMultiplePackageVersions to throw
getMultiplePackageVersions.mockRejectedValue(new Error('Network error'));
// Mock process.exit
const exitMock = vi
.spyOn(process, 'exit')
.mockImplementation(() => undefined);
await create('test-project', { template: 'vue' });
// Verify error handling
expect(exitMock).toHaveBeenCalledWith(1);
expect(ora().fail).toHaveBeenCalled();
});
it('should handle template rendering errors', async () => {
// Mock fs.ensureDir to throw
fs.ensureDir.mockRejectedValue(new Error('Permission denied'));
// Mock process.exit
const exitMock = vi
.spyOn(process, 'exit')
.mockImplementation(() => undefined);
await create('test-project', { template: 'vue' });
// Verify error handling
expect(exitMock).toHaveBeenCalledWith(1);
expect(ora().fail).toHaveBeenCalled();
});
it('should allow customizing DAO Style packages', async () => {
// Mock user selecting only core package
inquirer.prompt.mockResolvedValue({
packages: ['@dao-style/core'],
});
await create('test-project', { template: 'vue' });
// Verify only core package version was fetched
expect(getMultiplePackageVersions).toHaveBeenCalledWith([
'@dao-style/core',
]);
});
});