identity
Version:
Identity client
221 lines (166 loc) • 5.6 kB
JavaScript
var ActionHero = require("../../actionhero/actionhero.js").actionheroPrototype;
process.env.NODE_ENV = 'test';
var server;
var config = {
clearSql: process.cwd() + '/test/fixtures/sql/clear.sql',
dataSql: process.cwd() + '/test/fixtures/sql/defaults.sql',
databaseConfigFile: process.cwd() + '/config/database'
};
var uses_database = true;
global.users = {};
global.test = {
config: function(options){
config = options;
},
startActionhero: function(done){
this.timeout(15000);
//load the database config
if(!config.database && config.databaseConfigFile){
try{
var db = require(config.databaseConfigFile);
if(db.test){
config.database = db.test.database();
}else{
throw new Error('No TEST database config found!');
}
} catch(e){
// this project does not use any database
uses_database = false;
}
}
if(!server){ //start server
test.clearTables(function(){
server = new ActionHero();
server.start(function(err, api){
global.api = api;
test.insertTestData(api, done);
});
});
}
},
stopActionhero: function(done){
server.stop(done);
},
clearTables: function (callback){
if (uses_database == false){
return callback();
}
test.execSql(config.database, 'clear.sql', callback);
},
insertTestData: function (api, callback){
if (uses_database == false){
return callback();
}
test.execSql(config.database, 'defaults.sql', callback);
},
execSql: function (config, file, callback){
if (uses_database == false){
return callback();
}
var exec = require('child_process').exec;
var database = config.database;
var username = config.user;
var password = config.password;
exec('PGPASSWORD=' + password + ' psql ' + database + ' -U ' + username + ' < test/fixtures/sql/' + file, function(err){
if(err){
if(err.toString().match(/does not exist/)) {
throw new Error(
"Create database " + database + ": \n\n\n" +
"CREATE USER " + username + " with encrypted password '" + password + "';\n" +
"CREATE DATABASE " + database + " WITH OWNER " + username + ";\n\n"
)
}else{
throw new Error(err);
}
}
callback();
});
},
addUser: function(name, config){
if(!config) throw new Error('No user config given!');
if(!config.id) throw new Error('No user.id given!');
if(!config.permissions) throw new Error('No user.permissions given!');
if(!(config.permissions instanceof Array)) throw new Error('user.permissions should be an array!');
if(config.permissions.length > 0 && !config.permissions[0].role_id) throw new Error('No user.permissions[0].role_id given!');
if(config.permissions.length > 0 && !config.permissions[0].values) throw new Error('No user.permissions[0].values given!');
global.users[name] = config;
},
loginAs: function(login){
var self = this;
return {
action: function(actionName, params, callback){
var user = users[login];
var roles = [];
var access_token;
if(user) roles = user.roles;
if(user) access_token = user.access_token;
if(typeof params == 'function'){
callback = params;
params = {};
}
self.action(actionName, params, {user: user, roles: roles, access_token: access_token}, callback);
}
};
},
action: function(actionName, params, connection_options, callback){
if(typeof params == 'function'){
callback = params;
params = {};
connection_options = {};
}
if(typeof connection_options == 'function'){
callback = connection_options;
connection_options = {};
}
var connection = api.specHelper.connection();
connection.params = params;
for(var i in connection_options){
if(connection_options.hasOwnProperty(i)){
connection[i] = connection_options[i];
}
}
api.specHelper.runAction(actionName, connection, callback);
},
insufficientPermissions: function(done){
return function(response){
if(response.error.base){
response.error.base.should.be.eql([api.config.errors.insufficient_permissions]);
response.success.should.be.false;
}else{
response.error.should.be.equal(api.config.errors.insufficient_permissions);
}
//a little bit hacky...
var params = getParamNames(done);
if(params[0] === 'err'){
done();
}else{
done(response);
}
}
},
emptyResult: function(done){
return function(response){
if(typeof response.success === 'boolean'){
response.success.should.be.false;
(response.data === null).should.be.true;
}else{
response.data.should.be.eql([]);
}
//a little bit hacky...
var params = getParamNames(done);
if(params[0] === 'err'){
done();
}else{
done(response);
}
}
}
};
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
function getParamNames(func) {
var fnStr = func.toString().replace(STRIP_COMMENTS, '')
var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(/([^\s,]+)/g)
if(result === null)
result = []
return result
}