mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-14 18:13:54 +00:00
170 lines
4.7 KiB
JavaScript
170 lines
4.7 KiB
JavaScript
|
import { consola } from '../utils'
|
||
|
import Command from '../../src/command'
|
||
|
import { options as Options } from '../../src/options'
|
||
|
|
||
|
jest.mock('@nuxt/core')
|
||
|
jest.mock('@nuxt/builder')
|
||
|
jest.mock('@nuxt/generator')
|
||
|
|
||
|
describe('cli/command', () => {
|
||
|
beforeEach(() => {
|
||
|
jest.restoreAllMocks()
|
||
|
})
|
||
|
|
||
|
test('adds default options', () => {
|
||
|
const cmd = new Command()
|
||
|
|
||
|
expect(cmd.options.length).not.toBe(0)
|
||
|
})
|
||
|
|
||
|
test('builds minimist options', () => {
|
||
|
const cmd = new Command({
|
||
|
options: Object.keys(Options)
|
||
|
})
|
||
|
|
||
|
const minimistOptions = cmd._getMinimistOptions()
|
||
|
|
||
|
expect(minimistOptions.string.length).toBe(4)
|
||
|
expect(minimistOptions.boolean.length).toBe(9)
|
||
|
expect(minimistOptions.alias.c).toBe('config-file')
|
||
|
expect(minimistOptions.default.c).toBe(Options['config-file'].default)
|
||
|
})
|
||
|
|
||
|
test('parses args', () => {
|
||
|
const cmd = new Command({
|
||
|
options: Object.keys(Options)
|
||
|
})
|
||
|
|
||
|
let args = ['-c', 'test-file', '-s', '-p', '3001']
|
||
|
let argv = cmd.getArgv(args)
|
||
|
|
||
|
expect(argv['config-file']).toBe(args[1])
|
||
|
expect(argv.spa).toBe(true)
|
||
|
expect(argv.universal).toBe(false)
|
||
|
expect(argv.build).toBe(true)
|
||
|
expect(argv.port).toBe('3001')
|
||
|
|
||
|
args = ['--no-build']
|
||
|
argv = cmd.getArgv(args)
|
||
|
|
||
|
expect(argv.build).toBe(false)
|
||
|
})
|
||
|
|
||
|
test('prints version automatically', () => {
|
||
|
const cmd = new Command()
|
||
|
cmd.showVersion = jest.fn()
|
||
|
|
||
|
const args = ['--version']
|
||
|
cmd.getArgv(args)
|
||
|
|
||
|
expect(cmd.showVersion).toHaveBeenCalledTimes(1)
|
||
|
})
|
||
|
|
||
|
test('prints help automatically', () => {
|
||
|
const cmd = new Command()
|
||
|
cmd.showHelp = jest.fn()
|
||
|
|
||
|
const args = ['-h']
|
||
|
cmd.getArgv(args)
|
||
|
|
||
|
expect(cmd.showHelp).toHaveBeenCalledTimes(1)
|
||
|
})
|
||
|
|
||
|
test('returns nuxt config', async () => {
|
||
|
const cmd = new Command({
|
||
|
options: Object.keys(Options)
|
||
|
})
|
||
|
|
||
|
const args = ['-c', 'test-file', '-a', '-p', '3001', '-q', '-H']
|
||
|
const argv = cmd.getArgv(args)
|
||
|
argv._ = ['.']
|
||
|
|
||
|
const options = await cmd.getNuxtConfig(argv, { testOption: true })
|
||
|
|
||
|
expect(options.testOption).toBe(true)
|
||
|
expect(options.server.port).toBe(3001)
|
||
|
expect(options.build.quiet).toBe(true)
|
||
|
expect(options.build.analyze).toBe(true)
|
||
|
expect(consola.fatal).toHaveBeenCalledWith('Provided hostname argument has no value') // hostname check
|
||
|
})
|
||
|
|
||
|
test('returns Nuxt instance', async () => {
|
||
|
const cmd = new Command()
|
||
|
const nuxt = await cmd.getNuxt()
|
||
|
|
||
|
expect(nuxt.constructor.name).toBe('Nuxt')
|
||
|
expect(typeof nuxt.ready).toBe('function')
|
||
|
})
|
||
|
|
||
|
test('returns Builder instance', async () => {
|
||
|
const cmd = new Command()
|
||
|
const builder = await cmd.getBuilder()
|
||
|
|
||
|
expect(builder.constructor.name).toBe('Builder')
|
||
|
expect(typeof builder.build).toBe('function')
|
||
|
})
|
||
|
|
||
|
test('returns Generator instance', async () => {
|
||
|
const cmd = new Command()
|
||
|
const generator = await cmd.getGenerator()
|
||
|
|
||
|
expect(generator.constructor.name).toBe('Generator')
|
||
|
expect(typeof generator.generate).toBe('function')
|
||
|
})
|
||
|
|
||
|
test('builds help text', () => {
|
||
|
const cmd = new Command({
|
||
|
description: 'a very long description that is longer than 80 chars and ' +
|
||
|
'should wrap to the next line while keeping indentation',
|
||
|
usage: 'this is how you do it',
|
||
|
options: ['build']
|
||
|
})
|
||
|
|
||
|
const expectedText = `
|
||
|
Description
|
||
|
a very long description that is longer than 80 chars and should wrap to the next
|
||
|
line while keeping indentation
|
||
|
Usage
|
||
|
$ nuxt this is how you do it
|
||
|
Options
|
||
|
--no-build Only generate pages for dynamic routes. Nuxt has to be
|
||
|
built once before using this option
|
||
|
--spa, -s Launch in SPA mode
|
||
|
--universal, -u Launch in Universal mode (default)
|
||
|
--config-file, -c Path to Nuxt.js config file (default: nuxt.config.js)
|
||
|
--version Display the Nuxt version
|
||
|
--help, -h Display this message
|
||
|
|
||
|
`
|
||
|
expect(cmd._getHelp()).toBe(expectedText)
|
||
|
})
|
||
|
|
||
|
test('show version prints to stdout and exits', () => {
|
||
|
jest.spyOn(process.stdout, 'write').mockImplementation(() => {})
|
||
|
jest.spyOn(process, 'exit').mockImplementationOnce(code => code)
|
||
|
|
||
|
const cmd = new Command()
|
||
|
cmd.showVersion()
|
||
|
|
||
|
expect(process.stdout.write).toHaveBeenCalled()
|
||
|
expect(process.exit).toHaveBeenCalled()
|
||
|
|
||
|
process.stdout.write.mockRestore()
|
||
|
process.exit.mockRestore()
|
||
|
})
|
||
|
|
||
|
test('show help prints to stdout and exits', () => {
|
||
|
jest.spyOn(process.stdout, 'write').mockImplementation(() => {})
|
||
|
jest.spyOn(process, 'exit').mockImplementationOnce(code => code)
|
||
|
|
||
|
const cmd = new Command()
|
||
|
cmd.showHelp()
|
||
|
|
||
|
expect(process.stdout.write).toHaveBeenCalled()
|
||
|
expect(process.exit).toHaveBeenCalled()
|
||
|
|
||
|
process.stdout.write.mockRestore()
|
||
|
process.exit.mockRestore()
|
||
|
})
|
||
|
})
|