UNPKG

identity

Version:

Identity client

221 lines (166 loc) 5.6 kB
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 }