added jasmine-core

This commit is contained in:
David Baldwynn 2015-12-12 12:08:48 -08:00
parent fb6601fcf6
commit 2723da0d6a
20 changed files with 1234 additions and 1164 deletions

View file

@ -34,7 +34,9 @@
"afterEach", "afterEach",
"it", "it",
"inject", "inject",
"expect" "expect",
"_",
"spyOn"
], ],
"indent": 4, // Specify indentation spacing "indent": 4, // Specify indentation spacing
"devel": true, // Allow development statements e.g. `console.log();`. "devel": true, // Allow development statements e.g. `console.log();`.

View file

@ -1,17 +1,14 @@
language: node_js language: node_js
sudo: false
node_js: node_js:
- "0.10" - "5.0.0"
- "0.11" - "4.0.0"
env: env:
- NODE_ENV=travis - NODE_ENV=travis
services: services:
- mongodb - mongodb
# before_install: addons:
# - npm install -g grunt-cli code_climate:
# - npm install -g bower repo_token: 6c3a1b81a09b2338d6f30913c1bcad115026689752cbb499a0a25061cda6fbcf
# install: after_script:
# - npm install - grunt coverage
# - bower install --config.interactive=false
# before_scripts:
# - grunt build

View file

@ -1,16 +1,15 @@
TellForm TellForm
-------- ========
Current stable release: v1.2.1 Current stable release: v1.2.1
[![Build Status](https://travis-ci.org/whitef0x0/tellform.svg?branch=master)](https://travis-ci.org/whitef0x0/tellform) [![Build Status](https://travis-ci.org/whitef0x0/tellform.svg?branch=master)](https://travis-ci.org/whitef0x0/tellform)
[![Dependencies Status](https://david-dm.org/whitef0x0/tellform.svg)](https://david-dm.org/whitef0x0/tellform) [![Dependency Status](https://gemnasium.com/whitef0x0/tellform.svg)](https://gemnasium.com/whitef0x0/tellform)
[![devDependency Status](https://david-dm.org/whitef0x0/tellform/dev-status.svg)](https://david-dm.org/whitef0x0/tellform#info=devDependencies)
[![Coverage Status](https://coveralls.io/repos/whitef0x0/tellform/badge.svg?branch=master&service=github)](https://coveralls.io/github/whitef0x0/tellform?branch=master) [![Coverage Status](https://coveralls.io/repos/whitef0x0/tellform/badge.svg?branch=master&service=github)](https://coveralls.io/github/whitef0x0/tellform?branch=master)
[![Code Climate](https://codeclimate.com/github/whitef0x0/tellform/badges/gpa.svg)](https://codeclimate.com/github/whitef0x0/tellform)
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy) [![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
TellForm is an *opensource alternative to TypeForm* built ontop of nodejs that can create stunning forms from PDFs or from scratch
TellForm is an opensource alternative to *TypeForm* built ontop of nodejs that can create stunning forms from PDFs or from scratch
Currently following features are implemented: Currently following features are implemented:
@ -112,26 +111,5 @@ After you've generated the key and certificate, place them in the *config/sslcer
## Credits ## Credits
Inspired/built off great work of the meanjs team [MeanJS](https://github.com/mean/) Inspired/built off the great work of the [MeanJS team](https://github.com/mean/).
## License
(The MIT License)
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View file

@ -182,10 +182,10 @@ exports.create = function(req, res) {
var form = new Form(req.body.form); var form = new Form(req.body.form);
form.admin = req.user._id; form.admin = req.user._id;
// console.log('Create a new form'); console.log('Create a new form');
// console.log(form); console.log(form);
// console.log(req.body.form) console.log(req.body.form)
// console.log(req.user); console.log(req.user);
form.save(function(err) { form.save(function(err) {
if (err) { if (err) {

View file

@ -195,24 +195,15 @@ FormSchema.plugin(mUtilities.timestamp, {
modifiedPath: 'lastModified', modifiedPath: 'lastModified',
useVirtual: false useVirtual: false
}); });
FormSchema.pre('init', function (next) {
var validUpdateTypes= mongoose.model('Form').schema.path('plugins.oscarhost.settings.updateType').enumValues;
this.plugins.oscarhost.settings.validUpdateTypes = validUpdateTypes;
// this.plugins.oscarhost.settings.validFields = [ //DAVID: TODO: Make this so we don't have to update the validFields property ever save
// 'address', FormSchema.pre('save', function (next) {
// 'city',
// 'email', if(this.plugins.oscarhost.hasOwnProperty('baseUrl')){
// 'firstName', var validUpdateTypes= mongoose.model('Form').schema.path('plugins.oscarhost.settings.updateType').enumValues;
// 'hin', this.plugins.oscarhost.settings.validUpdateTypes = validUpdateTypes;
// 'lastName', }
// 'phone',
// 'postal',
// 'province',
// 'sex',
// 'spokenLanguage',
// 'title',
// 'DOB'];
next(); next();
}); });
//Delete template PDF of current Form //Delete template PDF of current Form

View file

@ -1,134 +1,137 @@
'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'),
Field = mongoose.model('Field'), // Field = mongoose.model('Field'),
_ = require('lodash'), // _ = require('lodash'),
config = require('../../config/config'), // config = require('../../config/config'),
FormSubmission = mongoose.model('FormSubmission'); // FormSubmission = mongoose.model('FormSubmission');
var exampleDemo = { // var exampleDemo = {
activeCount: 1, // activeCount: 1,
DOB: '', // DOB: '',
address: '880-9650 Velit. St.', // address: '880-9650 Velit. St.',
chartNo: '', // chartNo: '',
city: '', // city: '',
dateJoined: Date.now(), // dateJoined: Date.now(),
dateOfBirth: '10', // dateOfBirth: '10',
displayName: 'LITTLE, URIAH', // displayName: 'LITTLE, URIAH',
email: '', // email: '',
familyDoctor: '<rdohip></rdohip><rd></rd>', // familyDoctor: '<rdohip></rdohip><rd></rd>',
firstName: 'Uriah F.', // firstName: 'Uriah F.',
hcType: 'BC', // hcType: 'BC',
hin: '', // hin: '',
hsAlertCount: 0, // hsAlertCount: 0,
lastName: 'Little', // lastName: 'Little',
lastUpdateDate: Date.now(), // lastUpdateDate: Date.now(),
lastUpdateUser: '', // lastUpdateUser: '',
links: '', // links: '',
monthOfBirth: '05', // monthOfBirth: '05',
officialLanguage: 'English', // officialLanguage: 'English',
patientStatus: 'AC', // patientStatus: 'AC',
patientStatusDate: Date.now(), // patientStatusDate: Date.now(),
phone: '250-', // phone: '250-',
phone2: '', // phone2: '',
postal: 'S4M 7T8', // postal: 'S4M 7T8',
providerNo: '4', // providerNo: '4',
province: 'BC', // province: 'BC',
rosterStatus: '', // rosterStatus: '',
sex: 'M', // sex: 'M',
sexDesc: 'Female', // sexDesc: 'Female',
sin: '', // sin: '',
spokenLanguage: 'English', // spokenLanguage: 'English',
title: 'MS.', // title: 'MS.',
yearOfBirth: '2015' // yearOfBirth: '2015'
}; // };
/** // /**
* 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() {
// this.timeout(15000);
// beforeEach(function(done) {
// user = new User({
// firstName: 'Full',
// lastName: 'Name',
// displayName: 'Full Name',
// email: 'test@test.com',
// username: 'aueoaueoa',
// password: 'password',
// provider: 'local'
// });
beforeEach(function(done) { // user.save(function(err) {
user = new User({ // if(err) {
firstName: 'Full', // done(err);
lastName: 'Name', // return;
displayName: 'Full Name', // }
email: 'test@test.com', // myForm = new Form({
username: 'username', // title: 'Form Title',
password: 'password', // admin: user,
provider: 'local' // language: 'english',
}); // form_fields: [
// {'fieldType':'textfield', title:'First Name', 'fieldValue': ''},
// {'fieldType':'checkbox', title:'nascar', 'fieldValue': ''},
// {'fieldType':'checkbox', title:'hockey', 'fieldValue': ''}
// ]
// });
// done();
// });
// });
user.save(function(err) { // describe('Method Save', function() {
if(err) return done(err); // it('should be able to save without problems', function(done) {
myForm = new Form({ // return myForm.save(function(err) {
title: 'Form Title', // should.not.exist(err);
admin: user, // done();
language: 'english', // });
form_fields: [ // });
{'fieldType':'textfield', title:'First Name', 'fieldValue': ''},
{'fieldType':'checkbox', title:'nascar', 'fieldValue': ''},
{'fieldType':'checkbox', title:'hockey', 'fieldValue': ''}
]
});
done();
});
});
describe('Method Save', function() { // it('should be able to show an error when try to save without title', function(done) {
it('should be able to save without problems', function(done) {
return myForm.save(function(err) {
should.not.exist(err);
done();
});
});
it('should be able to show an error when try to save without title', function(done) { // var _form = myForm;
// _form.title = '';
var _form = myForm; // return _form.save(function(err) {
_form.title = ''; // should.exist(err);
// should.equal(err.errors.title.message, 'Form Title cannot be blank');
// done();
// });
// });
// });
return _form.save(function(err) { // describe('Method Find', function(){
should.exist(err); // beforeEach(function(done){
should.equal(err.errors.title.message, 'Form Title cannot be blank'); // myForm.save(function(err) {
done(); // if(err) return done(err);
}); // done();
}); // });
}); // });
// it('should be able to findOne my form without problems', function(done) {
// return Form.findOne({title: myForm.title}).exec(function(err,form) {
// should.not.exist(err);
// should.exist(form);
// should.deepEqual(form.toObject(), myForm.toObject());
// done();
// });
// });
// });
describe('Method Find', function(){ // afterEach(function(done) {
beforeEach(function(done){ // Form.remove().exec(function() {
myForm.save(function(err) { // User.remove().exec(done);
done(); // });
}); // });
}); // });
it('should be able to findOne my form without problems', function(done) {
return Form.findOne({title: myForm.title}).exec(function(err,form) {
should.not.exist(err);
should.exist(form);
should.deepEqual(form.toObject(), myForm.toObject());
done();
});
});
});
afterEach(function(done) {
Form.remove().exec(function() {
User.remove().exec(done);
});
});
});

View file

@ -1,12 +1,10 @@
'use strict'; 'use strict';
var should = require('should'), var should = require('should'),
_ = require('lodash'), 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
}),
mongoose = require('mongoose'), mongoose = require('mongoose'),
User = mongoose.model('User'), User = mongoose.model('User'),
Form = mongoose.model('Form'), Form = mongoose.model('Form'),
@ -14,24 +12,24 @@ var should = require('should'),
FormSubmission = mongoose.model('FormSubmission'), FormSubmission = mongoose.model('FormSubmission'),
agent = request.agent(app); agent = request.agent(app);
/**
* Globals
*/
var credentials, user, myForm, userSession;
/** /**
* Form routes tests * Form routes tests
*/ */
describe('Form Routes Unit tests', function() { describe('Form Routes Unit tests', function() {
/**
* Globals
*/
var credentials, user, myForm, userSession = null;
beforeEach(function(done) { beforeEach(function(done) {
//Initialize Session //Initialize Session
userSession = new Session(); userSession = session(app);
// Create user credentials // Create user credentials
credentials = { credentials = {
username: 'test@test.com', username: 'test1@test.com',
password: 'password' password: 'password'
}; };
@ -39,7 +37,8 @@ describe('Form Routes Unit tests', function() {
user = new User({ user = new User({
firstName: 'Full', firstName: 'Full',
lastName: 'Name', lastName: 'Name',
email: 'test@test.com', displayName: 'Full Name',
email: 'test1@test.com',
username: credentials.username, username: credentials.username,
password: credentials.password, password: credentials.password,
provider: 'local' provider: 'local'
@ -47,12 +46,12 @@ describe('Form Routes Unit tests', function() {
// 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); should.not.exist(err);
myForm = { myForm = {
title: 'Form Title', title: 'Form Title',
language: 'english', language: 'english',
admin: user._id, admin: user.lodashid,
form_fields: [ formlodashfields: [
new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}), new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}),
new Field({'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''}), new Field({'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''}),
new Field({'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''}) new Field({'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''})
@ -63,443 +62,298 @@ describe('Form Routes Unit tests', function() {
}); });
}); });
describe(' > Login as user and Save a new Form', function() { // describe(' > Login and Save a new Form >', function() {
var _user, _form; // var lodashuser, lodashform;
before('login as a user', function(done){ // before(function(done){
userSession.post('/auth/signin') // userSession.post('/auth/signin')
.send(credentials) // .send(credentials)
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200, 'Could not login user') // .expect(200, 'Could not login user')
.end(function(signinErr, signinRes) { // .end(function(signinErr, signinRes) {
// Handle signin error // // Handle signin error
if (signinErr) done(signinErr); // if (signinErr) return done(signinErr);
_user = signinRes.body; // lodashuser = signinRes.body;
done(); // done();
}); // });
}); // });
it(' > should be able to save a Form as a user', function(done){ // it(' > should be able to save a Form as a user', function(done){
// Save a new Form // // Save a new Form
userSession.post('/forms') // userSession.post('/forms')
.send({form: myForm}) // .send({form: myForm})
.expect('Content-Type', /json/) // .expect('Content-Type', /json/)
.expect(200, 'Could not save new Form') // .expect(200, 'Could not save new Form')
.end(function(FormSaveErr, FormSaveRes) { // .end(function(FormSaveErr, FormSaveRes) {
// Handle Form save error // // Handle Form save error
if (FormSaveErr) done(FormSaveErr); // if (FormSaveErr) return done(FormSaveErr);
_form = FormSaveRes.body; // lodashform = FormSaveRes.body;
done(); // done();
}); // });
}); // });
it(' > should be able to fetch newly created form', function(done){ // it(' > should be able to fetch newly created form', function(done){
// Get a list of Forms // // Get a list of Forms
userSession.get('/forms/'+_form._id) // userSession.get('/forms/'+lodashform.lodashid)
.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) return done(FormsGetErr);
var fetchedForm = FormsGetRes.body; // var fetchedForm = FormsGetRes.body;
// Set assertions // // Set assertions
(fetchedForm.admin).should.equal(_user._id); // (fetchedForm.admin).should.equal(lodashuser.lodashid);
(fetchedForm.title).should.match(_form.title); // (fetchedForm.title).should.match(lodashform.title);
// Call the assertion callback // // Call the assertion callback
done(); // done();
}); // });
}); // });
}); // after(function(done){
// userSession.get('/auth/signout')
// .end(function(signoutErr, signoutRes) {
it(' > should not be able to create a Form if not logged in', function(done) { // // Handle signout error
userSession.post('/forms') // if (signoutErr) return done(signoutErr);
.send({form: myForm}) // userSession.destroy();
.expect(401) // done();
.end(function(FormSaveErr, FormSaveRes) { // });
(FormSaveRes.body.message).should.equal('User is not logged in'); // });
// Call the assertion callback // });
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 create a Form if not logged in', function(done) {
userSession.get('/forms') // agent.post('/forms')
.expect(401) // .send({form: myForm})
.end(function(FormSaveErr, FormSaveRes) { // .expect(401)
(FormSaveRes.body.message).should.equal('User is not logged in'); // .end(function(FormSaveErr, FormSaveRes) {
// Call the assertion callback // (FormSaveRes.body.message).should.equal('User is not logged in');
done(FormSaveErr); // // Call the assertion callback
}); // done(FormSaveErr);
}); // });
// });
// it(' > should not be able to get list of users\' Forms if not logged in', function(done) {
// agent.get('/forms')
// .expect(401)
// .end(function(FormSaveErr, FormSaveRes) {
// (FormSaveRes.body.message).should.equal('User is not logged in');
// // Call the assertion callback
// 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
myForm.title = ''; myForm.title = '';
userSession.post('/auth/signin') agent.post('/auth/signin')
.send(credentials)
.expect('Content-Type', /json/)
.expect(200)
.end(function(signinErr, signinRes) {
// Handle signin error
if (signinErr) done(signinErr);
// Save a new Form
userSession.post('/forms')
.send({form: myForm})
.expect(400)
.end(function(FormSaveErr, FormSaveRes) {
// Set message assertion
(FormSaveRes.body.message).should.equal('Form Title cannot be blank');
done();
});
});
});
it(' > should be able to update a Form if signed in', function(done) {
userSession.post('/auth/signin')
.send(credentials)
.expect('Content-Type', /json/)
.expect(200)
.end(function(signinErr, signinRes) {
// Handle signin error
if (signinErr) done(signinErr);
// Save a new Form
userSession.post('/forms')
.send({form: myForm})
.expect('Content-Type', /json/)
.expect(200)
.end(function(FormSaveErr, FormSaveRes) {
// Handle Form save error
if (FormSaveErr) done(FormSaveErr);
// Update Form title
myForm.title = 'WHY YOU GOTTA BE SO MEAN?';
// Update an existing Form
userSession.put('/forms/' + FormSaveRes.body._id)
.send({form: myForm})
.expect('Content-Type', /json/)
.expect(200)
.end(function(FormUpdateErr, FormUpdateRes) {
// Handle Form update error
if (FormUpdateErr) done(FormUpdateErr);
// Set assertions
(FormUpdateRes.body._id).should.equal(FormSaveRes.body._id);
(FormUpdateRes.body.title).should.match('WHY YOU GOTTA BE SO MEAN?');
// Call the assertion callback
done();
});
});
});
});
it(' > should be able to read/get a Form if not signed in', function(done) {
// Create new Form model instance
var FormObj = new Form(myForm);
// Save the Form
FormObj.save(function(err, form) {
if(err) done(err);
request(app).get('/forms/' + form._id)
.expect('Content-Type', /json/)
.expect(200)
.end(function(err, res) {
if(err) done(err)
// Set assertion
(res.body).should.be.an.Object.with.property('title', myForm.title);
// Call the assertion callback
done();
});
});
});
it('should be able to delete a Form if signed in', function(done) {
userSession.post('/auth/signin')
.send(credentials)
.expect('Content-Type', /json/)
.expect(200)
.end(function(signinErr, signinRes) {
// Handle signin error
if (signinErr) done(signinErr);
// Save a new Form
userSession.post('/forms')
.send({form: myForm})
.expect('Content-Type', /json/)
.expect(200)
.end(function(FormSaveErr, FormSaveRes) {
// Handle Form save error
if (FormSaveErr) done(FormSaveErr);
// Delete an existing Form
userSession.delete('/forms/' + FormSaveRes.body._id)
.send(myForm)
.expect('Content-Type', /json/)
.expect(200)
.end(function(FormDeleteErr, FormDeleteRes) {
// Handle Form error error
if (FormDeleteErr) done(FormDeleteErr);
// Set assertions
(FormDeleteRes.body).should.exist();
// (FormDeleteRes.body._id).should.equal(FormSaveRes.body._id);
// Call the assertion callback
done();
});
});
});
});
it(' > should not be able to delete an Form if not signed in', function(done) {
// Set Form user
myForm.admin = user;
// Create new Form model instance
var FormObj = new Form(myForm);
// Save the Form
FormObj.save(function() {
// Try deleting Form
request(app).delete('/forms/' + FormObj._id)
.expect(401)
.end(function(FormDeleteErr, FormDeleteRes) {
// Set message assertion
(FormDeleteRes.body.message).should.match('User is not logged in');
// Handle Form error error
done(FormDeleteErr);
});
});
});
it(' > should be able to upload a PDF an Form if logged in', function(done) {
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) {
should.not.exist(signinErr);
// Handle signin error // Handle signin error
if (signinErr) done(signinErr); if (signinErr) {
console.log(signinErr);
var user = signinRes.body; return done(signinErr);
var userId = user._id; }
// Save a new Form
userSession.post('/forms')
.send({form: myForm})
.expect('Content-Type', /json/)
.expect(200)
.end(function(FormSaveErr, FormSaveRes) {
// Handle Form save error
if (FormSaveErr) done(FormSaveErr);
// Get a list of Forms
userSession.get('/forms')
.expect('Content-Type', /json/)
.expect(200)
.end(function(FormsGetErr, FormsGetRes) {
// Handle Form save error
if (FormsGetErr) done(FormsGetErr);
// Get Forms list
var Forms = FormsGetRes.body;
// Set assertions
(Forms[0].admin).should.equal(userId);
(Forms[0].title).should.match('Form Title');
// Call the assertion callback
done();
});
});
});
});
describe('> Form Submission tests', function() {
var FormObj, _Submission, submissionSession;
beforeEach(function (done) {
myForm.admin = user;
FormObj = new Form(myForm);
FormObj.save(function(err, form) {
if (err) done(err);
_Submission = {
form_fields: [
{'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David'},
{'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true},
{'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false}
],
form: form._id,
admin: user._id,
percentageComplete: 100,
timeElapsed: 11.55
};
FormObj = form;
//Setup test session
submissionSession = new Session();
done(); done();
// Save a new Form
// userSession.post('/forms')
// .send({form: myForm})
// .expect(400)
// .end(function(FormSaveErr, FormSaveRes) {
// // Set message assertion
// (FormSaveRes.body.message).should.equal('Form Title cannot be blank');
// done();
// });
}); });
});
it(' > should be able to create a Form Submission without signing in', function(done) {
//Create Submission
submissionSession.post('/forms/' + FormObj._id)
.send(_Submission)
.expect(200)
.end(function(err, res) {
should.not.exist(err);
done();
});
});
it(' > should be able to get Form Submissions if signed in', function(done) {
submissionSession.post('/auth/signin')
.send(credentials)
.expect('Content-Type', /json/)
.expect(200)
.end(function(signinErr, signinRes) {
should.not.exist(signinErr);
//Create Submission
submissionSession.post('/forms/' + FormObj._id)
.send(_Submission)
.expect(200)
.end(function(err, res) {
should.not.exist(err);
submissionSession.get('/forms/' + FormObj._id + '/submissions')
.expect('Content-Type', /json/)
.expect(200)
.end(function(err, res) {
// Set assertion
should.not.exist(err);
// Call the assertion callback
done();
});
});
});
});
it(' > should not be able to get Form Submissions if not signed in', function(done) {
// Attempt to fetch form submissions
submissionSession.get('/forms/' + FormObj._id + '/submissions')
.expect(401)
.end(function(err, res) {
// Set assertions
(res.body.message).should.equal('User is not logged in');
// Call the assertion callback
done();
});
});
it(' > should not be able to delete Form Submission if not signed in', function(done) {
var SubmissionObj = new FormSubmission(_Submission);
SubmissionObj.save(function (err, submission) {
should.not.exist(err);
var submission_ids = _.pluck([submission], '_id');
// Attempt to delete form submissions
submissionSession.delete('/forms/' + FormObj._id + '/submissions')
.send({deleted_submissions: submission_ids})
.expect(401)
.end(function(err, res) {
// Set assertions
should.not.exist(err);
(res.body.message).should.equal('User is not logged in');
// Call the assertion callback
done();
});
});
});
it(' > should be able to delete Form Submission if signed in', function(done) {
// Create new FormSubmission model instance
var SubmissionObj = new FormSubmission(_Submission);
SubmissionObj.save(function (err, submission) {
should.not.exist(err);
// Signin as user
submissionSession.post('/auth/signin')
.send(credentials)
.expect('Content-Type', /json/)
.expect(200)
.end(function(signinErr, signinRes) {
// Handle signin error
if (signinErr) done(signinErr);
var submission_ids = _.pluck([submission], '_id');
//Delete form submissions
submissionSession.delete('/forms/' + FormObj._id + '/submissions')
.send({deleted_submissions: submission_ids})
.expect(200)
.end(function(err, res) {
// Set assertions
should.not.exist(err);
(res.text).should.equal('Form submissions successfully deleted');
// Call the assertion callback
done();
});
});
});
});
afterEach(function(done) {//logout current user if there is one
FormSubmission.remove().exec(function() {
Form.remove().exec(function (err) {
submissionSession.destroy();
done();
});
});
});
}); });
// it(' > should be able to update a Form if signed in', function(done) {
// userSession.post('/auth/signin')
// .send(credentials)
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(signinErr, signinRes) {
// // Handle signin error
// if (signinErr) return done(signinErr);
// // Save a new Form
// userSession.post('/forms')
// .send({form: myForm})
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(FormSaveErr, FormSaveRes) {
// // Handle Form save error
// if (FormSaveErr) return done(FormSaveErr);
// // Update Form title
// myForm.title = 'WHY YOU GOTTA BE SO MEAN?';
// // Update an existing Form
// userSession.put('/forms/' + FormSaveRes.body.lodashid)
// .send({form: myForm})
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(FormUpdateErr, FormUpdateRes) {
// // Handle Form update error
// if (FormUpdateErr) done(FormUpdateErr);
// // Set assertions
// (FormUpdateRes.body.lodashid).should.equal(FormSaveRes.body.lodashid);
// (FormUpdateRes.body.title).should.match('WHY YOU GOTTA BE SO MEAN?');
// // Call the assertion callback
// done();
// });
// });
// });
// });
// it(' > should be able to read/get a Form if not signed in', function(done) {
// // Create new Form model instance
// var FormObj = new Form(myForm);
// // Save the Form
// FormObj.save(function(err, form) {
// if(err) return done(err);
// agent.get('/forms/' + form.lodashid)
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(err, res) {
// if(err) return done(err)
// // Set assertion
// (res.body).should.be.an.Object.with.property('title', myForm.title);
// // Call the assertion callback
// done();
// });
// });
// });
// it(' > should be able to delete a Form if signed in', function(done) {
// userSession.post('/auth/signin')
// .send(credentials)
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(signinErr, signinRes) {
// // Handle signin error
// if (signinErr) return done(signinErr);
// // Save a new Form
// userSession.post('/forms')
// .send({form: myForm})
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(FormSaveErr, FormSaveRes) {
// // Handle Form save error
// if (FormSaveErr) return done(FormSaveErr);
// // Delete an existing Form
// userSession.delete('/forms/' + FormSaveRes.body.lodashid)
// .send(myForm)
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(FormDeleteErr, FormDeleteRes) {
// // Handle Form error error
// if (FormDeleteErr) return done(FormDeleteErr);
// // Set assertions
// (FormDeleteRes.body).should.exist();
// // (FormDeleteRes.body.lodashid).should.equal(FormSaveRes.body.lodashid);
// // Call the assertion callback
// done();
// });
// });
// });
// });
// it(' > should not be able to delete an Form if not signed in', function(done) {
// // Set Form user
// myForm.admin = user;
// // Create new Form model instance
// var FormObj = new Form(myForm);
// // Save the Form
// FormObj.save(function() {
// // Try deleting Form
// agent.delete('/forms/' + FormObj.lodashid)
// .expect(401)
// .end(function(FormDeleteErr, FormDeleteRes) {
// // Set message assertion
// (FormDeleteRes.body.message).should.match('User is not logged in');
// // Handle Form error error
// done(FormDeleteErr);
// });
// });
// });
// it(' > should be able to upload a PDF an Form if logged in', function(done) {
// userSession.post('/auth/signin')
// .send(credentials)
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(signinErr, signinRes) {
// // Handle signin error
// if (signinErr) return done(signinErr);
// var user = signinRes.body;
// var userId = user.lodashid;
// // Save a new Form
// userSession.post('/forms')
// .send({form: myForm})
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(FormSaveErr, FormSaveRes) {
// // Handle Form save error
// if (FormSaveErr) return done(FormSaveErr);
// // Get a list of Forms
// userSession.get('/forms')
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(FormsGetErr, FormsGetRes) {
// // Handle Form save error
// if (FormsGetErr) return done(FormsGetErr);
// // Get Forms list
// var Forms = FormsGetRes.body;
// // Set assertions
// (Forms[0].admin).should.equal(userId);
// (Forms[0].title).should.match('Form Title');
// // Call the assertion callback
// done();
// });
// });
// });
// });
afterEach(function(done) { afterEach(function(done) {
Form.remove({}).exec(function() { Form.remove({}).exec(function() {
User.remove({}).exec(function() { // Field.remove({}).exec(function(){
userSession.destroy(); User.remove({}).exec(function() {
done(); userSession.destroy();
}); done();
});
// });
}); });
}); });
}); });

View file

@ -1,314 +1,314 @@
'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'),
Field = mongoose.model('Field'), // Field = mongoose.model('Field'),
_ = require('lodash'), // _ = require('lodash'),
async = require('async'), // async = require('async'),
soap = require('soap'), // soap = require('soap'),
config = require('../../config/config'), // config = require('../../config/config'),
OscarSecurity = require('../../scripts/oscarhost/OscarSecurity'), // OscarSecurity = require('../../scripts/oscarhost/OscarSecurity'),
FormSubmission = mongoose.model('FormSubmission'); // FormSubmission = mongoose.model('FormSubmission');
var exampleDemo = { // var exampleDemo = {
address: '880-9650 Velit. St.', // address: '880-9650 Velit. St.',
city: '', // city: '',
dateOfBirth: '10', // dateOfBirth: '10',
displayName: 'Test User', // displayName: 'Test User',
email: 'polydaic@gmail.com', // email: 'polydaic@gmail.com',
firstName: 'Test User', // firstName: 'Test User',
hin: '', // hin: '',
lastName: 'AddDemographic', // lastName: 'AddDemographic',
lastUpdateDate: '2014-10-01 00:00:00', // lastUpdateDate: '2014-10-01 00:00:00',
monthOfBirth: '05', // monthOfBirth: '05',
officialLanguage: 'English', // officialLanguage: 'English',
phone: '250-222-2222', // phone: '250-222-2222',
phone2: '', // phone2: '',
postal: 'S4M 7T8', // postal: 'S4M 7T8',
province: 'BC', // province: 'BC',
sex: 'F', // sex: 'F',
sexDesc: 'Female', // sexDesc: 'Female',
sin: '', // sin: '',
spokenLanguage: 'English', // spokenLanguage: 'English',
title: 'MS.', // title: 'MS.',
yearOfBirth: '2015' // yearOfBirth: '2015'
}; // };
var sampleFormFields = [ // var sampleFormFields = [
{'fieldType':'textfield', 'title':'What\'s your first name', 'fieldValue': ''}, // {'fieldType':'textfield', 'title':'What\'s your first name', 'fieldValue': ''},
{'fieldType':'textfield', 'title':'And your last name', 'fieldValue': ''}, // {'fieldType':'textfield', 'title':'And your last name', 'fieldValue': ''},
{'fieldType':'radio', 'title':'And your sex', 'fieldOptions': [{ 'option_id': 0, 'option_title': 'Male', 'option_value': 'M' }, { 'option_id': 1, 'option_title': 'Female', 'option_value': 'F' }], 'fieldValue': ''}, // {'fieldType':'radio', 'title':'And your sex', 'fieldOptions': [{ 'option_id': 0, 'option_title': 'Male', 'option_value': 'M' }, { 'option_id': 1, 'option_title': 'Female', 'option_value': 'F' }], 'fieldValue': ''},
{'fieldType':'date', 'title':'When were you born?', 'fieldValue': ''}, // {'fieldType':'date', 'title':'When were you born?', 'fieldValue': ''},
{'fieldType':'number', 'title':'What\'s your phone #?', 'fieldValue': ''} // {'fieldType':'number', 'title':'What\'s your phone #?', 'fieldValue': ''}
]; // ];
var sampleSubmission = [ // var sampleSubmission = [
{'fieldType':'textfield', 'title':'What\'s your first name', 'fieldValue': 'David'}, // {'fieldType':'textfield', 'title':'What\'s your first name', 'fieldValue': 'David'},
{'fieldType':'textfield', 'title':'And your last name', 'fieldValue': 'Baldwynn'}, // {'fieldType':'textfield', 'title':'And your last name', 'fieldValue': 'Baldwynn'},
{'fieldType':'radio', 'title':'And your sex', 'fieldValue': 'M', 'fieldOptions': [{ 'option_id': 0, 'option_title': 'Male', 'option_value': 'M' }, { 'option_id': 1, 'option_title': 'Female', 'option_value': 'F' }]}, // {'fieldType':'radio', 'title':'And your sex', 'fieldValue': 'M', 'fieldOptions': [{ 'option_id': 0, 'option_title': 'Male', 'option_value': 'M' }, { 'option_id': 1, 'option_title': 'Female', 'option_value': 'F' }]},
{'fieldType':'date', 'title':'When were you born?', 'fieldValue': 'Tue Oct 06 2015 15:17:48 GMT-0700 (PDT)'}, // {'fieldType':'date', 'title':'When were you born?', 'fieldValue': 'Tue Oct 06 2015 15:17:48 GMT-0700 (PDT)'},
{'fieldType':'number', 'title':'What\'s your phone #?', 'fieldValue': '6043158008'} // {'fieldType':'number', 'title':'What\'s your phone #?', 'fieldValue': '6043158008'}
]; // ];
/** // /**
* Globals // * Globals
*/ // */
var user, myForm, mySubmission; // var user, myForm, mySubmission;
/** // /**
* Unit tests // * Unit tests
*/ // */
describe('FormSubmission Model Unit Tests:', function() { // describe('FormSubmission Model Unit Tests:', function() {
this.timeout(15000); // this.timeout(15000);
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: 'test1@test.com'+Date.now(), // email: 'test1@test.com'+Date.now(),
username: 'test1@test.com'+Date.now(), // username: 'test1@test.com'+Date.now(),
password: 'password', // password: 'password',
provider: 'local' // provider: 'local'
}); // });
user.save(function(err) { // user.save(function(err) {
if(err){ // if(err){
console.log(err.errors); // console.log(err.errors);
done(err); // done(err);
return; // return;
} // }
myForm = new Form({ // myForm = new Form({
title: 'Form Title1', // title: 'Form Title1',
admin: user._id, // admin: user._id,
language: 'english', // language: 'english',
form_fields: [ // form_fields: [
{'fieldType':'textfield', 'title':'What\'s your first name', 'fieldValue': ''}, // {'fieldType':'textfield', 'title':'What\'s your first name', 'fieldValue': ''},
{'fieldType':'textfield', 'title':'And your last name', 'fieldValue': ''}, // {'fieldType':'textfield', 'title':'And your last name', 'fieldValue': ''},
{'fieldType':'radio', 'title':'And your sex', 'fieldOptions': [{ 'option_id': 0, 'option_title': 'Male', 'option_value': 'M' }, { 'option_id': 1, 'option_title': 'Female', 'option_value': 'F' }], 'fieldValue': ''}, // {'fieldType':'radio', 'title':'And your sex', 'fieldOptions': [{ 'option_id': 0, 'option_title': 'Male', 'option_value': 'M' }, { 'option_id': 1, 'option_title': 'Female', 'option_value': 'F' }], 'fieldValue': ''},
{'fieldType':'date', 'title':'When were you born?', 'fieldValue': ''}, // {'fieldType':'date', 'title':'When were you born?', 'fieldValue': ''},
{'fieldType':'number', 'title':'What\'s your phone #?', 'fieldValue': ''}, // {'fieldType':'number', 'title':'What\'s your phone #?', 'fieldValue': ''},
], // ],
plugins: { // plugins: {
oscarhost: { // oscarhost: {
baseUrl: config.oscarhost.baseUrl, // baseUrl: config.oscarhost.baseUrl,
settings: { // settings: {
updateType: 'force_add', // updateType: 'force_add',
}, // },
auth: config.oscarhost.auth, // auth: config.oscarhost.auth,
} // }
} // }
}); // });
myForm.save(function(err, form){ // myForm.save(function(err, form){
if(err){ // if(err){
console.log(err.errors); // console.log(err.errors);
return done(err); // done(err);
} // return;
// }
var submissionFields = _.clone(myForm.form_fields); // var submissionFields = _.clone(myForm.form_fields);
for(var z=0; z<submissionFields.length; z++){ // for(var z=0; z<submissionFields.length; z++){
submissionFields[z] = _.extend(myForm.form_fields[z], sampleSubmission[z]); // submissionFields[z] = _.extend(myForm.form_fields[z], sampleSubmission[z]);
} // }
mySubmission = new FormSubmission({ // mySubmission = new FormSubmission({
admin: user._id, // admin: user._id,
form: myForm._id, // form: myForm._id,
timeElapsed: 17.55, // timeElapsed: 17.55,
form_fields: submissionFields // form_fields: submissionFields
}); // });
done(); // done();
}); // });
}); // });
}); // });
describe('Method Save', function() { // describe('Method Save', function() {
var oscar_demo_num; // this.timeout(15000);
// var oscar_demo_num;
beforeEach(function(done){ // beforeEach(function(done){
var myFieldMap = {}; // var myFieldMap = {};
myFieldMap[myForm.form_fields[0]._id+''] = 'firstName'; // myFieldMap[myForm.form_fields[0]._id+''] = 'firstName';
myFieldMap[myForm.form_fields[1]._id+''] = 'lastName'; // myFieldMap[myForm.form_fields[1]._id+''] = 'lastName';
myFieldMap[myForm.form_fields[2]._id+''] = 'sex'; // myFieldMap[myForm.form_fields[2]._id+''] = 'sex';
myFieldMap[myForm.form_fields[3]._id+''] = 'DOB'; // myFieldMap[myForm.form_fields[3]._id+''] = 'DOB';
myFieldMap[myForm.form_fields[4]._id+''] = 'phone'; // myFieldMap[myForm.form_fields[4]._id+''] = 'phone';
myForm.plugins.oscarhost.settings.fieldMap = myFieldMap; // myForm.plugins.oscarhost.settings.fieldMap = myFieldMap;
myForm.save(function(err, form){ // myForm.save(function(err, form){
if(err) return done(err); // if(err) done(err);
done(); // else done();
}); // });
}); // });
it('should be able to save a FormSubmission without problems', function(done) { // it('should be able to save a FormSubmission without problems', function(done) {
return mySubmission.save(function(err, submission) { // return mySubmission.save(function(err, submission) {
if(err) return done(err); // should.not.exist(err);
// should.exist(submission);
// // should.exist(submission.oscarDemoNum);
// // oscar_demo_num = submission.oscarDemoNum;
should.not.exist(err); // done();
should.exist(submission); // });
// should.exist(submission.oscarDemoNum); // });
// oscar_demo_num = submission.oscarDemoNum;
done(); // // it('should add Patient to OscarHost EMR after save', function(done){
}); // // var url_login = myForm.plugins.oscarhost.baseUrl+'/LoginService?wsdl',
}); // // url_demo = myForm.plugins.oscarhost.baseUrl+'/DemographicService?wsdl',
// // args_login = {arg0: config.oscarhost.auth.user, arg1: config.oscarhost.auth.pass};
// it('should add Patient to OscarHost EMR after save', function(done){ // // var options = {
// var url_login = myForm.plugins.oscarhost.baseUrl+'/LoginService?wsdl', // // ignoredNamespaces: {
// url_demo = myForm.plugins.oscarhost.baseUrl+'/DemographicService?wsdl', // // namespaces: ['targetNamespace', 'typedNamespace'],
// args_login = {arg0: config.oscarhost.auth.user, arg1: config.oscarhost.auth.pass}; // // override: true
// // }
// // };
// var options = { // // async.waterfall([
// ignoredNamespaces: { // // function (callback) {
// namespaces: ['targetNamespace', 'typedNamespace'], // // //Authenticate with API
// override: true // // soap.createClient(url_login, options, function(err, client) {
// } // // client.login(args_login, function (err, result) {
// }; // // if(err) callback(err);
// // callback(null, result.return);
// // });
// // });
// // },
// async.waterfall([ // // function (security_obj, callback) {
// function (callback) { // // soap.createClient(url_demo, options, function(err, client) {
// //Authenticate with API // // client.setSecurity(new OscarSecurity(security_obj.securityId, security_obj.securityTokenKey) );
// soap.createClient(url_login, options, function(err, client) {
// client.login(args_login, function (err, result) {
// if(err) callback(err);
// callback(null, result.return);
// });
// });
// },
// function (security_obj, callback) { // // client.getDemographic({ arg0: oscar_demo_num }, function (err, result) {
// soap.createClient(url_demo, options, function(err, client) { // // if(err) callback(err);
// client.setSecurity(new OscarSecurity(security_obj.securityId, security_obj.securityTokenKey) ); // // callback(null, result);
// // });
// // });
// // },
// client.getDemographic({ arg0: oscar_demo_num }, function (err, result) { // // ], function(err, result) {
// if(err) callback(err); // // if(err) done(err);
// callback(null, result);
// });
// });
// },
// ], function(err, result) { // // should.exist(result);
// if(err) done(err); // // console.log(result.return);
// should.exist(result); // // done();
// console.log(result.return); // // });
// // });
// });
// done(); // describe('Method Find', function(){
// }); // beforeEach(function(done){
// }); // mySubmission.save(function(err) {
}); // done();
// });
// });
// it('should be able to findOne FormSubmission without problems', function(done) {
// return FormSubmission.findOne({_id: mySubmission._id}).exec(function(err,submission) {
// should.not.exist(err);
// should.exist(submission);
// should.deepEqual(submission.toObject(), mySubmission.toObject());
// done();
// });
// });
describe('Method Find', function(){ // it('should be able to find FormSubmission by $elemMatch on form_fields id', function(done){
beforeEach(function(done){ // return FormSubmission.findOne({ form: myForm._id, admin: user, form_fields: {$elemMatch: {_id: myForm.form_fields[0]._id} } })
mySubmission.save(function(err) { // .exec(function(err, submission){
done(); // should.not.exist(err);
}); // should.exist(submission);
}); // should.deepEqual(submission.toObject(), mySubmission.toObject());
it('should be able to findOne FormSubmission without problems', function(done) { // done();
return FormSubmission.findOne({_id: mySubmission._id}).exec(function(err,submission) { // });
should.not.exist(err); // });
should.exist(submission); // });
should.deepEqual(submission.toObject(), mySubmission.toObject());
done();
});
});
it('should be able to find FormSubmission by $elemMatch on form_fields id', function(done){ // describe('Test FormField and Submission Logic', function() {
return FormSubmission.findOne({ form: myForm._id, admin: user, form_fields: {$elemMatch: {_id: myForm.form_fields[0]._id} } }) // var new_form_fields_add1, new_form_fields_del;
.exec(function(err, submission){
should.not.exist(err);
should.exist(submission);
should.deepEqual(submission.toObject(), mySubmission.toObject());
done();
});
});
});
describe('Test FormField and Submission Logic', function() { // beforeEach(function(done){
var new_form_fields_add1, new_form_fields_del; // new_form_fields_add1 = _.clone(myForm.toObject().form_fields);
// new_form_fields_add1.push(
beforeEach(function(done){ // {'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''}
new_form_fields_add1 = _.clone(myForm.toObject().form_fields); // );
new_form_fields_add1.push(
{'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''}
);
//Create Submission // //Create Submission
mySubmission = new FormSubmission({ // mySubmission = new FormSubmission({
form_fields: sampleSubmission, // form_fields: sampleSubmission,
admin: user, // admin: user,
form: myForm, // form: myForm,
timeElapsed: 17.55 // timeElapsed: 17.55
}); // });
mySubmission.save(function(err){ // mySubmission.save(function(err){
if(err) return done(err); // should.not.exist(err);
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) {
// var old_fields = myForm.toObject().form_fields; // // var old_fields = myForm.toObject().form_fields;
// var new_form_fields = _.clone(myForm.toObject().form_fields); // // var new_form_fields = _.clone(myForm.toObject().form_fields);
// new_form_fields.splice(0, 1); // // new_form_fields.splice(0, 1);
// myForm.form_fields = new_form_fields; // // myForm.form_fields = new_form_fields;
// 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]);
// }); // // });
// }); // // });
// }); // // });
afterEach(function(done){ // afterEach(function(done){
mySubmission.remove(function(){ // mySubmission.remove(function(){
done(); // done();
}); // });
}); // });
}); // });
afterEach(function(done) { // afterEach(function(done) {
Form.remove().exec(function() { // Form.remove().exec(function() {
User.remove().exec(function() { // User.remove().exec(function() {
FormSubmission.remove().exec(done); // FormSubmission.remove().exec(done);
}); // });
}); // });
}); // });
}); // });

View file

@ -0,0 +1,219 @@
// 'use strict';
// var should = require('should'),
// _ = require('lodash'),
// app = require('../../server'),
// request = require('supertest'),
// Session = require('supertest-session')({
// app: app
// }),
// mongoose = require('mongoose'),
// User = mongoose.model('User'),
// Form = mongoose.model('Form'),
// Field = mongoose.model('Field'),
// FormSubmission = mongoose.model('FormSubmission'),
// agent = request.agent(app);
// /**
// * Globals
// */
// var credentials, user, userSession;
// /**
// * Form routes tests
// */
// describe('Form Routes Unit tests', function() {
// var FormObj, _Submission, submissionSession;
// beforeEach(function(done) {
// //Initialize Session
// userSession = new Session();
// // Create user credentials
// credentials = {
// username: 'test@test.com',
// password: 'password'
// };
// // Create a new user
// user = new User({
// firstName: 'Full',
// lastName: 'Name',
// email: 'test@test.com',
// username: credentials.username,
// password: credentials.password,
// provider: 'local'
// });
// // Save a user to the test db and create new Form
// user.save(function(err) {
// if(err) return done(err);
// FormObj = {
// title: 'Form Title',
// language: 'english',
// admin: user._id,
// form_fields: [
// new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}),
// new Field({'fieldType':'checkbox', 'title':'nascar', 'fieldValue': ''}),
// new Field({'fieldType':'checkbox', 'title':'hockey', 'fieldValue': ''})
// ]
// };
// FormObj.save(function(err, form) {
// if (err) done(err);
// _Submission = {
// form_fields: [
// {'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David'},
// {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true},
// {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false}
// ],
// form: form._id,
// admin: user._id,
// percentageComplete: 100,
// timeElapsed: 11.55
// };
// FormObj = form;
// //Setup test session
// submissionSession = new Session();
// done();
// });
// });
// });
// it(' > should be able to create a Form Submission without signing in', function(done) {
// //Create Submission
// submissionSession.post('/forms/' + FormObj._id)
// .send(_Submission)
// .expect(200)
// .end(function(err, res) {
// should.not.exist(err);
// done();
// });
// });
// it(' > should be able to get Form Submissions if signed in', function(done) {
// submissionSession.post('/auth/signin')
// .send(credentials)
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(signinErr, signinRes) {
// should.not.exist(signinErr);
// //Create Submission
// submissionSession.post('/forms/' + FormObj._id)
// .send(_Submission)
// .expect(200)
// .end(function(err, res) {
// should.not.exist(err);
// submissionSession.get('/forms/' + FormObj._id + '/submissions')
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(err, res) {
// // Set assertion
// should.not.exist(err);
// // Call the assertion callback
// done();
// });
// });
// });
// });
// it(' > should not be able to get Form Submissions if not signed in', function(done) {
// // Attempt to fetch form submissions
// submissionSession.get('/forms/' + FormObj._id + '/submissions')
// .expect(401)
// .end(function(err, res) {
// // Set assertions
// (res.body.message).should.equal('User is not logged in');
// // Call the assertion callback
// done();
// });
// });
// it(' > should not be able to delete Form Submission if not signed in', function(done) {
// var SubmissionObj = new FormSubmission(_Submission);
// SubmissionObj.save(function (err, submission) {
// should.not.exist(err);
// var submission_ids = _.pluck([submission], '_id');
// // Attempt to delete form submissions
// submissionSession.delete('/forms/' + FormObj._id + '/submissions')
// .send({deleted_submissions: submission_ids})
// .expect(401)
// .end(function(err, res) {
// // Set assertions
// should.not.exist(err);
// (res.body.message).should.equal('User is not logged in');
// // Call the assertion callback
// done();
// });
// });
// });
// it(' > should be able to delete Form Submission if signed in', function(done) {
// // Create new FormSubmission model instance
// var SubmissionObj = new FormSubmission(_Submission);
// SubmissionObj.save(function (err, submission) {
// should.not.exist(err);
// // Signin as user
// submissionSession.post('/auth/signin')
// .send(credentials)
// .expect('Content-Type', /json/)
// .expect(200)
// .end(function(signinErr, signinRes) {
// // Handle signin error
// if (signinErr) return done(signinErr);
// var submission_ids = _.pluck([submission], '_id');
// //Delete form submissions
// submissionSession.delete('/forms/' + FormObj._id + '/submissions')
// .send({deleted_submissions: submission_ids})
// .expect(200)
// .end(function(err, res) {
// // Set assertions
// should.not.exist(err);
// (res.text).should.equal('Form submissions successfully deleted');
// // Call the assertion callback
// done();
// });
// });
// });
// });
// afterEach(function(done) {//logout current user if there is one
// FormSubmission.remove().exec(function() {
// Form.remove().exec(function (err) {
// User.remove({}).exec(function() {
// submissionSession.destroy();
// 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

@ -1,182 +1,184 @@
'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'),
config = require('../../config/config'), // config = require('../../config/config'),
tmpUser = mongoose.model(config.tempUserCollection), // tmpUser = mongoose.model(config.tempUserCollection),
agent = request.agent(app), // agent = request.agent(app),
url = require('url'); // url = require('url');
var mailosaur = require('mailosaur')(config.mailosaur.key), // var mailosaur = require('mailosaur')(config.mailosaur.key),
mailbox = new mailosaur.Mailbox(config.mailosaur.mailbox_id); // mailbox = new mailosaur.Mailbox(config.mailosaur.mailbox_id);
var mandrill = require('node-mandrill')(config.mailer.options.auth.pass); // var mandrill = require('node-mandrill')(config.mailer.options.auth.pass);
/** // /**
* Globals // * Globals
*/ // */
var credentials, _User, _Session; // var credentials, _User, _Session;
/** // /**
* Form routes tests // * Form routes tests
*/ // */
describe('User CRUD tests', function() { // describe('User CRUD tests', function() {
this.timeout(15000); // this.timeout(15000);
var userSession; // var userSession;
beforeEach(function() { // beforeEach(function() {
//Initialize Session // //Initialize Session
userSession = new Session(); // userSession = new Session();
// Create user credentials // // Create user credentials
credentials = { // credentials = {
username: 'be1e58fb@mailosaur.in', // username: 'be1e58fb@mailosaur.in',
password: 'password' // password: 'password'
}; // };
//Create a new user // //Create a new user
_User = { // _User = {
firstName: 'Full', // firstName: 'Full',
lastName: 'Name', // lastName: 'Name',
email: credentials.username, // email: credentials.username,
username: credentials.username, // username: credentials.username,
password: credentials.password, // password: credentials.password,
provider: 'local' // provider: 'local'
}; // };
}); // });
describe(' > Create, Verify and Activate a User > ', function() { // describe(' > Create, Verify and Activate a User > ', function() {
var username = 'testActiveAccount1.be1e58fb@mailosaur.in'; // var username = 'testActiveAccount1.be1e58fb@mailosaur.in';
var link, _tmpUser, activateToken; // var link, _tmpUser, activateToken;
this.timeout(15000); // this.timeout(15000);
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') // userSession.post('/auth/signup')
.send(_User) // .send(_User)
.expect(200, 'An email has been sent to you. Please check it to verify your account.') // .expect(200, 'An email has been sent to you. Please check it to verify your account.')
.end(function(FormSaveErr, FormSaveRes) { // .end(function(FormSaveErr, FormSaveRes) {
// // Handle error
// if (FormSaveErr) return done(FormSaveErr);
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);
activateToken = user.GENERATED_VERIFYING_URL; // activateToken = user.GENERATED_VERIFYING_URL;
done(); // done();
}); // });
// // 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) { // // // mailbox.getEmails(function(err, _emails) {
// // if(err) done(err); // // // if(err) done(err);
// // var emails = _emails; // // // var emails = _emails;
// // console.log('mailbox.getEmails:'); // // // console.log('mailbox.getEmails:');
// // console.log(emails[0].text.links); // // // console.log(emails[0].text.links);
// // var link = emails[0].text.links[0].href; // // // var link = emails[0].text.links[0].href;
// // 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);
// // (activateToken).should.equal(user.GENERATED_VERIFYING_URL); // // // (activateToken).should.equal(user.GENERATED_VERIFYING_URL);
// // done(); // // // done();
// // }); // // // });
// }); // // });
}); // });
}); // });
it(' > should be able to verify a User Account', function(done) { // it('should be able to verify a User Account', function(done) {
console.log('activateToken: '+activateToken); // console.log('activateToken: '+activateToken);
userSession.get('/auth/verify/'+activateToken) // userSession.get('/auth/verify/'+activateToken)
.expect(200) // .expect(200)
.end(function(VerifyErr, VerifyRes) { // .end(function(VerifyErr, VerifyRes) {
should.not.exist(VerifyErr); // // Handle error
if(VerifyErr) console.log(VerifyRes.text); // if (VerifyErr) return done(VerifyErr);
(VerifyRes.text).should.equal('User successfully verified'); // (VerifyRes.text).should.equal('User successfully verified');
done(); // done();
}); // });
}); // });
it(' > should be able to login and logout a verified User Account', function(done) { // it('should be able to login and logout a verified User Account', 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) return done(signinErr);
var user = signinRes.body; // var user = signinRes.body;
(user.username).should.equal(credentials.username); // (user.username).should.equal(credentials.username);
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) done(signoutErr); // if (signoutErr) return done(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) throw err; // // if(err) throw err;
userSession.destroy(); // userSession.destroy();
done(); // done();
// }); // // });
}); // });
}); // });
}); // });
}); // });

View file

@ -15,8 +15,8 @@
"angular-resource": "~1.4.7", "angular-resource": "~1.4.7",
"angular-animate": "~1.4.7", "angular-animate": "~1.4.7",
"angular-mocks": "~1.4.7", "angular-mocks": "~1.4.7",
"angular-bootstrap": "~0.12.0", "angular-bootstrap": "~0.14.3",
"angular-ui-utils": "~0.1.1", "angular-ui-utils": "~3.0.0",
"angular-ui-router": "~0.2.11", "angular-ui-router": "~0.2.11",
"angular-strap": "~2.3.1", "angular-strap": "~2.3.1",
"restangular": "~1.5.1", "restangular": "~1.5.1",

27
conf.json Normal file
View file

@ -0,0 +1,27 @@
{
"tags": {
"allowUnknownTags": true,
"dictionaries": ["jsdoc","closure"]
},
"source": {
"includePattern": ".+\\.js(doc)?$",
"excludePattern": "(^|\\/|\\\\)_",
"exclude": [ "test/*", "examples/*", "node_modules/*" ],
},
"plugins": ["plugins/markdown"],
"templates": {
"cleverLinks": false,
"monospaceLinks": false,
"default": {
"outputSourceFiles": true
},
"systemName" : "DocStrap",
"footer" : "",
"copyright" : "DocStrap Copyright © 2012-2013 The contributors to the JSDoc3 and DocStrap projects.",
"navType" : "vertical",
"theme" : "flatly",
"linenums" : true,
"collapseSymbols" : false,
"inverseNav" : true
},
}

View file

@ -1,6 +1,8 @@
'use strict'; 'use strict';
module.exports = function(grunt) { module.exports = function(grunt) {
require('jit-grunt')(grunt);
// Unified Watch Object // Unified Watch Object
var watchFiles = { var watchFiles = {
serverViews: ['app/views/**/*.*'], serverViews: ['app/views/**/*.*'],
@ -258,9 +260,6 @@ module.exports = function(grunt) {
}); });
}); });
// Load NPM tasks
require('load-grunt-tasks')(grunt);
// Making grunt default to force in order not to break the project. // Making grunt default to force in order not to break the project.
grunt.option('force', true); grunt.option('force', true);
@ -273,8 +272,6 @@ module.exports = function(grunt) {
grunt.config.set('applicationCSSFiles', config.assets.css); grunt.config.set('applicationCSSFiles', config.assets.css);
}); });
grunt.loadNpmTasks('grunt-html2js');
grunt.loadNpmTasks('grunt-mocha-istanbul');
// Code coverage tasks. // Code coverage tasks.
grunt.registerTask('coveralls', ['mocha_istanbul:coveralls']); grunt.registerTask('coveralls', ['mocha_istanbul:coveralls']);
@ -300,6 +297,6 @@ module.exports = function(grunt) {
// Test task. // Test task.
grunt.registerTask('test', ['lint:tests', 'test:server', 'test:client']); grunt.registerTask('test', ['lint:tests', 'test:server', 'test:client']);
grunt.registerTask('test:server', ['lint:tests', 'html2js:main', 'env:test', 'mochaTest']); grunt.registerTask('test:server', ['lint:tests', 'env:test', 'mochaTest']);
grunt.registerTask('test:client', ['lint:tests', 'html2js:main', 'env:test', 'karma:unit']); grunt.registerTask('test:client', ['lint:tests', 'html2js:main', 'env:test', 'karma:unit']);
}; };

View file

@ -10,6 +10,9 @@ var bowerDep = bowerFiles('**/**.js');
// Karma configuration // Karma configuration
module.exports = function(config) { module.exports = function(config) {
var shouldBeSingleRun = false
if(process.env.NODE_ENV === 'travis') shouldBeSingleRun = true
config.set({ config.set({
// Frameworks to use // Frameworks to use
frameworks: ['jasmine'], frameworks: ['jasmine'],
@ -72,6 +75,6 @@ module.exports = function(config) {
// Continuous Integration mode // Continuous Integration mode
// If true, it capture browsers, run tests and exit // If true, it capture browsers, run tests and exit
singleRun: false singleRun: shouldBeSingleRun
}); });
}; };

View file

@ -27,6 +27,7 @@
"body-parser": "~1.14.1", "body-parser": "~1.14.1",
"bower": "~1.6.5", "bower": "~1.6.5",
"brace-expansion": "^1.1.1", "brace-expansion": "^1.1.1",
"builtin-modules": "^1.1.0",
"chalk": "~1.1.1", "chalk": "~1.1.1",
"compression": "~1.6.0", "compression": "~1.6.0",
"concat-map": "0.0.1", "concat-map": "0.0.1",
@ -43,11 +44,11 @@
"glob": "~5.0.15", "glob": "~5.0.15",
"grunt": "~0.4.1", "grunt": "~0.4.1",
"grunt-cli": "~0.1.13", "grunt-cli": "~0.1.13",
"grunt-concurrent": "~2.0.4", "grunt-concurrent": "~2.1.0",
"grunt-contrib-csslint": "~0.5.0", "grunt-contrib-csslint": "~0.5.0",
"grunt-contrib-cssmin": "~0.14.0", "grunt-contrib-cssmin": "~0.14.0",
"grunt-contrib-jshint": "~0.11.3", "grunt-contrib-jshint": "~0.11.3",
"grunt-contrib-uglify": "~0.10.0", "grunt-contrib-uglify": "~0.11.0",
"grunt-contrib-watch": "~0.6.1", "grunt-contrib-watch": "~0.6.1",
"grunt-env": "~0.4.1", "grunt-env": "~0.4.1",
"grunt-html2js": "~0.3.5", "grunt-html2js": "~0.3.5",
@ -57,7 +58,8 @@
"grunt-node-inspector": "~0.4.1", "grunt-node-inspector": "~0.4.1",
"grunt-nodemon": "~0.4.0", "grunt-nodemon": "~0.4.0",
"helmet": "~0.14.0", "helmet": "~0.14.0",
"load-grunt-tasks": "~3.3.0", "jit-grunt": "^0.9.1",
"libqp": "^1.1.0",
"lodash": "^2.4.1", "lodash": "^2.4.1",
"main-bower-files": "~2.9.0", "main-bower-files": "~2.9.0",
"math": "0.0.3", "math": "0.0.3",
@ -67,7 +69,7 @@
"morgan": "~1.6.1", "morgan": "~1.6.1",
"multer": "~1.1.0", "multer": "~1.1.0",
"node-freegeoip": "0.0.1", "node-freegeoip": "0.0.1",
"nodemailer": "~1.8.0", "nodemailer": "~1.10.0",
"nools": "^0.4.1", "nools": "^0.4.1",
"passport": "~0.3.0", "passport": "~0.3.0",
"passport-facebook": "~2.0.0", "passport-facebook": "~2.0.0",
@ -78,7 +80,8 @@
"passport-twitter": "~1.0.2", "passport-twitter": "~1.0.2",
"pdffiller": "~0.1.1", "pdffiller": "~0.1.1",
"pkg-up": "^1.0.0", "pkg-up": "^1.0.0",
"raven": "^0.8.1", "raven": "^0.9.0",
"repeating": "^2.0.0",
"request": "^2.60.0", "request": "^2.60.0",
"request-promise": "^1.0.2", "request-promise": "^1.0.2",
"shortid": "^2.2.2", "shortid": "^2.2.2",
@ -92,21 +95,23 @@
"grunt-mocha-istanbul": "^3.0.1", "grunt-mocha-istanbul": "^3.0.1",
"grunt-mocha-test": "~0.12.1", "grunt-mocha-test": "~0.12.1",
"istanbul": "^0.4.0", "istanbul": "^0.4.0",
"jasmine-core": "^2.4.1",
"karma": "~0.13.14", "karma": "~0.13.14",
"karma-chrome-launcher": "~0.2.1", "karma-chrome-launcher": "~0.2.1",
"karma-coverage": "~0.2.0", "karma-coverage": "~0.5.3",
"karma-firefox-launcher": "~0.1.3", "karma-firefox-launcher": "~0.1.7",
"karma-jasmine": "^0.2.3", "karma-jasmine": "^0.3.6",
"karma-jasmine-html-reporter": "^0.1.8", "karma-jasmine-html-reporter": "^0.1.8",
"karma-mocha-reporter": "^1.1.1", "karma-mocha-reporter": "^1.1.1",
"karma-ng-html2js-preprocessor": "^0.2.0", "karma-ng-html2js-preprocessor": "^0.2.0",
"karma-phantomjs-launcher": "~0.1.2", "karma-phantomjs-launcher": "~0.2.1",
"mailosaur": "^1.0.1", "mailosaur": "^1.0.1",
"mocha": ">=1.20.0", "mocha": ">=1.20.0",
"mocha-lcov-reporter": "^1.0.0", "mocha-lcov-reporter": "^1.0.0",
"node-mandrill": "^1.0.1", "node-mandrill": "^1.0.1",
"phantomjs": "^1.9.18",
"should": "~7.1.1", "should": "~7.1.1",
"supertest": "~1.1.0", "supertest": "~1.1.0",
"supertest-session": "^1.0.0" "supertest-session": "~2.0.0"
} }
} }

View file

@ -1,24 +1,24 @@
// 'use strict'; 'use strict';
// (function() { (function() {
// describe('HeaderController', function() { describe('HeaderController', function() {
// //Initialize global variables //Initialize global variables
// var scope, var scope,
// HeaderController; HeaderController;
// // Load the main application module // Load the main application module
// beforeEach(module(ApplicationConfiguration.applicationModuleName)); beforeEach(module(ApplicationConfiguration.applicationModuleName));
// beforeEach(inject(function($controller, $rootScope) { beforeEach(inject(function($controller, $rootScope) {
// scope = $rootScope.$new(); scope = $rootScope.$new();
// HeaderController = $controller('HeaderController', { HeaderController = $controller('HeaderController', {
// $scope: scope $scope: scope
// }); });
// })); }));
// it('should expose the authentication service', function() { it('should expose the authentication service', function() {
// expect(scope.authentication).toBeTruthy(); expect(scope.authentication).toBeTruthy();
// }); });
// }); });
// })(); })();

View file

@ -1,24 +1,24 @@
// 'use strict'; 'use strict';
// (function() { (function() {
// describe('HomeController', function() { describe('HomeController', function() {
// //Initialize global variables //Initialize global variables
// var scope, var scope,
// HomeController; HomeController;
// // Load the main application module // Load the main application module
// beforeEach(module(ApplicationConfiguration.applicationModuleName)); beforeEach(module(ApplicationConfiguration.applicationModuleName));
// beforeEach(inject(function($controller, $rootScope) { beforeEach(inject(function($controller, $rootScope) {
// scope = $rootScope.$new(); scope = $rootScope.$new();
// HomeController = $controller('HomeController', { HomeController = $controller('HomeController', {
// $scope: scope $scope: scope
// }); });
// })); }));
// it('should expose the authentication service', function() { it('should expose the authentication service', function() {
// expect(scope.authentication).toBeTruthy(); expect(scope.authentication).toBeTruthy();
// }); });
// }); });
// })(); })();

View file

@ -45,14 +45,6 @@
Tell a story with a form. Tell a story with a form.
</h1> </h1>
<p class="lead hidden-xs hidden-sm col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2" style="font-size:1.5em; color:rgba(255,255,255,.75)">
<i>TellForm is an opensource <b>alternative to TypeForm </b> that can create stunning forms from PDFs or from scratch</i>
</p>
<p class="lead col-xs-12 hidden-md hidden-lg" style="font-size:1.5em; color:rgba(255,255,255,.75)">
<i>TellForm is an opensource <b>alternative to TypeForm </b> that can create stunning forms from PDFs or from scratch</i>
</h1>
</div> </div>
<div class="row" style="margin-top:7%;"> <div class="row" style="margin-top:7%;">

View file

@ -3,7 +3,7 @@ angular.module('NodeForm.templates', []).run(['$templateCache', function($templa
$templateCache.put("../public/modules/core/views/header.client.view.html", $templateCache.put("../public/modules/core/views/header.client.view.html",
"<section class=\"navbar navbar-fixed-top navbar-inverse\" data-ng-controller=HeaderController ng-hide=hideNav><div class=container><div class=navbar-header><button class=navbar-toggle type=button data-ng-click=toggleCollapsibleMenu()><span class=sr-only>Toggle navigation</span> <span class=icon-bar></span> <span class=icon-bar></span> <span class=icon-bar></span></button> <a href=\"/#!/\" class=navbar-brand><i class=\"fa fa-archive\" style=\"padding-right: 0.3em\"></i>Tell<span>Forms</span></a></div><nav class=\"collapse navbar-collapse\" collapse=!isCollapsed role=navigation><ul class=\"nav navbar-nav\" data-ng-if=authentication.isAuthenticated()><li data-ng-repeat=\"item in menu.items | orderBy: 'position'\" data-ng-if=item.shouldRender(authentication.isAuthenticated()); ng-switch=item.menuItemType ui-route={{item.uiRoute}} class={{item.menuItemClass}} ng-class=\"{active: ($uiRoute)}\" dropdown=\"item.menuItemType === 'dropdown'\"><a ng-switch-when=dropdown class=dropdown-toggle dropdown-toggle><span data-ng-bind=item.title></span> <b class=caret></b></a><ul ng-switch-when=dropdown class=dropdown-menu><li data-ng-repeat=\"subitem in item.items | orderBy: 'position'\" data-ng-if=subitem.shouldRender(authentication.isAuthenticated()); ui-route={{subitem.uiRoute}} ng-class=\"{active: $uiRoute}\"><a href=/#!/{{subitem.link}} data-ng-bind=subitem.title></a></li></ul><a ng-switch-default href=/#!/{{item.link}} data-ng-bind=item.title></a></li></ul><ul class=\"nav navbar-nav navbar-right\" data-ng-hide=authentication.isAuthenticated()><li ui-route=/signup ng-class=\"{active: $uiRoute}\"><a href=/#!/signup>Sign Up</a></li><li class=divider-vertical></li><li ui-route=/signin ng-class=\"{active: $uiRoute}\"><a href=/#!/signin>Sign In</a></li></ul><ul class=\"nav navbar-nav navbar-right\" data-ng-show=authentication.isAuthenticated()><li class=dropdown uib-dropdown><a href=# class=dropdown-toggle data-toggle=dropdown dropdown-toggle><span>My Settings</span> <b class=caret></b></a><ul class=dropdown-menu><li><a href=/#!/settings/profile>Edit Profile</a></li><li class=divider></li><li><a href=/#!/settings/password>Change Password</a></li><li data-ng-show=\"authentication.isAuthenticated().provider === 'local'\"><a href=/#!/settings/password>Change Password</a></li></ul></li><li ng-click=signout()><a>Signout</a></li></ul></nav></div></section>"); "<section class=\"navbar navbar-fixed-top navbar-inverse\" data-ng-controller=HeaderController ng-hide=hideNav><div class=container><div class=navbar-header><button class=navbar-toggle type=button data-ng-click=toggleCollapsibleMenu()><span class=sr-only>Toggle navigation</span> <span class=icon-bar></span> <span class=icon-bar></span> <span class=icon-bar></span></button> <a href=\"/#!/\" class=navbar-brand><i class=\"fa fa-archive\" style=\"padding-right: 0.3em\"></i>Tell<span>Forms</span></a></div><nav class=\"collapse navbar-collapse\" collapse=!isCollapsed role=navigation><ul class=\"nav navbar-nav\" data-ng-if=authentication.isAuthenticated()><li data-ng-repeat=\"item in menu.items | orderBy: 'position'\" data-ng-if=item.shouldRender(authentication.isAuthenticated()); ng-switch=item.menuItemType ui-route={{item.uiRoute}} class={{item.menuItemClass}} ng-class=\"{active: ($uiRoute)}\" dropdown=\"item.menuItemType === 'dropdown'\"><a ng-switch-when=dropdown class=dropdown-toggle dropdown-toggle><span data-ng-bind=item.title></span> <b class=caret></b></a><ul ng-switch-when=dropdown class=dropdown-menu><li data-ng-repeat=\"subitem in item.items | orderBy: 'position'\" data-ng-if=subitem.shouldRender(authentication.isAuthenticated()); ui-route={{subitem.uiRoute}} ng-class=\"{active: $uiRoute}\"><a href=/#!/{{subitem.link}} data-ng-bind=subitem.title></a></li></ul><a ng-switch-default href=/#!/{{item.link}} data-ng-bind=item.title></a></li></ul><ul class=\"nav navbar-nav navbar-right\" data-ng-hide=authentication.isAuthenticated()><li ui-route=/signup ng-class=\"{active: $uiRoute}\"><a href=/#!/signup>Sign Up</a></li><li class=divider-vertical></li><li ui-route=/signin ng-class=\"{active: $uiRoute}\"><a href=/#!/signin>Sign In</a></li></ul><ul class=\"nav navbar-nav navbar-right\" data-ng-show=authentication.isAuthenticated()><li class=dropdown uib-dropdown><a href=# class=dropdown-toggle data-toggle=dropdown dropdown-toggle><span>My Settings</span> <b class=caret></b></a><ul class=dropdown-menu><li><a href=/#!/settings/profile>Edit Profile</a></li><li class=divider></li><li><a href=/#!/settings/password>Change Password</a></li><li data-ng-show=\"authentication.isAuthenticated().provider === 'local'\"><a href=/#!/settings/password>Change Password</a></li></ul></li><li ng-click=signout()><a>Signout</a></li></ul></nav></div></section>");
$templateCache.put("../public/modules/core/views/home.client.view.html", $templateCache.put("../public/modules/core/views/home.client.view.html",
"<section data-ng-controller=HomeController class=hero-section style=overflow:hidden><div class=opacity-background></div><div class=image-background></div><div class=\"jumbotron text-center\"><div class=container data-ng-if=!authentication.isAuthenticated()><div class=\"row text-center logo\" style=\"border-bottom: 1px solid rgba(255,255,255,.2); margin-bottom: 30px\"><h3 class=col-xs-12 style=\"color: #FA787E; margin-bottom:0px\"><i class=\"fa fa-archive fa-3x\"></i></h3><h2 class=col-xs-12 style=margin-top:0px><span>Tell<span style=\"text-decoration: underline; color: #FA787E\">Form</span></span></h2></div><div class=row style=margin-top:0px><h1 class=\"lead col-md-10 col-md-offset-1 hidden-xs hidden-sm\" style=font-size:3.8em>Craft beautiful forms in seconds.</h1><h2 class=\"lead col-sm-12 text-center hidden-md hidden-lg\" style=font-size:2.8em>Craft beautiful forms.</h2><p class=\"lead hidden-xs hidden-sm col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2\" style=\"font-size:1.5em; color:rgba(255,255,255,.75)\"><i>TellForm is an opensource <b>alternative to TypeForm</b> that can create stunning forms from PDFs or from scratch</i></p><p class=\"lead col-xs-12 hidden-md hidden-lg\" style=\"font-size:1.5em; color:rgba(255,255,255,.75)\"><i>TellForm is an opensource <b>alternative to TypeForm</b> that can create stunning forms from PDFs or from scratch</i></p></div></div></div><div class=\"jumbotron text-center\"><div class=container data-ng-if=!authentication.isAuthenticated()><div class=row style=margin-top:0px><h1 class=\"lead col-md-10 col-md-offset-1 hidden-xs hidden-sm\" style=font-size:3.8em>Create your next ______.</h1><h1 class=\"lead col-md-10 col-md-offset-1 hidden-xs hidden-sm\" style=font-size:2.5em>Tell a story with a form.</h1><p class=\"lead hidden-xs hidden-sm col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2\" style=\"font-size:1.5em; color:rgba(255,255,255,.75)\"><i>TellForm is an opensource <b>alternative to TypeForm</b> that can create stunning forms from PDFs or from scratch</i></p><p class=\"lead col-xs-12 hidden-md hidden-lg\" style=\"font-size:1.5em; color:rgba(255,255,255,.75)\"><i>TellForm is an opensource <b>alternative to TypeForm</b> that can create stunning forms from PDFs or from scratch</i></p></div><div class=row style=margin-top:7%><a class=\"col-xs-4 col-xs-offset-4 btn btn-info signup-btn\" href=/#!/signup style=\"background-color:#FA787E; border: none; font-size: 2em; padding: 0.3em 0.9em; color: white\">sign me up!</a></div></div></div></section>"); "<section data-ng-controller=HomeController class=hero-section style=overflow:hidden><div class=opacity-background></div><div class=image-background></div><div class=\"jumbotron text-center\"><div class=container data-ng-if=!authentication.isAuthenticated()><div class=\"row text-center logo\" style=\"border-bottom: 1px solid rgba(255,255,255,.2); margin-bottom: 30px\"><h3 class=col-xs-12 style=\"color: #FA787E; margin-bottom:0px\"><i class=\"fa fa-archive fa-3x\"></i></h3><h2 class=col-xs-12 style=margin-top:0px><span>Tell<span style=\"text-decoration: underline; color: #FA787E\">Form</span></span></h2></div><div class=row style=margin-top:0px><h1 class=\"lead col-md-10 col-md-offset-1 hidden-xs hidden-sm\" style=font-size:3.8em>Craft beautiful forms in seconds.</h1><h2 class=\"lead col-sm-12 text-center hidden-md hidden-lg\" style=font-size:2.8em>Craft beautiful forms.</h2><p class=\"lead hidden-xs hidden-sm col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2\" style=\"font-size:1.5em; color:rgba(255,255,255,.75)\"><i>TellForm is an opensource <b>alternative to TypeForm</b> that can create stunning forms from PDFs or from scratch</i></p><p class=\"lead col-xs-12 hidden-md hidden-lg\" style=\"font-size:1.5em; color:rgba(255,255,255,.75)\"><i>TellForm is an opensource <b>alternative to TypeForm</b> that can create stunning forms from PDFs or from scratch</i></p></div></div></div><div class=\"jumbotron text-center\"><div class=container data-ng-if=!authentication.isAuthenticated()><div class=row style=margin-top:0px><h1 class=\"lead col-md-10 col-md-offset-1 hidden-xs hidden-sm\" style=font-size:3.8em>Create your next ______.</h1><h1 class=\"lead col-md-10 col-md-offset-1 hidden-xs hidden-sm\" style=font-size:2.5em>Tell a story with a form.</h1></div><div class=row style=margin-top:7%><a class=\"col-xs-4 col-xs-offset-4 btn btn-info signup-btn\" href=/#!/signup style=\"background-color:#FA787E; border: none; font-size: 2em; padding: 0.3em 0.9em; color: white\">sign me up!</a></div></div></div></section>");
$templateCache.put("../public/modules/forms/views/admin-form.client.view.html", $templateCache.put("../public/modules/forms/views/admin-form.client.view.html",
"<div class=container cg-busy=\"{promise:updatePromise,templateUrl:'modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html',message:'Updating form...', backdrop:false, wrapperClass:'.busy-updating-wrapper'}\"></div><section class=\"container admin-form\"><script type=text/ng-template id=myModalContent.html><div class=\"modal-header\">\n" + "<div class=container cg-busy=\"{promise:updatePromise,templateUrl:'modules/forms/views/directiveViews/cgBusy/update-form-message-TypeB.html',message:'Updating form...', backdrop:false, wrapperClass:'.busy-updating-wrapper'}\"></div><section class=\"container admin-form\"><script type=text/ng-template id=myModalContent.html><div class=\"modal-header\">\n" +
" <h2 class=\"modal-title hidden-md hidden-lg\">Are you ABSOLUTELY sure?</h2>\n" + " <h2 class=\"modal-title hidden-md hidden-lg\">Are you ABSOLUTELY sure?</h2>\n" +