mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-11 08:33:53 +00:00
Merge pull request #2412 from pimlie/test-no-serial-and-sinon
Test improvements, eg run tests in parallel and use sinon for console tests
This commit is contained in:
commit
ae754af362
2
.gitignore
vendored
2
.gitignore
vendored
@ -9,7 +9,7 @@ package-lock.json
|
|||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
|
|
||||||
# Other
|
# Other
|
||||||
.nuxt
|
.nuxt*
|
||||||
.cache
|
.cache
|
||||||
|
|
||||||
# Dist folder
|
# Dist folder
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "npm run lint && nyc ava --verbose --serial test/ -- && nyc report --reporter=html",
|
"test": "npm run lint && nyc ava --verbose test/ -- && nyc report --reporter=html",
|
||||||
"coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov",
|
"coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov",
|
||||||
"lint": "eslint --ext .js,.vue bin/* build/ lib/ test/ examples/",
|
"lint": "eslint --ext .js,.vue bin/* build/ lib/ test/ examples/",
|
||||||
"precommit": "npm run lint",
|
"precommit": "npm run lint",
|
||||||
|
@ -2,6 +2,7 @@ import test from 'ava'
|
|||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
import * as browser from './helpers/browser'
|
import * as browser from './helpers/browser'
|
||||||
|
import { interceptLog } from './helpers/console'
|
||||||
|
|
||||||
const port = 4003
|
const port = 4003
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
@ -10,36 +11,46 @@ let nuxt = null
|
|||||||
let page = null
|
let page = null
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4003
|
// Init nuxt.js and create server listening on localhost:4003
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const options = {
|
const options = {
|
||||||
rootDir: resolve(__dirname, 'fixtures/basic'),
|
rootDir: resolve(__dirname, 'fixtures/basic'),
|
||||||
dev: false,
|
buildDir: '.nuxt-csr',
|
||||||
|
dev: true,
|
||||||
head: {
|
head: {
|
||||||
titleTemplate(titleChunk) {
|
titleTemplate(titleChunk) {
|
||||||
return titleChunk ? `${titleChunk} - Nuxt.js` : 'Nuxt.js'
|
return titleChunk ? `${titleChunk} - Nuxt.js` : 'Nuxt.js'
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(options)
|
nuxt = new Nuxt(options)
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
|
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
t.true(logSpy.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test.before('Start browser', async t => {
|
test.serial('Start browser', async t => {
|
||||||
|
t.plan(0) // suppress 'no assertions' warning
|
||||||
await browser.start({
|
await browser.start({
|
||||||
// slowMo: 50,
|
// slowMo: 50,
|
||||||
// headless: false
|
// headless: false
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Open /', async t => {
|
test.serial('Open /', async t => {
|
||||||
page = await browser.page(url('/'))
|
page = await browser.page(url('/'))
|
||||||
|
|
||||||
t.is(await page.$text('h1'), 'Index page')
|
t.is(await page.$text('h1'), 'Index page')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/stateless', async t => {
|
test.serial('/stateless', async t => {
|
||||||
const { hook } = await page.nuxt.navigate('/stateless', false)
|
const { hook } = await page.nuxt.navigate('/stateless', false)
|
||||||
const loading = await page.nuxt.loadingData()
|
const loading = await page.nuxt.loadingData()
|
||||||
|
|
||||||
@ -48,27 +59,27 @@ test('/stateless', async t => {
|
|||||||
t.is(await page.$text('h1'), 'My component!')
|
t.is(await page.$text('h1'), 'My component!')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/css', async t => {
|
test.serial('/css', async t => {
|
||||||
await page.nuxt.navigate('/css')
|
await page.nuxt.navigate('/css')
|
||||||
|
|
||||||
t.is(await page.$text('.red'), 'This is red')
|
t.is(await page.$text('.red'), 'This is red')
|
||||||
t.is(await page.$eval('.red', (red) => window.getComputedStyle(red).color), 'rgb(255, 0, 0)')
|
t.is(await page.$eval('.red', (red) => window.getComputedStyle(red).color), 'rgb(255, 0, 0)')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/stateful', async t => {
|
test.serial('/stateful', async t => {
|
||||||
await page.nuxt.navigate('/stateful')
|
await page.nuxt.navigate('/stateful')
|
||||||
|
|
||||||
t.is(await page.$text('p'), 'The answer is 42')
|
t.is(await page.$text('p'), 'The answer is 42')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/store', async t => {
|
test.serial('/store', async t => {
|
||||||
await page.nuxt.navigate('/store')
|
await page.nuxt.navigate('/store')
|
||||||
|
|
||||||
t.is(await page.$text('h1'), 'Vuex Nested Modules')
|
t.is(await page.$text('h1'), 'Vuex Nested Modules')
|
||||||
t.is(await page.$text('p'), '1')
|
t.is(await page.$text('p'), '1')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/head', async t => {
|
test.serial('/head', async t => {
|
||||||
const msg = new Promise((resolve) => page.on('console', (msg) => resolve(msg.text)))
|
const msg = new Promise((resolve) => page.on('console', (msg) => resolve(msg.text)))
|
||||||
await page.nuxt.navigate('/head')
|
await page.nuxt.navigate('/head')
|
||||||
const metas = await page.$$attr('meta', 'content')
|
const metas = await page.$$attr('meta', 'content')
|
||||||
@ -79,31 +90,31 @@ test('/head', async t => {
|
|||||||
t.is(metas[0], 'my meta')
|
t.is(metas[0], 'my meta')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/async-data', async t => {
|
test.serial('/async-data', async t => {
|
||||||
await page.nuxt.navigate('/async-data')
|
await page.nuxt.navigate('/async-data')
|
||||||
|
|
||||||
t.is(await page.$text('p'), 'Nuxt.js')
|
t.is(await page.$text('p'), 'Nuxt.js')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/await-async-data', async t => {
|
test.serial('/await-async-data', async t => {
|
||||||
await page.nuxt.navigate('/await-async-data')
|
await page.nuxt.navigate('/await-async-data')
|
||||||
|
|
||||||
t.is(await page.$text('p'), 'Await Nuxt.js')
|
t.is(await page.$text('p'), 'Await Nuxt.js')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/callback-async-data', async t => {
|
test.serial('/callback-async-data', async t => {
|
||||||
await page.nuxt.navigate('/callback-async-data')
|
await page.nuxt.navigate('/callback-async-data')
|
||||||
|
|
||||||
t.is(await page.$text('p'), 'Callback Nuxt.js')
|
t.is(await page.$text('p'), 'Callback Nuxt.js')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/users/1', async t => {
|
test.serial('/users/1', async t => {
|
||||||
await page.nuxt.navigate('/users/1')
|
await page.nuxt.navigate('/users/1')
|
||||||
|
|
||||||
t.is(await page.$text('h1'), 'User: 1')
|
t.is(await page.$text('h1'), 'User: 1')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/validate should display a 404', async t => {
|
test.serial('/validate should display a 404', async t => {
|
||||||
await page.nuxt.navigate('/validate')
|
await page.nuxt.navigate('/validate')
|
||||||
const error = await page.nuxt.errorData()
|
const error = await page.nuxt.errorData()
|
||||||
|
|
||||||
@ -111,39 +122,39 @@ test('/validate should display a 404', async t => {
|
|||||||
t.is(error.message, 'This page could not be found')
|
t.is(error.message, 'This page could not be found')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/validate?valid=true', async t => {
|
test.serial('/validate?valid=true', async t => {
|
||||||
await page.nuxt.navigate('/validate?valid=true')
|
await page.nuxt.navigate('/validate?valid=true')
|
||||||
|
|
||||||
t.is(await page.$text('h1'), 'I am valid')
|
t.is(await page.$text('h1'), 'I am valid')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/redirect', async t => {
|
test.serial('/redirect', async t => {
|
||||||
await page.nuxt.navigate('/redirect')
|
await page.nuxt.navigate('/redirect')
|
||||||
|
|
||||||
t.is(await page.$text('h1'), 'Index page')
|
t.is(await page.$text('h1'), 'Index page')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/error', async t => {
|
test.serial('/error', async t => {
|
||||||
await page.nuxt.navigate('/error')
|
await page.nuxt.navigate('/error')
|
||||||
|
|
||||||
t.deepEqual(await page.nuxt.errorData(), { statusCode: 500 })
|
t.deepEqual(await page.nuxt.errorData(), { statusCode: 500 })
|
||||||
t.is(await page.$text('.title'), 'Error mouahahah')
|
t.is(await page.$text('.title'), 'Error mouahahah')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/error2', async t => {
|
test.serial('/error2', async t => {
|
||||||
await page.nuxt.navigate('/error2')
|
await page.nuxt.navigate('/error2')
|
||||||
|
|
||||||
t.is(await page.$text('.title'), 'Custom error')
|
t.is(await page.$text('.title'), 'Custom error')
|
||||||
t.deepEqual(await page.nuxt.errorData(), { message: 'Custom error' })
|
t.deepEqual(await page.nuxt.errorData(), { message: 'Custom error' })
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/redirect2', async t => {
|
test.serial('/redirect2', async t => {
|
||||||
await page.nuxt.navigate('/redirect2')
|
await page.nuxt.navigate('/redirect2')
|
||||||
|
|
||||||
t.is(await page.$text('h1'), 'Index page')
|
t.is(await page.$text('h1'), 'Index page')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/redirect3', async t => {
|
test.serial('/redirect3', async t => {
|
||||||
// New page for redirecting to external link.
|
// New page for redirecting to external link.
|
||||||
const page = await browser.page(url('/'))
|
const page = await browser.page(url('/'))
|
||||||
await page.nuxt.navigate('/redirect3', false)
|
await page.nuxt.navigate('/redirect3', false)
|
||||||
@ -152,44 +163,44 @@ test('/redirect3', async t => {
|
|||||||
t.pass()
|
t.pass()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/no-ssr', async t => {
|
test.serial('/no-ssr', async t => {
|
||||||
await page.nuxt.navigate('/no-ssr')
|
await page.nuxt.navigate('/no-ssr')
|
||||||
|
|
||||||
t.is(await page.$text('h1'), 'Displayed only on client-side')
|
t.is(await page.$text('h1'), 'Displayed only on client-side')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/meta', async t => {
|
test.serial('/meta', async t => {
|
||||||
await page.nuxt.navigate('/meta')
|
await page.nuxt.navigate('/meta')
|
||||||
|
|
||||||
const state = await page.nuxt.storeState()
|
const state = await page.nuxt.storeState()
|
||||||
t.deepEqual(state.meta, [{ works: true }])
|
t.deepEqual(state.meta, [{ works: true }])
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/fn-midd', async t => {
|
test.serial('/fn-midd', async t => {
|
||||||
await page.nuxt.navigate('/fn-midd')
|
await page.nuxt.navigate('/fn-midd')
|
||||||
|
|
||||||
t.is(await page.$text('.title'), 'You need to ask the permission')
|
t.is(await page.$text('.title'), 'You need to ask the permission')
|
||||||
t.deepEqual(await page.nuxt.errorData(), { message: 'You need to ask the permission', statusCode: 403 })
|
t.deepEqual(await page.nuxt.errorData(), { message: 'You need to ask the permission', statusCode: 403 })
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/fn-midd?please=true', async t => {
|
test.serial('/fn-midd?please=true', async t => {
|
||||||
await page.nuxt.navigate('/fn-midd?please=true')
|
await page.nuxt.navigate('/fn-midd?please=true')
|
||||||
|
|
||||||
const h1 = await page.$text('h1')
|
const h1 = await page.$text('h1')
|
||||||
t.true(h1.includes('Date:'))
|
t.true(h1.includes('Date:'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/router-guard', async t => {
|
test.serial('/router-guard', async t => {
|
||||||
await page.nuxt.navigate('/router-guard')
|
await page.nuxt.navigate('/router-guard')
|
||||||
|
|
||||||
t.is(await page.$text('p'), 'Nuxt.js')
|
t.is(await page.$text('p'), 'Nuxt.js')
|
||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
|
||||||
test.after('Stop browser', async t => {
|
test.after.always('Stop browser', async t => {
|
||||||
await browser.stop()
|
await browser.stop()
|
||||||
})
|
})
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import test from 'ava'
|
import test from 'ava'
|
||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import { interceptLog, release } from './helpers/console'
|
import { intercept, release } from './helpers/console'
|
||||||
import { Nuxt, Builder, Utils } from '..'
|
import { Nuxt, Builder, Utils } from '..'
|
||||||
import { truncateSync, readFileSync, writeFileSync } from 'fs'
|
import { truncateSync, readFileSync, writeFileSync } from 'fs'
|
||||||
|
|
||||||
@ -13,32 +13,39 @@ const pluginContent = readFileSync(pluginPath)
|
|||||||
let nuxt = null
|
let nuxt = null
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const options = {
|
const options = {
|
||||||
rootDir,
|
rootDir,
|
||||||
|
buildDir: '.nuxt-dev',
|
||||||
dev: true,
|
dev: true,
|
||||||
build: {
|
build: {
|
||||||
|
stats: false,
|
||||||
profile: true
|
profile: true
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
'~/plugins/watch.js'
|
'~/plugins/watch.js'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const spies = await intercept({ log: true, stderr: true }, async () => {
|
||||||
nuxt = new Nuxt(options)
|
nuxt = new Nuxt(options)
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
|
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(spies.log.calledWithMatch('DONE'))
|
||||||
|
t.true(spies.log.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('remove mixins in live reloading', async t => {
|
test.serial('remove mixins in live reloading', async t => {
|
||||||
const logSpy = await interceptLog()
|
const spies = await intercept({ log: true, error: true, stderr: true })
|
||||||
await nuxt.renderRoute(url('/'))
|
await nuxt.renderRoute(url('/'))
|
||||||
t.true(logSpy.calledWith('I am mixin'))
|
t.true(spies.log.calledWith('I am mixin'))
|
||||||
|
|
||||||
truncateSync(pluginPath)
|
truncateSync(pluginPath)
|
||||||
await new Promise(async (resolve, reject) => {
|
await new Promise(async (resolve, reject) => {
|
||||||
let waitTimes = 0
|
let waitTimes = 0
|
||||||
while (logSpy.neverCalledWithMatch(/Compiled successfully/)) {
|
while (spies.log.neverCalledWithMatch(/Compiled successfully/)) {
|
||||||
if (waitTimes++ >= 20) {
|
if (waitTimes++ >= 20) {
|
||||||
t.fail('Dev server doesn\'t reload after 2000ms')
|
t.fail('Dev server doesn\'t reload after 2000ms')
|
||||||
reject(Error())
|
reject(Error())
|
||||||
@ -47,16 +54,21 @@ test('remove mixins in live reloading', async t => {
|
|||||||
}
|
}
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
logSpy.reset()
|
spies.log.reset()
|
||||||
|
|
||||||
await nuxt.renderRoute(url('/'))
|
await nuxt.renderRoute(url('/'))
|
||||||
t.true(logSpy.neverCalledWith('I am mixin'))
|
t.true(spies.log.neverCalledWith('I am mixin'))
|
||||||
|
t.is(spies.error.getCall(0).args[0].statusCode, 404)
|
||||||
release()
|
release()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/stateless', async t => {
|
test.serial('/stateless', async t => {
|
||||||
|
const spies = await intercept()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/stateless'))
|
const window = await nuxt.renderAndGetWindow(url('/stateless'))
|
||||||
const html = window.document.body.innerHTML
|
const html = window.document.body.innerHTML
|
||||||
t.true(html.includes('<h1>My component!</h1>'))
|
t.true(html.includes('<h1>My component!</h1>'))
|
||||||
|
t.true(spies.info.calledWithMatch('You are running Vue in development mode.'))
|
||||||
|
release()
|
||||||
})
|
})
|
||||||
|
|
||||||
// test('/_nuxt/test.hot-update.json should returns empty html', async t => {
|
// test('/_nuxt/test.hot-update.json should returns empty html', async t => {
|
||||||
@ -69,7 +81,7 @@ test('/stateless', async t => {
|
|||||||
// })
|
// })
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', async t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
writeFileSync(pluginPath, pluginContent)
|
writeFileSync(pluginPath, pluginContent)
|
||||||
await nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -1,22 +1,32 @@
|
|||||||
import test from 'ava'
|
import test from 'ava'
|
||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import { Nuxt, Builder, Generator } from '..'
|
import { Nuxt, Builder, Generator } from '..'
|
||||||
|
import { intercept } from './helpers/console'
|
||||||
|
|
||||||
test('Fail with routes() which throw an error', async t => {
|
test('Fail with routes() which throw an error', async t => {
|
||||||
const options = {
|
const options = {
|
||||||
rootDir: resolve(__dirname, 'fixtures/basic'),
|
rootDir: resolve(__dirname, 'fixtures/basic'),
|
||||||
|
buildDir: '.nuxt-fail',
|
||||||
dev: false,
|
dev: false,
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
|
},
|
||||||
generate: {
|
generate: {
|
||||||
async routes() {
|
async routes() {
|
||||||
throw new Error('Not today!')
|
throw new Error('Not today!')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const spies = await intercept(async () => {
|
||||||
const nuxt = new Nuxt(options)
|
const nuxt = new Nuxt(options)
|
||||||
const builder = new Builder(nuxt)
|
const builder = new Builder(nuxt)
|
||||||
const generator = new Generator(nuxt, builder)
|
const generator = new Generator(nuxt, builder)
|
||||||
|
|
||||||
return generator.generate()
|
return generator.generate()
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
t.true(e.message === 'Not today!')
|
t.true(e.message === 'Not today!')
|
||||||
})
|
})
|
||||||
|
})
|
||||||
|
t.true(spies.log.calledWithMatch('DONE'))
|
||||||
|
t.true(spies.error.withArgs('Could not resolve routes').calledOnce)
|
||||||
})
|
})
|
||||||
|
@ -1,138 +0,0 @@
|
|||||||
import test from 'ava'
|
|
||||||
import { resolve } from 'path'
|
|
||||||
import { existsSync } from 'fs'
|
|
||||||
import http from 'http'
|
|
||||||
import serveStatic from 'serve-static'
|
|
||||||
import finalhandler from 'finalhandler'
|
|
||||||
import rp from 'request-promise-native'
|
|
||||||
import { Nuxt, Builder, Generator } from '..'
|
|
||||||
|
|
||||||
const port = 4002
|
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
|
||||||
|
|
||||||
let nuxt = null
|
|
||||||
let server = null
|
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
|
||||||
test.before('Init Nuxt.js', async t => {
|
|
||||||
const rootDir = resolve(__dirname, 'fixtures/basic')
|
|
||||||
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
|
||||||
config.rootDir = rootDir
|
|
||||||
config.dev = false
|
|
||||||
config.generate.subFolders = false
|
|
||||||
|
|
||||||
nuxt = new Nuxt(config)
|
|
||||||
const builder = new Builder(nuxt)
|
|
||||||
const generator = new Generator(nuxt, builder)
|
|
||||||
try {
|
|
||||||
await generator.generate() // throw an error (of /validate route)
|
|
||||||
} catch (err) {
|
|
||||||
}
|
|
||||||
|
|
||||||
const serve = serveStatic(resolve(__dirname, 'fixtures/basic/dist'), { extensions: ['html'] })
|
|
||||||
server = http.createServer((req, res) => {
|
|
||||||
serve(req, res, finalhandler(req, res))
|
|
||||||
})
|
|
||||||
server.listen(port)
|
|
||||||
})
|
|
||||||
|
|
||||||
test('Check ready hook called', async t => {
|
|
||||||
t.true(nuxt.__hook_called__)
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/stateless', async t => {
|
|
||||||
const window = await nuxt.renderAndGetWindow(url('/stateless'))
|
|
||||||
const html = window.document.body.innerHTML
|
|
||||||
t.true(html.includes('<h1>My component!</h1>'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/css', async t => {
|
|
||||||
const window = await nuxt.renderAndGetWindow(url('/css'))
|
|
||||||
const element = window.document.querySelector('.red')
|
|
||||||
t.not(element, null)
|
|
||||||
t.is(element.textContent, 'This is red')
|
|
||||||
t.is(element.className, 'red')
|
|
||||||
t.is(window.getComputedStyle(element).color, 'red')
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/stateful', async t => {
|
|
||||||
const window = await nuxt.renderAndGetWindow(url('/stateful'))
|
|
||||||
const html = window.document.body.innerHTML
|
|
||||||
t.true(html.includes('<div><p>The answer is 42</p></div>'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/head', async t => {
|
|
||||||
const window = await nuxt.renderAndGetWindow(url('/head'))
|
|
||||||
const html = window.document.body.innerHTML
|
|
||||||
const metas = window.document.getElementsByTagName('meta')
|
|
||||||
t.is(window.document.title, 'My title')
|
|
||||||
t.is(metas[0].getAttribute('content'), 'my meta')
|
|
||||||
t.true(html.includes('<div><h1>I can haz meta tags</h1></div>'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/async-data', async t => {
|
|
||||||
const window = await nuxt.renderAndGetWindow(url('/async-data'))
|
|
||||||
const html = window.document.body.innerHTML
|
|
||||||
t.true(html.includes('<p>Nuxt.js</p>'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/users/1', async t => {
|
|
||||||
const html = await rp(url('/users/1'))
|
|
||||||
t.true(html.includes('<h1>User: 1</h1>'))
|
|
||||||
t.true(existsSync(resolve(__dirname, 'fixtures/basic/dist', 'users/1.html')))
|
|
||||||
t.false(existsSync(resolve(__dirname, 'fixtures/basic/dist', 'users/1/index.html')))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/users/2', async t => {
|
|
||||||
const html = await rp(url('/users/2'))
|
|
||||||
t.true(html.includes('<h1>User: 2</h1>'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/users/3 (payload given)', async t => {
|
|
||||||
const html = await rp(url('/users/3'))
|
|
||||||
t.true(html.includes('<h1>User: 3000</h1>'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/users/4 -> Not found', async t => {
|
|
||||||
try {
|
|
||||||
await rp(url('/users/4'))
|
|
||||||
} catch (error) {
|
|
||||||
t.true(error.statusCode === 404)
|
|
||||||
t.true(error.response.body.includes('Cannot GET /users/4'))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/validate should not be server-rendered', async t => {
|
|
||||||
const html = await rp(url('/validate'))
|
|
||||||
t.true(html.includes('<div id="__nuxt"></div>'))
|
|
||||||
t.true(html.includes('serverRendered:!1'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/validate -> should display a 404', async t => {
|
|
||||||
const window = await nuxt.renderAndGetWindow(url('/validate'))
|
|
||||||
const html = window.document.body.innerHTML
|
|
||||||
t.true(html.includes('This page could not be found'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/validate?valid=true', async t => {
|
|
||||||
const window = await nuxt.renderAndGetWindow(url('/validate?valid=true'))
|
|
||||||
const html = window.document.body.innerHTML
|
|
||||||
t.true(html.includes('I am valid</h1>'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/redirect should not be server-rendered', async t => {
|
|
||||||
const html = await rp(url('/redirect'))
|
|
||||||
t.true(html.includes('<div id="__nuxt"></div>'))
|
|
||||||
t.true(html.includes('serverRendered:!1'))
|
|
||||||
})
|
|
||||||
|
|
||||||
test('/redirect -> check redirected source', async t => {
|
|
||||||
const window = await nuxt.renderAndGetWindow(url('/redirect'))
|
|
||||||
const html = window.document.body.innerHTML
|
|
||||||
t.true(html.includes('<h1>Index page</h1>'))
|
|
||||||
})
|
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
|
||||||
test.after('Closing server', t => {
|
|
||||||
server.close()
|
|
||||||
})
|
|
@ -1,31 +1,39 @@
|
|||||||
import test from 'ava'
|
import test from 'ava'
|
||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import { existsSync } from 'fs'
|
import { existsSync } from 'fs'
|
||||||
|
import { remove } from 'fs-extra'
|
||||||
import http from 'http'
|
import http from 'http'
|
||||||
import serveStatic from 'serve-static'
|
import serveStatic from 'serve-static'
|
||||||
import finalhandler from 'finalhandler'
|
import finalhandler from 'finalhandler'
|
||||||
import rp from 'request-promise-native'
|
import rp from 'request-promise-native'
|
||||||
|
import { interceptLog, release } from './helpers/console'
|
||||||
import { Nuxt, Builder, Generator } from '..'
|
import { Nuxt, Builder, Generator } from '..'
|
||||||
|
|
||||||
const port = 4002
|
const port = 4002
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
|
const rootDir = resolve(__dirname, 'fixtures/basic')
|
||||||
|
|
||||||
let nuxt = null
|
let nuxt = null
|
||||||
let server = null
|
let server = null
|
||||||
|
let generator = null
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const rootDir = resolve(__dirname, 'fixtures/basic')
|
|
||||||
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
||||||
config.rootDir = rootDir
|
config.rootDir = rootDir
|
||||||
|
config.buildDir = '.nuxt-generate'
|
||||||
config.dev = false
|
config.dev = false
|
||||||
|
config.build.stats = false
|
||||||
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(config)
|
nuxt = new Nuxt(config)
|
||||||
const builder = new Builder(nuxt)
|
const builder = new Builder(nuxt)
|
||||||
const generator = new Generator(nuxt, builder)
|
generator = new Generator(nuxt, builder)
|
||||||
try {
|
|
||||||
await generator.generate() // throw an error (of /validate route)
|
await generator.generate()
|
||||||
} catch (err) {
|
})
|
||||||
}
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
|
||||||
const serve = serveStatic(resolve(__dirname, 'fixtures/basic/dist'))
|
const serve = serveStatic(resolve(__dirname, 'fixtures/basic/dist'))
|
||||||
server = http.createServer((req, res) => {
|
server = http.createServer((req, res) => {
|
||||||
serve(req, res, finalhandler(req, res))
|
serve(req, res, finalhandler(req, res))
|
||||||
@ -33,17 +41,17 @@ test.before('Init Nuxt.js', async t => {
|
|||||||
server.listen(port)
|
server.listen(port)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Check ready hook called', async t => {
|
test.serial('Check ready hook called', async t => {
|
||||||
t.true(nuxt.__hook_called__)
|
t.true(nuxt.__hook_called__)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/stateless', async t => {
|
test.serial('/stateless', async t => {
|
||||||
const window = await nuxt.renderAndGetWindow(url('/stateless'))
|
const window = await nuxt.renderAndGetWindow(url('/stateless'))
|
||||||
const html = window.document.body.innerHTML
|
const html = window.document.body.innerHTML
|
||||||
t.true(html.includes('<h1>My component!</h1>'))
|
t.true(html.includes('<h1>My component!</h1>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/css', async t => {
|
test.serial('/css', async t => {
|
||||||
const window = await nuxt.renderAndGetWindow(url('/css'))
|
const window = await nuxt.renderAndGetWindow(url('/css'))
|
||||||
const element = window.document.querySelector('.red')
|
const element = window.document.querySelector('.red')
|
||||||
t.not(element, null)
|
t.not(element, null)
|
||||||
@ -52,84 +60,106 @@ test('/css', async t => {
|
|||||||
t.is(window.getComputedStyle(element).color, 'red')
|
t.is(window.getComputedStyle(element).color, 'red')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/stateful', async t => {
|
test.serial('/stateful', async t => {
|
||||||
const window = await nuxt.renderAndGetWindow(url('/stateful'))
|
const window = await nuxt.renderAndGetWindow(url('/stateful'))
|
||||||
const html = window.document.body.innerHTML
|
const html = window.document.body.innerHTML
|
||||||
t.true(html.includes('<div><p>The answer is 42</p></div>'))
|
t.true(html.includes('<div><p>The answer is 42</p></div>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/head', async t => {
|
test.serial('/head', async t => {
|
||||||
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/head'))
|
const window = await nuxt.renderAndGetWindow(url('/head'))
|
||||||
const html = window.document.body.innerHTML
|
const html = window.document.body.innerHTML
|
||||||
const metas = window.document.getElementsByTagName('meta')
|
const metas = window.document.getElementsByTagName('meta')
|
||||||
t.is(window.document.title, 'My title')
|
t.is(window.document.title, 'My title')
|
||||||
t.is(metas[0].getAttribute('content'), 'my meta')
|
t.is(metas[0].getAttribute('content'), 'my meta')
|
||||||
t.true(html.includes('<div><h1>I can haz meta tags</h1></div>'))
|
t.true(html.includes('<div><h1>I can haz meta tags</h1></div>'))
|
||||||
|
release()
|
||||||
|
t.is(logSpy.getCall(0).args[0], 'Body script!')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/async-data', async t => {
|
test.serial('/async-data', async t => {
|
||||||
const window = await nuxt.renderAndGetWindow(url('/async-data'))
|
const window = await nuxt.renderAndGetWindow(url('/async-data'))
|
||||||
const html = window.document.body.innerHTML
|
const html = window.document.body.innerHTML
|
||||||
t.true(html.includes('<p>Nuxt.js</p>'))
|
t.true(html.includes('<p>Nuxt.js</p>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/users/1', async t => {
|
test.serial('/users/1/index.html', async t => {
|
||||||
const html = await rp(url('/users/1'))
|
const html = await rp(url('/users/1/index.html'))
|
||||||
t.true(html.includes('<h1>User: 1</h1>'))
|
t.true(html.includes('<h1>User: 1</h1>'))
|
||||||
t.true(existsSync(resolve(__dirname, 'fixtures/basic/dist', 'users/1/index.html')))
|
t.true(existsSync(resolve(__dirname, 'fixtures/basic/dist', 'users/1/index.html')))
|
||||||
t.false(existsSync(resolve(__dirname, 'fixtures/basic/dist', 'users/1.html')))
|
t.false(existsSync(resolve(__dirname, 'fixtures/basic/dist', 'users/1.html')))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/users/2', async t => {
|
test.serial('/users/2', async t => {
|
||||||
const html = await rp(url('/users/2'))
|
const html = await rp(url('/users/2'))
|
||||||
t.true(html.includes('<h1>User: 2</h1>'))
|
t.true(html.includes('<h1>User: 2</h1>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/users/3 (payload given)', async t => {
|
test.serial('/users/3 (payload given)', async t => {
|
||||||
const html = await rp(url('/users/3'))
|
const html = await rp(url('/users/3'))
|
||||||
t.true(html.includes('<h1>User: 3000</h1>'))
|
t.true(html.includes('<h1>User: 3000</h1>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/users/4 -> Not found', async t => {
|
test.serial('/users/4 -> Not found', async t => {
|
||||||
try {
|
const error = await t.throws(rp(url('/users/4')))
|
||||||
await rp(url('/users/4'))
|
|
||||||
} catch (error) {
|
|
||||||
t.true(error.statusCode === 404)
|
t.true(error.statusCode === 404)
|
||||||
t.true(error.response.body.includes('Cannot GET /users/4'))
|
t.true(error.response.body.includes('Cannot GET /users/4'))
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/validate should not be server-rendered', async t => {
|
test.serial('/validate should not be server-rendered', async t => {
|
||||||
const html = await rp(url('/validate'))
|
const html = await rp(url('/validate'))
|
||||||
t.true(html.includes('<div id="__nuxt"></div>'))
|
t.true(html.includes('<div id="__nuxt"></div>'))
|
||||||
t.true(html.includes('serverRendered:!1'))
|
t.true(html.includes('serverRendered:!1'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/validate -> should display a 404', async t => {
|
test.serial('/validate -> should display a 404', async t => {
|
||||||
const window = await nuxt.renderAndGetWindow(url('/validate'))
|
const window = await nuxt.renderAndGetWindow(url('/validate'))
|
||||||
const html = window.document.body.innerHTML
|
const html = window.document.body.innerHTML
|
||||||
t.true(html.includes('This page could not be found'))
|
t.true(html.includes('This page could not be found'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/validate?valid=true', async t => {
|
test.serial('/validate?valid=true', async t => {
|
||||||
const window = await nuxt.renderAndGetWindow(url('/validate?valid=true'))
|
const window = await nuxt.renderAndGetWindow(url('/validate?valid=true'))
|
||||||
const html = window.document.body.innerHTML
|
const html = window.document.body.innerHTML
|
||||||
t.true(html.includes('I am valid</h1>'))
|
t.true(html.includes('I am valid</h1>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/redirect should not be server-rendered', async t => {
|
test.serial('/redirect should not be server-rendered', async t => {
|
||||||
const html = await rp(url('/redirect'))
|
const html = await rp(url('/redirect'))
|
||||||
t.true(html.includes('<div id="__nuxt"></div>'))
|
t.true(html.includes('<div id="__nuxt"></div>'))
|
||||||
t.true(html.includes('serverRendered:!1'))
|
t.true(html.includes('serverRendered:!1'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/redirect -> check redirected source', async t => {
|
test.serial('/redirect -> check redirected source', async t => {
|
||||||
const window = await nuxt.renderAndGetWindow(url('/redirect'))
|
const window = await nuxt.renderAndGetWindow(url('/redirect'))
|
||||||
const html = window.document.body.innerHTML
|
const html = window.document.body.innerHTML
|
||||||
t.true(html.includes('<h1>Index page</h1>'))
|
t.true(html.includes('<h1>Index page</h1>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
test.serial('/users/1 not found', async t => {
|
||||||
test.after('Closing server', t => {
|
await remove(resolve(rootDir, 'dist/users'))
|
||||||
server.close()
|
const error = await t.throws(rp(url('/users/1')))
|
||||||
|
t.true(error.statusCode === 404)
|
||||||
|
t.true(error.response.body.includes('Cannot GET /users/1'))
|
||||||
|
})
|
||||||
|
|
||||||
|
test.serial('nuxt re-generating with no subfolders', async t => {
|
||||||
|
const logSpy = await interceptLog()
|
||||||
|
nuxt.options.generate.subFolders = false
|
||||||
|
await generator.generate()
|
||||||
|
release()
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
})
|
||||||
|
|
||||||
|
test.serial('/users/1.html', async t => {
|
||||||
|
const html = await rp(url('/users/1.html'))
|
||||||
|
t.true(html.includes('<h1>User: 1</h1>'))
|
||||||
|
t.true(existsSync(resolve(__dirname, 'fixtures/basic/dist', 'users/1.html')))
|
||||||
|
t.false(existsSync(resolve(__dirname, 'fixtures/basic/dist', 'users/1/index.html')))
|
||||||
|
})
|
||||||
|
|
||||||
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
|
test.after.always('Closing server', async t => {
|
||||||
|
await server.close()
|
||||||
})
|
})
|
||||||
|
@ -2,30 +2,38 @@ import test from 'ava'
|
|||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import rp from 'request-promise-native'
|
import rp from 'request-promise-native'
|
||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
import { interceptLog, interceptError } from './helpers/console'
|
import { interceptLog, interceptError, release } from './helpers/console'
|
||||||
|
|
||||||
const port = 4003
|
const port = 4004
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
|
|
||||||
let nuxt = null
|
let nuxt = null
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4003
|
// Init nuxt.js and create server listening on localhost:4003
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const options = {
|
const options = {
|
||||||
rootDir: resolve(__dirname, 'fixtures/basic'),
|
rootDir: resolve(__dirname, 'fixtures/basic'),
|
||||||
|
buildDir: '.nuxt-ssr',
|
||||||
dev: false,
|
dev: false,
|
||||||
head: {
|
head: {
|
||||||
titleTemplate(titleChunk) {
|
titleTemplate(titleChunk) {
|
||||||
return titleChunk ? `${titleChunk} - Nuxt.js` : 'Nuxt.js'
|
return titleChunk ? `${titleChunk} - Nuxt.js` : 'Nuxt.js'
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await interceptLog('building nuxt', async () => {
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(options)
|
nuxt = new Nuxt(options)
|
||||||
await new Builder(nuxt).build()
|
const builder = await new Builder(nuxt)
|
||||||
await nuxt.listen(port, 'localhost')
|
await builder.build()
|
||||||
|
await nuxt.listen(port, '0.0.0.0')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
t.true(logSpy.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/stateless', async t => {
|
test('/stateless', async t => {
|
||||||
@ -62,8 +70,8 @@ test('/store', async t => {
|
|||||||
t.true(html.includes('<p>1</p>'))
|
t.true(html.includes('<p>1</p>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/head', async t => {
|
test.serial('/head', async t => {
|
||||||
const logSpy = await interceptLog(async () => {
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/head'), { virtualConsole: false })
|
const window = await nuxt.renderAndGetWindow(url('/head'), { virtualConsole: false })
|
||||||
t.is(window.document.title, 'My title - Nuxt.js')
|
t.is(window.document.title, 'My title - Nuxt.js')
|
||||||
|
|
||||||
@ -73,7 +81,8 @@ test('/head', async t => {
|
|||||||
|
|
||||||
const metas = window.document.getElementsByTagName('meta')
|
const metas = window.document.getElementsByTagName('meta')
|
||||||
t.is(metas[0].getAttribute('content'), 'my meta')
|
t.is(metas[0].getAttribute('content'), 'my meta')
|
||||||
})
|
release()
|
||||||
|
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
t.is(logSpy.args[0][0], 'Body script!')
|
t.is(logSpy.args[0][0], 'Body script!')
|
||||||
})
|
})
|
||||||
@ -145,12 +154,12 @@ test('/error', async t => {
|
|||||||
t.true(err.message.includes('Error mouahahah'))
|
t.true(err.message.includes('Error mouahahah'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/error status code', async t => {
|
test.serial('/error status code', async t => {
|
||||||
const errorSpy = await interceptError(async () => {
|
const errorSpy = await interceptError()
|
||||||
const err = await t.throws(rp(url('/error')))
|
const err = await t.throws(rp(url('/error')))
|
||||||
t.true(err.statusCode === 500)
|
t.true(err.statusCode === 500)
|
||||||
t.true(err.response.body.includes('An error occurred in the application and your page could not be served'))
|
t.true(err.response.body.includes('An error occurred in the application and your page could not be served'))
|
||||||
})
|
release()
|
||||||
t.true(errorSpy.calledOnce)
|
t.true(errorSpy.calledOnce)
|
||||||
t.true(errorSpy.args[0][0].message.includes('Error mouahahah'))
|
t.true(errorSpy.args[0][0].message.includes('Error mouahahah'))
|
||||||
})
|
})
|
||||||
@ -163,29 +172,25 @@ test('/error2', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
test('/error2 status code', async t => {
|
test('/error2 status code', async t => {
|
||||||
try {
|
const error = await t.throws(rp(url('/error2')))
|
||||||
await rp(url('/error2'))
|
t.is(error.statusCode, 500)
|
||||||
} catch (err) {
|
t.true(error.response.body.includes('Custom error'))
|
||||||
t.is(err.statusCode, 500)
|
|
||||||
t.true(err.response.body.includes('Custom error'))
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/error-midd', async t => {
|
test.serial('/error-midd', async t => {
|
||||||
const errorSpy = await interceptError(async () => {
|
const errorSpy = await interceptError()
|
||||||
const err = await t.throws(rp(url('/error-midd')))
|
const err = await t.throws(rp(url('/error-midd')))
|
||||||
|
|
||||||
t.is(err.statusCode, 505)
|
t.is(err.statusCode, 505)
|
||||||
t.true(err.response.body.includes('Middleware Error'))
|
t.true(err.response.body.includes('Middleware Error'))
|
||||||
})
|
release()
|
||||||
// Don't display error since redirect returns a noopApp
|
// Don't display error since redirect returns a noopApp
|
||||||
t.true(errorSpy.notCalled)
|
t.true(errorSpy.notCalled)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/redirect2', async t => {
|
test.serial('/redirect2', async t => {
|
||||||
const errorSpy = await interceptError(async () => {
|
const errorSpy = await interceptError()
|
||||||
await rp(url('/redirect2')) // Should not console.error
|
await rp(url('/redirect2')) // Should not console.error
|
||||||
})
|
release()
|
||||||
// Don't display error since redirect returns a noopApp
|
// Don't display error since redirect returns a noopApp
|
||||||
t.true(errorSpy.notCalled)
|
t.true(errorSpy.notCalled)
|
||||||
})
|
})
|
||||||
@ -202,16 +207,12 @@ test('/no-ssr (client-side)', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
test('ETag Header', async t => {
|
test('ETag Header', async t => {
|
||||||
const errorSpy = await interceptError(async () => {
|
|
||||||
const { headers: { etag } } = await rp(url('/stateless'), { resolveWithFullResponse: true })
|
const { headers: { etag } } = await rp(url('/stateless'), { resolveWithFullResponse: true })
|
||||||
// Validate etag
|
// Validate etag
|
||||||
t.regex(etag, /W\/".*"$/)
|
t.regex(etag, /W\/".*"$/)
|
||||||
// Verify functionality
|
// Verify functionality
|
||||||
const error = await t.throws(rp(url('/stateless'), { headers: { 'If-None-Match': etag } }))
|
const error = await t.throws(rp(url('/stateless'), { headers: { 'If-None-Match': etag } }))
|
||||||
t.is(error.statusCode, 304)
|
t.is(error.statusCode, 304)
|
||||||
})
|
|
||||||
t.true(errorSpy.calledOnce)
|
|
||||||
t.true(errorSpy.args[0][0].includes('TypeError: Cannot read property \'split\' of undefined'))
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/_nuxt/server-bundle.json should return 404', async t => {
|
test('/_nuxt/server-bundle.json should return 404', async t => {
|
||||||
@ -226,7 +227,6 @@ test('/_nuxt/ should return 404', async t => {
|
|||||||
|
|
||||||
test('/meta', async t => {
|
test('/meta', async t => {
|
||||||
const { html } = await nuxt.renderRoute('/meta')
|
const { html } = await nuxt.renderRoute('/meta')
|
||||||
|
|
||||||
t.true(html.includes('"meta":[{"works":true}]'))
|
t.true(html.includes('"meta":[{"works":true}]'))
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -258,6 +258,6 @@ test('/js-link', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', async t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
await nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -2,34 +2,45 @@ import test from 'ava'
|
|||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import { Nuxt, Builder, Utils } from '..'
|
import { Nuxt, Builder, Utils } from '..'
|
||||||
import * as browser from './helpers/browser'
|
import * as browser from './helpers/browser'
|
||||||
|
import { interceptLog } from './helpers/console'
|
||||||
|
|
||||||
const port = 4005
|
const port = 4014
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
|
|
||||||
let nuxt = null
|
let nuxt = null
|
||||||
|
let page
|
||||||
|
const dates = {}
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const options = {
|
const options = {
|
||||||
rootDir: resolve(__dirname, 'fixtures/children'),
|
rootDir: resolve(__dirname, 'fixtures/children'),
|
||||||
dev: false
|
buildDir: '.nuxt-patch',
|
||||||
|
dev: false,
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(options)
|
nuxt = new Nuxt(options)
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
|
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
t.true(logSpy.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
test.before('Start browser', async t => {
|
|
||||||
|
test.serial('Start browser', async t => {
|
||||||
|
t.plan(0) // suppress 'no assertions' warning
|
||||||
await browser.start({
|
await browser.start({
|
||||||
// slowMo: 50,
|
// slowMo: 50,
|
||||||
// headless: false
|
// headless: false
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
let page
|
test.serial('Loading /patch and keep ', async t => {
|
||||||
const dates = {}
|
|
||||||
|
|
||||||
test('Loading /patch and keep ', async t => {
|
|
||||||
page = await browser.page(url('/patch'))
|
page = await browser.page(url('/patch'))
|
||||||
|
|
||||||
const h1 = await page.$text('h1')
|
const h1 = await page.$text('h1')
|
||||||
@ -39,7 +50,7 @@ test('Loading /patch and keep ', async t => {
|
|||||||
dates.patch = await page.$text('[data-date-patch]')
|
dates.patch = await page.$text('[data-date-patch]')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Navigate to /patch/1', async t => {
|
test.serial('Navigate to /patch/1', async t => {
|
||||||
const { hook } = await page.nuxt.navigate('/patch/1', false)
|
const { hook } = await page.nuxt.navigate('/patch/1', false)
|
||||||
const loading = await page.nuxt.loadingData()
|
const loading = await page.nuxt.loadingData()
|
||||||
t.is(loading.show, true)
|
t.is(loading.show, true)
|
||||||
@ -52,7 +63,7 @@ test('Navigate to /patch/1', async t => {
|
|||||||
t.is(dates.patch, await page.$text('[data-date-patch]'))
|
t.is(dates.patch, await page.$text('[data-date-patch]'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Navigate to /patch/2', async t => {
|
test.serial('Navigate to /patch/2', async t => {
|
||||||
await page.nuxt.navigate('/patch/2')
|
await page.nuxt.navigate('/patch/2')
|
||||||
const date = await page.$text('[data-date-id]')
|
const date = await page.$text('[data-date-id]')
|
||||||
|
|
||||||
@ -62,19 +73,19 @@ test('Navigate to /patch/2', async t => {
|
|||||||
dates.id = date
|
dates.id = date
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Navigate to /patch/2?test=true', async t => {
|
test.serial('Navigate to /patch/2?test=true', async t => {
|
||||||
await page.nuxt.navigate('/patch/2?test=true')
|
await page.nuxt.navigate('/patch/2?test=true')
|
||||||
t.is(dates.patch, await page.$text('[data-date-patch]'))
|
t.is(dates.patch, await page.$text('[data-date-patch]'))
|
||||||
t.is(dates.id, await page.$text('[data-date-id]'))
|
t.is(dates.id, await page.$text('[data-date-id]'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Navigate to /patch/2#test', async t => {
|
test.serial('Navigate to /patch/2#test', async t => {
|
||||||
await page.nuxt.navigate('/patch/2#test')
|
await page.nuxt.navigate('/patch/2#test')
|
||||||
t.is(dates.patch, await page.$text('[data-date-patch]'))
|
t.is(dates.patch, await page.$text('[data-date-patch]'))
|
||||||
t.is(dates.id, await page.$text('[data-date-id]'))
|
t.is(dates.id, await page.$text('[data-date-id]'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Navigate to /patch/2/child', async t => {
|
test.serial('Navigate to /patch/2/child', async t => {
|
||||||
await page.nuxt.navigate('/patch/2/child')
|
await page.nuxt.navigate('/patch/2/child')
|
||||||
dates.child = await page.$text('[data-date-child]')
|
dates.child = await page.$text('[data-date-child]')
|
||||||
dates.slug = await page.$text('[data-date-child-slug]')
|
dates.slug = await page.$text('[data-date-child-slug]')
|
||||||
@ -85,7 +96,7 @@ test('Navigate to /patch/2/child', async t => {
|
|||||||
t.true(+dates.slug > +dates.child)
|
t.true(+dates.slug > +dates.child)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Navigate to /patch/2/child/1', async t => {
|
test.serial('Navigate to /patch/2/child/1', async t => {
|
||||||
await page.nuxt.navigate('/patch/2/child/1')
|
await page.nuxt.navigate('/patch/2/child/1')
|
||||||
const date = await page.$text('[data-date-child-slug]')
|
const date = await page.$text('[data-date-child-slug]')
|
||||||
|
|
||||||
@ -96,7 +107,7 @@ test('Navigate to /patch/2/child/1', async t => {
|
|||||||
dates.slug = date
|
dates.slug = date
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Navigate to /patch/2/child/1?foo=bar', async t => {
|
test.serial('Navigate to /patch/2/child/1?foo=bar', async t => {
|
||||||
await page.nuxt.navigate('/patch/2/child/1?foo=bar')
|
await page.nuxt.navigate('/patch/2/child/1?foo=bar')
|
||||||
|
|
||||||
t.is(dates.patch, await page.$text('[data-date-patch]'))
|
t.is(dates.patch, await page.$text('[data-date-patch]'))
|
||||||
@ -105,7 +116,7 @@ test('Navigate to /patch/2/child/1?foo=bar', async t => {
|
|||||||
t.is(dates.slug, await page.$text('[data-date-child-slug]'))
|
t.is(dates.slug, await page.$text('[data-date-child-slug]'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Search a country', async t => {
|
test.serial('Search a country', async t => {
|
||||||
const countries = await page.$$text('[data-test-search-result]')
|
const countries = await page.$$text('[data-test-search-result]')
|
||||||
t.is(countries.length, 5)
|
t.is(countries.length, 5)
|
||||||
|
|
||||||
@ -125,10 +136,11 @@ test('Search a country', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
test.after('Stop browser', async t => {
|
|
||||||
|
test.after.always('Stop browser', async t => {
|
||||||
await page.close()
|
await page.close()
|
||||||
await browser.stop()
|
await browser.stop()
|
||||||
})
|
})
|
||||||
|
@ -1,22 +1,31 @@
|
|||||||
import test from 'ava'
|
import test from 'ava'
|
||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
|
import { interceptLog } from './helpers/console'
|
||||||
|
|
||||||
const port = 4004
|
const port = 4013
|
||||||
// const url = (route) => 'http://localhost:' + port + route
|
// const url = (route) => 'http://localhost:' + port + route
|
||||||
|
|
||||||
let nuxt = null
|
let nuxt = null
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const options = {
|
const options = {
|
||||||
rootDir: resolve(__dirname, 'fixtures/children'),
|
rootDir: resolve(__dirname, 'fixtures/children'),
|
||||||
dev: false
|
dev: false,
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(options)
|
nuxt = new Nuxt(options)
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
|
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
t.true(logSpy.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/parent', async t => {
|
test('/parent', async t => {
|
||||||
@ -54,6 +63,6 @@ test('/parent/validate-child?key=12345', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -11,7 +11,7 @@ const rootDir = resolve(__dirname, 'fixtures/basic')
|
|||||||
const port = 4011
|
const port = 4011
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
|
|
||||||
test('bin/nuxt-build', async t => {
|
test.serial('bin/nuxt-build', async t => {
|
||||||
const binBuild = resolve(__dirname, '..', 'bin', 'nuxt-build')
|
const binBuild = resolve(__dirname, '..', 'bin', 'nuxt-build')
|
||||||
|
|
||||||
const { stdout, stderr } = await execify(`node ${binBuild} ${rootDir}`)
|
const { stdout, stderr } = await execify(`node ${binBuild} ${rootDir}`)
|
||||||
@ -20,7 +20,7 @@ test('bin/nuxt-build', async t => {
|
|||||||
t.true(stderr.includes('Building done'))
|
t.true(stderr.includes('Building done'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('bin/nuxt-start', async t => {
|
test.serial('bin/nuxt-start', async t => {
|
||||||
const binStart = resolve(__dirname, '..', 'bin', 'nuxt-start')
|
const binStart = resolve(__dirname, '..', 'bin', 'nuxt-start')
|
||||||
|
|
||||||
let stdout = ''
|
let stdout = ''
|
||||||
@ -79,7 +79,7 @@ test('bin/nuxt-start', async t => {
|
|||||||
t.is(exitCode, null)
|
t.is(exitCode, null)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('bin/nuxt-generate', async t => {
|
test.serial('bin/nuxt-generate', async t => {
|
||||||
const binGenerate = resolve(__dirname, '..', 'bin', 'nuxt-generate')
|
const binGenerate = resolve(__dirname, '..', 'bin', 'nuxt-generate')
|
||||||
|
|
||||||
const { stdout, stderr } = await execify(`node ${binGenerate} ${rootDir}`)
|
const { stdout, stderr } = await execify(`node ${binGenerate} ${rootDir}`)
|
||||||
|
@ -2,6 +2,7 @@ import test from 'ava'
|
|||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import rp from 'request-promise-native'
|
import rp from 'request-promise-native'
|
||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
|
import { interceptLog, interceptError, release } from './helpers/console'
|
||||||
|
|
||||||
const port = 4009
|
const port = 4009
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
@ -9,60 +10,87 @@ const url = (route) => 'http://localhost:' + port + route
|
|||||||
let nuxt = null
|
let nuxt = null
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const rootDir = resolve(__dirname, 'fixtures/debug')
|
const rootDir = resolve(__dirname, 'fixtures/debug')
|
||||||
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
||||||
config.rootDir = rootDir
|
config.rootDir = rootDir
|
||||||
config.dev = true // Needed for _open middleware
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(config)
|
nuxt = new Nuxt(config)
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
|
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
t.true(logSpy.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/_open (open-in-editor)', async t => {
|
test.serial('/test/_open (open-in-editor)', async t => {
|
||||||
|
const logSpy = await interceptLog()
|
||||||
const { body } = await rp(url('/test/_open?file=pages/index.vue'), { resolveWithFullResponse: true })
|
const { body } = await rp(url('/test/_open?file=pages/index.vue'), { resolveWithFullResponse: true })
|
||||||
t.is(body, 'opened in editor!')
|
t.is(body, 'opened in editor!')
|
||||||
|
release()
|
||||||
|
t.is(logSpy.getCall(0).args[0], '[open in editor]')
|
||||||
|
t.true(logSpy.calledOnce)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/_open should return error (open-in-editor)', async t => {
|
test.serial('/test/_open should return error (open-in-editor)', async t => {
|
||||||
|
const logSpy = await interceptLog()
|
||||||
const { body } = await rp(url('/test/_open?file='), { resolveWithFullResponse: true })
|
const { body } = await rp(url('/test/_open?file='), { resolveWithFullResponse: true })
|
||||||
t.is(body, 'File is not specified')
|
t.is(body, 'File is not specified')
|
||||||
|
release()
|
||||||
|
t.is(logSpy.getCall(0).args[0], '[open in editor]')
|
||||||
|
t.true(logSpy.calledOnce)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/error should return error stack trace (Youch)', async t => {
|
test.serial('/test/error should return error stack trace (Youch)', async t => {
|
||||||
|
const errorSpy = await interceptError()
|
||||||
const { response, error } = await t.throws(nuxt.renderAndGetWindow(url('/test/error')))
|
const { response, error } = await t.throws(nuxt.renderAndGetWindow(url('/test/error')))
|
||||||
t.is(response.statusCode, 500)
|
t.is(response.statusCode, 500)
|
||||||
t.is(response.statusMessage, 'NuxtServerError')
|
t.is(response.statusMessage, 'NuxtServerError')
|
||||||
t.true(error.includes('test youch !'))
|
t.true(error.includes('test youch !'))
|
||||||
t.true(error.includes('<div class="error-frames">'))
|
t.true(error.includes('<div class="error-frames">'))
|
||||||
|
release()
|
||||||
|
t.true(errorSpy.calledTwice)
|
||||||
|
t.true(errorSpy.getCall(0).args[0].includes('test youch !'))
|
||||||
|
t.true(errorSpy.getCall(1).args[0].message.includes('test youch !'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/error no source-map (Youch)', async t => {
|
test.serial('/test/error no source-map (Youch)', async t => {
|
||||||
const sourceMaps = nuxt.renderer.resources.serverBundle.maps
|
const sourceMaps = nuxt.renderer.resources.serverBundle.maps
|
||||||
nuxt.renderer.resources.serverBundle.maps = {}
|
nuxt.renderer.resources.serverBundle.maps = {}
|
||||||
|
|
||||||
|
const errorSpy = await interceptError()
|
||||||
const { response, error } = await t.throws(nuxt.renderAndGetWindow(url('/test/error')))
|
const { response, error } = await t.throws(nuxt.renderAndGetWindow(url('/test/error')))
|
||||||
t.is(response.statusCode, 500)
|
t.is(response.statusCode, 500)
|
||||||
t.is(response.statusMessage, 'NuxtServerError')
|
t.is(response.statusMessage, 'NuxtServerError')
|
||||||
t.true(error.includes('test youch !'))
|
t.true(error.includes('test youch !'))
|
||||||
t.true(error.includes('<div class="error-frames">'))
|
t.true(error.includes('<div class="error-frames">'))
|
||||||
|
release()
|
||||||
|
t.true(errorSpy.calledTwice)
|
||||||
|
t.true(errorSpy.getCall(0).args[0].includes('test youch !'))
|
||||||
|
t.true(errorSpy.getCall(1).args[0].message.includes('test youch !'))
|
||||||
|
|
||||||
nuxt.renderer.resources.serverBundle.maps = sourceMaps
|
nuxt.renderer.resources.serverBundle.maps = sourceMaps
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/error should return json format error (Youch)', async t => {
|
test.serial('/test/error should return json format error (Youch)', async t => {
|
||||||
const opts = {
|
const opts = {
|
||||||
headers: {
|
headers: {
|
||||||
'accept': 'application/json'
|
'accept': 'application/json'
|
||||||
},
|
},
|
||||||
resolveWithFullResponse: true
|
resolveWithFullResponse: true
|
||||||
}
|
}
|
||||||
|
const errorSpy = await interceptError()
|
||||||
const { response: { headers } } = await t.throws(rp(url('/test/error'), opts))
|
const { response: { headers } } = await t.throws(rp(url('/test/error'), opts))
|
||||||
t.is(headers['content-type'], 'text/json; charset=utf-8')
|
t.is(headers['content-type'], 'text/json; charset=utf-8')
|
||||||
|
release()
|
||||||
|
t.true(errorSpy.calledTwice)
|
||||||
|
t.true(errorSpy.getCall(0).args[0].includes('test youch !'))
|
||||||
|
t.true(errorSpy.getCall(1).args[0].message.includes('test youch !'))
|
||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -1,50 +1,52 @@
|
|||||||
import test from 'ava'
|
import test from 'ava'
|
||||||
import { interceptWarn, release } from './helpers/console'
|
|
||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import rp from 'request-promise-native'
|
import rp from 'request-promise-native'
|
||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
|
import { intercept, interceptWarn, release } from './helpers/console'
|
||||||
|
|
||||||
const port = 4010
|
const port = 4010
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
|
|
||||||
let nuxt = null
|
let nuxt = null
|
||||||
let builder = null
|
let builder = null
|
||||||
let buildLog = null
|
let buildSpies = null
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const rootDir = resolve(__dirname, 'fixtures/deprecate')
|
const rootDir = resolve(__dirname, 'fixtures/deprecate')
|
||||||
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
||||||
config.rootDir = rootDir
|
config.rootDir = rootDir
|
||||||
config.dev = false
|
config.dev = false
|
||||||
|
|
||||||
|
buildSpies = await intercept(async () => {
|
||||||
nuxt = new Nuxt(config)
|
nuxt = new Nuxt(config)
|
||||||
builder = new Builder(nuxt)
|
builder = await new Builder(nuxt)
|
||||||
|
|
||||||
buildLog = await interceptWarn()
|
|
||||||
await builder.build()
|
await builder.build()
|
||||||
release()
|
|
||||||
|
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(buildSpies.log.calledWithMatch('DONE'))
|
||||||
|
t.true(buildSpies.log.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Deprecated: context.isServer and context.isClient', async t => {
|
test.serial('Deprecated: context.isServer and context.isClient', async t => {
|
||||||
const logSpy = await interceptWarn()
|
const warnSpy = await interceptWarn()
|
||||||
await rp(url('/'))
|
await rp(url('/'))
|
||||||
t.true(logSpy.calledWith('context.isServer has been deprecated, please use process.server instead.'))
|
t.true(warnSpy.calledWith('context.isServer has been deprecated, please use process.server instead.'))
|
||||||
t.true(logSpy.calledWith('context.isClient has been deprecated, please use process.client instead.'))
|
t.true(warnSpy.calledWith('context.isClient has been deprecated, please use process.client instead.'))
|
||||||
t.true(logSpy.calledTwice)
|
t.true(warnSpy.calledTwice)
|
||||||
release()
|
release()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Deprecated: dev in build.extend()', async t => {
|
test.serial('Deprecated: dev in build.extend()', async t => {
|
||||||
t.true(buildLog.withArgs('dev has been deprecated in build.extend(), please use isDev').calledTwice)
|
t.true(buildSpies.warn.withArgs('dev has been deprecated in build.extend(), please use isDev').calledTwice)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Deprecated: nuxt.plugin()', async t => {
|
test.serial('Deprecated: nuxt.plugin()', async t => {
|
||||||
t.true(nuxt.__builder_plugin)
|
t.true(nuxt.__builder_plugin)
|
||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -6,7 +6,7 @@ import { Nuxt, Builder } from '..'
|
|||||||
import { interceptLog, release } from './helpers/console'
|
import { interceptLog, release } from './helpers/console'
|
||||||
|
|
||||||
const readFile = promisify(fs.readFile)
|
const readFile = promisify(fs.readFile)
|
||||||
const rootDir = resolve(__dirname, './fixtures/dll')
|
const rootDir = resolve(__dirname, 'fixtures/dll')
|
||||||
const dllDir = resolve(rootDir, '.cache/client-dll')
|
const dllDir = resolve(rootDir, '.cache/client-dll')
|
||||||
|
|
||||||
const checkCache = (lib) => {
|
const checkCache = (lib) => {
|
||||||
@ -19,12 +19,16 @@ const checkCache = (lib) => {
|
|||||||
|
|
||||||
let nuxt
|
let nuxt
|
||||||
|
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
||||||
config.rootDir = rootDir
|
config.rootDir = rootDir
|
||||||
config.dev = true
|
config.dev = true
|
||||||
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(config)
|
nuxt = new Nuxt(config)
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
|
})
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Check vue cache', checkCache('vue'))
|
test('Check vue cache', checkCache('vue'))
|
||||||
@ -41,6 +45,6 @@ test('Build with DllReferencePlugin', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing nuxt.js', t => {
|
test.after.always('Closing nuxt.js', t => {
|
||||||
nuxt.close()
|
nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -3,15 +3,24 @@ import { resolve } from 'path'
|
|||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
import { promisify } from 'util'
|
import { promisify } from 'util'
|
||||||
|
import { interceptLog } from './helpers/console'
|
||||||
|
|
||||||
const readFile = promisify(fs.readFile)
|
const readFile = promisify(fs.readFile)
|
||||||
|
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const nuxt = new Nuxt({
|
const config = {
|
||||||
rootDir: resolve(__dirname, 'fixtures/dynamic-routes'),
|
rootDir: resolve(__dirname, 'fixtures/dynamic-routes'),
|
||||||
dev: false
|
dev: false,
|
||||||
})
|
build: {
|
||||||
|
stats: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
|
const nuxt = new Nuxt(config)
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
|
})
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Check .nuxt/router.js', t => {
|
test('Check .nuxt/router.js', t => {
|
||||||
|
@ -2,6 +2,7 @@ import test from 'ava'
|
|||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import rp from 'request-promise-native'
|
import rp from 'request-promise-native'
|
||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
|
import { interceptLog, interceptError, release } from './helpers/console'
|
||||||
|
|
||||||
const port = 4005
|
const port = 4005
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
@ -9,48 +10,61 @@ const url = (route) => 'http://localhost:' + port + route
|
|||||||
let nuxt = null
|
let nuxt = null
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const options = {
|
const options = {
|
||||||
rootDir: resolve(__dirname, 'fixtures/error'),
|
rootDir: resolve(__dirname, 'fixtures/error'),
|
||||||
dev: false
|
dev: false,
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(options)
|
nuxt = new Nuxt(options)
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
|
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
t.true(logSpy.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/ should display an error', async t => {
|
test.serial('/ should display an error', async t => {
|
||||||
try {
|
const error = await t.throws(nuxt.renderRoute('/'))
|
||||||
await nuxt.renderRoute('/')
|
t.true(error.message.includes('not_defined is not defined'))
|
||||||
} catch (e) {
|
|
||||||
t.true(e.message.includes('not_defined is not defined'))
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/404 should display an error too', async t => {
|
test.serial('/404 should display an error too', async t => {
|
||||||
let { error } = await nuxt.renderRoute('/404')
|
let { error } = await nuxt.renderRoute('/404')
|
||||||
t.true(error.message.includes('This page could not be found'))
|
t.true(error.message.includes('This page could not be found'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/ with renderAndGetWindow()', async t => {
|
test.serial('/ with renderAndGetWindow()', async t => {
|
||||||
|
const errorSpy = await interceptError()
|
||||||
const err = await t.throws(nuxt.renderAndGetWindow(url('/')))
|
const err = await t.throws(nuxt.renderAndGetWindow(url('/')))
|
||||||
t.is(err.response.statusCode, 500)
|
t.is(err.response.statusCode, 500)
|
||||||
t.is(err.response.statusMessage, 'NuxtServerError')
|
t.is(err.response.statusMessage, 'NuxtServerError')
|
||||||
|
release()
|
||||||
|
t.true(errorSpy.calledOnce)
|
||||||
|
t.true(errorSpy.getCall(0).args[0].message.includes('render function or template not defined in component: anonymous'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/ with text/json content', async t => {
|
test.serial('/ with text/json content', async t => {
|
||||||
const opts = {
|
const opts = {
|
||||||
headers: {
|
headers: {
|
||||||
'accept': 'application/json'
|
'accept': 'application/json'
|
||||||
},
|
},
|
||||||
resolveWithFullResponse: true
|
resolveWithFullResponse: true
|
||||||
}
|
}
|
||||||
|
const errorSpy = await interceptError()
|
||||||
const { response: { headers } } = await t.throws(rp(url('/'), opts))
|
const { response: { headers } } = await t.throws(rp(url('/'), opts))
|
||||||
t.is(headers['content-type'], 'text/json; charset=utf-8')
|
t.is(headers['content-type'], 'text/json; charset=utf-8')
|
||||||
|
release()
|
||||||
|
t.true(errorSpy.calledOnce)
|
||||||
|
t.true(errorSpy.getCall(0).args[0].message.includes('render function or template not defined in component: anonymous'))
|
||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -3,6 +3,7 @@ import { resolve } from 'path'
|
|||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
import express from 'express'
|
import express from 'express'
|
||||||
import rp from 'request-promise-native'
|
import rp from 'request-promise-native'
|
||||||
|
import { interceptLog } from './helpers/console'
|
||||||
|
|
||||||
const port = 4000
|
const port = 4000
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
@ -11,17 +12,21 @@ let nuxt
|
|||||||
let app
|
let app
|
||||||
|
|
||||||
// Init nuxt.js and create express server
|
// Init nuxt.js and create express server
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const options = {
|
const config = {
|
||||||
rootDir: resolve(__dirname, 'fixtures/basic'),
|
rootDir: resolve(__dirname, 'fixtures/basic'),
|
||||||
dev: false
|
buildDir: '.nuxt-express',
|
||||||
|
dev: false,
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create nuxt instace
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(options)
|
nuxt = new Nuxt(config)
|
||||||
|
|
||||||
// Build
|
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
|
})
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
|
||||||
// Create express app
|
// Create express app
|
||||||
app = express()
|
app = express()
|
||||||
|
4
test/fixtures/debug/nuxt.config.js
vendored
4
test/fixtures/debug/nuxt.config.js
vendored
@ -2,9 +2,13 @@ module.exports = {
|
|||||||
router: {
|
router: {
|
||||||
base: '/test/'
|
base: '/test/'
|
||||||
},
|
},
|
||||||
|
dev: true, // Needed for _open middleware
|
||||||
debug: true,
|
debug: true,
|
||||||
editor: {
|
editor: {
|
||||||
cmd: 'echo',
|
cmd: 'echo',
|
||||||
pattern: ''
|
pattern: ''
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1
test/fixtures/deprecate/nuxt.config.js
vendored
1
test/fixtures/deprecate/nuxt.config.js
vendored
@ -3,6 +3,7 @@ module.exports = {
|
|||||||
'~/modules/hooks'
|
'~/modules/hooks'
|
||||||
],
|
],
|
||||||
build: {
|
build: {
|
||||||
|
stats: false,
|
||||||
extend(config, options) {
|
extend(config, options) {
|
||||||
if (options.dev) {
|
if (options.dev) {
|
||||||
// Please use isDev instead of dev
|
// Please use isDev instead of dev
|
||||||
|
1
test/fixtures/dll/nuxt.config.js
vendored
1
test/fixtures/dll/nuxt.config.js
vendored
@ -1,5 +1,6 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
build: {
|
build: {
|
||||||
|
stats: false,
|
||||||
dll: true,
|
dll: true,
|
||||||
extend(config, options) {
|
extend(config, options) {
|
||||||
if (options.isClient) {
|
if (options.isClient) {
|
||||||
|
3
test/fixtures/module/nuxt.config.js
vendored
3
test/fixtures/module/nuxt.config.js
vendored
@ -28,5 +28,8 @@ module.exports = {
|
|||||||
handler: '~/modules/middleware/use-middleware'
|
handler: '~/modules/middleware/use-middleware'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
6
test/fixtures/spa/nuxt.config.js
vendored
6
test/fixtures/spa/nuxt.config.js
vendored
@ -1,6 +1,8 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
rootDir: __dirname,
|
|
||||||
mode: 'spa',
|
mode: 'spa',
|
||||||
dev: false,
|
dev: false,
|
||||||
transition: false
|
transition: false,
|
||||||
|
build: {
|
||||||
|
stats: false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
10
test/fixtures/ssr/nuxt.config.js
vendored
Normal file
10
test/fixtures/ssr/nuxt.config.js
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
module.exports = {
|
||||||
|
dev: false,
|
||||||
|
render: {
|
||||||
|
resourceHints: false
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
stats: false,
|
||||||
|
extractCSS: true
|
||||||
|
}
|
||||||
|
}
|
1
test/fixtures/with-config/nuxt.config.js
vendored
1
test/fixtures/with-config/nuxt.config.js
vendored
@ -42,6 +42,7 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
build: {
|
build: {
|
||||||
|
stats: false,
|
||||||
publicPath: '/orion/',
|
publicPath: '/orion/',
|
||||||
analyze: {
|
analyze: {
|
||||||
analyzerMode: 'disabled',
|
analyzerMode: 'disabled',
|
||||||
|
@ -20,6 +20,12 @@ export function release() {
|
|||||||
if (context.error) {
|
if (context.error) {
|
||||||
console.error = context.error // eslint-disable-line no-console
|
console.error = context.error // eslint-disable-line no-console
|
||||||
}
|
}
|
||||||
|
if (context.stdout) {
|
||||||
|
process.stdout.write = context.stdout
|
||||||
|
}
|
||||||
|
if (context.stderr) {
|
||||||
|
process.stderr.write = context.stderr
|
||||||
|
}
|
||||||
|
|
||||||
context = null
|
context = null
|
||||||
}
|
}
|
||||||
@ -68,18 +74,32 @@ export async function intercept(levels, msg, cb) {
|
|||||||
spies.error = console.error = sinon.spy() // eslint-disable-line no-console
|
spies.error = console.error = sinon.spy() // eslint-disable-line no-console
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (levels && levels.stdout) {
|
||||||
|
context.stdout = process.stdout.write
|
||||||
|
spies.stdout = process.stdout.write = sinon.spy()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (levels && levels.stderr) {
|
||||||
|
context.stderr = process.stderr.write
|
||||||
|
spies.stderr = process.stderr.write = sinon.spy()
|
||||||
|
}
|
||||||
|
|
||||||
if (cb) {
|
if (cb) {
|
||||||
if (msg) {
|
if (msg) {
|
||||||
|
if (context.stdout) {
|
||||||
|
context.stdout(` ${msg}`)
|
||||||
|
} else {
|
||||||
process.stdout.write(` ${msg}`)
|
process.stdout.write(` ${msg}`)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await cb()
|
await cb()
|
||||||
|
|
||||||
|
release()
|
||||||
|
|
||||||
if (msg) {
|
if (msg) {
|
||||||
process.stdout.write('\n')
|
process.stdout.write('\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
release()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return spies
|
return spies
|
||||||
@ -104,3 +124,13 @@ export async function interceptError(msg, cb) {
|
|||||||
const { error } = await intercept({ error: true }, msg, cb)
|
const { error } = await intercept({ error: true }, msg, cb)
|
||||||
return error
|
return error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function interceptStdout(msg, cb) {
|
||||||
|
const { stdout } = await intercept({ stdout: true }, msg, cb)
|
||||||
|
return stdout
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function interceptStderr(msg, cb) {
|
||||||
|
const { stderr } = await intercept({ stderr: true }, msg, cb)
|
||||||
|
return stderr
|
||||||
|
}
|
||||||
|
@ -6,7 +6,7 @@ test('Nuxt.js Class', t => {
|
|||||||
t.is(typeof Nuxt, 'function')
|
t.is(typeof Nuxt, 'function')
|
||||||
})
|
})
|
||||||
|
|
||||||
test.serial('Nuxt.js Instance', async t => {
|
test('Nuxt.js Instance', async t => {
|
||||||
const nuxt = new Nuxt({
|
const nuxt = new Nuxt({
|
||||||
rootDir: resolve(__dirname, 'fixtures', 'empty')
|
rootDir: resolve(__dirname, 'fixtures', 'empty')
|
||||||
})
|
})
|
||||||
@ -17,7 +17,7 @@ test.serial('Nuxt.js Instance', async t => {
|
|||||||
t.is(nuxt.initialized, true)
|
t.is(nuxt.initialized, true)
|
||||||
})
|
})
|
||||||
|
|
||||||
test.serial('Fail to build when no pages/ directory but is in the parent', t => {
|
test('Fail to build when no pages/ directory but is in the parent', t => {
|
||||||
const nuxt = new Nuxt({
|
const nuxt = new Nuxt({
|
||||||
dev: false,
|
dev: false,
|
||||||
rootDir: resolve(__dirname, 'fixtures', 'empty', 'pages')
|
rootDir: resolve(__dirname, 'fixtures', 'empty', 'pages')
|
||||||
@ -29,7 +29,7 @@ test.serial('Fail to build when no pages/ directory but is in the parent', t =>
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
test.serial('Fail to build when no pages/ directory', t => {
|
test('Fail to build when no pages/ directory', t => {
|
||||||
const nuxt = new Nuxt({
|
const nuxt = new Nuxt({
|
||||||
dev: false,
|
dev: false,
|
||||||
rootDir: resolve(__dirname)
|
rootDir: resolve(__dirname)
|
||||||
|
@ -2,60 +2,62 @@ import test from 'ava'
|
|||||||
import { resolve, normalize } from 'path'
|
import { resolve, normalize } from 'path'
|
||||||
import rp from 'request-promise-native'
|
import rp from 'request-promise-native'
|
||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
import { interceptError, release } from './helpers/console'
|
import { intercept } from './helpers/console'
|
||||||
|
|
||||||
const port = 4006
|
const port = 4006
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
|
|
||||||
let nuxt = null
|
let nuxt = null
|
||||||
let builder = null
|
let builder = null
|
||||||
let builtErr = null
|
let buildSpies = null
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const rootDir = resolve(__dirname, 'fixtures/module')
|
const rootDir = resolve(__dirname, 'fixtures/module')
|
||||||
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
const config = require(resolve(rootDir, 'nuxt.config.js'))
|
||||||
config.rootDir = rootDir
|
config.rootDir = rootDir
|
||||||
config.dev = false
|
config.dev = false
|
||||||
nuxt = new Nuxt(config)
|
nuxt = new Nuxt(config)
|
||||||
builder = new Builder(nuxt)
|
builder = new Builder(nuxt)
|
||||||
|
|
||||||
builtErr = await interceptError()
|
buildSpies = await intercept({ log: true, error: true }, async () => {
|
||||||
await builder.build()
|
await builder.build()
|
||||||
release()
|
|
||||||
|
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(buildSpies.log.calledWithMatch('DONE'))
|
||||||
|
t.true(buildSpies.log.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Vendor', async t => {
|
test.serial('Vendor', async t => {
|
||||||
t.true(nuxt.options.build.vendor.indexOf('lodash') !== -1, 'lodash added to config')
|
t.true(nuxt.options.build.vendor.indexOf('lodash') !== -1, 'lodash added to config')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Plugin', async t => {
|
test.serial('Plugin', async t => {
|
||||||
t.true(normalize(nuxt.options.plugins[0].src)
|
t.true(normalize(nuxt.options.plugins[0].src)
|
||||||
.includes(normalize('fixtures/module/.nuxt/basic.reverse.')), 'plugin added to config')
|
.includes(normalize('fixtures/module/.nuxt/basic.reverse.')), 'plugin added to config')
|
||||||
const { html } = await nuxt.renderRoute('/')
|
const { html } = await nuxt.renderRoute('/')
|
||||||
t.true(html.includes('<h1>TXUN</h1>'), 'plugin works')
|
t.true(html.includes('<h1>TXUN</h1>'), 'plugin works')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Middleware', async t => {
|
test.serial('Hooks', async t => {
|
||||||
let response = await rp(url('/api'))
|
|
||||||
t.is(response, 'It works!', '/api response is correct')
|
|
||||||
})
|
|
||||||
|
|
||||||
test('Hooks', async t => {
|
|
||||||
t.is(nuxt.__module_hook, 1)
|
t.is(nuxt.__module_hook, 1)
|
||||||
t.is(nuxt.__renderer_hook, 2)
|
t.is(nuxt.__renderer_hook, 2)
|
||||||
t.is(nuxt.__builder_hook, 3)
|
t.is(nuxt.__builder_hook, 3)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Hooks - Functional', async t => {
|
test.serial('Hooks - Functional', async t => {
|
||||||
t.true(nuxt.__ready_called__)
|
t.true(nuxt.__ready_called__)
|
||||||
t.true(builder.__build_done__)
|
t.true(builder.__build_done__)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Hooks - Error', async t => {
|
test.serial('Hooks - Error', async t => {
|
||||||
t.true(builtErr.calledWithMatch(/build:extendRoutes/))
|
t.true(buildSpies.error.calledWithMatch(/build:extendRoutes/))
|
||||||
|
})
|
||||||
|
|
||||||
|
test('Middleware', async t => {
|
||||||
|
let response = await rp(url('/api'))
|
||||||
|
t.is(response, 'It works!', '/api response is correct')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Hooks - Use external middleware before render', async t => {
|
test('Hooks - Use external middleware before render', async t => {
|
||||||
@ -64,6 +66,6 @@ test('Hooks - Use external middleware before render', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
import test from 'ava'
|
import test from 'ava'
|
||||||
|
import { resolve } from 'path'
|
||||||
import { Nuxt, Builder } from '..'
|
import { Nuxt, Builder } from '..'
|
||||||
import { interceptLog, release } from './helpers/console'
|
import { interceptLog, release } from './helpers/console'
|
||||||
|
|
||||||
let nuxt = null
|
let nuxt = null
|
||||||
|
|
||||||
const port = 4004
|
const port = 4012
|
||||||
const url = (route) => 'http://localhost:' + port + route
|
const url = (route) => 'http://localhost:' + port + route
|
||||||
|
|
||||||
const renderRoute = async _url => {
|
const renderRoute = async _url => {
|
||||||
@ -15,28 +16,49 @@ const renderRoute = async _url => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
nuxt = new Nuxt(require('./fixtures/spa/nuxt.config'))
|
const rootDir = resolve(__dirname, 'fixtures/spa')
|
||||||
|
const config = require(resolve(rootDir, 'nuxt.config.js'))
|
||||||
|
config.rootDir = rootDir
|
||||||
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
|
nuxt = new Nuxt(config)
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
t.true(logSpy.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/ (basic spa)', async t => {
|
test.serial('/ (basic spa)', async t => {
|
||||||
|
const logSpy = await interceptLog()
|
||||||
const { html } = await renderRoute('/')
|
const { html } = await renderRoute('/')
|
||||||
t.true(html.includes('Hello SPA!'))
|
t.true(html.includes('Hello SPA!'))
|
||||||
|
release()
|
||||||
|
t.true(logSpy.withArgs('created').notCalled)
|
||||||
|
t.true(logSpy.withArgs('mounted').calledOnce)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/custom (custom layout)', async t => {
|
test.serial('/custom (custom layout)', async t => {
|
||||||
|
const logSpy = await interceptLog()
|
||||||
const { html } = await renderRoute('/custom')
|
const { html } = await renderRoute('/custom')
|
||||||
t.true(html.includes('Custom layout'))
|
t.true(html.includes('Custom layout'))
|
||||||
|
release()
|
||||||
|
t.true(logSpy.withArgs('created').calledOnce)
|
||||||
|
t.true(logSpy.withArgs('mounted').calledOnce)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/custom (not default layout)', async t => {
|
test.serial('/custom (not default layout)', async t => {
|
||||||
|
const logSpy = await interceptLog()
|
||||||
const { head } = await renderRoute('/custom')
|
const { head } = await renderRoute('/custom')
|
||||||
t.false(head.includes('src="/_nuxt/layouts/default.'))
|
t.false(head.includes('src="/_nuxt/layouts/default.'))
|
||||||
|
release()
|
||||||
|
t.true(logSpy.withArgs('created').calledOnce)
|
||||||
|
t.true(logSpy.withArgs('mounted').calledOnce)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/custom (call mounted and created once)', async t => {
|
test.serial('/custom (call mounted and created once)', async t => {
|
||||||
const logSpy = await interceptLog()
|
const logSpy = await interceptLog()
|
||||||
await renderRoute('/custom')
|
await renderRoute('/custom')
|
||||||
release()
|
release()
|
||||||
@ -51,6 +73,6 @@ test('/_nuxt/ (access publicPath in spa mode)', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -3,6 +3,7 @@ import { resolve } from 'path'
|
|||||||
import { Nuxt, Builder, Utils } from '..'
|
import { Nuxt, Builder, Utils } from '..'
|
||||||
import { uniq } from 'lodash'
|
import { uniq } from 'lodash'
|
||||||
import rp from 'request-promise-native'
|
import rp from 'request-promise-native'
|
||||||
|
import { interceptLog } from './helpers/console'
|
||||||
|
|
||||||
const port = 4008
|
const port = 4008
|
||||||
let nuxt = null
|
let nuxt = null
|
||||||
@ -17,20 +18,19 @@ const url = (route) => 'http://localhost:' + port + route
|
|||||||
const isWindows = /^win/.test(process.platform)
|
const isWindows = /^win/.test(process.platform)
|
||||||
|
|
||||||
// Init nuxt.js and create server listening on localhost:4000
|
// Init nuxt.js and create server listening on localhost:4000
|
||||||
test.before('Init Nuxt.js', async t => {
|
test.serial('Init Nuxt.js', async t => {
|
||||||
const options = {
|
const rootDir = resolve(__dirname, 'fixtures/ssr')
|
||||||
rootDir: resolve(__dirname, 'fixtures/ssr'),
|
const config = require(resolve(rootDir, 'nuxt.config.js'))
|
||||||
dev: false,
|
config.rootDir = rootDir
|
||||||
render: {
|
|
||||||
resourceHints: false
|
const logSpy = await interceptLog(async () => {
|
||||||
},
|
nuxt = new Nuxt(config)
|
||||||
build: {
|
|
||||||
extractCSS: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nuxt = new Nuxt(options)
|
|
||||||
await new Builder(nuxt).build()
|
await new Builder(nuxt).build()
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
t.true(logSpy.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
// == Uniq Test ==
|
// == Uniq Test ==
|
||||||
@ -121,6 +121,6 @@ test('stress test with asyncData', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
@ -16,19 +16,23 @@ test.before('Init Nuxt.js', async t => {
|
|||||||
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
let config = require(resolve(rootDir, 'nuxt.config.js'))
|
||||||
config.rootDir = rootDir
|
config.rootDir = rootDir
|
||||||
config.dev = false
|
config.dev = false
|
||||||
|
|
||||||
|
const logSpy = await interceptLog(async () => {
|
||||||
nuxt = new Nuxt(config)
|
nuxt = new Nuxt(config)
|
||||||
builder = new Builder(nuxt)
|
builder = new Builder(nuxt)
|
||||||
await interceptLog('building nuxt', async () => {
|
|
||||||
await builder.build()
|
await builder.build()
|
||||||
})
|
|
||||||
await nuxt.listen(port, 'localhost')
|
await nuxt.listen(port, 'localhost')
|
||||||
|
})
|
||||||
|
|
||||||
|
t.true(logSpy.calledWithMatch('DONE'))
|
||||||
|
t.true(logSpy.calledWithMatch('OPEN'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/', async t => {
|
test.serial('/', async t => {
|
||||||
const logSpy = await interceptLog(async () => {
|
const logSpy = await interceptLog()
|
||||||
const { html } = await nuxt.renderRoute('/')
|
const { html } = await nuxt.renderRoute('/')
|
||||||
t.true(html.includes('<h1>I have custom configurations</h1>'))
|
t.true(html.includes('<h1>I have custom configurations</h1>'))
|
||||||
})
|
release()
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
t.is(logSpy.args[0][0], 'Test plugin!')
|
t.is(logSpy.args[0][0], 'Test plugin!')
|
||||||
})
|
})
|
||||||
@ -58,21 +62,20 @@ test('/ (custom postcss.config.js)', async t => {
|
|||||||
t.true(html.includes('::-webkit-input-placeholder'))
|
t.true(html.includes('::-webkit-input-placeholder'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/ (router base)', async t => {
|
test.serial('/test/ (router base)', async t => {
|
||||||
const logSpy = await interceptLog(async () => {
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/test/'))
|
const window = await nuxt.renderAndGetWindow(url('/test/'))
|
||||||
|
|
||||||
const html = window.document.body.innerHTML
|
const html = window.document.body.innerHTML
|
||||||
t.is(window.__NUXT__.layout, 'default')
|
t.is(window.__NUXT__.layout, 'default')
|
||||||
t.true(html.includes('<h1>Default layout</h1>'))
|
t.true(html.includes('<h1>Default layout</h1>'))
|
||||||
t.true(html.includes('<h1>I have custom configurations</h1>'))
|
t.true(html.includes('<h1>I have custom configurations</h1>'))
|
||||||
})
|
release()
|
||||||
|
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
t.is(logSpy.args[0][0], 'Test plugin!')
|
t.is(logSpy.args[0][0], 'Test plugin!')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/about (custom layout)', async t => {
|
test.serial('/test/about (custom layout)', async t => {
|
||||||
const logSpy = await interceptLog()
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/test/about'))
|
const window = await nuxt.renderAndGetWindow(url('/test/about'))
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
@ -85,7 +88,7 @@ test('/test/about (custom layout)', async t => {
|
|||||||
t.true(html.includes('<h1>About page</h1>'))
|
t.true(html.includes('<h1>About page</h1>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/desktop (custom layout in desktop folder)', async t => {
|
test.serial('/test/desktop (custom layout in desktop folder)', async t => {
|
||||||
const logSpy = await interceptLog()
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/test/desktop'))
|
const window = await nuxt.renderAndGetWindow(url('/test/desktop'))
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
@ -98,7 +101,7 @@ test('/test/desktop (custom layout in desktop folder)', async t => {
|
|||||||
t.true(html.includes('<h1>Desktop page</h1>'))
|
t.true(html.includes('<h1>Desktop page</h1>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/mobile (custom layout in mobile folder)', async t => {
|
test.serial('/test/mobile (custom layout in mobile folder)', async t => {
|
||||||
const logSpy = await interceptLog()
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/test/mobile'))
|
const window = await nuxt.renderAndGetWindow(url('/test/mobile'))
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
@ -111,7 +114,7 @@ test('/test/mobile (custom layout in mobile folder)', async t => {
|
|||||||
t.true(html.includes('<h1>Mobile page</h1>'))
|
t.true(html.includes('<h1>Mobile page</h1>'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/env', async t => {
|
test.serial('/test/env', async t => {
|
||||||
const logSpy = await interceptLog()
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/test/env'))
|
const window = await nuxt.renderAndGetWindow(url('/test/env'))
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
@ -129,7 +132,7 @@ test('/test/env', async t => {
|
|||||||
t.true(html.includes('"obj": {'))
|
t.true(html.includes('"obj": {'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/error', async t => {
|
test.serial('/test/error', async t => {
|
||||||
const logSpy = await interceptLog()
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/test/error'))
|
const window = await nuxt.renderAndGetWindow(url('/test/error'))
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
@ -140,7 +143,7 @@ test('/test/error', async t => {
|
|||||||
t.true(html.includes('Error page'))
|
t.true(html.includes('Error page'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/user-agent', async t => {
|
test.serial('/test/user-agent', async t => {
|
||||||
const logSpy = await interceptLog()
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/test/user-agent'))
|
const window = await nuxt.renderAndGetWindow(url('/test/user-agent'))
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
@ -151,7 +154,7 @@ test('/test/user-agent', async t => {
|
|||||||
t.true(html.includes('<pre>Mozilla'))
|
t.true(html.includes('<pre>Mozilla'))
|
||||||
})
|
})
|
||||||
|
|
||||||
test('/test/about-bis (added with extendRoutes)', async t => {
|
test.serial('/test/about-bis (added with extendRoutes)', async t => {
|
||||||
const logSpy = await interceptLog()
|
const logSpy = await interceptLog()
|
||||||
const window = await nuxt.renderAndGetWindow(url('/test/about-bis'))
|
const window = await nuxt.renderAndGetWindow(url('/test/about-bis'))
|
||||||
t.true(logSpy.calledOnce)
|
t.true(logSpy.calledOnce)
|
||||||
@ -190,6 +193,6 @@ test('Check build.styleResources for style-resources-loader', async t => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Close server and ask nuxt to stop listening to file changes
|
// Close server and ask nuxt to stop listening to file changes
|
||||||
test.after('Closing server and nuxt.js', async t => {
|
test.after.always('Closing server and nuxt.js', async t => {
|
||||||
await nuxt.close()
|
await nuxt.close()
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user