Major improevements in testing, eventually got rid of a random error that seems to come from an inconsistent persistence state

This commit is contained in:
Dominic Bosch 2014-04-02 15:54:20 +02:00
parent 3dc35827b2
commit 47cabfaa31
22 changed files with 654 additions and 783 deletions

View file

@ -27,7 +27,7 @@ events = require 'events'
###
Module call
-----------
Initializes the HTTP listener and its request handler.
Initializes the Components Manager and constructs a new Event Emitter.
@param {Object} args
###
@ -72,7 +72,7 @@ containing the HTTP response code and a corresponding message.
@param {function} callback
###
exports.processRequest = ( user, oReq, callback ) =>
exports.processRequest = ( user, oReq, callback ) ->
if not oReq.payload
oReq.payload = '{}'
try
@ -88,121 +88,88 @@ exports.processRequest = ( user, oReq, callback ) =>
code: 404
message: 'What do you want from me?'
hasRequiredParams = ( arrParams, oReq ) ->
hasRequiredParams = ( arrParams, oPayload ) ->
answ =
code: 400
message: "Your request didn't contain all necessary fields! id and params required"
return answ for param in arrParams when not oReq[param]
return answ for param in arrParams when not oPayload[param]
answ.code = 200
answ.message = 'All required properties found'
answ
getModules = ( user, oPayload, dbMod, callback ) ->
dbMod.getAvailableModuleIds user.username, ( err, arrNames ) ->
oRes = {}
answReq = () ->
callback
code: 200
message: JSON.stringify oRes
sem = arrNames.length
if sem is 0
answReq()
else
fGetFunctions = ( id ) =>
dbMod.getModule id, ( err, oModule ) =>
if oModule
oRes[id] = JSON.parse oModule.functions
if --sem is 0
answReq()
fGetFunctions id for id in arrNames
getModuleParams = ( user, oPayload, dbMod, callback ) ->
answ = hasRequiredParams [ 'id' ], oPayload
if answ.code isnt 200
callback answ
else
dbMod.getModuleParams oPayload.id, ( err, oPayload ) ->
answ.message = oPayload
callback answ
forgeModule = ( user, oPayload, dbMod, callback ) ->
answ = hasRequiredParams [ 'id', 'params', 'lang', 'data' ], oPayload
if answ.code isnt 200
callback answ
else
dbMod.getModule oPayload.id, ( err, mod ) =>
if mod
answ.code = 409
answ.message = 'Event Poller module name already existing: ' + oPayload.id
else
src = oPayload.data
cm = dynmod.compileString src, oPayload.id, {}, oPayload.lang
answ = cm.answ
if answ.code is 200
funcs = []
funcs.push name for name, id of cm.module
@log.info "CM | Storing new module with functions #{ funcs }"
answ.message =
"Event Poller module successfully stored! Found following function(s): #{ funcs }"
oPayload.functions = JSON.stringify funcs
dbMod.storeModule user.username, oPayload
if oPayload.public is 'true'
dbMod.publish oPayload.id
callback answ
commandFunctions =
forge_event_poller: ( user, oReq, cb ) =>
answ = hasRequiredParams [ 'id', 'params', 'lang', 'data' ], oReq
if answ.code isnt 200
cb answ
else
db.eventPollers.getModule oReq.id, ( err, mod ) =>
if mod
answ.code = 409
answ.message = 'Event Poller module name already existing: ' + oReq.id
else
src = oReq.data
cm = dynmod.compileString src, oReq.id, {}, oReq.lang
answ = cm.answ
if answ.code is 200
events = []
events.push name for name, id of cm.module
@log.info "CM | Storing new eventpoller with events #{ events }"
answ.message =
"Event Poller module successfully stored! Found following event(s): #{ events }"
oReq.events = JSON.stringify events
db.eventPollers.storeModule oReq.id, user.username, oReq
if oReq.public is 'true'
db.eventPollers.publish oReq.id
cb answ
get_event_pollers: ( user, oPayload, callback ) ->
getModules user, oPayload, db.eventPollers, callback
get_event_pollers: ( user, oReq, cb ) ->
db.eventPollers.getAvailableModuleIds user.username, ( err, arrNames ) ->
oRes = {}
answReq = () ->
cb
code: 200
message: oRes
sem = arrNames.length
if sem is 0
answReq()
else
fGetEvents = ( id ) ->
db.eventPollers.getModule id, ( err, oModule ) ->
oRes[id] = oModule.events
if --sem is 0
answReq()
fGetEvents id for id in arrNames
get_action_invokers: ( user, oPayload, callback ) ->
getModules user, oPayload, db.actionInvokers, callback
get_event_poller_params: ( user, oReq, cb ) ->
answ = hasRequiredParams [ 'id' ], oReq
if answ.code isnt 200
cb answ
else
db.eventPollers.getModuleParams oReq.id, ( err, oReq ) ->
answ.message = oReq
cb answ
get_event_poller_params: ( user, oPayload, callback ) ->
getModuleParams user, oPayload, db.eventPollers, callback
get_action_invoker_params: ( user, oPayload, callback ) ->
getModuleParams user, oPayload, db.actionInvokers, callback
forge_event_poller: ( user, oPayload, callback ) ->
forgeModule user, oPayload, db.eventPollers, callback
forge_action_invoker: ( user, oPayload, callback ) ->
forgeModule user, oPayload, db.actionInvokers, callback
get_action_invokers: ( user, oReq, cb ) ->
db.actionInvokers.getAvailableModuleIds user.username, ( err, arrNames ) ->
oRes = {}
answReq = () ->
cb
code: 200
message: oRes
sem = arrNames.length
if sem is 0
answReq()
else
fGetActions = ( id ) ->
db.actionInvokers.getModule id, ( err, oModule ) ->
oRes[id] = oModule.actions
if --sem is 0
answReq()
fGetActions id for id in arrNames
get_action_invoker_params: ( user, oReq, cb ) ->
answ = hasRequiredParams [ 'id' ], oReq
if answ.code isnt 200
cb answ
else
db.actionInvokers.getModuleParams oReq.id, ( err, oReq ) ->
answ.message = oReq
cb answ
forge_action_invoker: ( user, oReq, cb ) =>
answ = hasRequiredParams [ 'id', 'params', 'lang', 'data' ], oReq
if answ.code isnt 200
cb answ
else
db.actionInvokers.getModule oReq.id, ( err, mod ) =>
if mod
answ.code = 409
answ.message = 'Action Invoker module name already existing: ' + oReq.id
else
src = oReq.data
cm = dynmod.compileString src, oReq.id, {}, oReq.lang
answ = cm.answ
if answ.code is 200
actions = []
actions.push name for name, id of cm.module
@log.info "CM | Storing new eventpoller with actions #{ actions }"
answ.message =
"Action Invoker module successfully stored! Found following action(s): #{ actions }"
oReq.actions = JSON.stringify actions
db.actionInvokers.storeModule oReq.id, user.username, oReq
if oReq.public is 'true'
db.actionInvokers.publish oReq.id
cb answ
get_rules: ( user, oReq, cb ) ->
get_rules: ( user, oPayload, callback ) ->
console.log 'CM | Implement get_rules'
# A rule needs to be in following format:
@ -210,41 +177,32 @@ commandFunctions =
# - event
# - conditions
# - actions
forge_rule: ( user, oReq, cb ) =>
console.log oReq
db.getRule oReq.id, ( err, oExisting ) =>
if oExisting isnt null
answ =
code: 409
message: 'Rule name already existing!'
else
if not oReq.id or not oReq.event or
not oReq.conditions or not oReq.actions
forge_rule: ( user, oPayload, callback ) =>
answ = hasRequiredParams [ 'id', 'event', 'conditions', 'actions' ], oPayload
if answ.code isnt 200
callback answ
else
db.getRule oPayload.id, ( err, oExisting ) =>
if oExisting isnt null
answ =
code: 400
message: 'Missing properties in rule!'
code: 409
message: 'Rule name already existing!'
else
try
rule =
id: oReq.id
event: oReq.event
conditions: JSON.parse oReq.conditions
actions: JSON.parse oReq.actions
strRule = JSON.stringify rule
db.storeRule rule.id, strRule
db.linkRule rule.id, user.username
db.activateRule rule.id, user.username
if oReq.event_params
db.eventPollers.storeUserParams ep.module, user.username, oReq.event_params
arrParams = JSON.parse oReq.action_params
db.actionInvokers.storeUserParams id, user.username, JSON.stringify params for id, params of arrParams
@ee.emit 'newRule', strRule
answ =
code: 200
message: 'Rule stored and activated!'
catch err
answ =
code: 400
message: 'bad bad request...'
console.log err
cb answ
rule =
id: oPayload.id
event: oPayload.event
conditions: oPayload.conditions
actions: oPayload.actions
strRule = JSON.stringify rule
db.storeRule rule.id, strRule
db.linkRule rule.id, user.username
db.activateRule rule.id, user.username
if oPayload.event_params
db.eventPollers.storeUserParams ep.module, user.username, oPayload.event_params
arrParams = oPayload.action_params
db.actionInvokers.storeUserParams id, user.username, JSON.stringify params for id, params of arrParams
@ee.emit 'newRule', strRule
answ =
code: 200
message: 'Rule stored and activated!'
callback answ

View file

@ -52,7 +52,7 @@ exports.compileString = ( src, id, params, lang ) =>
err.location.first_line
#FIXME not log but debug module is required to provide information to the user
sandbox =
id: id
id: id #TODO the ID needs to be a combination of the module id and the user name
params: params
needle: needle
log: console.log

