import { promisify } from 'util' import { resolve } from 'path' import rp from 'request-promise-native' import { exec, spawn } from 'child_process' import { Utils } from '..' const execify = promisify(exec) const rootDir = resolve(__dirname, 'fixtures/basic') const port = 4011 const url = route => 'http://localhost:' + port + route const nuxtBin = resolve(__dirname, '..', 'bin', 'nuxt') describe('cli', () => { test('nuxt build', async () => { const { stdout } = await execify(`node ${nuxtBin} build ${rootDir}`) expect(stdout.includes('Compiled successfully')).toBe(true) }) test('nuxt build -> error config', async () => { await expect(execify(`node ${nuxtBin} build ${rootDir} -c config.js`)).rejects.toMatchObject({ stderr: expect.stringContaining('Could not load config file') }) }) test('nuxt start', async () => { let stdout = '' // let stderr = '' let error let exitCode const env = process.env env.PORT = port const nuxtStart = spawn('node', [nuxtBin, 'start', rootDir], { env: env }) nuxtStart.stdout.on('data', data => { stdout += data }) nuxtStart.stderr.on('data', data => { // stderr += data }) nuxtStart.on('error', err => { error = err }) nuxtStart.on('close', code => { exitCode = code }) // Give the process max 20s to start let iterator = 0 while (!stdout.includes('OPEN') && iterator < 80) { await Utils.waitFor(250) iterator++ } if (iterator === 80) { test.log('WARN: server failed to start successfully in 20 seconds') } expect(error).toBe(undefined) expect(stdout.includes('OPEN')).toBe(true) const html = await rp(url('/users/1')) expect(html.includes('

User: 1

')).toBe(true) nuxtStart.kill() // Wait max 10s for the process to be killed iterator = 0 // eslint-disable-next-line no-unmodified-loop-condition while (exitCode === undefined && iterator < 40) { await Utils.waitFor(250) iterator++ } if (iterator >= 40) { // eslint-disable-line no-console test.log( `WARN: we were unable to automatically kill the child process with pid: ${ nuxtStart.pid }` ) } expect(exitCode).toBe(null) }) test('nuxt generate', async () => { const { stdout } = await execify(`node ${nuxtBin} generate ${rootDir}`) expect(stdout.includes('vue-ssr-client-manifest.json')).toBe(true) }) })