From 68858ca1a3af7ab71e4e3448b931726e68231307 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 10:42:07 -0800 Subject: [PATCH 1/6] fixed fieldType constant --- .gitignore | 1 + app/libs/constants.js | 9 +-- app/tests/form.server.model.test.js | 4 +- app/tests/form.server.routes.test.js | 80 +++++++++++++++++-- app/tests/form_submission.routes.test.js | 12 +-- config/env/all.js | 2 - config/env/development.js | 2 - config/env/test.js | 2 - .../admin-form.client.controller.js | 11 --- 9 files changed, 84 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index 91df1f8d..bbc3c9f2 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +selenium dist .vagrant npm-debug.* diff --git a/app/libs/constants.js b/app/libs/constants.js index 9b64918c..3688b692 100644 --- a/app/libs/constants.js +++ b/app/libs/constants.js @@ -21,21 +21,14 @@ module.exports = { 'date', 'email', 'legal', - 'url', 'textarea', + 'link', 'statement', - 'welcome', - 'thankyou', - 'file', 'dropdown', - 'scale', 'rating', 'radio', - 'checkbox', 'hidden', 'yes_no', - 'natural', - 'stripe', 'number' ], diff --git a/app/tests/form.server.model.test.js b/app/tests/form.server.model.test.js index 573e631b..849415a5 100644 --- a/app/tests/form.server.model.test.js +++ b/app/tests/form.server.model.test.js @@ -40,8 +40,8 @@ describe('Form Model Unit Tests:', function() { language: 'en', form_fields: [ {'fieldType':'textfield', title:'First Name', 'fieldValue': ''}, - {'fieldType':'checkbox', title:'nascar', 'fieldValue': ''}, - {'fieldType':'checkbox', title:'hockey', 'fieldValue': ''} + {'fieldType':'legal', title:'nascar', 'fieldValue': ''}, + {'fieldType':'legal', title:'hockey', 'fieldValue': ''} ] }); done(); diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index a4c16889..a74e84ba 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -24,6 +24,17 @@ var credentials = { password: 'password' }; +var sampleVisitorData = [{ + socketId: 'ntneooe8989eotnoeeo', + referrer: 'http://google.com', + timeElapsed: 89898989, + isSubmitted: true, + language: 'en', + ipAddr: '192.168.1.1', + deviceType: 'desktop', + userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' +}] + /** * Form routes tests */ @@ -50,8 +61,8 @@ describe('Form Routes Unit tests', function() { 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': ''}) + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) ], isLive: true }; @@ -315,8 +326,8 @@ describe('Form Routes Unit tests', function() { 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': ''}) + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) ], isLive: true }; @@ -327,8 +338,8 @@ describe('Form Routes Unit tests', function() { 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': ''}) + new Field({'fieldType':'legal', 'title':'formula one', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'football', 'fieldValue': ''}) ], isLive: true }; @@ -364,6 +375,63 @@ describe('Form Routes Unit tests', function() { }); }); + it(' > should preserve visitor data when updating a Form', function(done) { + // Create new Form model instance + + var formObject = { + title: 'First Form', + language: 'en', + admin: user.id, + form_fields: [ + new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) + ], + isLive: true, + analytics: { + gaCode: '', + visitors: sampleVisitorData + } + }; + + var formUpdateObject = { + title: 'Second Form', + language: 'en', + admin: user.id, + form_fields: [ + new Field({'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'formula one', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'football', 'fieldValue': ''}) + ], + isLive: true + }; + + var CurrentForm = new Form(formObject); + + // Save the Form + CurrentForm.save(function(err, form) { + if(err) return done(err); + + loginSession.post('/forms/' + form._id) + .send(formUpdateObject) + .expect(200) + .end(function(FormSaveErr) { + + should.not.exist(FormSaveErr); + + Form.findById(form._id, function (FormFindErr, UpdatedForm){ + should.not.exist(FormFindErr); + should.exist(UpdatedForm); + + UpdatedForm.toObject().visitors.should.deepEqual(sampleVisitorData); + + done(FormFindErr); + }); + + }); + }); + }); + afterEach('should be able to signout user', function(done){ authenticatedSession.get('/auth/signout') .expect(200) diff --git a/app/tests/form_submission.routes.test.js b/app/tests/form_submission.routes.test.js index 6398828e..17c77ace 100644 --- a/app/tests/form_submission.routes.test.js +++ b/app/tests/form_submission.routes.test.js @@ -54,8 +54,8 @@ describe('Form Submission Routes Unit tests', function() { 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': ''}) + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) ], selfNotifications: { fromField: mongoose.Types.ObjectId(), @@ -81,8 +81,8 @@ describe('Form Submission Routes Unit tests', function() { form: form._id, form_fields: [ {'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David', _id: '', isSubmission: false, deletePreserved: false}, - {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, - {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} + {'fieldType':'legal', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, + {'fieldType':'legal', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} ], percentageComplete: 100, timeElapsed: 11.55, @@ -101,8 +101,8 @@ describe('Form Submission Routes Unit tests', function() { _id: form._id, form_fields: [ {'fieldType':'textfield', 'title':'First Name', 'fieldValue': 'David', _id: '', isSubmission: false, deletePreserved: false}, - {'fieldType':'checkbox', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, - {'fieldType':'checkbox', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} + {'fieldType':'legal', 'title':'nascar', 'fieldValue': true, _id: '', isSubmission: false, deletePreserved: true}, + {'fieldType':'legal', 'title':'hockey', 'fieldValue': false, _id: '', isSubmission: false, deletePreserved: false} ], percentageComplete: 100, timeElapsed: 11.55, diff --git a/config/env/all.js b/config/env/all.js index bf0cc22b..36786173 100755 --- a/config/env/all.js +++ b/config/env/all.js @@ -10,8 +10,6 @@ module.exports = { db: { uri: process.env.MONGOLAB_URI || process.env.MONGODB_URI || 'mongodb://'+ (process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') + '/mean', options: { - user: '', - pass: '', useMongoClient: true } }, diff --git a/config/env/development.js b/config/env/development.js index 202ea79a..56e175a5 100755 --- a/config/env/development.js +++ b/config/env/development.js @@ -6,8 +6,6 @@ module.exports = { db: { uri: process.env.MONGODB_URI || 'mongodb://'+( process.env.DB_PORT_27017_TCP_ADDR || '127.0.0.1') +'/mean', options: { - user: '', - pass: '', useMongoClient: true } }, diff --git a/config/env/test.js b/config/env/test.js index fceeb365..433ffa13 100755 --- a/config/env/test.js +++ b/config/env/test.js @@ -5,8 +5,6 @@ module.exports = { db: { uri: 'mongodb://localhost/mean-test', options: { - user: '', - pass: '', useMongoClient: true } }, diff --git a/public/modules/forms/admin/controllers/admin-form.client.controller.js b/public/modules/forms/admin/controllers/admin-form.client.controller.js index adce5ec2..7845eecf 100644 --- a/public/modules/forms/admin/controllers/admin-form.client.controller.js +++ b/public/modules/forms/admin/controllers/admin-form.client.controller.js @@ -207,22 +207,11 @@ angular.module('forms').controller('AdminFormController', ['$rootScope', '$windo if(dataToSend.analytics && dataToSend.analytics.visitors){ delete dataToSend.analytics.visitors; } - if(dataToSend.submissions){ - delete dataToSend.submissions; - } if(dataToSend.visible_form_fields){ delete dataToSend.visible_form_fields; } - if(dataToSend.analytics){ - delete dataToSend.analytics.visitors; - delete dataToSend.analytics.fields; - delete dataToSend.analytics.submissions; - delete dataToSend.analytics.views; - delete dataToSend.analytics.conversionRate; - } - delete dataToSend.created; delete dataToSend.lastModified; delete dataToSend.__v; From d8268e4a9b64b2bfc480474582cb5482999bd4e8 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 10:48:11 -0800 Subject: [PATCH 2/6] Added test for preserving visitorData on update and removed debugger statements --- app/libs/constants.js | 16 ++++++++++++++++ app/tests/form.server.routes.test.js | 2 +- config/express.js | 1 - .../directives/edit-form.client.directive.js | 1 - 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/libs/constants.js b/app/libs/constants.js index 3688b692..f2bb9765 100644 --- a/app/libs/constants.js +++ b/app/libs/constants.js @@ -32,6 +32,22 @@ module.exports = { 'number' ], + ratingShapeTypes: [ + 'Heart', + 'Star', + 'thumbs-up', + 'thumbs-down', + 'Circle', + 'Square', + 'Check Circle', + 'Smile Outlined', + 'Hourglass', + 'bell', + 'Paper Plane', + 'Comment', + 'Trash' + ], + ratingShapeTypes: [ 'Heart', 'Star', diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index a74e84ba..7dbdaf3b 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -33,7 +33,7 @@ var sampleVisitorData = [{ ipAddr: '192.168.1.1', deviceType: 'desktop', userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' -}] +}]; /** * Form routes tests diff --git a/config/express.js b/config/express.js index febb14c1..87b84bd7 100755 --- a/config/express.js +++ b/config/express.js @@ -232,7 +232,6 @@ module.exports = function(db) { // CookieParser should be above session app.use(cookieParser()); - debugger; // Express MongoDB session storage app.use(session({ saveUninitialized: true, diff --git a/public/modules/forms/admin/directives/edit-form.client.directive.js b/public/modules/forms/admin/directives/edit-form.client.directive.js index a330dcf1..3c4f4f2b 100644 --- a/public/modules/forms/admin/directives/edit-form.client.directive.js +++ b/public/modules/forms/admin/directives/edit-form.client.directive.js @@ -26,7 +26,6 @@ angular.module('forms').directive('editFormDirective', ['$rootScope', 'FormField forceHelperSize: true, forcePlaceholderSize: true, stop: function(e, ui) { - debugger; $scope.update(false, $scope.myform, true, false, function(err){ if(err){ console.error(err); From fb26fbd4f956ed0d7d172b18fa1c1ba60ee67d42 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 10:54:23 -0800 Subject: [PATCH 3/6] disabled subdomains for server-side tests --- app/tests/form.server.routes.test.js | 4 ++-- config/env/test.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index 7dbdaf3b..495ba38d 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -102,7 +102,7 @@ describe('Form Routes Unit tests', function() { FormObj.save(function(err, form) { if(err) return done(err); - userSession.get('/subdomain/' + credentials.username + '/forms/' + form._id + '/render') + userSession.get('/forms/' + form._id + '/render') .expect(200) .end(function(err, res) { if(err) return done(err) @@ -125,7 +125,7 @@ describe('Form Routes Unit tests', function() { FormObj.save(function(err, form) { if(err) return done(err); - userSession.get('/subdomain/' + credentials.username + '/forms/' + form._id + '/render') + userSession.get('/forms/' + form._id + '/render') .expect(401, {message: 'Form is Not Public'}) .end(function(err, res) { done(err); diff --git a/config/env/test.js b/config/env/test.js index 433ffa13..aa5cf81c 100755 --- a/config/env/test.js +++ b/config/env/test.js @@ -18,6 +18,7 @@ module.exports = { //stream: 'access.log' } }, + subdomainsDisabled: true, app: { title: 'TellForm Test' }, From f6546deb59dcd7baf9bb1d8ecc5ed34d06631594 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 11:37:01 -0800 Subject: [PATCH 4/6] removed globalId --- app/controllers/forms.server.controller.js | 18 ++++- app/libs/send-email-notifications.js | 4 +- app/models/form.server.model.js | 24 ------ app/models/form_field.server.model.js | 13 +-- app/tests/form.server.routes.test.js | 79 +++++++++++++++++-- app/tests/form_submission.model.test.js | 74 +---------------- .../libs/send-email-notifications.test.js | 6 +- .../configure-form.client.directive.js | 2 +- .../respondent-notifications.html | 2 +- .../configureTabs/self-notifications.html | 2 +- 10 files changed, 95 insertions(+), 129 deletions(-) diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index 7a12250e..8beb8c3e 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -364,8 +364,8 @@ exports.update = function(req, res) { var form = req.form; var updatedForm = req.body.form; - - if(!form.analytics){ + + if(!form.analytics && req.body.form.analytics){ form.analytics = { visitors: [], gaCode: '' @@ -379,9 +379,18 @@ exports.update = function(req, res) { diff.applyChange(form._doc, true, change); }); } else { + if(!updatedForm){ + res.status(400).send({ + message: 'Updated Form is empty' + }); + } - delete updatedForm.__v; + delete updatedForm.lastModified; delete updatedForm.created; + delete updatedForm.id; + delete updatedForm._id; + delete updatedForm.__v; + //Unless we have 'admin' privileges, updating the form's admin is disabled if(updatedForm && req.user.roles.indexOf('admin') === -1) { delete updatedForm.admin; @@ -556,7 +565,8 @@ exports.formByIDFast = function(req, res, next, id) { */ exports.hasAuthorization = function(req, res, next) { var form = req.form; - if (req.form.admin.id !== req.user.id && req.user.roles.indexOf('admin') === -1) { + debugger + if (req.form.admin.id !== req.user.id || req.user.roles.indexOf('admin') > -1) { res.status(403).send({ message: 'User '+req.user.username+' is not authorized to edit Form: '+form.title }); diff --git a/app/libs/send-email-notifications.js b/app/libs/send-email-notifications.js index 8d4fd281..bbbc8548 100644 --- a/app/libs/send-email-notifications.js +++ b/app/libs/send-email-notifications.js @@ -39,8 +39,8 @@ module.exports = { createFieldDict: function(form_fields){ var formFieldDict = {}; form_fields.forEach(function(field){ - if(field.hasOwnProperty('globalId') && field.hasOwnProperty('fieldValue')){ - formFieldDict[field.globalId+''] = field.fieldValue+''; + if(field.hasOwnProperty('fieldValue')){ + formFieldDict[field.id] = String(field.fieldValue); } }); return formFieldDict; diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index 4aa58f89..3693a93f 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -228,30 +228,6 @@ FormSchema.plugin(timeStampPlugin, { useVirtual: false }); -function getDeletedIndexes(needle, haystack){ - var deletedIndexes = []; - - if(haystack.length > 0){ - for(var i = 0; i < needle.length; i++){ - if(haystack.indexOf(needle[i]) === -1){ - deletedIndexes.push(i); - } - } - } - return deletedIndexes; -} - -function formFieldsAllHaveIds(form_fields){ - if(form_fields){ - for(var i=0; i 0){ error.errors.ratingOptions = new mongoose.Error.ValidatorError({path:'fieldOptions', message: 'fieldOptions are only allowed for type dropdown, checkbox or radio fields.', type: 'notvalid', value: this.ratingOptions}); console.error(error); - return(next(error)); + return next(error); } } return next(); }); -//LogicJump Save -FormFieldSchema.pre('save', function(next) { - if(!this.globalId){ - this.globalId = tokgen(); - } - next(); -}); - //Submission fieldValue correction FormFieldSchema.pre('save', function(next) { if(this.fieldType === 'dropdown' && this.isSubmission){ diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index 495ba38d..fbdd1259 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -32,7 +32,8 @@ var sampleVisitorData = [{ language: 'en', ipAddr: '192.168.1.1', deviceType: 'desktop', - userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' + userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36', + filledOutFields: [] }]; /** @@ -412,22 +413,84 @@ describe('Form Routes Unit tests', function() { CurrentForm.save(function(err, form) { if(err) return done(err); - loginSession.post('/forms/' + form._id) - .send(formUpdateObject) + loginSession.put('/forms/' + form.id) + .send({ form: formUpdateObject }) .expect(200) - .end(function(FormSaveErr) { + .end(function(err, res) { - should.not.exist(FormSaveErr); + should.not.exist(err); - Form.findById(form._id, function (FormFindErr, UpdatedForm){ + Form.findById(form.id, function (FormFindErr, UpdatedForm){ should.not.exist(FormFindErr); should.exist(UpdatedForm); - UpdatedForm.toObject().visitors.should.deepEqual(sampleVisitorData); + var updatedFormObj = UpdatedForm.toJSON(); + var oldFormObj = CurrentForm.toJSON(); + + updatedFormObj.analytics.should.deepEqual(oldFormObj.analytics); + + done(FormFindErr); + }); + }); + }); + }); + + it(' > shouldn\'t allow a user to change the id when updating a form', function(done) { + // Create new Form model instance + + var formObject = { + title: 'First Form', + language: 'en', + admin: user.id, + form_fields: [ + new Field({'fieldType':'textfield', 'title':'First Name', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'nascar', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'hockey', 'fieldValue': ''}) + ], + isLive: true + }; + + var formUpdateObject = { + id: mongoose.Types.ObjectId(), + title: 'First Form', + language: 'en', + admin: user.id, + form_fields: [ + new Field({'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'formula one', 'fieldValue': ''}), + new Field({'fieldType':'legal', 'title':'football', 'fieldValue': ''}) + ], + isLive: true + }; + + var CurrentForm = new Form(formObject); + + // Save the Form + CurrentForm.save(function(err, InitialForm) { + if(err) return done(err); + + loginSession.put('/forms/' + InitialForm.id) + .send({ form: formUpdateObject }) + .expect(200) + .end(function(err, OldForm) { + console.log(OldForm.body); + + should.not.exist(err); + + Form.findById(InitialForm.id, function (FormFindErr, UpdatedForm){ + should.not.exist(FormFindErr); + should.exist(UpdatedForm); + + var updatedFormObj = UpdatedForm.toJSON(); + var oldFormObj = InitialForm.toJSON(); + + delete oldFormObj.lastModified; + delete updatedFormObj.lastModified; + + updatedFormObj.should.deepEqual(oldFormObj); done(FormFindErr); }); - }); }); }); diff --git a/app/tests/form_submission.model.test.js b/app/tests/form_submission.model.test.js index b857e9a9..219f5d87 100644 --- a/app/tests/form_submission.model.test.js +++ b/app/tests/form_submission.model.test.js @@ -166,7 +166,7 @@ describe('FormSubmission Model Unit Tests:', function() { }); it('should be able to find FormSubmission by $elemMatch on form_fields id', function(done){ - FormSubmission.findOne({ form: myForm._id, form_fields: {$elemMatch: {globalId: myForm.form_fields[0].globalId} } }) + FormSubmission.findOne({ form: myForm.id, form_fields: {$elemMatch: {id: myForm.form_fields[0].id} } }) .exec(function(err, submission){ should.not.exist(err); should.exist(submission); @@ -176,78 +176,6 @@ describe('FormSubmission Model Unit Tests:', function() { }); }); - /* - describe('Test FormField and Submission Logic', function() { - - beforeEach(function(done){ - - //Create Submission - mySubmission = new FormSubmission({ - form_fields: _.merge(sampleSubmission, myForm.form_fields), - admin: user, - form: myForm, - timeElapsed: 17.55 - }); - - mySubmission.save(function(err){ - should.not.exist(err); - done(); - }); - - }); - - 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); - - myForm.form_fields = new_form_fields; - - myForm.save(function(err, _form) { - - should.not.exist(err); - should.exist(_form.form_fields); - - 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(); - }); - }); - - it('should delete \'preserved\' form_fields whose submissions have been removed without any problems', function(done) { - - var old_fields = myForm.toObject().form_fields; - old_fields.splice(0,1); - var new_form_fields = _.clone(myForm.toObject().form_fields); - new_form_fields.splice(0, 1); - - myForm.form_fields = new_form_fields; - - myForm.save(function(err, _form){ - should.not.exist(err); - should.exist(_form.form_fields); - should.exist(old_fields); - - var actual_fields = _.deepOmit(_form.toObject().form_fields, ['lastModified', 'created', '_id']); - old_fields = _.deepOmit(old_fields, ['lastModified', 'created', '_id']); - - should.deepEqual(JSON.stringify(actual_fields), JSON.stringify(old_fields)); //'old form_fields not equal to newly saved form_fields'); - done(); - }); - }); - - afterEach(function(done){ - mySubmission.remove(function(){ - done(); - }); - }); - }); - */ - afterEach(function(done) { Form.remove().exec(function() { User.remove().exec(function() { diff --git a/app/tests/libs/send-email-notifications.test.js b/app/tests/libs/send-email-notifications.test.js index 9f9db698..38beb031 100644 --- a/app/tests/libs/send-email-notifications.test.js +++ b/app/tests/libs/send-email-notifications.test.js @@ -14,9 +14,9 @@ const should = require('should'), * Globals */ const validFormFields = [ - {fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false, globalId:'56340745f59a6fc9e22028e9'}, - {fieldType:'link', title:'Your Website', fieldValue: 'https://johnsmith.me', deletePreserved: false, globalId:'5c9e22028e907634f45f59a6'}, - {fieldType:'number', title:'Your Age', fieldValue: 45, deletePreserved: false, globalId:'56e90745f5934fc9e22028a6'} + {fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false, id:'56340745f59a6fc9e22028e9'}, + {fieldType:'link', title:'Your Website', fieldValue: 'https://johnsmith.me', deletePreserved: false, id:'5c9e22028e907634f45f59a6'}, + {fieldType:'number', title:'Your Age', fieldValue: 45, deletePreserved: false, id:'56e90745f5934fc9e22028a6'} ]; const validFieldDict = { diff --git a/public/modules/forms/admin/directives/configure-form.client.directive.js b/public/modules/forms/admin/directives/configure-form.client.directive.js index d57653d6..e2405ab2 100644 --- a/public/modules/forms/admin/directives/configure-form.client.directive.js +++ b/public/modules/forms/admin/directives/configure-form.client.directive.js @@ -18,7 +18,7 @@ angular.module('forms').directive('configureFormDirective', ['$rootScope', '$sta placeholder: { placeholders: $scope.myform.visible_form_fields.map(function(field){ return { - id: field.globalId, + id: field.id, label: field.title }; }), diff --git a/public/modules/forms/admin/views/adminTabs/configureTabs/respondent-notifications.html b/public/modules/forms/admin/views/adminTabs/configureTabs/respondent-notifications.html index 5c10ca8a..563f147a 100644 --- a/public/modules/forms/admin/views/adminTabs/configureTabs/respondent-notifications.html +++ b/public/modules/forms/admin/views/adminTabs/configureTabs/respondent-notifications.html @@ -36,7 +36,7 @@ {{$select.selected.title}} - + diff --git a/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html b/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html index 77b594ae..570c0334 100644 --- a/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html +++ b/public/modules/forms/admin/views/adminTabs/configureTabs/self-notifications.html @@ -42,7 +42,7 @@ {{$select.selected.title}} - + From 8c1964146f4566d3a50ff8f011640a4acef98855 Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 11:37:48 -0800 Subject: [PATCH 5/6] removed newOptionSchema property from FieldSchema --- app/models/form_field.server.model.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/models/form_field.server.model.js b/app/models/form_field.server.model.js index 6293b807..9338a9d7 100644 --- a/app/models/form_field.server.model.js +++ b/app/models/form_field.server.model.js @@ -49,10 +49,6 @@ function BaseFieldSchema(){ Schema.apply(this, arguments); this.add({ - newOptionSchema: { - type: Boolean, - default: false - }, isSubmission: { type: Boolean, default: false From 9d2a548dcae1b2f56f79c2fc19c7d85e99ab00bc Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Tue, 21 Nov 2017 11:46:57 -0800 Subject: [PATCH 6/6] Added new form_route tests for update route --- app/libs/send-email-notifications.js | 4 ++-- app/tests/form.server.routes.test.js | 23 +++++++++++++++---- app/tests/form_submission.model.test.js | 2 +- .../libs/send-email-notifications.test.js | 6 ++--- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/app/libs/send-email-notifications.js b/app/libs/send-email-notifications.js index bbbc8548..158882e7 100644 --- a/app/libs/send-email-notifications.js +++ b/app/libs/send-email-notifications.js @@ -39,8 +39,8 @@ module.exports = { createFieldDict: function(form_fields){ var formFieldDict = {}; form_fields.forEach(function(field){ - if(field.hasOwnProperty('fieldValue')){ - formFieldDict[field.id] = String(field.fieldValue); + if(field.hasOwnProperty('fieldValue') && field.hasOwnProperty('_id')){ + formFieldDict[field._id] = String(field.fieldValue); } }); return formFieldDict; diff --git a/app/tests/form.server.routes.test.js b/app/tests/form.server.routes.test.js index fbdd1259..e55e35ea 100644 --- a/app/tests/form.server.routes.test.js +++ b/app/tests/form.server.routes.test.js @@ -10,7 +10,22 @@ var should = require('should'), Form = mongoose.model('Form'), Field = mongoose.model('Field'), FormSubmission = mongoose.model('FormSubmission'), - async = require('async'); + async = require('async'), + _ = require('lodash'); + +function omitDeep(collection, excludeKeys) { + + function omitFn(value) { + + if (value && typeof value === 'object') { + excludeKeys.forEach((key) => { + delete value[key]; + }); + } + } + + return _.cloneDeepWith(collection, omitFn); +} /** * Globals @@ -473,8 +488,6 @@ describe('Form Routes Unit tests', function() { .send({ form: formUpdateObject }) .expect(200) .end(function(err, OldForm) { - console.log(OldForm.body); - should.not.exist(err); Form.findById(InitialForm.id, function (FormFindErr, UpdatedForm){ @@ -484,8 +497,8 @@ describe('Form Routes Unit tests', function() { var updatedFormObj = UpdatedForm.toJSON(); var oldFormObj = InitialForm.toJSON(); - delete oldFormObj.lastModified; - delete updatedFormObj.lastModified; + updatedFormObj = omitDeep('lastModified'); + oldFormObj = omitDeep('lastModified'); updatedFormObj.should.deepEqual(oldFormObj); diff --git a/app/tests/form_submission.model.test.js b/app/tests/form_submission.model.test.js index 219f5d87..36935165 100644 --- a/app/tests/form_submission.model.test.js +++ b/app/tests/form_submission.model.test.js @@ -166,7 +166,7 @@ describe('FormSubmission Model Unit Tests:', function() { }); it('should be able to find FormSubmission by $elemMatch on form_fields id', function(done){ - FormSubmission.findOne({ form: myForm.id, form_fields: {$elemMatch: {id: myForm.form_fields[0].id} } }) + FormSubmission.findOne({ form: myForm.id, form_fields: {$elemMatch: {_id: myForm.form_fields[0]._id} } }) .exec(function(err, submission){ should.not.exist(err); should.exist(submission); diff --git a/app/tests/libs/send-email-notifications.test.js b/app/tests/libs/send-email-notifications.test.js index 38beb031..772328ee 100644 --- a/app/tests/libs/send-email-notifications.test.js +++ b/app/tests/libs/send-email-notifications.test.js @@ -14,9 +14,9 @@ const should = require('should'), * Globals */ const validFormFields = [ - {fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false, id:'56340745f59a6fc9e22028e9'}, - {fieldType:'link', title:'Your Website', fieldValue: 'https://johnsmith.me', deletePreserved: false, id:'5c9e22028e907634f45f59a6'}, - {fieldType:'number', title:'Your Age', fieldValue: 45, deletePreserved: false, id:'56e90745f5934fc9e22028a6'} + {fieldType:'textfield', title:'First Name', fieldValue: 'John Smith', deletePreserved: false, _id:'56340745f59a6fc9e22028e9'}, + {fieldType:'link', title:'Your Website', fieldValue: 'https://johnsmith.me', deletePreserved: false, _id:'5c9e22028e907634f45f59a6'}, + {fieldType:'number', title:'Your Age', fieldValue: 45, deletePreserved: false, _id:'56e90745f5934fc9e22028a6'} ]; const validFieldDict = {