View file

@ -40,6 +40,7 @@ Initializes the DB connection with the given `db-port` property in the `args` ob
exports = module.exports = ( args ) =>
if not @db
#TODO we need to have a secure concept here, private keys per user
#FIXME get rid of crpto
if not args[ 'db-port' ]
args[ 'db-port' ] = 6379
@log = args.logger
@ -247,18 +248,18 @@ class IndexedModules
###
@private storeModule( *mId, userId, data* )
@param {String} mId
Stores a module and links it to the user.
@private storeModule( *userId, oModule* )
@param {String} userId
@param {object} data
@param {object} oModule
###
storeModule: ( mId, userId, data ) =>
@log.info "DB | (IdxedMods) #{ @setname }.storeModule( #{ mId }, #{ userId }, data )"
@db.sadd "#{ @setname }s", mId,
replyHandler "sadd '#{ mId }' to '#{ @setname }'"
@db.hmset "#{ @setname }:#{ mId }", data,
replyHandler "hmset properties in hash '#{ @setname }:#{ mId }'"
@linkModule mId, userId
storeModule: ( userId, oModule ) =>
@log.info "DB | (IdxedMods) #{ @setname }.storeModule( #{ userId }, oModule )"
@db.sadd "#{ @setname }s", oModule.id,
replyHandler "sadd '#{ oModule.id }' to '#{ @setname }'"
@db.hmset "#{ @setname }:#{ oModule.id }", oModule,
replyHandler "hmset properties in hash '#{ @setname }:#{ oModule.id }'"
@linkModule oModule.id, userId
#TODO add testing
linkModule: ( mId, userId ) =>

View file

@ -65,7 +65,6 @@ objects.*
@public handleEvent( *req, resp* )
###
exports.handleEvent = ( req, resp ) ->
console.log 'handleEvent'
body = ''
req.on 'data', ( data ) ->
body += data

View file

