sails
Version:
API-driven framework for building realtime apps, using MVC conventions (based on Express and Socket.io)
314 lines (269 loc) • 11.7 kB
JavaScript
/**
* Module dependencies
*/
var util = require('util');
var assert = require('assert');
var tmp = require('tmp');
var _ = require('@sailshq/lodash');
var Filesystem = require('machinepack-fs');
var Sails = require('../../lib').constructor;
tmp.setGracefulCleanup();
/**
* Errors
*/
var Err = {
badResponse: function(response) {
return 'Wrong server response! Response :::\n' + util.inspect(response.body);
}
};
/**
* Tests
*/
describe('blueprints :: ', function() {
describe('actions routes :: ', function() {
describe('when turned on :: ', function() {
var curDir, tmpDir, sailsApp;
before(function(done) {
// Cache the current working directory.
curDir = process.cwd();
// Create a temp directory.
tmpDir = tmp.dirSync({gracefulCleanup: true, unsafeCleanup: true});
// Switch to the temp directory.
process.chdir(tmpDir.name);
(new Sails()).load({
hooks: {
grunt: false, views: false, policies: false, pubsub: false, i18n: false
},
models: {
migrate: 'drop',
schema: true
},
blueprints: {
actions: true,
shortcuts: false,
rest: false
},
log: {level: 'error'},
controllers: {
moduleDefinitions: {
'toplevellegacy/fnaction': function (req, res) { res.send('legacy fn action!'); },
'toplevellegacy/machineaction': { exits: {success: {outputExample: 'abc123'} }, fn: function (inputs, exits) { exits.success('legacy machine action!'); } },
'top-level-standalone-fn': function (req, res) { res.send('top level standalone fn!'); },
'top-level-standalone-machine': { exits: {success: {outputExample: 'abc123'} }, fn: function (inputs, exits) { exits.success('top level standalone machine!'); } },
'somefolder/someotherfolder/nestedlegacy/fnaction': function (req, res) { res.send('nested legacy fn action!'); },
'somefolder/someotherfolder/nestedlegacy/machineaction': { exits: {success: {outputExample: 'abc123'} }, fn: function (inputs, exits) { exits.success('nested legacy machine action!'); } },
'somefolder/someotherfolder/nested-standalone-machine': { exits: {success: {outputExample: 'abc123'} }, fn: function (inputs, exits) { exits.success('nested standalone machine!'); } }
}
}
}, function(err, _sails) {
if (err) { return done(err); }
sailsApp = _sails;
return done();
});
});
after(function(done) {
sailsApp.lower(function() {
process.chdir(curDir);
return done();
});
});
it('should bind a route to \'ALL /toplevellegacy/fnaction\'', function(done) {
sailsApp.request('POST /toplevellegacy/fnaction', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'legacy fn action!');
sailsApp.request('GET /toplevellegacy/fnaction', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'legacy fn action!');
done();
});
});
});
it('should bind a route to \'ALL /toplevellegacy/machineaction\'', function(done) {
sailsApp.request('POST /toplevellegacy/machineaction', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'legacy machine action!');
sailsApp.request('GET /toplevellegacy/machineaction', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'legacy machine action!');
done();
});
});
});
it('should bind a route to \'ALL /top-level-standalone-fn\'', function(done) {
sailsApp.request('POST /top-level-standalone-fn', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'top level standalone fn!');
sailsApp.request('GET /top-level-standalone-fn', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'top level standalone fn!');
done();
});
});
});
it('should bind a route to \'ALL /top-level-standalone-machine\'', function(done) {
sailsApp.request('POST /top-level-standalone-machine', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'top level standalone machine!');
sailsApp.request('GET /top-level-standalone-machine', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'top level standalone machine!');
done();
});
});
});
it('should bind a route to \'ALL /somefolder/someotherfolder/nestedlegacy/fnaction\'', function(done) {
sailsApp.request('POST /somefolder/someotherfolder/nestedlegacy/fnaction', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'nested legacy fn action!');
sailsApp.request('GET /somefolder/someotherfolder/nestedlegacy/fnaction', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'nested legacy fn action!');
done();
});
});
});
it('should bind a route to \'ALL /somefolder/someotherfolder/nestedlegacy/machineaction\'', function(done) {
sailsApp.request('POST /somefolder/someotherfolder/nestedlegacy/machineaction', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'nested legacy machine action!');
sailsApp.request('GET /somefolder/someotherfolder/nestedlegacy/machineaction', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'nested legacy machine action!');
done();
});
});
});
it('should bind a route to \'ALL /somefolder/someotherfolder/nested-standalone-machine\'', function(done) {
sailsApp.request('POST /somefolder/someotherfolder/nested-standalone-machine', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'nested standalone machine!');
sailsApp.request('GET /somefolder/someotherfolder/nested-standalone-machine', {}, function (err, resp, data) {
assert(!err, err);
assert.deepEqual(data, 'nested standalone machine!');
done();
});
});
});
}); // </ describe('when turned on :: ', ... >
describe('when turned off globally', function() {
var curDir, tmpDir, sailsApp;
before(function(done) {
// Cache the current working directory.
curDir = process.cwd();
// Create a temp directory.
tmpDir = tmp.dirSync({gracefulCleanup: true, unsafeCleanup: true});
// Switch to the temp directory.
process.chdir(tmpDir.name);
(new Sails()).load({
hooks: {
grunt: false, views: false, policies: false, pubsub: false, i18n: false
},
models: {
migrate: 'drop',
schema: true
},
blueprints: {
actions: false,
shortcuts: false,
rest: false
},
log: {level: 'error'},
controllers: {
moduleDefinitions: {
'toplevellegacy/fnaction': function (req, res) { res.send('legacy fn action!'); },
'toplevellegacy/machineaction': { exits: {success: {outputExample: 'abc123'} }, fn: function (inputs, exits) { exits.success('legacy machine action!'); } },
'top-level-standalone-fn': function (req, res) { res.send('top level standalone fn!'); },
'top-level-standalone-machine': { exits: {success: {outputExample: 'abc123'} }, fn: function (inputs, exits) { exits.success('top level standalone machine!'); } },
'somefolder/someotherfolder/nestedlegacy/fnaction': function (req, res) { res.send('nested legacy fn action!'); },
'somefolder/someotherfolder/nestedlegacy/machineaction': { exits: {success: {outputExample: 'abc123'} }, fn: function (inputs, exits) { exits.success('nested legacy machine action!'); } },
'somefolder/someotherfolder/nested-standalone-machine': { exits: {success: {outputExample: 'abc123'} }, fn: function (inputs, exits) { exits.success('nested standalone machine!'); } }
}
}
}, function(err, _sails) {
if (err) { return done(err); }
sailsApp = _sails;
return done();
});
});
after(function(done) {
sailsApp.lower(function() {
process.chdir(curDir);
return done();
});
});
it('should not bind a route to \'ALL /toplevellegacy/fnaction\'', function(done) {
sailsApp.request('POST /toplevellegacy/fnaction', {}, function (err, resp, data) {
assert(err);
assert.equal(err.status, 404);
return done();
});
});
it('should bind a route to \'ALL /top-level-standalone-fn\'', function(done) {
sailsApp.request('POST /top-level-standalone-fn', {}, function (err, resp, data) {
assert(err);
assert.equal(err.status, 404);
return done();
});
});
}); // </ describe('when turned off globally :: ', ... >
describe('when turned off for a single controller', function() {
var curDir, tmpDir, sailsApp;
before(function(done) {
// Cache the current working directory.
curDir = process.cwd();
// Create a temp directory.
tmpDir = tmp.dirSync({gracefulCleanup: true, unsafeCleanup: true});
// Switch to the temp directory.
process.chdir(tmpDir.name);
Filesystem.writeSync({
force: true,
destination: 'api/controllers/NoController.js',
string: 'module.exports = { _config: { actions: false }, test: function (req, res) { return res.ok(); } }'
}).execSync();
Filesystem.writeSync({
force: true,
destination: 'api/controllers/YesController.js',
string: 'module.exports = { test: function (req, res) { return res.ok(); } }'
}).execSync();
(new Sails()).load({
hooks: {
grunt: false, views: false, policies: false, pubsub: false, i18n: false
},
models: {
migrate: 'drop',
schema: true
},
blueprints: {
actions: true,
shortcuts: false,
rest: false
},
log: {level: 'error'},
}, function(err, _sails) {
if (err) { return done(err); }
sailsApp = _sails;
return done();
});
});
after(function(done) {
sailsApp.lower(function() {
process.chdir(curDir);
return done();
});
});
it('should not bind a route to \'ALL /no/test\'', function(done) {
sailsApp.request('POST /no/test', {}, function (err, resp, data) {
assert(err);
assert.equal(err.status, 404);
return done();
});
});
it('should bind a route to \'ALL /yes/test\'', function(done) {
sailsApp.request('POST /yes/test', {}, function (err, resp, data) {
assert(!err, err);
done();
});
});
}); // </ describe('for a single controller', ... >
});
});