sails
Version:
API-driven framework for building realtime apps, using MVC conventions (based on Express and Socket.io)
366 lines (289 loc) • 9.4 kB
JavaScript
var assert = require('assert');
var Sails = require('../../lib/app');
var async = require('async');
var _ = require('@sailshq/lodash');
describe('sails being lifted and lowered (e.g in a test framework)', function() {
it('should clean up event listeners', function(done) {
// Get a list of all the current listeners on the process.
// Note that Mocha adds some listeners, so these might not all be empty arrays!
var beforeListeners = {
sigusr2: process.listeners('SIGUSR2'),
sigint: process.listeners('SIGINT'),
sigterm: process.listeners('SIGTERM'),
exit: process.listeners('exit')
};
// Lift and lower 15 Sails apps in a row, to simulate a testing environment
async.forEachOfSeries(Array(15), function(undef, i, cb) {
var sailsServer = null;
Sails().lift({
port: 1342,
environment: process.env.TEST_ENV,
log: {
level: 'error'
},
globals: false,
hooks: {
grunt: false,
i18n: false,
session: false
}
}, function(err, sails) {
if (err) {
return cb(err);
}
setTimeout(function() {
sails.lower(function(){setTimeout(cb, 100);});
});
});
}, function(err) {
if (err) {
return done(err);
}
// Check that we have the same # of listeners as before--that is,
// that all listeners that were added when the apps were initialized
// were subsequently removed when they were lowered.
assert.equal(beforeListeners.sigusr2.length,
process.listeners('SIGUSR2').length);
assert.equal(beforeListeners.sigterm.length,
process.listeners('SIGTERM').length);
assert.equal(beforeListeners.exit.length,
process.listeners('exit').length);
assert.equal(beforeListeners.sigint.length,
process.listeners('SIGINT').length);
return done();
});
}); //</should clean up event listeners>
describe('with NODE_ENV set and Sails environment not configured', function() {
var sailsApp;
var originalNodeEnv;
before(function() {
originalNodeEnv = process.env.NODE_ENV;
process.env.NODE_ENV = 'foobar';
});
after(function(done) {
if (_.isUndefined(originalNodeEnv)) {
delete process.env.NODE_ENV;
} else {
process.env.NODE_ENV = originalNodeEnv;
}
if (sailsApp) {
return sailsApp.lower(done);
}
else {
return done();
}
});
it('should change the Sails environment to match NODE_ENV it the Sails environment is not explicitly configured', function(done) {
// Save reference to original NODE_ENV.
var originalNodeEnv = process.env.NODE_ENV;
process.env.NODE_ENV = 'foobar';
// Load `app0` deep in the `'cenote'`
Sails().load({
log: {
level: 'error'
},
globals: false,
hooks: {
grunt: false,
i18n: false,
session: false
}
}, function(err, _sailsApp) {
if (err) { return done(err); }
sailsApp = _sailsApp;
// Assert that NODE_ENV is unchanged.
assert.equal('foobar', process.env.NODE_ENV);
// Assert that Sails environment has been changed to match NODE_ENV
assert.equal('foobar', sailsApp.config.environment);
return done();
});
});
});
describe('with Sails environment configured but no NODE_ENV set', function() {
var sailsApp;
var originalNodeEnv;
before(function() {
originalNodeEnv = process.env.NODE_ENV;
delete process.env.NODE_ENV;
});
after(function(done) {
if (_.isUndefined(originalNodeEnv)) {
delete process.env.NODE_ENV;
} else {
process.env.NODE_ENV = originalNodeEnv;
}
if (sailsApp) {
return sailsApp.lower(done);
}
else {
return done();
}
});
it('should not change the NODE_ENV env variable to match the configured Sails environment, or vice versa', function(done) {
// Load `app0` deep in the `'cenote'`
Sails().load({
environment: 'cenote',
log: {
level: 'error'
},
globals: false,
hooks: {
grunt: false,
i18n: false,
session: false
}
}, function(err, _sailsApp) {
if (err) { return done(err); }
sailsApp = _sailsApp;
// Assert that NODE_ENV is unchanged.
assert(typeof process.env.NODE_ENV === 'undefined');
// Assert that sails config is unchanged.
assert.equal(sailsApp.config.environment, 'cenote');
return done();
});//</app0.load()>
});
});
describe('with both NODE_ENV set and Sails environment configured', function() {
var sailsApp;
var originalNodeEnv;
before(function() {
originalNodeEnv = process.env.NODE_ENV;
process.env.NODE_ENV = 'foobar';
});
after(function(done) {
if (_.isUndefined(originalNodeEnv)) {
delete process.env.NODE_ENV;
} else {
process.env.NODE_ENV = originalNodeEnv;
}
if (sailsApp) {
return sailsApp.lower(done);
}
else {
return done();
}
});
it('should not change the NODE_ENV env variable to match the configured Sails environment, or vice versa', function(done) {
// Load `app0` deep in the `'cenote'`
Sails().load({
environment: 'cenote',
log: {
level: 'error'
},
globals: false,
hooks: {
grunt: false,
i18n: false,
session: false
}
}, function(err, _sailsApp) {
if (err) { return done(err); }
sailsApp = _sailsApp;
// Assert that NODE_ENV is unchanged.
assert.equal('foobar', process.env.NODE_ENV);
// Assert that sails config is unchanged.
assert.equal(sailsApp.config.environment, 'cenote');
return done();
});//</app0.load()>
});
});
describe('with Sails environment set to `production`, and the Node environment is `undefined`', function() {
var sailsApp;
var originalNodeEnv;
before(function() {
originalNodeEnv = process.env.NODE_ENV;
delete process.env.NODE_ENV;
});
after(function(done) {
if (_.isUndefined(originalNodeEnv)) {
delete process.env.NODE_ENV;
} else {
process.env.NODE_ENV = originalNodeEnv;
}
if (sailsApp) {
return sailsApp.lower(done);
}
else {
return done();
}
});
it('should change NODE_ENV to production and log a warning', function(done) {
var debugs = [];
var customLogger = {
level: 'debug',
custom: {
log: function(){},
warn: function(){},
debug: function(msg) {debugs.push(msg);}
},
colors: { warn: '' },
prefixTheme: 'abbreviated'
};
// Load `app0` deep in the `'cenote'`
Sails().load({
environment: 'production',
log: customLogger,
globals: false,
hooks: {
grunt: false,
i18n: false,
session: false,
sockets: false
}
}, function(err, _sailsApp) {
if (err) { return done(err); }
sailsApp = _sailsApp;
// Assert that NODE_ENV is changed.
assert.equal(process.env.NODE_ENV, 'production');
// Assert that sails config is unchanged.
assert.equal(sailsApp.config.environment, 'production');
assert (_.any(debugs, function(debug) {
return debug.indexOf('Detected Sails environment is "production", but NODE_ENV is `undefined`.') > -1;
}), 'Did not log a warning about NODE_ENV being undefined while sails environment is `production`!');
assert (_.any(debugs, function(debug) {
return debug.indexOf('Automatically setting the NODE_ENV environment variable to "production".') > -1;
}), 'Did not log a warning about NODE_ENV being set to `production`!');
return done();
});//</app0.load()>
});
});
describe('with Sails environment set to `production`, and the Node environment is `development`', function() {
var sailsApp;
var originalNodeEnv;
before(function() {
originalNodeEnv = process.env.NODE_ENV;
process.env.NODE_ENV = 'development';
});
after(function(done) {
if (_.isUndefined(originalNodeEnv)) {
delete process.env.NODE_ENV;
} else {
process.env.NODE_ENV = originalNodeEnv;
}
if (sailsApp) {
return sailsApp.lower(done);
}
else {
return done();
}
});
it('should fail to lift sails', function(done) {
// Load `app0` deep in the `'cenote'`
Sails().load({
environment: 'production',
log: {level: 'silent'},
globals: false,
hooks: {
grunt: false,
i18n: false,
session: false,
sockets: false
}
}, function(err, _sailsApp) {
if (!err) { return done(new Error('Sails should have failed to lift!')); }
assert.equal(err.code, 'E_INVALID_NODE_ENV');
return done();
});//</app0.load()>
});
});
});