diff --git a/lib/app/private/loadHooks.js b/lib/app/private/loadHooks.js index 6013a7f67..d73cdcfb6 100644 --- a/lib/app/private/loadHooks.js +++ b/lib/app/private/loadHooks.js @@ -19,7 +19,7 @@ module.exports = function(sails) { var hookPrototype = hooks[id]; // Allow disabling of hooks by setting them to "false" - if (hookPrototype === false || hooks[id.split('.')[0]] === false) { + if (hookPrototype === false || hookPrototype === 'false' || hooks[id.split('.')[0]] === false) { delete hooks[id]; return; } diff --git a/lib/hooks/moduleloader/index.js b/lib/hooks/moduleloader/index.js index aac59be09..289027826 100644 --- a/lib/hooks/moduleloader/index.js +++ b/lib/hooks/moduleloader/index.js @@ -471,7 +471,7 @@ module.exports = function(sails) { hookName = identity.replace(/^(@.+?\/)?(sails-hook-)?/, ''); } - if (sails.config.hooks[hookName] === false) { + if (sails.config.hooks[hookName] === false || sails.config.hooks[hookName] === 'false') { return memo; } diff --git a/test/integration/hook.3rdparty.test.js b/test/integration/hook.3rdparty.test.js index 5304bbc14..b0352a77e 100644 --- a/test/integration/hook.3rdparty.test.js +++ b/test/integration/hook.3rdparty.test.js @@ -76,6 +76,55 @@ describe('hooks :: ', function() { }); + describe('with hooks.shout set to boolean false', function() { + + var sails; + + before(function(done) { + appHelper.liftQuiet({hooks: {shout: false}}, function(err, _sails) { + if (err) {return done(err);} + sails = _sails; + return done(); + }); + }); + + after(function(done) { + sails.lower(function(){setTimeout(done, 100);}); + }); + + it('should not install a hook into `sails.hooks.shout`', function() { + + assert(_.isUndefined(sails.hooks.shout)); + + }); + + }); + + + describe('with hooks.shout set to the string "false"', function() { + + var sails; + + before(function(done) { + appHelper.liftQuiet({hooks: {shout: "false"}}, function(err, _sails) { + if (err) {return done(err);} + sails = _sails; + return done(); + }); + }); + + after(function(done) { + sails.lower(function(){setTimeout(done, 100);}); + }); + + it('should not install a hook into `sails.hooks.shout`', function() { + + assert(_.isUndefined(sails.hooks.shout)); + + }); + + }); + describe('with hook-level config options', function() { var sails; diff --git a/test/unit/app.initializeHooks.test.js b/test/unit/app.initializeHooks.test.js index 52bf0494b..30276178d 100644 --- a/test/unit/app.initializeHooks.test.js +++ b/test/unit/app.initializeHooks.test.js @@ -44,6 +44,29 @@ describe('app.initializeHooks()', function() { }); }); + describe('with the grunt hook set to boolen false', function() { + var sails = $Sails.load({hooks: {grunt: false}}); + it('should expose hooks on the `sails` global', function() { + sails.hooks.should.be.an.Object; + }); + it('should expose all the core hooks except for Grunt', function() { + var intersection = _.intersection(_.keys(sails.hooks), _.keys(constants.EXPECTED_DEFAULT_HOOKS)); + assert.deepEqual(intersection, _.without(_.keys(constants.EXPECTED_DEFAULT_HOOKS), 'grunt'), 'Missing expected default hooks'); + }); + }); + + describe('with the grunt hook set to the string "false"', function() { + var sails = $Sails.load({hooks: {grunt: "false"}}); + it('should expose hooks on the `sails` global', function() { + sails.hooks.should.be.an.Object; + }); + it('should expose all the core hooks except for Grunt', function() { + var intersection = _.intersection(_.keys(sails.hooks), _.keys(constants.EXPECTED_DEFAULT_HOOKS)); + assert.deepEqual(intersection, _.without(_.keys(constants.EXPECTED_DEFAULT_HOOKS), 'grunt'), 'Missing expected default hooks'); + }); + }); + + describe('configured with a custom hook called `noop`', function() {