added tests

This commit is contained in:
David Baldwynn 2015-09-03 11:21:56 -07:00
parent 9981cd8e8d
commit c209146aeb
14 changed files with 1556 additions and 843 deletions

View File

@ -24,7 +24,7 @@ exports.validateVerificationToken = function(req, res, next){
res.status(200).send('User successfully verified'); res.status(200).send('User successfully verified');
}else { }else {
// redirect to resend verification email // redirect to resend verification email
res.status(400).send('Verification token is invalid or has expired'); return res.status(400).send('Verification token is invalid or has expired');
} }
}); });
}; };
@ -35,7 +35,7 @@ exports.resendVerificationEmail = function(req, res, next){
res.status(200).send('Verification email successfully Re-Sent'); res.status(200).send('Verification email successfully Re-Sent');
}else { }else {
// user hasn't been found yet // user hasn't been found yet
res.status(400).send( {message: 'Error: Verification Email could NOT be sent'} ); return res.status(400).send( {message: 'Error: Verification Email could NOT be sent'} );
} }
}); });
}; };
@ -65,11 +65,10 @@ exports.signup = function(req, res) {
message: errorHandler.getErrorMessage(err) message: errorHandler.getErrorMessage(err)
}); });
} }
res.status(200).send('An email has been sent to you. Please check it to verify your account.'); res.status(200).send('An email has been sent to you. Please check it to verify your account.');
}); });
} else { } else {
res.status(400).send('Error: Temp user could NOT be created!'); return res.status(400).send('Error: Temp user could NOT be created!');
} }
}); });
}; };

View File

