diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index 005841bb..c511bcf0 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -88,17 +88,15 @@ exports.listSubmissions = function(req, res) { } res.json(_submissions); }); - }; /** * Create a new form */ exports.create = function(req, res) { - debugger; - + if(!req.body.form){ - return res.status(401).send({ + return res.status(400).send({ message: 'Invalid Input' }); } diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index b20d1a9e..f9139f26 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -71,7 +71,6 @@ var VisitorDataSchema = new Schema({ userAgent: { type: String } - }); var formSchemaOptions = { @@ -219,7 +218,7 @@ FormSchema.virtual('analytics.fields').get(function () { var visitors = this.analytics.visitors; var that = this; - if(this.form_fields.length === 0) { + if(!this.form_fields || this.form_fields.length === 0) { return null; } diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index e1aa2654..93c5e6cb 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -9,7 +9,8 @@ var should = require('should'), User = mongoose.model('User'), Form = mongoose.model('Form'), Field = mongoose.model('Field'), - FormSubmission = mongoose.model('FormSubmission'); + FormSubmission = mongoose.model('FormSubmission'), + async = require('async'); /** * Globals @@ -68,7 +69,7 @@ describe('Form Routes Unit tests', function() { .send({form: myForm}) .expect(401) .end(function(FormSaveErr, FormSaveRes) { - + console.log(FormSaveRes.text); // Call the assertion callback done(FormSaveErr); }); @@ -83,7 +84,7 @@ describe('Form Routes Unit tests', function() { }); }); - it(' > should be able to read/get a Form if not signed in', function(done) { + it(' > should be able to read/get a live Form if not signed in', function(done) { // Create new Form model instance var FormObj = new Form(myForm); @@ -105,6 +106,23 @@ describe('Form Routes Unit tests', function() { }); }); + it(' > should be able to read/get a non-live Form if not signed in', function(done) { + // Create new Form model instance + var FormObj = new Form(myForm); + FormObj.isLive = false; + + // Save the Form + FormObj.save(function(err, form) { + if(err) return done(err); + + userSession.get('/subdomain/' + credentials.username + '/forms/' + form._id + '/render') + .expect(401, {message: 'Form is Not Public'}) + .end(function(err, res) { + done(err); + }); + }); + }); + it(' > should not be able to delete an Form if not signed in', function(done) { // Set Form user myForm.admin = user; @@ -146,6 +164,16 @@ describe('Form Routes Unit tests', function() { }); }); + it(' > should not be able to create a Form if body is empty', function(done) { + loginSession.post('/forms') + .send({form: null}) + .expect(400, {"message":"Invalid Input"}) + .end(function(FormSaveErr, FormSaveRes) { + // Call the assertion callback + done(FormSaveErr); + }); + }); + it(' > should not be able to save a Form if no title is provided', function(done) { // Set Form with a invalid title field myForm.title = ''; @@ -165,10 +193,22 @@ describe('Form Routes Unit tests', function() { done(); }); - }); - it(' > should be able to update a Form if signed in', function(done) { + it(' > should be able to create a Form if form_fields are undefined', function(done) { + myForm.analytics = null; + myForm.form_fields = null; + + loginSession.post('/forms') + .send({form: myForm}) + .expect(200) + .end(function(FormSaveErr, FormSaveRes) { + // Call the assertion callback + done(FormSaveErr); + }); + }); + + it(' > should be able to update a Form if signed in and Form is valid', function(done) { // Save a new Form loginSession.post('/forms') @@ -182,7 +222,7 @@ describe('Form Routes Unit tests', function() { } // Update Form title - myForm.title = 'WHY YOU GOTTA BE SO MEAN?'; + myForm.title = 'WHY YOU GOTTA BE SO FORMULAIC?'; // Update an existing Form loginSession.put('/forms/' + FormSaveRes.body._id) @@ -197,13 +237,12 @@ describe('Form Routes Unit tests', function() { // Set assertions (FormUpdateRes.body._id).should.equal(FormSaveRes.body._id); - (FormUpdateRes.body.title).should.match('WHY YOU GOTTA BE SO MEAN?'); + (FormUpdateRes.body.title).should.match(myForm.title); // Call the assertion callback done(); }); }); - }); it(' > should be able to delete a Form if signed in', function(done) { @@ -238,10 +277,9 @@ describe('Form Routes Unit tests', function() { done(); }); }); - }); - it('should be able to save new form while logged in', function(done){ + it(' > should be able to save new form while logged in', function(done){ // Save a new Form authenticatedSession.post('/forms') .send({form: myForm}) @@ -271,12 +309,70 @@ describe('Form Routes Unit tests', function() { }); }); + it(' > should be able to get list of users\' forms sorted by date created while logged in', function(done) { + var myForm1 = { + title: 'First Form', + language: 'en', + 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': ''}) + ], + isLive: true + }; + + var myForm2 = { + title: 'Second Form', + language: 'en', + admin: user.id, + form_fields: [ + new Field({'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''}), + new Field({'fieldType':'checkbox', 'title':'formula one', 'fieldValue': ''}), + new Field({'fieldType':'checkbox', 'title':'football', 'fieldValue': ''}) + ], + isLive: true + }; + + var FormObj1 = new Form(myForm1); + var FormObj2 = new Form(myForm2); + + async.waterfall([ + function(callback) { + FormObj1.save(function(err){ + callback(err); + }); + }, + function(callback) { + FormObj2.save(function(err){ + callback(err); + }); + }, + function(callback) { + loginSession.get('/forms') + .expect(200) + .end(function(err, res) { + res.body.length.should.equal(2); + res.body[0].title.should.equal('Second Form'); + res.body[1].title.should.equal('First Form'); + + // Call the assertion callback + callback(err); + }); + } + ], function (err) { + done(err); + }); + }); + afterEach('should be able to signout user', function(done){ authenticatedSession.get('/auth/signout') .expect(200) .end(function(signoutErr, signoutRes) { // Handle signout error - if (signoutErr) return done(signoutErr); + if (signoutErr) { + return done(signoutErr); + } authenticatedSession.destroy(); done(); }); diff --git a/app/tests/form_submission.model.test.js b/app/tests/form_submission.model.test.js index f60e599e..09442c81 100644 --- a/app/tests/form_submission.model.test.js +++ b/app/tests/form_submission.model.test.js @@ -199,6 +199,7 @@ describe('FormSubmission Model Unit Tests:', function() { it('should preserve deleted form_fields that have submissions without any problems', function(done) { + var fieldPropertiesToOmit = ['deletePreserved', 'globalId', 'lastModified', 'created', '_id', 'submissionId', 'isSubmission', 'validFieldTypes', 'title']; var old_fields = myForm.toObject().form_fields; var new_form_fields = _.clone(myForm.toObject().form_fields); new_form_fields.splice(0, 1); @@ -210,8 +211,8 @@ describe('FormSubmission Model Unit Tests:', function() { should.not.exist(err); should.exist(_form.form_fields); - var actual_fields = _.deepOmit(_form.toObject().form_fields, ['deletePreserved', 'globalId', 'lastModified', 'created', '_id', 'submissionId']); - old_fields = _.deepOmit(old_fields, ['deletePreserved', 'globalId', 'lastModified', 'created', '_id', 'submissionId']); + var actual_fields = _.deepOmit(_form.toObject().form_fields, fieldPropertiesToOmit); + old_fields = _.deepOmit(old_fields, fieldPropertiesToOmit); should.deepEqual(actual_fields, old_fields, 'old form_fields not equal to newly saved form_fields'); done(); diff --git a/app/views/500.server.view.pug b/app/views/500.server.view.pug index 688a9af0..3c6fc1b1 100644 --- a/app/views/500.server.view.pug +++ b/app/views/500.server.view.pug @@ -5,7 +5,7 @@ block content div.row.valign h3.col-md-12.text-center=__('500_HEADER') div.col-md-4.col-md-offset-4 - if process.env.NODE_ENV == 'development' + if process.env.NODE_ENV == 'development' || process.env.NODE_ENV == 'test' div.col-md-12.text-center(style="padding-bottom: 50px;") | #{error} else diff --git a/config/express.js b/config/express.js index 1da3f4a1..902beb6f 100755 --- a/config/express.js +++ b/config/express.js @@ -148,8 +148,6 @@ module.exports = function(db) { // reassign url req.url = subdomainPath; - req.userId = user._id; - // Q.E.D. return next(); }); @@ -200,7 +198,7 @@ module.exports = function(db) { app.use(morgan(logger.getLogFormat(), logger.getMorganOptions())); // Environment dependent middleware - if (process.env.NODE_ENV === 'development') { + if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test') { // Disable views cache app.set('view cache', false); } else if (process.env.NODE_ENV === 'production') { @@ -263,9 +261,13 @@ module.exports = function(db) { //Visitor Language Detection app.use(function(req, res, next) { var acceptLanguage = req.headers['accept-language']; - var languages = acceptLanguage.match(/[a-z]{2}(?!-)/g) || []; + var languages, supportedLanguage; + + if(acceptLanguage){ + languages = acceptLanguage.match(/[a-z]{2}(?!-)/g) || []; + supportedLanguage = containsAnySupportedLanguages(languages); + } - var supportedLanguage = containsAnySupportedLanguages(languages); if(!req.user && supportedLanguage !== null){ var currLanguage = res.cookie('userLang'); @@ -288,7 +290,7 @@ module.exports = function(db) { app.use(function (req, res, next) { // Website you wish to allow to connect - res.setHeader('Access-Control-Allow-Origin', 'https://sentry.polydaic.com'); + res.setHeader('Access-Control-Allow-Origin', 'https://sentry.io'); // Request methods you wish to allow res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); @@ -320,16 +322,10 @@ module.exports = function(db) { // Log it client.captureError(err); - if(process.env.NODE_ENV === 'production'){ - res.status(500).render('500', { - error: 'Internal Server Error' - }); - } else { - // Error page - res.status(500).render('500', { - error: err.stack - }); - } + // Error page + res.status(500).render('500', { + error: err.stack + }); }); // Assume 404 since no middleware responded diff --git a/config/strategies/local.js b/config/strategies/local.js index 319324a6..174a0007 100755 --- a/config/strategies/local.js +++ b/config/strategies/local.js @@ -14,8 +14,6 @@ module.exports = function () { passwordField: 'password' }, function (username, password, done) { - console.log('\n\n\n\n\nusername: '+username); - console.log('password: '+password) User.findOne({ $or: [ {'username': username.toLowerCase()}, diff --git a/public/modules/core/img/loaders/page-loader.gif b/public/modules/core/img/loaders/page-loader.gif new file mode 100644 index 00000000..ae90a507 Binary files /dev/null and b/public/modules/core/img/loaders/page-loader.gif differ