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 () {