@ -17,8 +17,7 @@ var mongoose = require('mongoose'),
var FieldSchema = require('./form_field.server.model.js'), var FieldSchema = require('./form_field.server.model.js'),
FormSubmissionSchema = require('./form_submission.server.model.js'), FormSubmissionSchema = require('./form_submission.server.model.js'),
Field = mongoose.model('Field', FieldSchema), Field = mongoose.model('Field', FieldSchema),
FormSubmission = mongoose.model('FormSubmission', FormSubmissionSchema); FormSubmission = mongoose.model('FormSubmission', FormSubmissionSchema)
var ButtonSchema = new Schema({ var ButtonSchema = new Schema({
url: { url: {
@ -42,7 +41,7 @@ var ButtonSchema = new Schema({
/** /**
* Form Schema * Form Schema
*/ */
var FormSchema = new Schema({ var LogicJumpSchema = new Schema({
created: { created: {
type: Date, type: Date,
default: Date.now default: Date.now
@ -145,7 +144,7 @@ var FormSchema = new Schema({
//Delete template PDF of current Form //Delete template PDF of current Form
FormSchema.pre('remove', function (next) { LogicJumpSchema.pre('remove', function (next) {
if(this.pdf && process.env.NODE_ENV === 'development'){ if(this.pdf && process.env.NODE_ENV === 'development'){
//Delete template form //Delete template form
fs.unlink(this.pdf.path, function(err){ fs.unlink(this.pdf.path, function(err){
@ -158,7 +157,7 @@ FormSchema.pre('remove', function (next) {
var _original; var _original;
//Set _original //Set _original
FormSchema.pre('save', function (next) { LogicJumpSchema.pre('save', function (next) {
// console.log(this.constructor.model); // console.log(this.constructor.model);
// console.log(FormModel); // console.log(FormModel);
this.constructor // ≈ mongoose.model('…', FieldSchema).findById this.constructor // ≈ mongoose.model('…', FieldSchema).findById
@ -176,7 +175,7 @@ FormSchema.pre('save', function (next) {
}); });
//Update lastModified and created everytime we save //Update lastModified and created everytime we save
FormSchema.pre('save', function (next) { LogicJumpSchema.pre('save', function (next) {
var now = new Date(); var now = new Date();
this.lastModified = now; this.lastModified = now;
if( !this.created ){ if( !this.created ){
@ -199,7 +198,7 @@ function getDeletedIndexes(needle, haystack){
} }
//Move PDF to permanent location after new template is uploaded //Move PDF to permanent location after new template is uploaded
FormSchema.pre('save', function (next) { LogicJumpSchema.pre('save', function (next) {
if(this.pdf){ if(this.pdf){
var that = this; var that = this;
async.series([ async.series([
@ -312,7 +311,7 @@ FormSchema.pre('save', function (next) {
next(); next();
}); });
FormSchema.pre('save', function (next) { LogicJumpSchema.pre('save', function (next) {
// var _original = this._original; // var _original = this._original;
// console.log('_original\n------------'); // console.log('_original\n------------');
// console.log(_original); // console.log(_original);
@ -446,7 +445,7 @@ FormSchema.pre('save', function (next) {
} }
}); });
// FormSchema.methods.generateFDFTemplate = function() { // LogicJumpSchema.methods.generateFDFTemplate = function() {
// var _keys = _.pluck(this.form_fields, 'title'), // var _keys = _.pluck(this.form_fields, 'title'),
// _values = _.pluck(this.form_fields, 'fieldValue'); // _values = _.pluck(this.form_fields, 'fieldValue');
@ -463,4 +462,4 @@ FormSchema.pre('save', function (next) {
// return jsonObj; // return jsonObj;
// }; // };
mongoose.model('Form', FormSchema); mongoose.model('LogicJump', LogicJumpSchema);

View File

@ -4,7 +4,19 @@
* Module dependencies. * Module dependencies.
*/ */
var mongoose = require('mongoose'), var mongoose = require('mongoose'),
Schema = mongoose.Schema; Schema = mongoose.Schema,
nools = require('nools');
// /**
// * LogicJump Schema
// */
// var LogicJump = new Schema({
// [
// ]
// type: Schema.Types.ObjectId,
// ref: 'FormSubmission'
// });
/** /**
* Question Schema * Question Schema
@ -28,6 +40,11 @@ var FormFieldSchema = new Schema({
type: String, type: String,
default: '', default: '',
}, },
logicJumps: [{
type: String,
}],
//DAVID: TODO: SEMI-URGENT: Need to come up with a schema for field options //DAVID: TODO: SEMI-URGENT: Need to come up with a schema for field options
fieldOptions: [{ fieldOptions: [{
type: Schema.Types.Mixed type: Schema.Types.Mixed
@ -110,6 +127,4 @@ function validateFormFieldType(value) {
} }
module.exports = FormFieldSchema; module.exports = FormFieldSchema;
// mongoose.model('Field', FormFieldSchema);

View File

@ -0,0 +1,90 @@
'use strict';
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
_ = require('lodash'),
tree = require('mongoose-tree'),
math = require('math'),
deasync = require('fibers');
var BooleanExpresssionSchema = new Schema({
expressionString: {
type: String,
},
result: {
type: Boolean,
}
});
/*
BooleanExpresssionSchema.plugin(tree, {
pathSeparator : '#' // Default path separator
onDelete : 'DELETE' // Can be set to 'DELETE' or 'REPARENT'. Default: 'REPARENT'
numWorkers: 5 // Number of stream workers
idType: Schema.ObjectId // Type used for _id. Can be, for example, String generated by shortid module
});
*/
BooleanExpresssionSchema.methods.evaluate = function(){
//Get headNode
var headNode = math.parse(expressionString);
var expressionScope = {};
var that = this;
//Create scope
headNode.traverse(function (node, path, parent) {
if(node.type === 'SymbolNode'){
Fiber()
mongoose.model('Field')
.findOne({_id: node.name}).exec(function(err, field){
if(err) {
console.log(err);
throw new Error(err);
}
if(!!_.parseInt(field.fieldValue)){
that.expressionScope[node.name] = _.parseInt(field.fieldValue);
}else {
that.expressionScope[node.name] = field.fieldValue;
}
console.log('_id: '+node.name);
console.log('value: '+that.expressionScope[node.name]);
});
}
});
var code = node.compile();
var result = code.eval(expressionScope);
this.result = result;
return result;
});
mongoose.model('BooleanStatement', BooleanStatementSchema);
/**
* Form Schema
*/
var LogicJumpSchema = new Schema({
created: {
type: Date,
default: Date.now
},
lastModified: {
type: Date,
},
BooleanExpression: {
type: Schema.Types.ObjectId,
ref: 'BooleanExpression'
},
});
mongoose.model('LogicJump', LogicJumpSchema);

View File

@ -1,189 +1,189 @@
'use strict'; // 'use strict';
/** // /**
* Module dependencies. // * Module dependencies.
*/ // */
var should = require('should'), // var should = require('should'),
mongoose = require('mongoose'), // mongoose = require('mongoose'),
User = mongoose.model('User'), // User = mongoose.model('User'),
Form = mongoose.model('Form'), // Form = mongoose.model('Form'),
_ = require('lodash'), // _ = require('lodash'),
FormSubmission = mongoose.model('FormSubmission'); // FormSubmission = mongoose.model('FormSubmission');
/** // /**
* Globals // * Globals
*/ // */
var user, myForm, mySubmission; // var user, myForm, mySubmission;
/** // /**
* Unit tests // * Unit tests
*/ // */
describe('Form Model Unit Tests:', function() { // describe('Form Model Unit Tests:', function() {
beforeEach(function(done) { // beforeEach(function(done) {
user = new User({ // user = new User({
firstName: 'Full', // firstName: 'Full',
lastName: 'Name', // lastName: 'Name',
displayName: 'Full Name', // displayName: 'Full Name',
email: 'test@test.com', // email: 'test@test.com',
username: 'username', // username: 'username',
password: 'password' // password: 'password'
}); // });
user.save(function() { // user.save(function() {
myForm = new Form({ // myForm = new Form({
title: 'Form Title', // title: 'Form Title',
admin: user, // admin: user,
language: 'english', // language: 'english',
form_fields: [ // form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}, // {'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''}, // {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''} // {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''}
] // ]
}); // });
done(); // done();
}); // });
}); // });
describe('Method Save', function() { // describe('Method Save', function() {
it('should be able to save without problems', function(done) { // it('should be able to save without problems', function(done) {
return myForm.save(function(err) { // return myForm.save(function(err) {
should.not.exist(err); // should.not.exist(err);
done(); // done();
}); // });
}); // });
it('should be able to show an error when try to save without title', function(done) { // it('should be able to show an error when try to save without title', function(done) {
var _form = myForm; // var _form = myForm;
_form.title = ''; // _form.title = '';
return _form.save(function(err) { // return _form.save(function(err) {
should.exist(err); // should.exist(err);
should.equal(err.errors.title.message, 'Form Title cannot be blank'); // should.equal(err.errors.title.message, 'Form Title cannot be blank');
done(); // done();
}); // });
}); // });
}); // });
describe('Method Find', function(){ // describe('Method Find', function(){
beforeEach(function(done){ // beforeEach(function(done){
myForm.save(function(err) { // myForm.save(function(err) {
done(); // done();
}); // });
}); // });
it('should be able to findOne my form without problems', function(done) { // it('should be able to findOne my form without problems', function(done) {
return Form.findOne({_id: myForm._id}, function(err,form) { // return Form.findOne({_id: myForm._id}, function(err,form) {
should.not.exist(err); // should.not.exist(err);
should.exist(form); // should.exist(form);
should.deepEqual(form.toObject(), myForm.toObject()); // should.deepEqual(form.toObject(), myForm.toObject());
done(); // done();
}); // });
}); // });
}); // });
describe('Test FormField and Submission Logic', function() { // describe('Test FormField and Submission Logic', function() {
var new_form_fields_add1, new_form_fields_del, submission_fields, old_fields, form; // var new_form_fields_add1, new_form_fields_del, submission_fields, old_fields, form;
before(function(){ // before(function(){
new_form_fields_add1 = _.clone(myForm.toObject().form_fields); // new_form_fields_add1 = _.clone(myForm.toObject().form_fields);
new_form_fields_add1.push( // new_form_fields_add1.push(
{'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''} // {'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''}
); // );
new_form_fields_del = _.clone(myForm.toObject().form_fields); // new_form_fields_del = _.clone(myForm.toObject().form_fields);
new_form_fields_del.splice(0, 1); // new_form_fields_del.splice(0, 1);
submission_fields = _.clone(myForm.toObject().form_fields); // submission_fields = _.clone(myForm.toObject().form_fields);
submission_fields[0].fieldValue = 'David'; // submission_fields[0].fieldValue = 'David';
submission_fields[1].fieldValue = true; // submission_fields[1].fieldValue = true;
submission_fields[2].fieldValue = true; // submission_fields[2].fieldValue = true;
mySubmission = new FormSubmission({ // mySubmission = new FormSubmission({
form_fields: submission_fields, // form_fields: submission_fields,
admin: user, // admin: user,
form: myForm, // form: myForm,
timeElapsed: 17.55 // timeElapsed: 17.55
}); // });
}); // });
beforeEach(function(done){ // beforeEach(function(done){
myForm.save(function(){ // myForm.save(function(){
mySubmission.save(function(){ // mySubmission.save(function(){
done(); // done();
}); // });
}); // });
}); // });
afterEach(function(done){ // afterEach(function(done){
mySubmission.remove(function(){ // mySubmission.remove(function(){
done(); // done();
}); // });
}); // });
// it('should preserve deleted form_fields that have submissions without any problems', function(done) { // // it('should preserve deleted form_fields that have submissions without any problems', function(done) {
// old_fields = myForm.toObject().form_fields; // // old_fields = myForm.toObject().form_fields;
// // console.log(old_fields); // // // console.log(old_fields);
// // var expected_fields = old_fields.slice(1,3).concat(old_fields.slice(0,1)); // // // var expected_fields = old_fields.slice(1,3).concat(old_fields.slice(0,1));
// myForm.form_fields = new_form_fields_del; // // myForm.form_fields = new_form_fields_del;
// myForm.save(function(err, _form) { // // myForm.save(function(err, _form) {
// should.not.exist(err); // // should.not.exist(err);
// should.exist(_form); // // should.exist(_form);
// // var actual_fields = _.map(_form.toObject().form_fields, function(o){ _.omit(o, '_id')}); // // // var actual_fields = _.map(_form.toObject().form_fields, function(o){ _.omit(o, '_id')});
// // old_fields = _.map(old_fields, function(o){ _.omit(o, '_id')}); // // // old_fields = _.map(old_fields, function(o){ _.omit(o, '_id')});
// // console.log(old_fields); // // // console.log(old_fields);
// should.deepEqual(JSON.stringify(_form.toObject().form_fields), JSON.stringify(old_fields), 'old form_fields not equal to newly saved form_fields'); // // should.deepEqual(JSON.stringify(_form.toObject().form_fields), JSON.stringify(old_fields), 'old form_fields not equal to newly saved form_fields');
// done(); // // done();
// }); // // });
// }); // // });
// it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) { // // it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) {
// myForm.form_fields = new_form_fields_del; // // myForm.form_fields = new_form_fields_del;
// myForm.save(function(err, form // // myForm.save(function(err, form
// should.not.exist(err); // // should.not.exist(err);
// (form.form_fields).should.be.eql(old_fields, 'old form_fields not equal to newly saved form_fields'); // // (form.form_fields).should.be.eql(old_fields, 'old form_fields not equal to newly saved form_fields');
// //Remove submission // // //Remove submission
// mySubmission.remove(function(err){ // // mySubmission.remove(function(err){
// myForm.submissions.should.have.length(0); // // myForm.submissions.should.have.length(0);
// myForm.form_fields.should.not.containDeep(old_fields[0]); // // myForm.form_fields.should.not.containDeep(old_fields[0]);
// }); // // });
// }); // // });
// }); // // });
}); // });
// describe('Method generateFDFTemplate', function() { // // describe('Method generateFDFTemplate', function() {
// var FormFDF; // // var FormFDF;
// before(function(done){ // // before(function(done){
// return myForm.save(function(err, form){ // // return myForm.save(function(err, form){
// FormFDF = { // // FormFDF = {
// 'First Name': '', // // 'First Name': '',
// 'nascar': '', // // 'nascar': '',
// 'hockey': '' // // 'hockey': ''
// }; // // };
// done(); // // done();
// }); // // });
// }); // // });
// it('should be able to generate a FDF template without any problems', function() { // // it('should be able to generate a FDF template without any problems', function() {
// var fdfTemplate = myForm.generateFDFTemplate(); // // var fdfTemplate = myForm.generateFDFTemplate();
// (fdfTemplate).should.be.eql(FormFDF); // // (fdfTemplate).should.be.eql(FormFDF);
// }); // // });
// }); // // });
afterEach(function(done) { // afterEach(function(done) {
Form.remove().exec(function() { // Form.remove().exec(function() {
User.remove().exec(done); // User.remove().exec(done);
}); // });
}); // });
}); // });

View File

@ -1,503 +1,503 @@
'use strict'; // 'use strict';
var should = require('should'), // var should = require('should'),
_ = require('lodash'), // _ = require('lodash'),
app = require('../../server'), // app = require('../../server'),
request = require('supertest'), // request = require('supertest'),
Session = require('supertest-session')({ // Session = require('supertest-session')({
app: app // app: app
}), // }),
mongoose = require('mongoose'), // mongoose = require('mongoose'),
User = mongoose.model('User'), // User = mongoose.model('User'),
Form = mongoose.model('Form'), // Form = mongoose.model('Form'),
FormSubmission = mongoose.model('FormSubmission'), // FormSubmission = mongoose.model('FormSubmission'),
agent = request.agent(app); // agent = request.agent(app);
/** // /**
* Globals // * Globals
*/ // */
var credentials, user, _Form, userSession; // var credentials, user, _Form, userSession;
/** // /**
* Form routes tests // * Form routes tests
*/ // */
describe('Form CRUD tests', function() { // describe('Form CRUD tests', function() {
beforeEach(function(done) { // beforeEach(function(done) {
//Initialize Session // //Initialize Session
userSession = new Session(); // userSession = new Session();
// Create user credentials // // Create user credentials
credentials = { // credentials = {
username: 'test@test.com', // username: 'test@test.com',
password: 'password' // password: 'password'
}; // };
// Create a new user // // Create a new user
user = new User({ // user = new User({
firstName: 'Full', // firstName: 'Full',
lastName: 'Name', // lastName: 'Name',
email: 'test@test.com', // email: 'test@test.com',
username: credentials.username, // username: credentials.username,
password: credentials.password, // password: credentials.password,
provider: 'local' // provider: 'local'
}); // });
// Save a user to the test db and create new Form // // Save a user to the test db and create new Form
user.save(function(err) { // user.save(function(err) {
if(err) done(err); // if(err) done(err);
_Form = { // _Form = {
title: 'Form Title', // title: 'Form Title',
language: 'english', // language: 'english',
admin: user._id, // admin: user._id,
form_fields: [ // form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}, // {'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''}, // {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''} // {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''}
] // ]
}; // };
done(); // done();
}); // });
}); // });
it('should be able to save a Form if logged in', function(done) { // it('should be able to save a Form if logged in', function(done) {
userSession.post('/auth/signin') // userSession.post('/auth/signin')
.send(credentials) // .send(credentials)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(signinErr, signinRes) { // .end(function(signinErr, signinRes) {
// Handle signin error // // Handle signin error
if (signinErr) done(signinErr); // if (signinErr) done(signinErr);
var user = signinRes.body; // var user = signinRes.body;
var userId = user._id; // var userId = user._id;
// Save a new Form // // Save a new Form
userSession.post('/forms') // userSession.post('/forms')
.send({form: _Form}) // .send({form: _Form})
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(FormSaveErr, FormSaveRes) { // .end(function(FormSaveErr, FormSaveRes) {
// Handle Form save error // // Handle Form save error
if (FormSaveErr) done(FormSaveErr); // if (FormSaveErr) done(FormSaveErr);
// Get a list of Forms // // Get a list of Forms
userSession.get('/forms') // userSession.get('/forms')
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(FormsGetErr, FormsGetRes) { // .end(function(FormsGetErr, FormsGetRes) {
// Handle Form save error // // Handle Form save error
if (FormsGetErr) done(FormsGetErr); // if (FormsGetErr) done(FormsGetErr);
// Get Forms list // // Get Forms list
var Forms = FormsGetRes.body; // var Forms = FormsGetRes.body;
// Set assertions // // Set assertions
(Forms[0].admin).should.equal(userId); // (Forms[0].admin).should.equal(userId);
(Forms[0].title).should.match('Form Title'); // (Forms[0].title).should.match('Form Title');
// Call the assertion callback // // Call the assertion callback
done(); // done();
}); // });
}); // });
}); // });
}); // });
it('should not be able to create a Form if not logged in', function(done) { // it('should not be able to create a Form if not logged in', function(done) {
userSession.post('/forms') // userSession.post('/forms')
.send({form: _Form}) // .send({form: _Form})
.expect(401) // .expect(401)
.end(function(FormSaveErr, FormSaveRes) { // .end(function(FormSaveErr, FormSaveRes) {
(FormSaveRes.body.message).should.equal('User is not logged in'); // (FormSaveRes.body.message).should.equal('User is not logged in');
// Call the assertion callback // // Call the assertion callback
done(FormSaveErr); // done(FormSaveErr);
}); // });
}); // });
it('should not be able to get list of users\' Forms if not logged in', function(done) { // it('should not be able to get list of users\' Forms if not logged in', function(done) {
userSession.get('/forms') // userSession.get('/forms')
.expect(401) // .expect(401)
.end(function(FormSaveErr, FormSaveRes) { // .end(function(FormSaveErr, FormSaveRes) {
(FormSaveRes.body.message).should.equal('User is not logged in'); // (FormSaveRes.body.message).should.equal('User is not logged in');
// Call the assertion callback // // Call the assertion callback
done(FormSaveErr); // done(FormSaveErr);
}); // });
}); // });
it('should not be able to save a Form if no title is provided', function(done) { // it('should not be able to save a Form if no title is provided', function(done) {
// Set Form with a invalid title field // // Set Form with a invalid title field
_Form.title = ''; // _Form.title = '';
userSession.post('/auth/signin') // userSession.post('/auth/signin')
.send(credentials) // .send(credentials)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(signinErr, signinRes) { // .end(function(signinErr, signinRes) {
// Handle signin error // // Handle signin error
if (signinErr) done(signinErr); // if (signinErr) done(signinErr);
// Save a new Form // // Save a new Form
userSession.post('/forms') // userSession.post('/forms')
.send({form: _Form}) // .send({form: _Form})
.expect(400) // .expect(400)
.end(function(FormSaveErr, FormSaveRes) { // .end(function(FormSaveErr, FormSaveRes) {
// Set message assertion // // Set message assertion
(FormSaveRes.body.message).should.equal('Form Title cannot be blank'); // (FormSaveRes.body.message).should.equal('Form Title cannot be blank');
// Handle Form save error // // Handle Form save error
done(); // done();
}); // });
}); // });
}); // });
it('should be able to update a Form if signed in', function(done) { // it('should be able to update a Form if signed in', function(done) {
userSession.post('/auth/signin') // userSession.post('/auth/signin')
.send(credentials) // .send(credentials)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(signinErr, signinRes) { // .end(function(signinErr, signinRes) {
// Handle signin error // // Handle signin error
if (signinErr) done(signinErr); // if (signinErr) done(signinErr);
// Save a new Form // // Save a new Form
userSession.post('/forms') // userSession.post('/forms')
.send({form: _Form}) // .send({form: _Form})
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(FormSaveErr, FormSaveRes) { // .end(function(FormSaveErr, FormSaveRes) {
// Handle Form save error // // Handle Form save error
if (FormSaveErr) done(FormSaveErr); // if (FormSaveErr) done(FormSaveErr);
// Update Form title // // Update Form title
_Form.title = 'WHY YOU GOTTA BE SO MEAN?'; // _Form.title = 'WHY YOU GOTTA BE SO MEAN?';
// Update an existing Form // // Update an existing Form
userSession.put('/forms/' + FormSaveRes.body._id) // userSession.put('/forms/' + FormSaveRes.body._id)
.send({form: _Form}) // .send({form: _Form})
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(FormUpdateErr, FormUpdateRes) { // .end(function(FormUpdateErr, FormUpdateRes) {
// Handle Form update error // // Handle Form update error
if (FormUpdateErr) done(FormUpdateErr); // if (FormUpdateErr) done(FormUpdateErr);
// Set assertions // // Set assertions
(FormUpdateRes.body._id).should.equal(FormSaveRes.body._id); // (FormUpdateRes.body._id).should.equal(FormSaveRes.body._id);
(FormUpdateRes.body.title).should.match('WHY YOU GOTTA BE SO MEAN?'); // (FormUpdateRes.body.title).should.match('WHY YOU GOTTA BE SO MEAN?');
// Call the assertion callback // // Call the assertion callback
done(); // done();
}); // });
}); // });
}); // });
}); // });
it('should be able to read/get a Form if not signed in', function(done) { // it('should be able to read/get a Form if not signed in', function(done) {
// Create new Form model instance // // Create new Form model instance
var FormObj = new Form(_Form); // var FormObj = new Form(_Form);
// Save the Form // // Save the Form
FormObj.save(function(err, form) { // FormObj.save(function(err, form) {
if(err) done(err); // if(err) done(err);
request(app).get('/forms/' + form._id) // request(app).get('/forms/' + form._id)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(err, res) { // .end(function(err, res) {
if(err) done(err) // if(err) done(err)
// Set assertion // // Set assertion
(res.body).should.be.an.Object.with.property('title', _Form.title); // (res.body).should.be.an.Object.with.property('title', _Form.title);
// Call the assertion callback // // Call the assertion callback
done(); // done();
}); // });
}); // });
}); // });
it('should be able to delete a Form if signed in', function(done) { // it('should be able to delete a Form if signed in', function(done) {
userSession.post('/auth/signin') // userSession.post('/auth/signin')
.send(credentials) // .send(credentials)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(signinErr, signinRes) { // .end(function(signinErr, signinRes) {
// Handle signin error // // Handle signin error
if (signinErr) done(signinErr); // if (signinErr) done(signinErr);
done(); // done();
// Save a new Form // // Save a new Form
// userSession.post('/forms') // // userSession.post('/forms')
// .send({form: _Form}) // // .send({form: _Form})
// .expect('Content-Type', /json/) // // .expect('Content-Type', /json/)
// .expect(200) // // .expect(200)
// .end(function(FormSaveErr, FormSaveRes) { // // .end(function(FormSaveErr, FormSaveRes) {
// // Handle Form save error // // // Handle Form save error
// if (FormSaveErr) done(FormSaveErr); // // if (FormSaveErr) done(FormSaveErr);
// // Delete an existing Form // // // Delete an existing Form
// userSession.delete('/forms/' + FormSaveRes.body._id) // // userSession.delete('/forms/' + FormSaveRes.body._id)
// .send(_Form) // // .send(_Form)
// .expect('Content-Type', /json/) // // .expect('Content-Type', /json/)
// .expect(200) // // .expect(200)
// .end(function(FormDeleteErr, FormDeleteRes) { // // .end(function(FormDeleteErr, FormDeleteRes) {
// // Handle Form error error // // // Handle Form error error
// if (FormDeleteErr) done(FormDeleteErr); // // if (FormDeleteErr) done(FormDeleteErr);
// // Set assertions // // // Set assertions
// (FormDeleteRes.body._id).should.equal(FormSaveRes.body._id); // // (FormDeleteRes.body._id).should.equal(FormSaveRes.body._id);
// // Call the assertion callback // // // Call the assertion callback
// done(); // // done();
// }); // // });
// }); // // });
}); // });
}); // });
it('should not be able to delete an Form if not signed in', function(done) { // it('should not be able to delete an Form if not signed in', function(done) {
// Set Form user // // Set Form user
_Form.admin = user; // _Form.admin = user;
// Create new Form model instance // // Create new Form model instance
var FormObj = new Form(_Form); // var FormObj = new Form(_Form);
// Save the Form // // Save the Form
FormObj.save(function() { // FormObj.save(function() {
// Try deleting Form // // Try deleting Form
request(app).delete('/forms/' + FormObj._id) // request(app).delete('/forms/' + FormObj._id)
.expect(401) // .expect(401)
.end(function(FormDeleteErr, FormDeleteRes) { // .end(function(FormDeleteErr, FormDeleteRes) {
// Set message assertion // // Set message assertion
(FormDeleteRes.body.message).should.match('User is not logged in'); // (FormDeleteRes.body.message).should.match('User is not logged in');
// Handle Form error error // // Handle Form error error
done(FormDeleteErr); // done(FormDeleteErr);
}); // });
}); // });
}); // });
it('should be able to upload a PDF an Form if logged in', function(done) { // it('should be able to upload a PDF an Form if logged in', function(done) {
userSession.post('/auth/signin') // userSession.post('/auth/signin')
.send(credentials) // .send(credentials)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(signinErr, signinRes) { // .end(function(signinErr, signinRes) {
// Handle signin error // // Handle signin error
if (signinErr) done(signinErr); // if (signinErr) done(signinErr);
var user = signinRes.body; // var user = signinRes.body;
var userId = user._id; // var userId = user._id;
// Save a new Form // // Save a new Form
userSession.post('/forms') // userSession.post('/forms')
.send({form: _Form}) // .send({form: _Form})
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(FormSaveErr, FormSaveRes) { // .end(function(FormSaveErr, FormSaveRes) {
// Handle Form save error // // Handle Form save error
if (FormSaveErr) done(FormSaveErr); // if (FormSaveErr) done(FormSaveErr);
// Get a list of Forms // // Get a list of Forms
userSession.get('/forms') // userSession.get('/forms')
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(FormsGetErr, FormsGetRes) { // .end(function(FormsGetErr, FormsGetRes) {
// Handle Form save error // // Handle Form save error
if (FormsGetErr) done(FormsGetErr); // if (FormsGetErr) done(FormsGetErr);
// Get Forms list // // Get Forms list
var Forms = FormsGetRes.body; // var Forms = FormsGetRes.body;
// Set assertions // // Set assertions
(Forms[0].admin).should.equal(userId); // (Forms[0].admin).should.equal(userId);
(Forms[0].title).should.match('Form Title'); // (Forms[0].title).should.match('Form Title');
// Call the assertion callback // // Call the assertion callback
done(); // done();
}); // });
}); // });
}); // });
}); // });
describe('Form Submission tests', function() { // describe('Form Submission tests', function() {
var FormObj, _Submission, submissionSession; // var FormObj, _Submission, submissionSession;
beforeEach(function (done) { // beforeEach(function (done) {
_Form.admin = user; // _Form.admin = user;
FormObj = new Form(_Form); // FormObj = new Form(_Form);
FormObj.save(function(err, form) { // FormObj.save(function(err, form) {
if (err) done(err); // if (err) done(err);
_Submission = { // _Submission = {
form_fields: [ // form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David'}, // {'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David'},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true}, // {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false} // {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false}
], // ],
form: form._id, // form: form._id,
admin: user._id, // admin: user._id,
percentageComplete: 100, // percentageComplete: 100,
timeElapsed: 11.55 // timeElapsed: 11.55
}; // };
FormObj = form; // FormObj = form;
//Setup test session // //Setup test session
submissionSession = new Session(); // submissionSession = new Session();
done(); // done();
}); // });
}); // });
it('should be able to create a Form Submission without signing in', function(done) { // it('should be able to create a Form Submission without signing in', function(done) {
//Create Submission // //Create Submission
submissionSession.post('/forms/' + FormObj._id) // submissionSession.post('/forms/' + FormObj._id)
.send(_Submission) // .send(_Submission)
.expect(200) // .expect(200)
.end(function(err, res) { // .end(function(err, res) {
should.not.exist(err); // should.not.exist(err);
done(); // done();
}); // });
}); // });
it('should be able to get Form Submissions if signed in', function(done) { // it('should be able to get Form Submissions if signed in', function(done) {
submissionSession.post('/auth/signin') // submissionSession.post('/auth/signin')
.send(credentials) // .send(credentials)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(signinErr, signinRes) { // .end(function(signinErr, signinRes) {
should.not.exist(signinErr); // should.not.exist(signinErr);
//Create Submission // //Create Submission
submissionSession.post('/forms/' + FormObj._id) // submissionSession.post('/forms/' + FormObj._id)
.send(_Submission) // .send(_Submission)
.expect(200) // .expect(200)
.end(function(err, res) { // .end(function(err, res) {
should.not.exist(err); // should.not.exist(err);
submissionSession.get('/forms/' + FormObj._id + '/submissions') // submissionSession.get('/forms/' + FormObj._id + '/submissions')
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(err, res) { // .end(function(err, res) {
// Set assertion // // Set assertion
should.not.exist(err); // should.not.exist(err);
// Call the assertion callback // // Call the assertion callback
done(); // done();
}); // });
}); // });
}); // });
}); // });
it('should not be able to get Form Submissions if not signed in', function(done) { // it('should not be able to get Form Submissions if not signed in', function(done) {
// Attempt to fetch form submissions // // Attempt to fetch form submissions
submissionSession.get('/forms/' + FormObj._id + '/submissions') // submissionSession.get('/forms/' + FormObj._id + '/submissions')
.expect(401) // .expect(401)
.end(function(err, res) { // .end(function(err, res) {
// Set assertions // // Set assertions
(res.body.message).should.equal('User is not logged in'); // (res.body.message).should.equal('User is not logged in');
// Call the assertion callback // // Call the assertion callback
done(); // done();
}); // });
}); // });
it('should not be able to delete Form Submission if not signed in', function(done) { // it('should not be able to delete Form Submission if not signed in', function(done) {
var SubmissionObj = new FormSubmission(_Submission); // var SubmissionObj = new FormSubmission(_Submission);
SubmissionObj.save(function (err, submission) { // SubmissionObj.save(function (err, submission) {
should.not.exist(err); // should.not.exist(err);
var submission_ids = _.pluck([submission], '_id'); // var submission_ids = _.pluck([submission], '_id');
// Attempt to delete form submissions // // Attempt to delete form submissions
submissionSession.delete('/forms/' + FormObj._id + '/submissions') // submissionSession.delete('/forms/' + FormObj._id + '/submissions')
.send({deleted_submissions: submission_ids}) // .send({deleted_submissions: submission_ids})
.expect(401) // .expect(401)
.end(function(err, res) { // .end(function(err, res) {
// Set assertions // // Set assertions
should.not.exist(err); // should.not.exist(err);
(res.body.message).should.equal('User is not logged in'); // (res.body.message).should.equal('User is not logged in');
// Call the assertion callback // // Call the assertion callback
done(); // done();
}); // });
}); // });
}); // });
it('should be able to delete Form Submission if signed in', function(done) { // it('should be able to delete Form Submission if signed in', function(done) {
// Create new FormSubmission model instance // // Create new FormSubmission model instance
var SubmissionObj = new FormSubmission(_Submission); // var SubmissionObj = new FormSubmission(_Submission);
SubmissionObj.save(function (err, submission) { // SubmissionObj.save(function (err, submission) {
should.not.exist(err); // should.not.exist(err);
// Signin as user // // Signin as user
submissionSession.post('/auth/signin') // submissionSession.post('/auth/signin')
.send(credentials) // .send(credentials)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(signinErr, signinRes) { // .end(function(signinErr, signinRes) {
// Handle signin error // // Handle signin error
if (signinErr) done(signinErr); // if (signinErr) done(signinErr);
var submission_ids = _.pluck([submission], '_id'); // var submission_ids = _.pluck([submission], '_id');
//Delete form submissions // //Delete form submissions
submissionSession.delete('/forms/' + FormObj._id + '/submissions') // submissionSession.delete('/forms/' + FormObj._id + '/submissions')
.send({deleted_submissions: submission_ids}) // .send({deleted_submissions: submission_ids})
.expect(200) // .expect(200)
.end(function(err, res) { // .end(function(err, res) {
// Set assertions // // Set assertions
should.not.exist(err); // should.not.exist(err);
(res.text).should.equal('Form submissions successfully deleted'); // (res.text).should.equal('Form submissions successfully deleted');
// Call the assertion callback // // Call the assertion callback
done(); // done();
}); // });
}); // });
}); // });
}); // });
afterEach(function(done) {//logout current user if there is one // afterEach(function(done) {//logout current user if there is one
FormSubmission.remove().exec(function() { // FormSubmission.remove().exec(function() {
Form.remove().exec(function (err) { // Form.remove().exec(function (err) {
submissionSession.destroy(); // submissionSession.destroy();
done(); // done();
}); // });
}); // });
}); // });
}); // });
afterEach(function(done) { // afterEach(function(done) {
User.remove().exec(function() { // User.remove().exec(function() {
Form.remove().exec(function() { // Form.remove().exec(function() {
userSession.destroy(); // userSession.destroy();
done(); // done();
}); // });
}); // });
}); // });
}); // });

View File

@ -0,0 +1,324 @@
var RuleEngine = require('node-rules'),
should = require('should'),
rules = require('../../docs/Node-Rules/rules.logic-jump');
describe('Logic-Jump Rules Tests', function() {
describe('StringRules', function(){
describe('Contains Rule', function(){
it('should be TRUTHY if right IS a substring of left', function(done){
//initialize the rule engine
R = new RuleEngine(rules.StringRules.Contains);
//sample fact to run the rules on
var fact = {
left:"userblahblahnamenaoeuaoe",
right:"user",
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
it('should be FALSEY if right IS NOT a substring of left', function(done){
//initialize the rule engine
R = new RuleEngine(rules.StringRules.Contains);
//sample fact to run the rules on
var fact = {
left:"userblahblahnamenaoeuaoe",
right:"user1",
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(false);
done();
});
});
});
describe('NotContains Rule', function(){
it('should be TRUTHY if right IS NOT a substring of left', function(done){
//initialize the rule engine
R = new RuleEngine(rules.StringRules.NotContains);
//sample fact to run the rules on
var fact = {
"left":"userblahblahnamenaoeuaoe",
"right":"user1oe",
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
it('should be FALSEY if right IS a substring of left', function(done){
//initialize the rule engine
R = new RuleEngine(rules.StringRules.NotContains);
//sample fact to run the rules on
var fact = {
"left":"userblahblahnamenaoeuaoe",
"right":"user",
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(false);
done();
});
});
});
describe('BeginsWith Rule', function(){
it('should be TRUTHY if Left string DOES begin with Right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.StringRules.BeginsWith);
//sample fact to run the rules on
var fact = {
"left":"userblahblahnamenaoeuaoe",
"right":"user",
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
it('should be FALSEY if left DOES NOT begin with right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.StringRules.BeginsWith);
//sample fact to run the rules on
var fact = {
"left":"userblahblahnamenaoeuaoe",
"right":"euaoe",
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(false);
done();
});
});
});
describe('EndsWith Rule', function(){
it('should be TRUTHY if Left string DOES end with Right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.StringRules.EndsWith);
//sample fact to run the rules on
var fact = {
"left":"userblahblahnamenaoeuaoe",
"right":"euaoe",
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
it('should be FALSEY if left DOES NOT end with right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.StringRules.EndsWith);
//sample fact to run the rules on
var fact = {
"left":"userblahblahnamenaoeuaoe",
"right":"userb",
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(false);
done();
});
});
});
});
describe('NumberRules', function(){
describe('GreaterThan Rule', function(){
it('NumberRules.GreaterThan rule should be TRUTHY if left > right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.GreaterThan);
//sample fact to run the rules on
var fact = {
left:100,
right:5,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
it('NumberRules.GreaterThan rule should be FALSEY if left < right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.GreaterThan);
//sample fact to run the rules on
var fact = {
left:100,
right:1000,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(false);
done();
});
});
});
describe('SmallerThan Rule', function(){
it('should be TRUTHY if left < right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.SmallerThan);
//sample fact to run the rules on
var fact = {
left:100,
right:1000,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
it('should be FALSEY if left > right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.SmallerThan);
//sample fact to run the rules on
var fact = {
left:100,
right:5,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(false);
done();
});
});
});
describe('GreaterThanOrEqual Rule', function(){
it('should be TRUTHY if left == right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.GreaterThanOrEqual);
//sample fact to run the rules on
var fact = {
left:100,
right:100,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
it('should be TRUTHY if left > right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.GreaterThanOrEqual);
//sample fact to run the rules on
var fact = {
left:100,
right:5,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
it('should be FALSEY if left < right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.GreaterThanOrEqual);
//sample fact to run the rules on
var fact = {
left:100,
right:1000,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(false);
done();
});
});
});
describe('SmallerThanOrEqual Rule', function(){
it('should be TRUTHY if left === right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.SmallerThanOrEqual);
//sample fact to run the rules on
var fact = {
left:100,
right:100,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
it('should be FALSEY if left > right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.SmallerThanOrEqual);
//sample fact to run the rules on
var fact = {
left:100,
right:5,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(false);
done();
});
});
it('should be TRUTHY if left < right', function(done){
//initialize the rule engine
R = new RuleEngine(rules.NumberRules.SmallerThanOrEqual);
//sample fact to run the rules on
var fact = {
left:100,
right:1000,
};
//Now pass the fact on to the rule engine for results
R.execute(fact,function(result){
result.result.should.equal(true);
done();
});
});
});
});
});

View File

@ -1,90 +1,90 @@
'use strict'; // 'use strict';
/** // /**
* Module dependencies. // * Module dependencies.
*/ // */
var should = require('should'), // var should = require('should'),
mongoose = require('mongoose'), // mongoose = require('mongoose'),
User = mongoose.model('User'); // User = mongoose.model('User');
/** // /**
* Globals // * Globals
*/ // */
var user, user2; // var user, user2;
/** // /**
* Unit tests // * Unit tests
*/ // */
describe('User Model Unit Tests:', function() { // describe('User Model Unit Tests:', function() {
beforeEach(function(done) { // beforeEach(function(done) {
user = new User({ // user = new User({
firstName: 'Full', // firstName: 'Full',
lastName: 'Name', // lastName: 'Name',
email: 'test@test.com', // email: 'test@test.com',
username: 'test@test.com', // username: 'test@test.com',
password: 'password', // password: 'password',
provider: 'local' // provider: 'local'
}); // });
user2 = new User({ // user2 = new User({
firstName: 'Full', // firstName: 'Full',
lastName: 'Name', // lastName: 'Name',
email: 'test@test.com', // email: 'test@test.com',
username: 'test@test.com', // username: 'test@test.com',
password: 'password', // password: 'password',
provider: 'local' // provider: 'local'
}); // });
done(); // done();
}); // });
describe('Method Save', function() { // describe('Method Save', function() {
it('should begin with no users', function(done) { // it('should begin with no users', function(done) {
User.find({}, function(err, users) { // User.find({}, function(err, users) {
users.should.have.length(0); // users.should.have.length(0);
done(); // done();
}); // });
}); // });
it('should be able to save without problems', function(done) { // it('should be able to save without problems', function(done) {
user.save(done); // user.save(done);
}); // });
it('should fail to save an existing user again', function(done) { // it('should fail to save an existing user again', function(done) {
user.save(function() { // user.save(function() {
user2.save(function(err) { // user2.save(function(err) {
should.exist(err); // should.exist(err);
done(); // done();
}); // });
}); // });
}); // });
it('should be able to show an error when try to save without first name', function(done) { // it('should be able to show an error when try to save without first name', function(done) {
user.firstName = ''; // user.firstName = '';
return user.save(function(err) { // return user.save(function(err) {
should.exist(err); // should.exist(err);
done(); // done();
}); // });
}); // });
}); // });
describe('Method findUniqueUsername', function() { // describe('Method findUniqueUsername', function() {
beforeEach(function(done) { // beforeEach(function(done) {
User.find({}, function(err, users) { // User.find({}, function(err, users) {
users.should.have.length(0); // users.should.have.length(0);
user.save(done); // user.save(done);
}); // });
}); // });
it('should be able to find unique version of existing username without problems', function(done) { // it('should be able to find unique version of existing username without problems', function(done) {
User.findUniqueUsername(user.username, null, function (availableUsername) { // User.findUniqueUsername(user.username, null, function (availableUsername) {
availableUsername.should.not.equal(user.username); // availableUsername.should.not.equal(user.username);
done(); // done();
}); // });
}); // });
}); // });
afterEach(function(done) { // afterEach(function(done) {
User.remove().exec(done); // User.remove().exec(done);
}); // });
}); // });

View File

@ -19,7 +19,6 @@ var mailosaur = require('mailosaur')(config.mailosaur.key),
var mandrill = require('node-mandrill')(config.mailer.options.auth.pass); var mandrill = require('node-mandrill')(config.mailer.options.auth.pass);
/** /**
* Globals * Globals
*/ */
@ -32,7 +31,7 @@ describe('User CRUD tests', function() {
this.timeout(15000); this.timeout(15000);
var userSession; var userSession;
beforeEach(function(done) { beforeEach(function() {
//Initialize Session //Initialize Session
userSession = new Session(); userSession = new Session();
@ -50,88 +49,75 @@ describe('User CRUD tests', function() {
username: credentials.username, username: credentials.username,
password: credentials.password, password: credentials.password,
}; };
done();
}); });
describe('create, activate and confirm a User Account', function () { // describe('Create, Verify and Activate a User', function() {
var username = 'testActiveAccount.be1e58fb@mailosaur.in'; var username = 'testActiveAccount.be1e58fb@mailosaur.in';
var link, _tmpUser, activateToken = ''; var link, _tmpUser, activateToken = '';
it('should be able to create a temporary (non-activated) User', function(done) { it('should be able to create a temporary (non-activated) User', function(done) {
_User.email = _User.username = username; _User.email = _User.username = username;
userSession.post('/auth/signup') request(app).post('/auth/signup')
.send(_User) .send(_User)
.expect(200) .expect(200, 'An email has been sent to you. Please check it to verify your account.')
.end(function(FormSaveErr, FormSaveRes) { .end(function(FormSaveErr, FormSaveRes) {
(FormSaveRes.text).should.equal('An email has been sent to you. Please check it to verify your account.'); // (FormSaveRes.text).should.equal('An email has been sent to you. Please check it to verify your account.');
done();
setTimeout(function() { // tmpUser.findOne({username: _User.username}, function (err, user) {
tmpUser.findOne({username: _User.username}, function (err, user) { // should.not.exist(err);
should.not.exist(err); // should.exist(user);
should.exist(user); // _tmpUser = user;
_tmpUser = user;
_User.username.should.equal(user.username); // _User.username.should.equal(user.username);
_User.firstName.should.equal(user.firstName); // _User.firstName.should.equal(user.firstName);
_User.lastName.should.equal(user.lastName); // _User.lastName.should.equal(user.lastName);
mandrill('/messages/search', { // // mandrill('/messages/search', {
query: "subject:Confirm", // // query: "subject:Confirm",
senders: [ // // senders: [
"test@forms.polydaic.com" // // "test@forms.polydaic.com"
], // // ],
limit: 1 // // limit: 1
}, function(error, emails) { // // }, function(error, emails) {
if (error) console.log( JSON.stringify(error) ); // // if (error) console.log( JSON.stringify(error) );
var confirmation_email = emails[0]; // // var confirmation_email = emails[0];
mandrill('/messages/content', { // // mandrill('/messages/content', {
id: confirmation_email._id // // id: confirmation_email._id
}, function(error, email) { // // }, function(error, email) {
if (error) console.log( JSON.stringify(error) ); // // if (error) console.log( JSON.stringify(error) );
// console.log(email); // // // console.log(email);
var link = _(email.text.split('\n')).reverse().value()[1]; // // var link = _(email.text.split('\n')).reverse().value()[1];
console.log(link); // // console.log(link);
activateToken = _(url.parse(link).hash.split('/')).reverse().value()[0]; // // activateToken = _(url.parse(link).hash.split('/')).reverse().value()[0];
console.log('actual activateToken: '+ activateToken); // // console.log('actual activateToken: '+ activateToken);
console.log('expected activateToken: ' + user.GENERATED_VERIFYING_URL); // // console.log('expected activateToken: ' + user.GENERATED_VERIFYING_URL);
done(); // // done();
}); // // });
}); // // });
// mailbox.getEmails(function(err, _emails) {
// if(err) done(err);
// var emails = _emails; // // mailbox.getEmails(function(err, _emails) {
// // if(err) done(err);
// // console.log('mailbox.getEmails:'); // // var emails = _emails;
// // console.log(emails[0].text.links);
// var link = emails[0].text.links[0].href; // // console.log('mailbox.getEmails:');
// activateToken = _(url.parse(link).hash.split('/')).reverse().value()[0]; // // console.log(emails[0].text.links);
// console.log('actual activateToken: '+ activateToken);
// console.log('expected activateToken: ' + user.GENERATED_VERIFYING_URL);
// (activateToken).should.equal(user.GENERATED_VERIFYING_URL);
// // done(); // // var link = emails[0].text.links[0].href;
// userSession.get('/auth/verify/'+activateToken) // // activateToken = _(url.parse(link).hash.split('/')).reverse().value()[0];
// .expect(200) // // console.log('actual activateToken: '+ activateToken);
// .end(function(VerifyErr, VerifyRes) { // // console.log('expected activateToken: ' + user.GENERATED_VERIFYING_URL);
// should.not.exist(VerifyErr); // // (activateToken).should.equal(user.GENERATED_VERIFYING_URL);
// (VerifyRes.text).should.equal('User successfully verified');
// done();
// });
// }); // // done();
// // });
}); // });
}, 3000);
}); });
}); });
@ -145,64 +131,64 @@ describe('User CRUD tests', function() {
// }); // });
// }); // });
it('should receive confirmation email after verifying a User Account', function(done) { // it('should receive confirmation email after verifying a User Account', function(done) {
mailbox.getEmails(function(err, _emails) { // mailbox.getEmails(function(err, _emails) {
if(err) throw err; // if(err) throw err;
var email = _emails[0]; // var email = _emails[0];
// console.log('mailbox.getEmails:'); // // console.log('mailbox.getEmails:');
console.log(email); // console.log(email);
(email.subject).should.equal('Account successfully verified!'); // (email.subject).should.equal('Account successfully verified!');
done(); // done();
}); // });
}); // });
}); // });
it('should be able to login and logout a User', function (done) { // it('should be able to login and logout a User', function (done) {
var username = 'testActiveAccount.be1e58fb@mailosaur.in'; // var username = 'testActiveAccount.be1e58fb@mailosaur.in';
_User.email = _User.username = credentials.username = username; // _User.email = _User.username = credentials.username = username;
userSession.post('/auth/signup') // userSession.post('/auth/signup')
.send(_User) // .send(_User)
.expect(200) // .expect(200)
.end(function(FormSaveErr, FormSaveRes) { // .end(function(FormSaveErr, FormSaveRes) {
(FormSaveRes.text).should.equal('An email has been sent to you. Please check it to verify your account.'); // (FormSaveRes.text).should.equal('An email has been sent to you. Please check it to verify your account.');
userSession.post('/auth/signin') // userSession.post('/auth/signin')
.send(credentials) // .send(credentials)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200) // .expect(200)
.end(function(signinErr, signinRes) { // .end(function(signinErr, signinRes) {
// Handle signin error // // Handle signin error
if (signinErr) throw signinErr; // if (signinErr) throw signinErr;
userSession.get('/auth/signout') // userSession.get('/auth/signout')
.expect(200) // .expect(200)
.end(function(signoutErr, signoutRes) { // .end(function(signoutErr, signoutRes) {
// Handle signout error // // Handle signout error
if (signoutErr) throw signoutErr; // if (signoutErr) throw signoutErr;
(signoutRes.text).should.equal('Successfully logged out'); // (signoutRes.text).should.equal('Successfully logged out');
done(); // done();
}); // });
}); // });
}); // });
}); // });
it('should be able to reset a User\'s password'); // it('should be able to reset a User\'s password');
it('should be able to delete a User account without any problems'); // it('should be able to delete a User account without any problems');
afterEach(function(done) { afterEach(function(done) {
User.remove().exec(function () { User.remove().exec(function () {
tmpUser.remove().exec(function(){ tmpUser.remove().exec(function(){
mailbox.deleteAllEmail(function (err, body) { // mailbox.deleteAllEmail(function (err, body) {
if(err) done(err); // if(err) throw err;
userSession.destroy(); userSession.destroy();
done(); done();
}); // });
}); });
}); });
}); });

View File

@ -0,0 +1,33 @@
Data Schema for LogicJump
-----------------------------
##Initial Structure/Hierarchy
**Each LogicJump has:**
-"Boolean Statement"
-Question to Jump to if Boolean Statement is T
-Question to Jump to if Boolean Statement is F
**Each "Boolean Statement" has:**
-List of "If.. then.. statements" that are chained with ANDs or ORs
Each "If.. then.. statement" is structured like
-If.. A condition1 B then...
##What we need to store
####Constants
1. List of valid "conditions" (aka boolean comparison operators)
2. List of valid statement "chainers" (aka AND, OR, NOR, NAND etc)
####Javascript Mongoose Object
IfElseStatement = {
value1: 'true',
value2: 'false',
condition: 'isEqual',
}
BooleanStatement = {
}

View File

@ -0,0 +1,29 @@
Logic Engine
------------
##Rules for String Comparison
**All rules compare left with right (one-way comparison)**
-Equal
-NotEqual
-BeginsWith
-EndsWith
-Contains
-NotContains
##Rules for Number Comparison
**All rules compare left with right (one-way comparison)**
-Equal
-NotEqual
-GreaterThan
-SmallerThan
-GreaterThanOrEqual
-SmallerThanOrEqual
##Rules for Boolean Comparison
**All rules compare left with right (one-way comparison)**
-Equal
-NotEqual
-OR
-AND

View File

@ -0,0 +1,236 @@
//LogicJump (node-rules) Rules in JSON
var simpleFact = {
left:"user 4",
right:"something something user something",
};
var multiFact = {
operandTuples: [
{
left:"user 4",
right:"something something user something",
logicOp: "AND",
},
{
left:"something something user something",
right:"something",
logicOp: "OR",
}
],
left:"",
right:"",
logicOp:"",
prevResult: null,
};
var _globalRules = function(){};
_globalRules.Equal = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
this.logicOp = currTuple.logicOp;
}
R.when(!(this.left === this.right));
},
"consequence" : function(R) {
if(prevResult !== null){
if(logicOp === "AND"){
}
}
this.result = false;
R.next();
},
};
_globalRules.NotEqual = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
R.when(!(this.left !== this.right));
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
_globalRules.AND = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
R.when(!(this.left && this.right));
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
_globalRules.OR = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
R.when(!(this.left || this.right));
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
var _stringRules = function(){};
_stringRules.prototype = _globalRules;
_stringRules.Contains = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
var contains = (this.left.indexOf(this.right) > -1);
R.when(!contains);
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
_stringRules.NotContains = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
var notContains = !(this.left.indexOf(this.right) > -1);
R.when(!notContains);
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
_stringRules.BeginsWith = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
R.when(!(this.left.indexOf(this.right) === 0));
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
_stringRules.EndsWith = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
var lenLeft = this.left.length;
var lenRight = this.right.length;
R.when(!(this.left.indexOf(this.right) === (lenLeft-lenRight)));
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
var _numberRules = function(){};
_numberRules.prototype = _globalRules;
_numberRules.GreaterThan = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
var greaterThan = (this.left > this.right);
R.when(!greaterThan);
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
_numberRules.SmallerThan = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
var smallerThan = (this.left < this.right);
R.when(!smallerThan);
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
_numberRules.GreaterThanOrEqual = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
var greaterThanOrEqual = (this.left >= this.right);
R.when(!greaterThanOrEqual);
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
_numberRules.SmallerThanOrEqual = {
"condition" : function(R) {
if(this.operandTuples){
var currTuple = this.operandTuples.pop();
this.left = currTuple.left;
this.right = currTuple.right;
}
var smallerThanOrEqual = (this.left <= this.right);
R.when(!smallerThanOrEqual);
},
"consequence" : function(R) {
this.result = false;
R.next();
},
};
module.exports = {
StringRules: _stringRules,
NumberRules: _numberRules,
BooleanRules: _globalRules,
};

1
node-rules-extended Submodule

@ -0,0 +1 @@
Subproject commit 2e3c63889452849fff8c6806746c10160db9c95f

View File

@ -69,6 +69,7 @@
"multer": "~0.1.8", "multer": "~0.1.8",
"node-pdffiller": "~0.0.5", "node-pdffiller": "~0.0.5",
"nodemailer": "~1.3.0", "nodemailer": "~1.3.0",
"nools": "^0.4.1",
"passport": "~0.2.0", "passport": "~0.2.0",
"passport-facebook": "~1.0.2", "passport-facebook": "~1.0.2",
"passport-github": "~0.1.5", "passport-github": "~0.1.5",