@ -10,7 +10,7 @@ Components Manager
(function() {
var commandFunctions, db, dynmod, events, exports, fs, hasRequiredParams, path, vm,
var commandFunctions, db, dynmod, events, exports, forgeModule, fs, getModuleParams, getModules, hasRequiredParams, path, vm,
_this = this;
db = require('./persistence');
@ -28,7 +28,7 @@ Components Manager
/*
Module call
-----------
Initializes the HTTP listener and its request handler.
Initializes the Components Manager and constructs a new Event Emitter.
@param {Object} args
*/
@ -110,7 +110,7 @@ Components Manager
}
};
hasRequiredParams = function(arrParams, oReq) {
hasRequiredParams = function(arrParams, oPayload) {
var answ, param, _i, _len;
answ = {
code: 400,
@ -118,7 +118,7 @@ Components Manager
};
for (_i = 0, _len = arrParams.length; _i < _len; _i++) {
param = arrParams[_i];
if (!oReq[param]) {
if (!oPayload[param]) {
return answ;
}
}
@ -127,219 +127,155 @@ Components Manager
return answ;
};
commandFunctions = {
forge_event_poller: function(user, oReq, cb) {
var answ;
answ = hasRequiredParams(['id', 'params', 'lang', 'data'], oReq);
if (answ.code !== 200) {
return cb(answ);
} else {
return db.eventPollers.getModule(oReq.id, function(err, mod) {
var cm, id, name, src, _ref;
if (mod) {
answ.code = 409;
answ.message = 'Event Poller module name already existing: ' + oReq.id;
} else {
src = oReq.data;
cm = dynmod.compileString(src, oReq.id, {}, oReq.lang);
answ = cm.answ;
if (answ.code === 200) {
events = [];
_ref = cm.module;
for (name in _ref) {
id = _ref[name];
events.push(name);
}
_this.log.info("CM | Storing new eventpoller with events " + events);
answ.message = "Event Poller module successfully stored! Found following event(s): " + events;
oReq.events = JSON.stringify(events);
db.eventPollers.storeModule(oReq.id, user.username, oReq);
if (oReq["public"] === 'true') {
db.eventPollers.publish(oReq.id);
}
}
}
return cb(answ);
getModules = function(user, oPayload, dbMod, callback) {
return dbMod.getAvailableModuleIds(user.username, function(err, arrNames) {
var answReq, fGetFunctions, id, oRes, sem, _i, _len, _results,
_this = this;
oRes = {};
answReq = function() {
return callback({
code: 200,
message: JSON.stringify(oRes)
});
}
},
get_event_pollers: function(user, oReq, cb) {
return db.eventPollers.getAvailableModuleIds(user.username, function(err, arrNames) {
var answReq, fGetEvents, id, oRes, sem, _i, _len, _results;
oRes = {};
answReq = function() {
return cb({
code: 200,
message: oRes
};
sem = arrNames.length;
if (sem === 0) {
return answReq();
} else {
fGetFunctions = function(id) {
return dbMod.getModule(id, function(err, oModule) {
if (oModule) {
oRes[id] = JSON.parse(oModule.functions);
}
if (--sem === 0) {
return answReq();
}
});
};
sem = arrNames.length;
if (sem === 0) {
return answReq();
} else {
fGetEvents = function(id) {
return db.eventPollers.getModule(id, function(err, oModule) {
oRes[id] = oModule.events;
if (--sem === 0) {
return answReq();
}
});
};
_results = [];
for (_i = 0, _len = arrNames.length; _i < _len; _i++) {
id = arrNames[_i];
_results.push(fGetEvents(id));
}
return _results;
_results = [];
for (_i = 0, _len = arrNames.length; _i < _len; _i++) {
id = arrNames[_i];
_results.push(fGetFunctions(id));
}
});
},
get_event_poller_params: function(user, oReq, cb) {
var answ;
answ = hasRequiredParams(['id'], oReq);
if (answ.code !== 200) {
return cb(answ);
} else {
return db.eventPollers.getModuleParams(oReq.id, function(err, oReq) {
answ.message = oReq;
return cb(answ);
});
return _results;
}
},
get_action_invokers: function(user, oReq, cb) {
return db.actionInvokers.getAvailableModuleIds(user.username, function(err, arrNames) {
var answReq, fGetActions, id, oRes, sem, _i, _len, _results;
oRes = {};
answReq = function() {
return cb({
code: 200,
message: oRes
});
};
sem = arrNames.length;
if (sem === 0) {
return answReq();
} else {
fGetActions = function(id) {
return db.actionInvokers.getModule(id, function(err, oModule) {
oRes[id] = oModule.actions;
if (--sem === 0) {
return answReq();
}
});
};
_results = [];
for (_i = 0, _len = arrNames.length; _i < _len; _i++) {
id = arrNames[_i];
_results.push(fGetActions(id));
}
return _results;
}
});
},
get_action_invoker_params: function(user, oReq, cb) {
var answ;
answ = hasRequiredParams(['id'], oReq);
if (answ.code !== 200) {
return cb(answ);
} else {
return db.actionInvokers.getModuleParams(oReq.id, function(err, oReq) {
answ.message = oReq;
return cb(answ);
});
}
},
forge_action_invoker: function(user, oReq, cb) {
var answ;
answ = hasRequiredParams(['id', 'params', 'lang', 'data'], oReq);
if (answ.code !== 200) {
return cb(answ);
} else {
return db.actionInvokers.getModule(oReq.id, function(err, mod) {
var actions, cm, id, name, src, _ref;
if (mod) {
answ.code = 409;
answ.message = 'Action Invoker module name already existing: ' + oReq.id;
} else {
src = oReq.data;
cm = dynmod.compileString(src, oReq.id, {}, oReq.lang);
answ = cm.answ;
if (answ.code === 200) {
actions = [];
_ref = cm.module;
for (name in _ref) {
id = _ref[name];
actions.push(name);
}
_this.log.info("CM | Storing new eventpoller with actions " + actions);
answ.message = "Action Invoker module successfully stored! Found following action(s): " + actions;
oReq.actions = JSON.stringify(actions);
db.actionInvokers.storeModule(oReq.id, user.username, oReq);
if (oReq["public"] === 'true') {
db.actionInvokers.publish(oReq.id);
}
}
}
return cb(answ);
});
}
},
get_rules: function(user, oReq, cb) {
return console.log('CM | Implement get_rules');
},
forge_rule: function(user, oReq, cb) {
console.log(oReq);
return db.getRule(oReq.id, function(err, oExisting) {
var answ, arrParams, id, params, rule, strRule;
if (oExisting !== null) {
answ = {
code: 409,
message: 'Rule name already existing!'
};
} else {
if (!oReq.id || !oReq.event || !oReq.conditions || !oReq.actions) {
answ = {
code: 400,
message: 'Missing properties in rule!'
};
} else {
try {
rule = {
id: oReq.id,
event: oReq.event,
conditions: JSON.parse(oReq.conditions),
actions: JSON.parse(oReq.actions)
};
strRule = JSON.stringify(rule);
db.storeRule(rule.id, strRule);
db.linkRule(rule.id, user.username);
db.activateRule(rule.id, user.username);
if (oReq.event_params) {
db.eventPollers.storeUserParams(ep.module, user.username, oReq.event_params);
}
arrParams = JSON.parse(oReq.action_params);
for (id in arrParams) {
params = arrParams[id];
db.actionInvokers.storeUserParams(id, user.username, JSON.stringify(params));
}
_this.ee.emit('newRule', strRule);
answ = {
code: 200,
message: 'Rule stored and activated!'
};
} catch (_error) {
err = _error;
answ = {
code: 400,
message: 'bad bad request...'
};
console.log(err);
}
}
}
return cb(answ);
});
};
getModuleParams = function(user, oPayload, dbMod, callback) {
var answ;
answ = hasRequiredParams(['id'], oPayload);
if (answ.code !== 200) {
return callback(answ);
} else {
return dbMod.getModuleParams(oPayload.id, function(err, oPayload) {
answ.message = oPayload;
return callback(answ);
});
}
};
forgeModule = function(user, oPayload, dbMod, callback) {
var answ,
_this = this;
answ = hasRequiredParams(['id', 'params', 'lang', 'data'], oPayload);
if (answ.code !== 200) {
return callback(answ);
} else {
return dbMod.getModule(oPayload.id, function(err, mod) {
var cm, funcs, id, name, src, _ref;
if (mod) {
answ.code = 409;
answ.message = 'Event Poller module name already existing: ' + oPayload.id;
} else {
src = oPayload.data;
cm = dynmod.compileString(src, oPayload.id, {}, oPayload.lang);
answ = cm.answ;
if (answ.code === 200) {
funcs = [];
_ref = cm.module;
for (name in _ref) {
id = _ref[name];
funcs.push(name);
}
_this.log.info("CM | Storing new module with functions " + funcs);
answ.message = "Event Poller module successfully stored! Found following function(s): " + funcs;
oPayload.functions = JSON.stringify(funcs);
dbMod.storeModule(user.username, oPayload);
if (oPayload["public"] === 'true') {
dbMod.publish(oPayload.id);
}
}
}
return callback(answ);
});
}
};
commandFunctions = {
get_event_pollers: function(user, oPayload, callback) {
return getModules(user, oPayload, db.eventPollers, callback);
},
get_action_invokers: function(user, oPayload, callback) {
return getModules(user, oPayload, db.actionInvokers, callback);
},
get_event_poller_params: function(user, oPayload, callback) {
return getModuleParams(user, oPayload, db.eventPollers, callback);
},
get_action_invoker_params: function(user, oPayload, callback) {
return getModuleParams(user, oPayload, db.actionInvokers, callback);
},
forge_event_poller: function(user, oPayload, callback) {
return forgeModule(user, oPayload, db.eventPollers, callback);
},
forge_action_invoker: function(user, oPayload, callback) {
return forgeModule(user, oPayload, db.actionInvokers, callback);
},
get_rules: function(user, oPayload, callback) {
return console.log('CM | Implement get_rules');
},
forge_rule: function(user, oPayload, callback) {
var answ;
answ = hasRequiredParams(['id', 'event', 'conditions', 'actions'], oPayload);
if (answ.code !== 200) {
return callback(answ);
} else {
return db.getRule(oPayload.id, function(err, oExisting) {
var arrParams, id, params, rule, strRule;
if (oExisting !== null) {
answ = {
code: 409,
message: 'Rule name already existing!'
};
} else {
rule = {
id: oPayload.id,
event: oPayload.event,
conditions: oPayload.conditions,
actions: oPayload.actions
};
strRule = JSON.stringify(rule);
db.storeRule(rule.id, strRule);
db.linkRule(rule.id, user.username);
db.activateRule(rule.id, user.username);
if (oPayload.event_params) {
db.eventPollers.storeUserParams(ep.module, user.username, oPayload.event_params);
}
arrParams = oPayload.action_params;
for (id in arrParams) {
params = arrParams[id];
db.actionInvokers.storeUserParams(id, user.username, JSON.stringify(params));
}
_this.ee.emit('newRule', strRule);
answ = {
code: 200,
message: 'Rule stored and activated!'
};
}
return callback(answ);
});
}
}
};
}).call(this);

View file

@ -328,18 +328,18 @@ Persistence
};
/*
@private storeModule( *mId, userId, data* )
@param {String} mId
Stores a module and links it to the user.
@private storeModule( *userId, oModule* )
@param {String} userId
@param {object} data
@param {object} oModule
*/
IndexedModules.prototype.storeModule = function(mId, userId, data) {
this.log.info("DB | (IdxedMods) " + this.setname + ".storeModule( " + mId + ", " + userId + ", data )");
this.db.sadd("" + this.setname + "s", mId, replyHandler("sadd '" + mId + "' to '" + this.setname + "'"));
this.db.hmset("" + this.setname + ":" + mId, data, replyHandler("hmset properties in hash '" + this.setname + ":" + mId + "'"));
return this.linkModule(mId, userId);
IndexedModules.prototype.storeModule = function(userId, oModule) {
this.log.info("DB | (IdxedMods) " + this.setname + ".storeModule( " + userId + ", oModule )");
this.db.sadd("" + this.setname + "s", oModule.id, replyHandler("sadd '" + oModule.id + "' to '" + this.setname + "'"));
this.db.hmset("" + this.setname + ":" + oModule.id, oModule, replyHandler("hmset properties in hash '" + this.setname + ":" + oModule.id + "'"));
return this.linkModule(oModule.id, userId);
};
IndexedModules.prototype.linkModule = function(mId, userId) {

View file

@ -70,7 +70,6 @@ Request Handler
exports.handleEvent = function(req, resp) {
var body;
console.log('handleEvent');
body = '';
req.on('data', function(data) {
return body += data;

View file

@ -4,7 +4,9 @@
"event": "test_1",
"payload": {
"property": "test_1",
"nestedProperty": "really nested"
"nestedProperty": {
"more": "really nested"
}
}
},
"eventTwo":{
@ -12,13 +14,21 @@
}
},
"eps": {
"ep1": {
"code": "unit-test event poller 1 content",
"reqparams": "[param11,param12]"
"epOne": {
"id":"epOne",
"lang":"0",
"data":"\n#\n# EmailYak EVENT POLLER\n#\n# Requires user params:\n# - apikey: The user's EmailYak API key\n#\n\nurl = 'https://api.emailyak.com/v1/' + params.apikey + '/json/get/new/email/'\n\nexports.newMail = ( pushEvent ) ->\n needle.get url, ( err, resp, body ) ->\n if not err and resp.statusCode is 200\n mails = JSON.parse( body ).Emails\n pushEvent mail for mail in mails\n else\n log.error 'Error in EmailYak EM newMail: ' + err.message\n\n",
"public":"false",
"params":"[\"apikey\"]",
"functions":"[\"newMail\"]"
},
"ep2": {
"code": "unit-test event poller 2 content",
"reqparams": "[param21,param22]"
"epTwo": {
"id":"epTwo",
"lang":"0",
"data":"\nurl = 'https://api.emailyak.com/v1/' + params.firstparam + '/json/get/new/email/'\n\nexports.newEvent = ( pushEvent ) ->\n needle.get url, ( err, resp, body ) ->\n if not err and resp.statusCode is 200\n mails = JSON.parse( body ).Emails\n pushEvent mail for mail in mails\n else\n log.error 'Error in EmailYak EM newMail: ' + err.message\n\nexports.randomNess = ( pushEvent ) ->\n console.log 'test runs: ' + params.secondparam\n",
"public":"true",
"params":"[\"firstparam\",\"secondparam\"]",
"functions":"[\"newEvent\",\"randomNess\"]"
}
},
"rules": {

View file

@ -10,8 +10,8 @@ catch err
console.log 'Error fetching standard objects file: ' + err.message
logger = require path.join '..', 'js-coffee', 'logging'
log = logger.getLogger
nolog: true
log = logger.getLogger()
# nolog: true
cm = require path.join '..', 'js-coffee', 'components-manager'
opts =
@ -21,100 +21,96 @@ cm opts
db = require path.join '..', 'js-coffee', 'persistence'
db opts
oUser = objects.users.userOne
oRuleOne = objects.rules.ruleOne
oRuleTwo = objects.rules.ruleTwo
exports.testEmptyPayload = ( test ) =>
test.expect 1
exports.tearDown = ( cb ) ->
db.deleteRule oRuleOne.id
db.deleteRule oRuleTwo.id
cb()
oUser = objects.users.userOne
request =
command: 'get_event_pollers'
exports.requestProcessing =
testEmptyPayload: ( test ) =>
test.expect 1
cm.processRequest oUser, request, ( answ ) =>
test.equals 200, answ.code, 'testListener failed: ' + answ.message
test.done()
request =
command: 'get_event_pollers'
cm.processRequest oUser, request, ( answ ) =>
test.strictEqual 200, answ.code, 'Empty payload did not return 200'
test.done()
testCorruptPayload: ( test ) =>
test.expect 1
request =
command: 'get_event_pollers'
payload: 'no-json'
cm.processRequest oUser, request, ( answ ) =>
test.strictEqual 404, answ.code, 'Corrupt payload did not return 404'
test.done()
exports.testListener = ( test ) =>
test.expect 2
oUser = objects.users.userOne
oRuleOne = objects.rules.ruleOne
oRuleTwo = objects.rules.ruleTwo
db.storeRule 'test-cm-rule', JSON.stringify oRuleOne
db.storeRule oRuleOne.id, JSON.stringify oRuleOne
request =
command: 'forge_rule'
payload: JSON.stringify oRuleTwo
cm.addListener 'newRule', ( evt ) =>
console.log 'got new rule!'
test.deepEqual evt, oRuleTwo, 'Event is not the same!'
try
newRule = JSON.parse evt
catch err
test.ok false, 'Failed to parse the newRule event'
test.deepEqual newRule, oRuleTwo, 'New Rule is not the same!'
test.done()
console.log 'new rule listener added'
cm.addListener 'init', ( evt ) =>
test.deepEqual evt, oRuleOne, 'Event is not the same!'
console.log 'got and checked init'
try
initRule = JSON.parse evt
catch err
test.ok false, 'Failed to parse the newRule event'
test.deepEqual initRule, oRuleOne, 'Init Rule is not the same!'
cm.processRequest oUser, request, ( answ ) =>
console.log answ
if answ.code isnt 200
test.ok false, 'testListener failed: ' + answ.message
fWaitForInit = ->
cm.processRequest oUser, request, ( answ ) =>
if answ.code isnt 200
test.ok false, 'testListener failed: ' + answ.message
test.done()
setTimeout fWaitForInit, 200
exports.moduleHandling =
testGetModules: ( test ) ->
test.expect 2
oModule = objects.eps.epOne
db.eventPollers.storeModule oUser.username, oModule
request =
command: 'get_event_pollers'
cm.processRequest oUser, request, ( answ ) =>
test.strictEqual 200, answ.code, 'GetModules failed...'
oExpected = {}
oExpected[oModule.id] = JSON.parse oModule.functions
test.strictEqual JSON.stringify(oExpected), answ.message,
'GetModules retrieved modules is not what we expected'
console.log answ
test.done()
console.log 'init listener added'
# testGetModuleParams: ( test ) ->
# test.expect 1
exports.testListener = ( test ) =>
test.expect 2
oUser = objects.users.userOne
oRuleOne = objects.rules.ruleOne
oRuleTwo = objects.rules.ruleTwo
db.storeRule 'test-cm-rule', JSON.stringify oRuleOne
request =
command: 'forge_rule'
payload: JSON.stringify oRuleTwo
cm.addListener 'newRule', ( evt ) =>
console.log 'got new rule!'
test.deepEqual evt, oRuleTwo, 'Event is not the same!'
test.done()
console.log 'new rule listener added'
cm.addListener 'init', ( evt ) =>
test.deepEqual evt, oRuleOne, 'Event is not the same!'
console.log 'got and checked init'
cm.processRequest oUser, request, ( answ ) =>
console.log answ
if answ.code isnt 200
test.ok false, 'testListener failed: ' + answ.message
test.done()
console.log 'init listener added'
exports.testListener = ( test ) =>
test.expect 2
oUser = objects.users.userOne
oRuleOne = objects.rules.ruleOne
oRuleTwo = objects.rules.ruleTwo
db.storeRule 'test-cm-rule', JSON.stringify oRuleOne
request =
command: 'forge_rule'
payload: JSON.stringify oRuleTwo
cm.addListener 'newRule', ( evt ) =>
console.log 'got new rule!'
test.deepEqual evt, oRuleTwo, 'Event is not the same!'
test.done()
console.log 'new rule listener added'
cm.addListener 'init', ( evt ) =>
test.deepEqual evt, oRuleOne, 'Event is not the same!'
console.log 'got and checked init'
cm.processRequest oUser, request, ( answ ) =>
console.log answ
if answ.code isnt 200
test.ok false, 'testListener failed: ' + answ.message
test.done()
console.log 'init listener added'
# oModule = objects.eps.epOne
# db.eventPollers.storeModule oUser.username, oModule
# request =
# command: 'get_event_pollers'
# cm.processRequest oUser, request, ( answ ) =>
# test.strictEqual 200, answ.code, 'Empty payload did not return 200'
# console.log answ
# test.done()

View file

@ -1,46 +1,43 @@
path = require 'path'
logger = require path.join '..', 'js-coffee', 'logging'
log = logger.getLogger
nolog: true
conf = require path.join '..', 'js-coffee', 'config'
conf
logger: log
exports.setUp = ( cb ) =>
logger = require path.join '..', 'js-coffee', 'logging'
log = logger.getLogger
nolog: true
@conf = require path.join '..', 'js-coffee', 'config'
@conf
logger: log
cb()
exports.testRequire = ( test ) =>
exports.testRequire = ( test ) ->
test.expect 1
test.ok @conf.isReady(), 'File does not exist!'
test.ok conf.isReady(), 'File does not exist!'
test.done()
exports.testParameters = ( test ) =>
exports.testParameters = ( test ) ->
reqProp = [
'mode'
'io-level'
'file-level'
]
test.expect 3 + reqProp.length
test.ok @conf.getHttpPort(), 'HTTP port does not exist!'
test.ok @conf.getDbPort(), 'DB port does not exist!'
logconf = @conf.getLogConf()
test.ok conf.getHttpPort(), 'HTTP port does not exist!'
test.ok conf.getDbPort(), 'DB port does not exist!'
logconf = conf.getLogConf()
test.ok logconf, 'Log config does not exist!'
for prop in reqProp
test.ok logconf[prop], "Log conf property #{ prop } does not exist!"
test.done()
exports.testDifferentConfigFile = ( test ) =>
exports.testDifferentConfigFile = ( test ) ->
test.expect 1
@conf
conf
# nolog: true
configPath: path.join 'testing', 'files', 'jsonTestConfig.json'
test.ok @conf.isReady(), 'Different path not loaded!'
test.ok conf.isReady(), 'Different path not loaded!'
test.done()
exports.testNoConfigFile = ( test ) =>
exports.testNoConfigFile = ( test ) ->
test.expect 1
@conf
conf
nolog: true
configPath: 'wrongpath.file'
test.strictEqual @conf.isReady(), false, 'Wrong path still loaded!'
test.strictEqual conf.isReady(), false, 'Wrong path still loaded!'
test.done()

View file

@ -1,8 +1,10 @@
path = require 'path'
fs = require 'fs'
stdPath = path.resolve __dirname, '..', 'logs', 'server.log'
logger = require path.join '..', 'js-coffee', 'logging'
getLog = ( strPath, cb ) ->
fWait = =>
fWait = ->
# cb fs.readFileSync path, 'utf-8'
str = fs.readFileSync path.resolve( strPath ), 'utf-8'
arrStr = str.split "\n"
@ -13,17 +15,12 @@ getLog = ( strPath, cb ) ->
cb arrStr.slice 0, arrStr.length - 1
setTimeout fWait, 100
exports.setUp = ( cb ) =>
@stdPath = path.resolve __dirname, '..', 'logs', 'server.log'
exports.setUp = ( cb ) ->
try
fs.unlinkSync @stdPath
@logger = require path.join '..', 'js-coffee', 'logging'
fs.unlinkSync stdPath
cb()
# exports.tearDown = ( cb ) =>
# cb()
exports.testCreate = ( test ) =>
exports.testCreate = ( test ) ->
test.expect 2
arrLogs = [
'TL | testInitIO - info'
@ -32,12 +29,12 @@ exports.testCreate = ( test ) =>
]
args = {}
args[ 'io-level' ] = 'error'
log = @logger.getLogger args
log = logger.getLogger args
log.info arrLogs[0]
log.warn arrLogs[1]
log.error arrLogs[2]
test.ok fs.existsSync( @stdPath ), 'Log file does not exist!'
getLog @stdPath, ( arr ) ->
test.ok fs.existsSync( stdPath ), 'Log file does not exist!'
getLog stdPath, ( arr ) ->
allCorrect = true
for o,i in arr
if o.msg is not arrLogs[i]
@ -45,20 +42,20 @@ exports.testCreate = ( test ) =>
test.ok allCorrect, 'Log file does not contain the correct entries!'
test.done()
exports.testNoLog = ( test ) =>
exports.testNoLog = ( test ) ->
test.expect 1
log = @logger.getLogger
log = logger.getLogger
nolog: true
log.info 'TL | test 1'
fWait = () =>
test.ok !fs.existsSync( @stdPath ), 'Log file does still exist!'
fWait = () ->
test.ok !fs.existsSync( stdPath ), 'Log file does still exist!'
test.done()
setTimeout fWait, 100
exports.testCustomPath = ( test ) =>
exports.testCustomPath = ( test ) ->
test.expect 2
strInfo = 'TL | custom path test 1'
@ -67,10 +64,10 @@ exports.testCustomPath = ( test ) =>
args[ 'file-path' ] = strPath
args[ 'io-level' ] = 'error'
log = @logger.getLogger args
log = logger.getLogger args
log.info strInfo
fWait = () =>
fWait = () ->
test.ok fs.existsSync( strPath ), 'Custom log file does not exist!'
getLog strPath, ( arr ) ->
test.ok arr[0].msg is strInfo, 'Custom log file not correct!'
@ -80,7 +77,7 @@ exports.testCustomPath = ( test ) =>
setTimeout fWait, 100
exports.testWrongPath = ( test ) =>
exports.testWrongPath = ( test ) ->
empty = [
'trace'
'debug'
@ -96,7 +93,7 @@ exports.testWrongPath = ( test ) =>
args = {}
args[ 'file-path' ] = strPath
args[ 'io-level' ] = 'error'
log = @logger.getLogger args
log = logger.getLogger args
test.ok prop in empty, "#{ prop } shouldn't be here" for prop of log
test.done()

View file

@ -18,23 +18,36 @@ opts =
opts[ 'db-port' ] = 6379
db opts
oEvtOne = objects.events.eventOne
oEvtTwo = objects.events.eventTwo
oUser = objects.users.userOne
oEpOne = objects.eps.epOne
oEpTwo = objects.eps.epTwo
oRuleOne = objects.rules.ruleOne
oRuleTwo = objects.rules.ruleTwo
exports.tearDown = ( cb ) ->
db.deleteUser oUser.username
setTimeout cb, 100
# ###
# # Test AVAILABILITY
# ###
exports.Availability =
testRequire: ( test ) =>
testRequire: ( test ) ->
test.expect 1
test.ok db, 'DB interface loaded'
test.done()
testConnect: ( test ) =>
testConnect: ( test ) ->
test.expect 1
db.isConnected ( err ) ->
test.ifError err, 'Connection failed!'
test.done()
# We cannot test for no db-port, since node-redis then assumes standard port
testWrongDbPort: ( test ) =>
testWrongDbPort: ( test ) ->
test.expect 1
db.initPort 13410
@ -43,38 +56,37 @@ exports.Availability =
db.initPort 6379
test.done()
testPurgeQueue: ( test ) =>
testPurgeQueue: ( test ) ->
test.expect 2
db.pushEvent objects.events.eventOne
db.pushEvent oEvtOne
db.purgeEventQueue()
db.popEvent ( err, obj ) =>
db.popEvent ( err, obj ) ->
test.ifError err, 'Error during pop after purging!'
test.strictEqual obj, null, 'There was an event in the queue!?'
test.done()
###
# Test EVENT QUEUE
###
exports.EventQueue =
testEmptyPopping: ( test ) =>
testEmptyPopping: ( test ) ->
test.expect 2
db.purgeEventQueue()
db.popEvent ( err, obj ) =>
db.popEvent ( err, obj ) ->
test.ifError err,
'Error during pop after purging!'
test.strictEqual obj, null,
'There was an event in the queue!?'
test.done()
testEmptyPushing: ( test ) =>
testEmptyPushing: ( test ) ->
test.expect 2
db.pushEvent null
db.popEvent ( err, obj ) =>
db.popEvent ( err, obj ) ->
test.ifError err,
'Error during non-empty pushing!'
test.strictEqual obj, null,
@ -82,21 +94,21 @@ exports.EventQueue =
test.done()
testNonEmptyPopping: ( test ) =>
testNonEmptyPopping: ( test ) ->
test.expect 3
db.pushEvent objects.events.eventOne
db.popEvent ( err, obj ) =>
db.pushEvent oEvtOne
db.popEvent ( err, obj ) ->
test.ifError err,
'Error during non-empty popping!'
test.notStrictEqual obj, null,
'There was no event in the queue!'
test.deepEqual objects.events.eventOne, obj,
test.deepEqual oEvtOne, obj,
'Wrong event in queue!'
test.done()
testMultiplePushAndPops: ( test ) =>
testMultiplePushAndPops: ( test ) ->
test.expect 6
semaphore = 2
@ -105,23 +117,23 @@ exports.EventQueue =
test.done()
db.pushEvent objects.events.eventOne
db.pushEvent objects.events.eventTwo
db.pushEvent oEvtOne
db.pushEvent oEvtTwo
# eventually it would be wise to not care about the order of events
db.popEvent ( err, obj ) =>
db.popEvent ( err, obj ) ->
test.ifError err,
'Error during multiple push and pop!'
test.notStrictEqual obj, null,
'There was no event in the queue!'
test.deepEqual objects.events.eventOne, obj,
test.deepEqual oEvtOne, obj,
'Wrong event in queue!'
forkEnds()
db.popEvent ( err, obj ) =>
db.popEvent ( err, obj ) ->
test.ifError err,
'Error during multiple push and pop!'
test.notStrictEqual obj, null,
'There was no event in the queue!'
test.deepEqual objects.events.eventTwo, obj,
test.deepEqual oEvtTwo, obj,
'Wrong event in queue!'
forkEnds()
@ -131,110 +143,106 @@ exports.EventQueue =
# since Action Invoker uses the same class
###
exports.EventPoller =
setUp: ( cb ) =>
@userId = 'tester1'
@event1id = 'test-event-poller_1'
@event2id = 'test-event-poller_2'
cb()
tearDown: ( cb ) =>
db.eventPollers.unlinkModule @event1id, @userId
db.eventPollers.deleteModule @event1id
db.eventPollers.unlinkModule @event2id, @userId
db.eventPollers.deleteModule @event2id
tearDown: ( cb ) ->
# db.eventPollers.unlinkModule oEpOne.id, oUser.username
db.eventPollers.deleteModule oEpOne.id
# db.eventPollers.unlinkModule oEpTwo.id, oUser.username
db.eventPollers.deleteModule oEpTwo.id
cb()
testCreateAndRead: ( test ) =>
testCreateAndRead: ( test ) ->
test.expect 3
db.eventPollers.storeModule @event1id, @userId, objects.eps.ep1
db.eventPollers.storeModule oUser.username, oEpOne
# test that the ID shows up in the set
db.eventPollers.getModuleIds ( err , obj ) =>
test.ok @event1id in obj,
db.eventPollers.getModuleIds ( err , obj ) ->
test.ok oEpOne.id in obj,
'Expected key not in event-pollers set'
# the retrieved object really is the one we expected
db.eventPollers.getModule @event1id, ( err , obj ) =>
test.deepEqual obj, objects.eps.ep1,
db.eventPollers.getModule oEpOne.id, ( err , obj ) ->
test.deepEqual obj, oEpOne,
'Retrieved Event Poller is not what we expected'
# Ensure the event poller is in the list of all existing ones
db.eventPollers.getModules ( err , obj ) =>
test.deepEqual objects.eps.ep1, obj[@event1id],
db.eventPollers.getModules ( err , obj ) ->
test.deepEqual oEpOne, obj[oEpOne.id],
'Event Poller ist not in result set'
test.done()
testUpdate: ( test ) =>
testUpdate: ( test ) ->
test.expect 2
oTmp = {}
oTmp[key] = val for key, val of oEpOne
oTmp.public = 'true'
# store an entry to start with
db.eventPollers.storeModule @event1id, @userId, objects.eps.ep1
db.eventPollers.storeModule @event1id, @userId, objects.eps.ep2
db.eventPollers.storeModule oUser.username, oEpOne
db.eventPollers.storeModule oUser.username, oTmp
# the retrieved object really is the one we expected
db.eventPollers.getModule @event1id, ( err , obj ) =>
test.deepEqual obj, objects.eps.ep2,
db.eventPollers.getModule oEpOne.id, ( err , obj ) ->
test.deepEqual obj, oTmp,
'Retrieved Event Poller is not what we expected'
# Ensure the event poller is in the list of all existing ones
db.eventPollers.getModules ( err , obj ) =>
test.deepEqual objects.eps.ep2, obj[@event1id],
db.eventPollers.getModules ( err , obj ) ->
test.deepEqual oTmp, obj[oEpOne.id],
'Event Poller ist not in result set'
test.done()
testDelete: ( test ) =>
testDelete: ( test ) ->
test.expect 2
# store an entry to start with
db.eventPollers.storeModule @event1id, @userId, objects.eps.ep1
db.eventPollers.storeModule oUser.username, oEpOne
# Ensure the event poller has been deleted
db.eventPollers.deleteModule @event1id
db.eventPollers.getModule @event1id, ( err , obj ) =>
db.eventPollers.deleteModule oEpOne.id
db.eventPollers.getModule oEpOne.id, ( err , obj ) ->
test.strictEqual obj, null,
'Event Poller still exists'
# Ensure the ID has been removed from the set
db.eventPollers.getModuleIds ( err , obj ) =>
test.ok @event1id not in obj,
db.eventPollers.getModuleIds ( err , obj ) ->
test.ok oEpOne.id not in obj,
'Event Poller key still exists in set'
test.done()
testFetchSeveral: ( test ) =>
testFetchSeveral: ( test ) ->
test.expect 3
semaphore = 2
fCheckInvoker = ( modname, mod ) =>
fCheckInvoker = ( modname, mod ) ->
myTest = test
forkEnds = () ->
if --semaphore is 0
myTest.done()
( err, obj ) =>
( err, obj ) ->
myTest.deepEqual mod, obj,
"Invoker #{ modname } does not equal the expected one"
forkEnds()
db.eventPollers.storeModule @event1id, @userId, objects.eps.ep1
db.eventPollers.storeModule @event2id, @userId, objects.eps.ep2
db.eventPollers.getModuleIds ( err, obj ) =>
test.ok @event1id in obj and @event2id in obj,
db.eventPollers.storeModule oUser.username, oEpOne
db.eventPollers.storeModule oUser.username, oEpTwo
db.eventPollers.getModuleIds ( err, obj ) ->
test.ok oEpOne.id in obj and oEpTwo.id in obj,
'Not all event poller Ids in set'
db.eventPollers.getModule @event1id, fCheckInvoker @event1id, objects.eps.ep1
db.eventPollers.getModule @event2id, fCheckInvoker @event2id, objects.eps.ep2
db.eventPollers.getModule oEpOne.id, fCheckInvoker oEpOne.id, oEpOne
db.eventPollers.getModule oEpTwo.id, fCheckInvoker oEpTwo.id, oEpTwo
###
# Test EVENT POLLER PARAMS
###
exports.EventPollerParams =
testCreateAndRead: ( test ) =>
testCreateAndRead: ( test ) ->
test.expect 2
userId = 'tester1'
@ -245,18 +253,18 @@ exports.EventPollerParams =
db.eventPollers.storeUserParams eventId, userId, params
# test that the ID shows up in the set
db.eventPollers.getUserParamsIds ( err, obj ) =>
db.eventPollers.getUserParamsIds ( err, obj ) ->
test.ok eventId+':'+userId in obj,
'Expected key not in event-params set'
# the retrieved object really is the one we expected
db.eventPollers.getUserParams eventId, userId, ( err, obj ) =>
db.eventPollers.getUserParams eventId, userId, ( err, obj ) ->
test.strictEqual obj, params,
'Retrieved event params is not what we expected'
db.eventPollers.deleteUserParams eventId, userId
test.done()
testUpdate: ( test ) =>
testUpdate: ( test ) ->
test.expect 1
userId = 'tester1'
@ -269,14 +277,14 @@ exports.EventPollerParams =
db.eventPollers.storeUserParams eventId, userId, paramsNew
# the retrieved object really is the one we expected
db.eventPollers.getUserParams eventId, userId, ( err, obj ) =>
db.eventPollers.getUserParams eventId, userId, ( err, obj ) ->
test.strictEqual obj, paramsNew,
'Retrieved event params is not what we expected'
db.eventPollers.deleteUserParams eventId, userId
test.done()
testDelete: ( test ) =>
testDelete: ( test ) ->
test.expect 2
userId = 'tester1'
@ -288,11 +296,11 @@ exports.EventPollerParams =
db.eventPollers.deleteUserParams eventId, userId
# Ensure the event params have been deleted
db.eventPollers.getUserParams eventId, userId, ( err, obj ) =>
db.eventPollers.getUserParams eventId, userId, ( err, obj ) ->
test.strictEqual obj, null,
'Event params still exists'
# Ensure the ID has been removed from the set
db.eventPollers.getUserParamsIds ( err, obj ) =>
db.eventPollers.getUserParamsIds ( err, obj ) ->
test.ok eventId+':'+userId not in obj,
'Event Params key still exists in set'
@ -303,194 +311,189 @@ exports.EventPollerParams =
# Test RULES
###
exports.Rules =
setUp: ( cb ) =>
@userId = 'tester-1'
@ruleId = 'test-rule_1'
tearDown: ( cb ) ->
db.deleteRule oRuleOne.id
cb()
tearDown: ( cb ) =>
db.deleteRule @ruleId
cb()
testCreateAndRead: ( test ) =>
testCreateAndRead: ( test ) ->
test.expect 3
# store an entry to start with
db.storeRule @ruleId, JSON.stringify objects.rules.ruleOne
db.storeRule oRuleOne.id, JSON.stringify oRuleOne
# test that the ID shows up in the set
db.getRuleIds ( err, obj ) =>
test.ok @ruleId in obj,
db.getRuleIds ( err, obj ) ->
test.ok oRuleOne.id in obj,
'Expected key not in rule key set'
# the retrieved object really is the one we expected
db.getRule @ruleId, ( err, obj ) =>
test.deepEqual JSON.parse(obj), objects.rules.ruleOne,
db.getRule oRuleOne.id, ( err, obj ) ->
test.deepEqual JSON.parse(obj), oRuleOne,
'Retrieved rule is not what we expected'
# Ensure the rule is in the list of all existing ones
db.getRules ( err , obj ) =>
test.deepEqual objects.rules.ruleOne, JSON.parse( obj[@ruleId] ),
db.getRules ( err , obj ) ->
test.deepEqual oRuleOne, JSON.parse( obj[oRuleOne.id] ),
'Rule not in result set'
test.done()
testUpdate: ( test ) =>
testUpdate: ( test ) ->
test.expect 1
# store an entry to start with
db.storeRule @ruleId, JSON.stringify objects.rules.ruleOne
db.storeRule @ruleId, JSON.stringify objects.rules.ruleTwo
db.storeRule oRuleOne.id, JSON.stringify oRuleOne
db.storeRule oRuleOne.id, JSON.stringify oRuleTwo
# the retrieved object really is the one we expected
db.getRule @ruleId, ( err, obj ) =>
test.deepEqual JSON.parse(obj), objects.rules.ruleTwo,
db.getRule oRuleOne.id, ( err, obj ) ->
test.deepEqual JSON.parse(obj), oRuleTwo,
'Retrieved rule is not what we expected'
test.done()
testDelete: ( test ) =>
testDelete: ( test ) ->
test.expect 2
# store an entry to start with and delete it right away
db.storeRule @ruleId, JSON.stringify objects.rules.ruleOne
db.deleteRule @ruleId
db.storeRule oRuleOne.id, JSON.stringify oRuleOne
db.deleteRule oRuleOne.id
# Ensure the event params have been deleted
db.getRule @ruleId, ( err, obj ) =>
db.getRule oRuleOne.id, ( err, obj ) ->
test.strictEqual obj, null,
'Rule still exists'
# Ensure the ID has been removed from the set
db.getRuleIds ( err, obj ) =>
test.ok @ruleId not in obj,
db.getRuleIds ( err, obj ) ->
test.ok oRuleOne.id not in obj,
'Rule key still exists in set'
test.done()
testLink: ( test ) =>
testLink: ( test ) ->
test.expect 2
# link a rule to the user
db.linkRule @ruleId, @userId
db.linkRule oRuleOne.id, oUser.username
# Ensure the user is linked to the rule
db.getRuleLinkedUsers @ruleId, ( err, obj ) =>
test.ok @userId in obj,
"Rule not linked to user #{ @userId }"
db.getRuleLinkedUsers oRuleOne.id, ( err, obj ) ->
test.ok oUser.username in obj,
"Rule not linked to user #{ oUser.username }"
# Ensure the rule is linked to the user
db.getUserLinkedRules @userId, ( err, obj ) =>
test.ok @ruleId in obj,
"User not linked to rule #{ @ruleId }"
db.getUserLinkedRules oUser.username, ( err, obj ) ->
test.ok oRuleOne.id in obj,
"User not linked to rule #{ oRuleOne.id }"
test.done()
testUnlink: ( test ) =>
testUnlink: ( test ) ->
test.expect 2
# link and unlink immediately afterwards
db.linkRule @ruleId, @userId
db.unlinkRule @ruleId, @userId
db.linkRule oRuleOne.id, oUser.username
db.unlinkRule oRuleOne.id, oUser.username
# Ensure the user is linked to the rule
db.getRuleLinkedUsers @ruleId, ( err, obj ) =>
test.ok @userId not in obj,
"Rule still linked to user #{ @userId }"
db.getRuleLinkedUsers oRuleOne.id, ( err, obj ) ->
test.ok oUser.username not in obj,
"Rule still linked to user #{ oUser.username }"
# Ensure the rule is linked to the user
db.getUserLinkedRules @userId, ( err, obj ) =>
test.ok @ruleId not in obj,
"User still linked to rule #{ @ruleId }"
db.getUserLinkedRules oUser.username, ( err, obj ) ->
test.ok oRuleOne.id not in obj,
"User still linked to rule #{ oRuleOne.id }"
test.done()
testActivate: ( test ) =>
testActivate: ( test ) ->
test.expect 4
usr =
username: "tester-1"
password: "tester-1"
db.storeUser usr
db.activateRule @ruleId, @userId
db.activateRule oRuleOne.id, oUser.username
# activate a rule for a user
# Ensure the user is activated to the rule
db.getRuleActivatedUsers @ruleId, ( err, obj ) =>
test.ok @userId in obj,
"Rule not activated for user #{ @userId }"
db.getRuleActivatedUsers oRuleOne.id, ( err, obj ) ->
test.ok oUser.username in obj,
"Rule not activated for user #{ oUser.username }"
# Ensure the rule is linked to the user
db.getUserActivatedRules @userId, ( err, obj ) =>
test.ok @ruleId in obj,
"User not activated for rule #{ @ruleId }"
db.getUserActivatedRules oUser.username, ( err, obj ) ->
test.ok oRuleOne.id in obj,
"User not activated for rule #{ oRuleOne.id }"
# Ensure the rule is showing up in all active rules
db.getAllActivatedRuleIdsPerUser ( err, obj ) =>
test.notStrictEqual obj[@userId], undefined,
"User #{ @userId } not in activated rules set"
if obj[@userId]
test.ok @ruleId in obj[@userId],
"Rule #{ @ruleId } not in activated rules set"
db.getAllActivatedRuleIdsPerUser ( err, obj ) ->
test.notStrictEqual obj[oUser.username], undefined,
"User #{ oUser.username } not in activated rules set"
if obj[oUser.username]
test.ok oRuleOne.id in obj[oUser.username],
"Rule #{ oRuleOne.id } not in activated rules set"
# else
# test.ok true,
# "Dummy so we meet the expected num of tests"
test.done()
testDeactivate: ( test ) =>
testDeactivate: ( test ) ->
test.expect 3
# store an entry to start with and link it to te user
db.activateRule @ruleId, @userId
db.deactivateRule @ruleId, @userId
db.activateRule oRuleOne.id, oUser.username
db.deactivateRule oRuleOne.id, oUser.username
# Ensure the user is linked to the rule
db.getRuleActivatedUsers @ruleId, ( err, obj ) =>
test.ok @userId not in obj,
"Rule still activated for user #{ @userId }"
db.getRuleActivatedUsers oRuleOne.id, ( err, obj ) ->
test.ok oUser.username not in obj,
"Rule still activated for user #{ oUser.username }"
# Ensure the rule is linked to the user
db.getUserActivatedRules @userId, ( err, obj ) =>
test.ok @ruleId not in obj,
"User still activated for rule #{ @ruleId }"
db.getUserActivatedRules oUser.username, ( err, obj ) ->
test.ok oRuleOne.id not in obj,
"User still activated for rule #{ oRuleOne.id }"
# Ensure the rule is showing up in all active rules
db.getAllActivatedRuleIdsPerUser ( err, obj ) =>
if obj[@userId]
test.ok @ruleId not in obj[@userId],
"Rule #{ @ruleId } still in activated rules set"
db.getAllActivatedRuleIdsPerUser ( err, obj ) ->
if obj[oUser.username]
test.ok oRuleOne.id not in obj[oUser.username],
"Rule #{ oRuleOne.id } still in activated rules set"
else
test.ok true,
"We are fine since there are no entries for this user anymore"
test.done()
testUnlinkAndDeactivateAfterDeletion: ( test ) =>
testUnlinkAndDeactivateAfterDeletion: ( test ) ->
test.expect 2
# store an entry to start with and link it to te user
db.storeRule @ruleId, JSON.stringify objects.rules.ruleOne
db.linkRule @ruleId, @userId
db.activateRule @ruleId, @userId
db.storeRule oRuleOne.id, JSON.stringify oRuleOne
db.linkRule oRuleOne.id, oUser.username
db.activateRule oRuleOne.id, oUser.username
# We need to wait here and there since these calls are asynchronous
fWaitForTest = () =>
fWaitForTest = () ->
# Ensure the user is unlinked to the rule
db.getUserLinkedRules @userId, ( err, obj ) =>
test.ok @ruleId not in obj,
"Rule #{ @ruleId } still linked to user #{ @userId }"
db.getUserLinkedRules oUser.username, ( err, obj ) ->
test.ok oRuleOne.id not in obj,
"Rule #{ oRuleOne.id } still linked to user #{ oUser.username }"
# Ensure the rule is deactivated for the user
db.getUserActivatedRules @userId, ( err, obj ) =>
test.ok @ruleId not in obj,
"Rule #{ @ruleId } still activated for user #{ @userId }"
db.getUserActivatedRules oUser.username, ( err, obj ) ->
test.ok oRuleOne.id not in obj,
"Rule #{ oRuleOne.id } still activated for user #{ oUser.username }"
test.done()
fWaitForDeletion = () =>
db.deleteRule @ruleId
fWaitForDeletion = () ->
db.deleteRule oRuleOne.id
setTimeout fWaitForTest, 300
setTimeout fWaitForDeletion, 100
@ -500,12 +503,7 @@ exports.Rules =
# Test USER
###
exports.User =
tearDown: ( cb ) =>
db.deleteUser objects.users.userOne.username
cb()
testCreateInvalid: ( test ) =>
testCreateInvalid: ( test ) ->
test.expect 4
oUserInvOne =
@ -517,134 +515,126 @@ exports.User =
db.storeUser oUserInvOne
db.storeUser oUserInvTwo
db.getUser oUserInvOne.username, ( err, obj ) =>
db.getUser oUserInvOne.username, ( err, obj ) ->
test.strictEqual obj, null,
'User One was stored!?'
db.getUser oUserInvTwo.username, ( err, obj ) =>
db.getUser oUserInvTwo.username, ( err, obj ) ->
test.strictEqual obj, null,
'User Two was stored!?'
db.getUserIds ( err, obj ) =>
db.getUserIds ( err, obj ) ->
test.ok oUserInvOne.username not in obj,
'User key was stored!?'
test.ok oUserInvTwo.username not in obj,
'User key was stored!?'
test.done()
testDelete: ( test ) =>
testDelete: ( test ) ->
test.expect 2
oUsr = objects.users.userOne
# Store the user
db.storeUser oUsr
db.storeUser oUser
db.getUser oUsr.username, ( err, obj ) =>
test.deepEqual obj, oUsr,
"User #{ objects.users.userOne.username } is not what we expect!"
db.getUser oUser.username, ( err, obj ) ->
test.deepEqual obj, oUser,
"User #{ oUser.username } is not what we expect!"
db.getUserIds ( err, obj ) =>
test.ok oUsr.username in obj,
db.getUserIds ( err, obj ) ->
test.ok oUser.username in obj,
'User key was not stored!?'
test.done()
testUpdate: ( test ) =>
testUpdate: ( test ) ->
test.expect 2
oUsr = objects.users.userOne
# Store the user
db.storeUser oUsr
oUsr.password = "password-update"
db.storeUser oUsr
db.storeUser oUser
oUser.password = "password-update"
db.storeUser oUser
db.getUser oUsr.username, ( err, obj ) =>
test.deepEqual obj, oUsr,
"User #{ oUsr.username } is not what we expect!"
db.getUser oUser.username, ( err, obj ) ->
test.deepEqual obj, oUser,
"User #{ oUser.username } is not what we expect!"
db.getUserIds ( err, obj ) =>
test.ok oUsr.username in obj,
db.getUserIds ( err, obj ) ->
test.ok oUser.username in obj,
'User key was not stored!?'
db.deleteUser oUsr.username
db.deleteUser oUser.username
test.done()
testDelete: ( test ) =>
testDelete: ( test ) ->
test.expect 2
oUsr = objects.users.userOne
# Wait until the user and his rules and roles are deleted
fWaitForDeletion = () =>
db.getUserIds ( err, obj ) =>
test.ok oUsr.username not in obj,
fWaitForDeletion = () ->
db.getUserIds ( err, obj ) ->
test.ok oUser.username not in obj,
'User key still in set!'
db.getUser oUsr.username, ( err, obj ) =>
db.getUser oUser.username, ( err, obj ) ->
test.strictEqual obj, null,
'User key still exists!'
test.done()
# Store the user and make some links
db.storeUser oUsr
db.deleteUser oUsr.username
db.storeUser oUser
db.deleteUser oUser.username
setTimeout fWaitForDeletion, 100
testDeleteLinks: ( test ) =>
testDeleteLinks: ( test ) ->
test.expect 4
oUsr = objects.users.userOne
# Wait until the user and his rules and roles are stored
fWaitForPersistence = () =>
db.deleteUser oUsr.username
fWaitForPersistence = () ->
db.deleteUser oUser.username
setTimeout fWaitForDeletion, 200
# Wait until the user and his rules and roles are deleted
fWaitForDeletion = () =>
db.getRoleUsers 'tester', ( err, obj ) =>
test.ok oUsr.username not in obj,
fWaitForDeletion = () ->
db.getRoleUsers 'tester', ( err, obj ) ->
test.ok oUser.username not in obj,
'User key still in role tester!'
db.getUserRoles oUsr.username, ( err, obj ) =>
db.getUserRoles oUser.username, ( err, obj ) ->
test.ok obj.length is 0,
'User still associated to roles!'
db.getUserLinkedRules oUsr.username, ( err, obj ) =>
db.getUserLinkedRules oUser.username, ( err, obj ) ->
test.ok obj.length is 0,
'User still associated to rules!'
db.getUserActivatedRules oUsr.username, ( err, obj ) =>
db.getUserActivatedRules oUser.username, ( err, obj ) ->
test.ok obj.length is 0,
'User still associated to activated rules!'
test.done()
# Store the user and make some links
db.storeUser oUsr
db.linkRule 'rule-1', oUsr.username
db.linkRule 'rule-2', oUsr.username
db.linkRule 'rule-3', oUsr.username
db.activateRule 'rule-1', oUsr.username
db.storeUserRole oUsr.username, 'tester'
db.storeUser oUser
db.linkRule 'rule-1', oUser.username
db.linkRule 'rule-2', oUser.username
db.linkRule 'rule-3', oUser.username
db.activateRule 'rule-1', oUser.username
db.storeUserRole oUser.username, 'tester'
setTimeout fWaitForPersistence, 100
testLogin: ( test ) =>
testLogin: ( test ) ->
test.expect 3
oUsr = objects.users.userOne
# Store the user and make some links
db.storeUser oUsr
db.loginUser oUsr.username, oUsr.password, ( err, obj ) =>
test.deepEqual obj, oUsr,
db.storeUser oUser
db.loginUser oUser.username, oUser.password, ( err, obj ) ->
test.deepEqual obj, oUser,
'User not logged in!'
db.loginUser 'dummyname', oUsr.password, ( err, obj ) =>
db.loginUser 'dummyname', oUser.password, ( err, obj ) ->
test.strictEqual obj, null,
'User logged in?!'
db.loginUser oUsr.username, 'wrongpass', ( err, obj ) =>
db.loginUser oUser.username, 'wrongpass', ( err, obj ) ->
test.strictEqual obj, null,
'User logged in?!'
@ -655,42 +645,37 @@ exports.User =
# Test ROLES
###
exports.Roles =
tearDown: ( cb ) =>
db.deleteUser objects.users.userOne.username
cb()
testStore: ( test ) =>
testStore: ( test ) ->
test.expect 2
oUsr = objects.users.userOne
db.storeUser oUsr
db.storeUserRole oUsr.username, 'tester'
db.storeUser oUser
db.storeUserRole oUser.username, 'tester'
db.getUserRoles oUsr.username, ( err, obj ) =>
db.getUserRoles oUser.username, ( err, obj ) ->
test.ok 'tester' in obj,
'User role tester not stored!'
db.getRoleUsers 'tester', ( err, obj ) =>
test.ok oUsr.username in obj,
"User #{ oUsr.username } not stored in role tester!"
db.getRoleUsers 'tester', ( err, obj ) ->
test.ok oUser.username in obj,
"User #{ oUser.username } not stored in role tester!"
test.done()
testDelete: ( test ) =>
testDelete: ( test ) ->
test.expect 2
oUsr = objects.users.userOne
db.storeUser oUsr
db.storeUserRole oUsr.username, 'tester'
db.removeUserRole oUsr.username, 'tester'
db.storeUser oUser
db.storeUserRole oUser.username, 'tester'
db.removeUserRole oUser.username, 'tester'
db.getUserRoles oUsr.username, ( err, obj ) =>
db.getUserRoles oUser.username, ( err, obj ) ->
test.ok 'tester' not in obj,
'User role tester not stored!'
db.getRoleUsers 'tester', ( err, obj ) =>
test.ok oUsr.username not in obj,
"User #{ oUsr.username } not stored in role tester!"
db.getRoleUsers 'tester', ( err, obj ) ->
test.ok oUser.username not in obj,
"User #{ oUser.username } not stored in role tester!"
test.done()
# store an entry to start with

View file

@ -5,6 +5,7 @@ events = require 'events'
cp = require 'child_process'
qs = require 'querystring'
try
data = fs.readFileSync path.resolve( 'testing', 'files', 'testObjects.json' ), 'utf8'
try
@ -21,14 +22,13 @@ opts =
opts[ 'db-port' ] = 6379
db = require path.join '..', 'js-coffee', 'persistence'
db opts
rh = require path.join '..', 'js-coffee', 'request-handler'
args =
logger: log
args[ 'request-service' ] = ( usr, obj, cb ) ->
opts[ 'request-service' ] = ( usr, obj, cb ) ->
test.ok false, 'testEvent should not cause a service request call'
args[ 'shutdown-function' ] = () ->
opts[ 'shutdown-function' ] = () ->
test.ok false, 'testEvent should not cause a system shutdown'
rh args
rh opts
createRequest = ( query, origUrl ) ->
req = new events.EventEmitter()
@ -120,17 +120,18 @@ exports.session =
postRequestData req, qs.stringify usr # emit the data post event
exports.events =
setUp: ( cb ) =>
setUp: ( cb ) ->
db.purgeEventQueue()
cb()
testCorrectEvent: ( test ) =>
# This test seems to hang sometimes... maybe it's also happening somewhere else...
testCorrectEvent: ( test ) ->
test.expect 2
oEvt = objects.events.eventOne
semaphore = 2
fPopEvent = () =>
fPopEvent = () ->
fCb = ( err, obj ) ->
oEvt.eventid = obj.eventid # because the event id is generated by the system
test.deepEqual obj, oEvt, 'Caught event is not what we expected'
@ -148,14 +149,14 @@ exports.events =
postRequestData req, JSON.stringify oEvt # emit the data post event
setTimeout fPopEvent, 200 # try to fetch the db entry
testIncorrectEvent: ( test ) =>
testIncorrectEvent: ( test ) ->
test.expect 2
oEvt =
data: 'event misses event type property'
semaphore = 2
fPopEvent = () =>
fPopEvent = () ->
fCb = ( err, obj ) ->
test.deepEqual obj, null, 'We caught an event!?'
if --semaphore is 0
@ -172,27 +173,27 @@ exports.events =
postRequestData req, qs.stringify oEvt # emit the data post event
setTimeout fPopEvent, 200 # try to fetch the db entry
exports.testLoginOrPage = ( test ) =>
exports.testLoginOrPage = ( test ) ->
test.expect 3
req = createRequest()
req.query =
page: 'forge_event'
resp = createResponse ( code, msg ) =>
resp = createResponse ( code, msg ) ->
# Ensure we have to login first
test.ok msg.indexOf( 'document.title = \'Login\'' ) > 0, 'Didn\'t get login page?'
req = createLoggedInRequest()
req.query =
page: 'forge_event'
resp = createResponse ( code, msg ) =>
resp = createResponse ( code, msg ) ->
# After being logged in we should get the expected page
test.ok msg.indexOf( 'document.title = \'Event Forge!\'' ) > 0, 'Didn\' get forge page?'
req = createLoggedInRequest()
req.query =
page: 'wrongpage'
resp = createResponse ( code, msg ) =>
resp = createResponse ( code, msg ) ->
# A wrong page request should give back an error page
test.ok msg.indexOf( 'document.title = \'Error!\'' ) > 0, 'Didn\' get forge page?'
@ -203,17 +204,17 @@ exports.testLoginOrPage = ( test ) =>
rh.handleForge req, resp # set the handler to listening
exports.testUserCommandsNoLogin = ( test ) =>
exports.testUserCommandsNoLogin = ( test ) ->
test.expect 1
req = createRequest()
resp = createResponse ( code, msg ) =>
resp = createResponse ( code, msg ) ->
test.strictEqual code, 401, 'Login did not fail?'
test.done()
rh.handleUserCommand req, resp # set the handler to listening
exports.testUserCommands = ( test ) =>
exports.testUserCommands = ( test ) ->
test.expect 3
oReqData =
@ -237,7 +238,7 @@ exports.testUserCommands = ( test ) =>
rh args
req = createLoggedInRequest()
resp = createResponse ( code, msg ) =>
resp = createResponse ( code, msg ) ->
test.strictEqual code, 200, 'Service wasn\'t happy with our request'
test.deepEqual msg, oRespData, 'Service didn\'t return expected'
test.done()

View file

@ -2,17 +2,10 @@
cp = require 'child_process'
path = require 'path'
# exports.setUp = ( cb ) =>
# cb()
# exports.tearDown = ( cb ) =>
# @engine.send('die')
# cb()
# TODO test http shutdown command
# TODO test wrong/invalid config file
exports.testShutDown = ( test ) =>
exports.testShutDown = ( test ) ->
test.expect 1
isRunning = true
@ -35,11 +28,11 @@ exports.testShutDown = ( test ) =>
if isRunning
test.ok false, '"testShutDown" Engine didn\'t shut down!'
engine.kill()
test.done()
setTimeout test.done, 100
setTimeout fWaitForStartup, 1000
exports.testKill = ( test ) =>
exports.testKill = ( test ) ->
test.expect 1
pth = path.resolve 'js-coffee', 'webapi-eca'
@ -62,6 +55,9 @@ exports.testHttpPortAlreadyUsed = ( test ) =>
test.expect 1
isRunning = true
pth = path.resolve 'js-coffee', 'webapi-eca'
# Strange! why can't we make these variables local without
# the tests failing in one of the next tests...
@engine_one = cp.fork pth, [ '-n', '-w', '8642' ] # [ '-i' , 'warn' ]
@engine_one.on 'error', ( err ) ->
console.log err
@ -89,7 +85,7 @@ exports.testHttpPortAlreadyUsed = ( test ) =>
setTimeout fWaitForFirstStartup, 1000
exports.testHttpPortInvalid = ( test ) =>
exports.testHttpPortInvalid = ( test ) ->
test.expect 1
isRunning = true
@ -103,7 +99,7 @@ exports.testHttpPortInvalid = ( test ) =>
console.log err
# Garbage collect eventually still running process
fWaitForDeath = () =>
fWaitForDeath = () ->
if isRunning
test.ok false, '"testHttpPortInvalid" Engine didn\'t shut down!'
test.done()
@ -111,7 +107,7 @@ exports.testHttpPortInvalid = ( test ) =>
setTimeout fWaitForDeath, 1000
exports.testDbPortInvalid = ( test ) =>
exports.testDbPortInvalid = ( test ) ->
test.expect 1
isRunning = true
@ -125,7 +121,7 @@ exports.testDbPortInvalid = ( test ) =>
test.done()
# Garbage collect eventually still running process
fWaitForDeath = () =>
fWaitForDeath = () ->
engine.kill()
if isRunning
test.ok false, '"testHttpPortInvalid" Engine didn\'t shut down!'

View file

@ -182,10 +182,6 @@ fOnLoad = () ->
conditions: {} #TODO Add conditions!
actions: acts
action_params: ap
# event_params: JSON.stringify ep
# conditions: JSON.stringify {} #TODO Add conditions!
# actions: JSON.stringify acts
# action_params: JSON.stringify ap
obj.payload = JSON.stringify obj.payload
$.post( '/usercommand', obj )
.done ( data ) ->

View file

@ -1,4 +1,4 @@
// Generated by CoffeeScript 1.7.1
// Generated by CoffeeScript 1.6.3
(function() {
var fOnLoad;

View file

@ -1,4 +1,4 @@
// Generated by CoffeeScript 1.7.1
// Generated by CoffeeScript 1.6.3
(function() {
var fOnLoad;

View file

@ -1,4 +1,4 @@
// Generated by CoffeeScript 1.7.1
// Generated by CoffeeScript 1.6.3
(function() {
var fOnLoad;

View file

@ -1,4 +1,4 @@
// Generated by CoffeeScript 1.7.1
// Generated by CoffeeScript 1.6.3
(function() {
var fOnLoad;

View file

@ -1,4 +1,4 @@
// Generated by CoffeeScript 1.7.1
// Generated by CoffeeScript 1.6.3
(function() {
var fOnLoad;

View file

@ -1,4 +1,4 @@
// Generated by CoffeeScript 1.7.1
// Generated by CoffeeScript 1.6.3
(function() {
var fOnLoad;

View file

@ -1,4 +1,4 @@
// Generated by CoffeeScript 1.7.1
// Generated by CoffeeScript 1.6.3
(function() {
var fOnLoad;