'use strict' var express = require('..'); var path = require('node:path') var request = require('supertest'); var tmpl = require('./support/tmpl'); describe('res', function(){ describe('.render(name)', function(){ it('should support absolute paths', function(done){ var app = createApp(); app.locals.user = { name: 'tobi' }; app.use(function(req, res){ res.render(path.join(__dirname, 'fixtures', 'user.tmpl')) }); request(app) .get('/') .expect('
tobi
', done); }) it('should support absolute paths with "view engine"', function(done){ var app = createApp(); app.locals.user = { name: 'tobi' }; app.set('view engine', 'tmpl'); app.use(function(req, res){ res.render(path.join(__dirname, 'fixtures', 'user')) }); request(app) .get('/') .expect('tobi
', done); }) it('should error without "view engine" set and file extension to a non-engine module', function (done) { var app = createApp() app.locals.user = { name: 'tobi' } app.use(function (req, res) { res.render(path.join(__dirname, 'fixtures', 'broken.send')) }) request(app) .get('/') .expect(500, /does not provide a view engine/, done) }) it('should error without "view engine" set and no file extension', function (done) { var app = createApp(); app.locals.user = { name: 'tobi' }; app.use(function(req, res){ res.render(path.join(__dirname, 'fixtures', 'user')) }); request(app) .get('/') .expect(500, /No default engine was specified/, done); }) it('should expose app.locals', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; app.use(function(req, res){ res.render('user.tmpl'); }); request(app) .get('/') .expect('tobi
', done); }) it('should expose app.locals with `name` property', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) app.locals.name = 'tobi'; app.use(function(req, res){ res.render('name.tmpl'); }); request(app) .get('/') .expect('tobi
', done); }) it('should support index.This is an email
', done); }) }) describe('when "views" is given', function(){ it('should lookup the file in the path', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures', 'default_layout')) app.use(function(req, res){ res.render('user.tmpl', { user: { name: 'tobi' } }); }); request(app) .get('/') .expect('tobi
', done); }) describe('when array of paths', function(){ it('should lookup the file in the path', function(done){ var app = createApp(); var views = [ path.join(__dirname, 'fixtures', 'local_layout'), path.join(__dirname, 'fixtures', 'default_layout') ] app.set('views', views); app.use(function(req, res){ res.render('user.tmpl', { user: { name: 'tobi' } }); }); request(app) .get('/') .expect('tobi', done); }) it('should lookup in later paths until found', function(done){ var app = createApp(); var views = [ path.join(__dirname, 'fixtures', 'local_layout'), path.join(__dirname, 'fixtures', 'default_layout') ] app.set('views', views); app.use(function(req, res){ res.render('name.tmpl', { name: 'tobi' }); }); request(app) .get('/') .expect('tobi
', done); }) }) }) }) describe('.render(name, option)', function(){ it('should render the template', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) var user = { name: 'tobi' }; app.use(function(req, res){ res.render('user.tmpl', { user: user }); }); request(app) .get('/') .expect('tobi
', done); }) it('should expose app.locals', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; app.use(function(req, res){ res.render('user.tmpl'); }); request(app) .get('/') .expect('tobi
', done); }) it('should expose res.locals', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ res.locals.user = { name: 'tobi' }; res.render('user.tmpl'); }); request(app) .get('/') .expect('tobi
', done); }) it('should give precedence to res.locals over app.locals', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; app.use(function(req, res){ res.locals.user = { name: 'jane' }; res.render('user.tmpl', {}); }); request(app) .get('/') .expect('jane
', done); }) it('should give precedence to res.render() locals over res.locals', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) var jane = { name: 'jane' }; app.use(function(req, res){ res.locals.user = { name: 'tobi' }; res.render('user.tmpl', { user: jane }); }); request(app) .get('/') .expect('jane
', done); }) it('should give precedence to res.render() locals over app.locals', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; var jane = { name: 'jane' }; app.use(function(req, res){ res.render('user.tmpl', { user: jane }); }); request(app) .get('/') .expect('jane
', done); }) }) describe('.render(name, options, fn)', function(){ it('should pass the resulting string', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ var tobi = { name: 'tobi' }; res.render('user.tmpl', { user: tobi }, function (err, html) { html = html.replace('tobi', 'loki'); res.end(html); }); }); request(app) .get('/') .expect('loki
', done); }) }) describe('.render(name, fn)', function(){ it('should pass the resulting string', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ res.locals.user = { name: 'tobi' }; res.render('user.tmpl', function (err, html) { html = html.replace('tobi', 'loki'); res.end(html); }); }); request(app) .get('/') .expect('loki
', done); }) describe('when an error occurs', function(){ it('should pass it to the callback', function(done){ var app = createApp(); app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ res.render('user.tmpl', function (err) { if (err) { res.status(500).send('got error: ' + err.name) } }); }); request(app) .get('/') .expect(500, 'got error: RenderError', done) }) }) }) }) function createApp() { var app = express(); app.engine('.tmpl', tmpl); return app; }