diff --git a/lib/index.js b/lib/index.js index 20a021c..8a08a4a 100755 --- a/lib/index.js +++ b/lib/index.js @@ -54,7 +54,8 @@ internals.schema.viewBase = internals.schema.viewOverride.keys({ helpersPath: Joi.string(), isCached: Joi.boolean(), compileMode: Joi.string().valid('sync', 'async'), - defaultExtension: Joi.string() + defaultExtension: Joi.string(), + context: [ Joi.object(), Joi.func() ] }); @@ -101,6 +102,7 @@ exports.Manager = internals.Manager = function (options) { var extensions = Object.keys(engines); Hoek.assert(extensions.length, 'Views manager requires at least one registered extension handler'); + this._context = options.context; this._engines = {}; this._defaultExtension = defaultExtension || (extensions.length === 1 ? extensions[0] : ''); @@ -259,9 +261,17 @@ internals.Manager.prototype.render = function (filename, context, options, callb var self = this; - context = context || {}; options = options || {}; + var defaultContext; + if (typeof this._context === 'function') { + defaultContext = this._context(); + } + else { + defaultContext = this._context ? Hoek.clone(this._context) : {}; + } + context = Hoek.merge(defaultContext, context, true, false); + var engine = null; var fileExtension = Path.extname(filename).slice(1); diff --git a/test/index.js b/test/index.js index 92f06fa..ef78bdf 100755 --- a/test/index.js +++ b/test/index.js @@ -641,6 +641,108 @@ describe('Manager', function () { }); }); + it('renders with a global context object', function (done) { + + var testView = new Vision.Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: { + message: 'default message', + + query: { + test: 'global' + } + } + }); + + testView.render('valid/testContext', null, null, function (err, rendered, config) { + + expect(rendered).to.exist; + expect(rendered).to.contain('

global

'); + expect(rendered).to.contain('

default message

'); + done(); + }); + }); + + it('overrides the global context object with local values', function (done) { + + var testView = new Vision.Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: { + message: 'default message', + + query: { + test: 'global' + } + } + }); + + testView.render('valid/testContext', { message : 'override' }, null, function (err, rendered, config) { + + expect(rendered).to.exist; + expect(rendered).to.contain('

global

'); + expect(rendered).to.contain('

override

'); + done(); + }); + }); + + it('renders with a global context function', function (done) { + + var testView = new Vision.Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: function () { + + return { + message: 'default message', + + query: { + test: 'global' + } + }; + } + }); + + testView.render('valid/testContext', null, null, function (err, rendered, config) { + + expect(rendered).to.exist; + expect(rendered).to.contain('

global

'); + expect(rendered).to.contain('

default message

'); + done(); + }); + }); + + it('overrides the global context function values with local values', function (done) { + + var testView = new Vision.Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: function () { + + return { + message: 'default message', + + query: { + test: 'global' + } + }; + } + }); + + testView.render('valid/testContext', { message : 'override' }, null, function (err, rendered, config) { + + expect(rendered).to.exist; + expect(rendered).to.contain('

global

'); + expect(rendered).to.contain('

override

'); + done(); + }); + }); + it('uses specified default ext', function (done) { var testView = new Vision.Manager({ @@ -1190,6 +1292,84 @@ describe('Manager', function () { done(); }); }); + + it('handles a global context', function (done) { + + var server = new Hapi.Server(); + server.handler('viewTest', Vision.handler); + server._views = new Vision.Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: { + message: 'default message', + + query: { + test: 'global' + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { viewTest: { template: 'valid/testContext' } } }); + server.inject('/', function (res) { + + expect(res.result).to.contain('

global

'); + expect(res.result).to.contain('

default message

'); + done(); + }); + }); + + it('overrides the global context with the default handler context', function (done) { + + var server = new Hapi.Server(); + server.handler('viewTest', Vision.handler); + server._views = new Vision.Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: { + message: 'default message', + + query: { + test: 'global' + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { viewTest: { template: 'valid/testContext' } } }); + server.inject('/?test=yes', function (res) { + + expect(res.result).to.contain('

yes

'); + expect(res.result).to.contain('

default message

'); + done(); + }); + }); + + it('overrides the global and default contexts with a custom handler context', function (done) { + + var server = new Hapi.Server(); + server.handler('viewTest', Vision.handler); + server._views = new Vision.Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: { + message: 'default message', + + query: { + test: 'global' + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { viewTest: { template: 'valid/testContext', context: { message: 'override', query: { test: 'no' } } } } }); + server.inject('/?test=yes', function (res) { + + expect(res.result).to.contain('

no

'); + expect(res.result).to.contain('

override

'); + done(); + }); + }); }); describe('response()', function () {