UNPKG

sails

Version:

API-driven framework for building realtime apps, using MVC conventions (based on Express and Socket.io)

586 lines (455 loc) 20.9 kB
/** * Test dependencies */ var assert = require('assert'); var httpHelper = require('./helpers/httpHelper.js'); var appHelper = require('./helpers/appHelper'); var util = require('util'); var path = require('path'); var fs = require('fs-extra'); var _ = require('@sailshq/lodash'); describe('hooks :: ', function() { var sailsprocess; describe('installing a 3rd-party hook', function() { var appName = 'testApp'; // Before each test, remove the test app's package.json from the require cache, // so that we can change its dependencies on a per-test basis. beforeEach(function() { delete require.cache[path.resolve(__dirname, '../..', appName, 'package.json')]; }); before(function() { appHelper.teardown(); }); describe('into node_modules/sails-hook-shout', function(){ before(function(done) { // Add `sails-hook-shout` as a dependency of the test app. fs.outputFileSync(path.resolve(__dirname, '../..', appName, 'package.json'), '{"dependencies":{"sails-hook-shout":"0.0.0"}}'); // Copy the hook into the test app's node_modules folder. fs.mkdirs(path.resolve(__dirname, '../..', appName, 'node_modules'), function(err) { if (err) {return done(err);} fs.copySync(path.resolve(__dirname, 'fixtures/hooks/installable/shout'), path.resolve(__dirname,'../../testApp/node_modules/sails-hook-shout')); process.chdir(path.resolve(__dirname, '../..', appName)); done(); }); }); after(function() { process.chdir('../'); // Sleep for 500ms--otherwise we get timing errors for this test on Windows setTimeout(function() { appHelper.teardown(); }, 500); }); describe('with default settings', function() { var sails; before(function(done) { appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); after(function(done) { sails.lower(function(){setTimeout(done, 100);}); }); it('should install a hook into `sails.hooks.shout`', function() { assert(sails.hooks.shout); }); it('should use merge the default hook config', function() { assert.equal(sails.config.shout.phrase, 'make it rain'); }); it('should bind a /shout route that responds with the default phrase', function(done) { httpHelper.testRoute('GET', 'shout', function(err, resp, body) { assert.equal(body, 'make it rain'); return done(); }); }); }); 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; before(function(done) { appHelper.liftQuiet({shout: {phrase: 'yolo'}}, function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); after(function(done) { sails.lower(function(){setTimeout(done, 100);}); }); it('should bind a /shout route that responds with the configured phrase', function(done) { httpHelper.testRoute('GET', 'shout', function(err, resp, body) { assert(body === 'yolo'); return done(); }); }); }); describe('setting the config key to `shoutHook`', function() { var sails; before(function(done) { appHelper.liftQuiet({installedHooks: {'sails-hook-shout': {configKey: 'shoutHook'}}, shoutHook: {phrase: 'holla back!'}}, function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); after(function(done) { sails.lower(function(){setTimeout(done, 100);}); }); it('should bind a /shout route that responds with the configured phrase', function(done) { httpHelper.testRoute('GET', 'shout', function(err, resp, body) { assert(body === 'holla back!'); return done(); }); }); }); describe('setting the hook name to `foobar`', function(){ var sails; before(function(done) { appHelper.liftQuiet({installedHooks: {'sails-hook-shout': {name: 'foobar'}}}, function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); after(function(done) { sails.lower(function(){setTimeout(done, 100);}); }); it('should install a hook into `sails.hooks.foobar`', function() { assert(sails.hooks.foobar); }); it('should use merge the default hook config', function() { assert(sails.config.foobar.phrase === 'make it rain', sails.config.foobar.phrase); }); it('should bind a /shout route that responds with the default phrase', function(done) { httpHelper.testRoute('GET', 'shout', function(err, resp, body) { assert(body === 'make it rain'); return done(); }); }); }); describe('setting the hook name to `security` (an existing hook)', function(){ var sails; before(function(done) { appHelper.liftQuiet({installedHooks: {'sails-hook-shout': {name: 'security'}}}, function(err, _sails) { sails = _sails; done(err); }); }); after(function(done) { sails.lower(function(){setTimeout(done, 100);}); }); it('should replace the core `security` hook', function() { assert(sails.hooks.security.isShoutyHook); }); }); }); describe('into node_modules/shouty', function(){ before(function(done) { // Add `shouty` as a dependency of the test app. fs.outputFileSync(path.resolve(__dirname, '../..', appName, 'package.json'), '{"dependencies":{"shouty":"0.0.0"}}'); fs.mkdirs(path.resolve(__dirname, '../..', appName, 'node_modules'), function(err) { if (err) {return done(err);} fs.copySync(path.resolve(__dirname, 'fixtures/hooks/installable/shout'), path.resolve(__dirname,'../../testApp/node_modules/shouty')); var packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname,'../../testApp/node_modules/shouty','package.json'))); packageJson.name = 'shouty'; fs.writeFileSync(path.resolve(__dirname,'../../testApp/node_modules/shouty','package.json'), JSON.stringify(packageJson)); process.chdir(path.resolve(__dirname, '../..', appName)); done(); }); }); after(function(done) { process.chdir('../'); // Sleep for 500ms--otherwise we get timing errors for this test on Windows setTimeout(function() { appHelper.teardown(); return done(); }, 500); }); describe('with default settings', function() { var sails; before(function(done) { appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); after(function(done) { sails.lower(function(){setTimeout(done, 100);}); }); it('should install a hook into `sails.hooks.shouty`', function() { assert(sails.hooks.shouty); }); it('should use merge the default hook config', function() { assert(sails.config.shouty.phrase === 'make it rain', sails.config.shouty.phrase); }); it('should bind a /shout route that responds with the default phrase', function(done) { httpHelper.testRoute('GET', 'shout', function(err, resp, body) { assert(body === 'make it rain'); return done(); }); }); }); describe('with `hookName` set to `security` in the package.json', function() { var sails; before(function(done) { delete require.cache[path.resolve(__dirname,'../../testApp/node_modules/shouty','package.json')]; var packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname,'../../testApp/node_modules/shouty','package.json'))); packageJson.sails.hookName = 'security'; fs.writeFileSync(path.resolve(__dirname,'../../testApp/node_modules/shouty','package.json'), JSON.stringify(packageJson)); appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); after(function(done) { sails.lower(function(){setTimeout(done, 100);}); }); it('should replace the core `security` hook', function() { assert(sails.hooks.security.isShoutyHook); }); }); }); describe('into node_modules/sails-hook-security', function(){ var sails; before(function(done) { // Add `sails-hook-security` as a dependency of the test app. fs.outputFileSync(path.resolve(__dirname, '../..', appName, 'package.json'), '{"dependencies":{"sails-hook-security":"0.0.0"}}'); fs.mkdirs(path.resolve(__dirname, '../..', appName, 'node_modules'), function(err) { if (err) {return done(err);} fs.copySync(path.resolve(__dirname, 'fixtures/hooks/installable/shout'), path.resolve(__dirname,'../../testApp/node_modules/sails-hook-security')); var packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname,'../../testApp/node_modules/sails-hook-security','package.json'))); packageJson.name = 'sails-hook-security'; fs.writeFileSync(path.resolve(__dirname,'../../testApp/node_modules/sails-hook-security','package.json'), JSON.stringify(packageJson)); process.chdir(path.resolve(__dirname, '../..', appName)); appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); }); after(function(done) { sails.lower(function(err) { process.chdir('../'); appHelper.teardown(); return done(err); }); }); it('should replace the core `security` hook', function() { assert(sails.hooks.security.isShoutyHook); }); }); describe('into node_modules/security', function(){ var sails; before(function(done) { // Add `security` as a dependency of the test app. fs.outputFileSync(path.resolve(__dirname, '../..', appName, 'package.json'), '{"dependencies":{"security":"0.0.0"}}'); fs.mkdirs(path.resolve(__dirname, '../..', appName, 'node_modules'), function(err) { if (err) {return done(err);} fs.copySync(path.resolve(__dirname, 'fixtures/hooks/installable/shout'), path.resolve(__dirname,'../../testApp/node_modules/security')); var packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname,'../../testApp/node_modules/security','package.json'))); packageJson.name = 'security'; fs.writeFileSync(path.resolve(__dirname,'../../testApp/node_modules/security','package.json'), JSON.stringify(packageJson)); process.chdir(path.resolve(__dirname, '../..', appName)); appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); }); after(function(done) { sails.lower(function(err) { process.chdir('../'); appHelper.teardown(); return done(err); }); }); it('should replace the core `security` hook', function() { assert(sails.hooks.security.isShoutyHook); }); }); describe('into node_modules/@my-modules/shouty', function(){ describe('with default settings', function() { var sails; before(function(done) { // Add `@my-modules/shouty` as a dependency of the test app. fs.outputFileSync(path.resolve(__dirname, '../..', appName, 'package.json'), '{"dependencies":{"@my-modules/shouty":"0.0.0"}}'); fs.mkdirs(path.resolve(__dirname, '../..', appName, 'node_modules', '@my-modules'), function(err) { if (err) {return done(err);} fs.copySync(path.resolve(__dirname, 'fixtures/hooks/installable/shout'), path.resolve(__dirname,'../../testApp/node_modules/@my-modules/shouty')); var packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname,'../../testApp/node_modules/@my-modules/shouty','package.json'))); packageJson.name = '@my-modules/shouty'; fs.writeFileSync(path.resolve(__dirname,'../../testApp/node_modules/@my-modules/shouty','package.json'), JSON.stringify(packageJson)); process.chdir(path.resolve(__dirname, '../..', appName)); appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); }); after(function(done) { sails.lower(function(err) { process.chdir('../'); appHelper.teardown(); return done(err); }); }); it('should install a hook into `sails.hooks.shouty`', function() { assert(sails.hooks.shouty); }); }); describe('with `hookName` set to `security` in the package.json', function() { var sails; before(function(done) { fs.outputFileSync(path.resolve(__dirname, '../..', appName, 'package.json'), '{"dependencies":{"@my-modules/shouty":"0.0.0"}}'); delete require.cache[path.resolve(__dirname,'../../testApp/node_modules/@my-modules/shouty')]; delete require.cache[path.resolve(__dirname,'../../testApp/node_modules/@my-modules/shouty','package.json')]; fs.mkdirs(path.resolve(__dirname, '../..', appName, 'node_modules', '@my-modules'), function(err) { if (err) {return done(err);} fs.copySync(path.resolve(__dirname, 'fixtures/hooks/installable/shout'), path.resolve(__dirname,'../../testApp/node_modules/@my-modules/shouty')); var packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname,'../../testApp/node_modules/@my-modules/shouty','package.json'))); packageJson.sails.hookName = 'security'; packageJson.name = '@my-modules/shouty'; fs.writeFileSync(path.resolve(__dirname,'../../testApp/node_modules/@my-modules/shouty','package.json'), JSON.stringify(packageJson)); process.chdir(path.resolve(__dirname, '../..', appName)); appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); }); after(function(done) { sails.lower(function(err) { process.chdir('../'); appHelper.teardown(); return done(err); }); }); it('should replace the core `security` hook', function() { assert(sails.hooks.security.isShoutyHook); }); }); }); describe('into node_modules/@my-modules/sails-hook-security', function(){ var sails; before(function(done) { // Add `@my-modules/sails-hook-security` as a dependency of the test app. fs.outputFileSync(path.resolve(__dirname, '../..', appName, 'package.json'), '{"dependencies":{"sails-hook-shout":"0.0.0"}}'); fs.mkdirs(path.resolve(__dirname, '../..', appName, 'node_modules', '@my-modules'), function(err) { if (err) {return done(err);} fs.copySync(path.resolve(__dirname, 'fixtures/hooks/installable/shout'), path.resolve(__dirname,'../../testApp/node_modules/@my-modules/sails-hook-security')); var packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname,'../../testApp/node_modules/@my-modules/sails-hook-security','package.json'))); fs.writeFileSync(path.resolve(__dirname,'../../testApp/node_modules/@my-modules/sails-hook-security','package.json'), JSON.stringify(packageJson)); process.chdir(path.resolve(__dirname, '../..', appName)); appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); }); after(function(done) { sails.lower(function(err) { process.chdir('../'); appHelper.teardown(); return done(err); }); }); it('should replace the core `security` hook', function() { assert(sails.hooks.security.isShoutyHook); }); }); describe('into node_modules/@my-modules/sails-hook-security, with no corresponding package.json entry', function(){ var sails; before(function(done) { fs.mkdirs(path.resolve(__dirname, '../..', appName, 'node_modules', '@my-modules'), function(err) { if (err) {return done(err);} fs.copySync(path.resolve(__dirname, 'fixtures/hooks/installable/shout'), path.resolve(__dirname,'../../testApp/node_modules/@my-modules/sails-hook-security')); var packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname,'../../testApp/node_modules/@my-modules/sails-hook-security','package.json'))); fs.writeFileSync(path.resolve(__dirname,'../../testApp/node_modules/@my-modules/sails-hook-security','package.json'), JSON.stringify(packageJson)); process.chdir(path.resolve(__dirname, '../..', appName)); appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; return done(); }); }); }); after(function(done) { sails.lower(function(err) { process.chdir('../'); appHelper.teardown(); return done(err); }); }); it('should NOT replace the core `security` hook', function() { assert(!sails.hooks.security.isShoutyHook); }); }); describe('with an invalid package.json file', function(){ var sails; before(function(done) { delete require.cache[path.resolve(__dirname,'../../testApp/node_modules/@my-modules/sails-hook-security/package.json')]; fs.mkdirs(path.resolve(__dirname, '../..', appName, 'node_modules', '@my-modules'), function(err) { if (err) {return done(err);} fs.copySync(path.resolve(__dirname, 'fixtures/hooks/installable/shout'), path.resolve(__dirname,'../../testApp/node_modules/@my-modules/sails-hook-security')); fs.outputFileSync(path.resolve(__dirname,'../../testApp/node_modules/@my-modules/sails-hook-security/package.json'), '{"foo":<%=bar%>}'); process.chdir(path.resolve(__dirname, '../..', appName)); return done(); }); }); after(function(done) { sails ? sails.lower(function(err) { process.chdir('../'); appHelper.teardown(); return done(err); }): done(); }); it('should lift without crashing', function(done) { appHelper.liftQuiet(function(err, _sails) { if (err) {return done(err);} sails = _sails; assert(!sails.hooks.security.isShoutyHook); return done(); }); }); }); }); });