UNPKG

@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
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', ]); }); });