You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

583 lines
14 KiB

'use strict'
const t = require('tap')
const test = t.test
const sget = require('simple-get').concat
const Fastify = require('fastify')
const { existsSync, rmdirSync } = require('fs')
const { join } = require('path')
const pino = require('pino')
const split = require('split2')
const compileOptions = {
path: 'templates',
destination: 'out',
log: false
}
require('./helper').dotHtmlMinifierTests(t, compileOptions, true)
require('./helper').dotHtmlMinifierTests(t, compileOptions, false)
test('reply.view with dot engine .dot file', t => {
t.plan(6)
const fastify = Fastify()
const data = { text: 'text' }
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
},
root: 'templates'
})
fastify.get('/', (req, reply) => {
reply.view('testdot', data)
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal(body.toString(), engine.process({ path: 'templates', destination: 'out' }).testdot(data))
fastify.close()
})
})
})
test('reply.view with dot engine .dot file should create non-existent destination', t => {
t.plan(2)
const fastify = Fastify()
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
},
options: {
destination: 'non-existent'
}
})
t.teardown(() => rmdirSync('non-existent'))
fastify.get('/', (req, reply) => {
reply.view('testdot')
})
fastify.listen(0, err => {
t.error(err)
t.ok(existsSync('non-existent'))
fastify.close()
})
})
test('reply.view with dot engine .dot file should log WARN if template not found', t => {
t.plan(2)
const splitStream = split(JSON.parse)
splitStream.on('data', (line) => {
t.equal(line.msg, `WARN: no template found in ${join(__dirname, '..')}`)
})
const logger = pino({ level: 'warn' }, splitStream)
const fastify = Fastify({
logger: logger
})
const engine = require('dot')
engine.log = false
t.teardown(() => rmdirSync('empty'))
fastify.register(require('../index'), {
engine: {
dot: engine
},
options: {
destination: 'empty'
}
})
fastify.listen(0, err => {
t.equal(err, err)
fastify.close()
})
})
test('reply.view with dot engine .jst file', t => {
t.plan(6)
const fastify = Fastify()
const data = { text: 'text' }
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
},
root: 'templates'
})
fastify.get('/', (req, reply) => {
reply.view('testjst', data)
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
engine.process(compileOptions)
t.equal(body.toString(), require('../out/testjst')(data))
fastify.close()
})
})
})
test('reply.view with dot engine without data-parameter but defaultContext', t => {
t.plan(6)
const fastify = Fastify()
const data = { text: 'text' }
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
},
defaultContext: data,
root: 'templates'
})
fastify.get('/', (req, reply) => {
reply.view('testdot')
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal(body.toString(), engine.process(compileOptions).testdot(data))
fastify.close()
})
})
})
test('reply.view with dot engine without data-parameter but without defaultContext', t => {
t.plan(6)
const fastify = Fastify()
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
},
root: 'templates'
})
fastify.get('/', (req, reply) => {
reply.view('testdot')
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
engine.process(compileOptions)
t.equal(body.toString(), engine.process(compileOptions).testdot())
fastify.close()
})
})
})
test('reply.view with dot engine with data-parameter and defaultContext', t => {
t.plan(6)
const fastify = Fastify()
const data = { text: 'text' }
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
},
defaultContext: data,
root: 'templates'
})
fastify.get('/', (req, reply) => {
reply.view('testdot', {})
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal(body.toString(), engine.process(compileOptions).testdot(data))
fastify.close()
})
})
})
test('reply.view for dot engine without data-parameter and defaultContext but with reply.locals', t => {
t.plan(6)
const fastify = Fastify()
const localsData = { text: 'text from locals' }
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
},
root: 'templates'
})
fastify.addHook('preHandler', function (request, reply, done) {
reply.locals = localsData
done()
})
fastify.get('/', (req, reply) => {
reply.view('testdot', {})
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal(body.toString(), engine.process(compileOptions).testdot(localsData))
fastify.close()
})
})
})
test('reply.view for dot engine without defaultContext but with reply.locals and data-parameter', t => {
t.plan(6)
const fastify = Fastify()
const localsData = { text: 'text from locals' }
const data = { text: 'text' }
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
},
root: 'templates'
})
fastify.addHook('preHandler', function (request, reply, done) {
reply.locals = localsData
done()
})
fastify.get('/', (req, reply) => {
reply.view('testdot', data)
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal(body.toString(), engine.process(compileOptions).testdot(data))
fastify.close()
})
})
})
test('reply.view for dot engine without data-parameter but with reply.locals and defaultContext', t => {
t.plan(6)
const fastify = Fastify()
const localsData = { text: 'text from locals' }
const defaultContext = { text: 'text' }
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
},
defaultContext,
root: 'templates'
})
fastify.addHook('preHandler', function (request, reply, done) {
reply.locals = localsData
done()
})
fastify.get('/', (req, reply) => {
reply.view('testdot')
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal(body.toString(), engine.process(compileOptions).testdot(localsData))
fastify.close()
})
})
})
test('reply.view for dot engine with data-parameter and reply.locals and defaultContext', t => {
t.plan(6)
const fastify = Fastify()
const localsData = { text: 'text from locals' }
const defaultContext = { text: 'text from context' }
const data = { text: 'text' }
const engine = require('dot')
fastify.register(require('../index'), {
engine: {
dot: engine
},
defaultContext,
root: 'templates'
})
fastify.addHook('preHandler', function (request, reply, done) {
reply.locals = localsData
done()
})
fastify.get('/', (req, reply) => {
reply.view('testdot', data)
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal(body.toString(), engine.process(compileOptions).testdot(data))
fastify.close()
})
})
})
test('fastify.view with dot engine, should throw page missing', t => {
t.plan(3)
const fastify = Fastify()
const engine = require('dot')
engine.log = false
fastify.register(require('../index'), {
engine: {
dot: engine
}
})
fastify.ready(err => {
t.error(err)
fastify.view(null, {}, err => {
t.ok(err instanceof Error)
t.equal(err.message, 'Missing page')
fastify.close()
})
})
})
test('reply.view with dot engine with layout option', t => {
t.plan(6)
const fastify = Fastify()
const engine = require('dot')
const data = { text: 'text' }
fastify.register(require('../index'), {
engine: {
dot: engine
},
root: 'templates',
layout: 'layout'
})
fastify.get('/', (req, reply) => {
reply.view('testdot', data)
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal('header: textfoo text1 <p>foo</p>footer', body.toString())
fastify.close()
})
})
})
test('reply.view with dot engine with layout option on render', t => {
t.plan(6)
const fastify = Fastify()
const engine = require('dot')
const data = { text: 'text' }
fastify.register(require('../index'), {
engine: {
dot: engine
},
root: 'templates'
})
fastify.get('/', (req, reply) => {
reply.view('testdot', data, { layout: 'layout' })
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal('header: textfoo text1 <p>foo</p>footer', body.toString())
fastify.close()
})
})
})
test('reply.view with dot engine with layout option on render', t => {
t.plan(6)
const fastify = Fastify()
const engine = require('dot')
const data = { text: 'text' }
fastify.register(require('../index'), {
engine: {
dot: engine
},
root: 'templates'
})
fastify.get('/', (req, reply) => {
reply.view('testdot', data, { layout: 'layout' })
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(response.headers['content-length'], '' + body.length)
t.equal(response.headers['content-type'], 'text/html; charset=utf-8')
t.equal('header: textfoo text1 <p>foo</p>footer', body.toString())
fastify.close()
})
})
})
test('reply.view should return 500 if layout is missing on render', t => {
t.plan(3)
const fastify = Fastify()
const engine = require('dot')
const data = { text: 'text' }
fastify.register(require('../index'), {
engine: {
dot: engine
},
root: 'templates'
})
fastify.get('/', (req, reply) => {
reply.view('testdot', data, { layout: 'non-existing-layout' })
})
fastify.listen(0, err => {
t.error(err)
sget({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 500)
fastify.close()
})
})
})