diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index 888f8714..20396425 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -67,9 +67,10 @@ var FormSchema = new Schema({ type: String, default: '', }, - form_fields: { - type: [FieldSchema], - }, + form_fields: [Field], + //form_fields: { + // type: [FieldSchema], + //}, submissions: [{ type: Schema.Types.ObjectId, diff --git a/app/models/form_field.server.model.js b/app/models/form_field.server.model.js index b5f2ae34..ce4dc125 100644 --- a/app/models/form_field.server.model.js +++ b/app/models/form_field.server.model.js @@ -24,6 +24,7 @@ var FieldOptionSchema = new Schema({ }, }); + /** * FormField Schema */ @@ -133,7 +134,6 @@ function validateFormFieldType(value) { return false; }; -// var cloneFieldSchema = _.cloneDeep(FormFieldSchema); mongoose.model('Field', FormFieldSchema); module.exports = FormFieldSchema; diff --git a/app/models/form_submission.server.model.js b/app/models/form_submission.server.model.js index 23e3597f..e7071301 100644 --- a/app/models/form_submission.server.model.js +++ b/app/models/form_submission.server.model.js @@ -18,31 +18,31 @@ var mongoose = require('mongoose'), OscarSecurity = require('../../scripts/oscarhost/OscarSecurity'); var newDemoTemplate = { - 'activeCount': 0, - 'address': '', - 'alias': '', - 'anonymous': '', - 'chartNo': '', - 'children':'', - 'citizenship':'', - 'city': '', - 'dateJoined': null, - 'dateOfBirth': '', - 'email': '', - 'firstName': '', - 'hin': 9146509343, - 'lastName': '', - 'lastUpdateDate': null, - 'monthOfBirth': '', - 'officialLanguage': '', - 'phone': '', - 'phone2': '', - 'providerNo': 0, - 'province': '', - 'sex': '', - 'spokenLanguage': '', - 'postal': '', - 'yearOfBirth': '' + "activeCount": 0, + "address": "", + "alias": "", + "anonymous": "", + "chartNo": "", + "children":"", + "citizenship":"", + "city": "", + "dateJoined": null, + "dateOfBirth": "", + "email": "", + "firstName": "", + "hin": 9146509343, + "lastName": "", + "lastUpdateDate": null, + "monthOfBirth": "", + "officialLanguage": "", + "phone": "", + "phone2": "", + "providerNo": 0, + "province": "", + "sex": "", + "spokenLanguage": "", + "postal": "", + "yearOfBirth": "" }; /** @@ -58,9 +58,12 @@ var FormSubmissionSchema = new Schema({ ref: 'User', required: true }, + form_fields: { type: [Schema.Types.Mixed], }, + // form_fields: [Field], + form: { type: Schema.Types.ObjectId, ref: 'Form', @@ -193,9 +196,7 @@ FormSubmissionSchema.pre('save', function (next) { }else{ next(); } - }); - }); //Check for IP Address of submitting person diff --git a/app/tests/form.server.model.test.js b/app/tests/form.server.model.test.js index df3e10ad..0ca2a6e6 100644 --- a/app/tests/form.server.model.test.js +++ b/app/tests/form.server.model.test.js @@ -12,6 +12,45 @@ var should = require('should'), config = require('../../config/config'), FormSubmission = mongoose.model('FormSubmission'); + + +var exampleDemo = { + activeCount: 1, + unparsedDOB: '', + address: '880-9650 Velit. St.', + chartNo: '', + city: '', + dateJoined: Date.now(), + dateOfBirth: '10', + displayName: 'LITTLE, URIAH', + email: '', + familyDoctor: '', + firstName: 'Uriah F.', + hcType: 'BC', + hin: '', + hsAlertCount: 0, + lastName: 'Little', + lastUpdateDate: Date.now(), + lastUpdateUser: '', + links: '', + monthOfBirth: '05', + officialLanguage: 'English', + patientStatus: 'AC', + patientStatusDate: Date.now(), + phone: '250-', + phone2: '', + postal: "S4M 7T8", + providerNo: '4', + province: 'BC', + rosterStatus: '', + sex: 'M', + sexDesc: 'Female', + sin: '', + spokenLanguage: 'English', + title: 'MS.', + yearOfBirth: '2015' +} + /** * Globals */ @@ -23,7 +62,6 @@ var user, myForm, mySubmission; describe('Form Model Unit Tests:', function() { beforeEach(function(done) { - user = new User({ firstName: 'Full', lastName: 'Name', @@ -34,13 +72,7 @@ describe('Form Model Unit Tests:', function() { provider: 'local' }); - user.save(function(err) { - - if(err){ - console.log(err.errors); - done(err); - } - + user.save(function() { myForm = new Form({ title: 'Form Title', admin: user, @@ -59,26 +91,18 @@ describe('Form Model Unit Tests:', function() { describe('Method Save', function() { it('should be able to save without problems', function(done) { - myForm.save(function(err) { + 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 = new Form({ - title: 'Form Title', - admin: user, - language: 'english', - form_fields: [ - {'fieldType':'textfield', title:'First Name', 'fieldValue': ''}, - {'fieldType':'checkbox', title:'nascar', 'fieldValue': ''}, - {'fieldType':'checkbox', title:'hockey', 'fieldValue': ''} - ] - }); + + var _form = myForm; _form.title = ''; - _form.save(function(err) { + return _form.save(function(err) { should.exist(err); should.equal(err.errors.title.message, 'Form Title cannot be blank'); done(); @@ -101,7 +125,141 @@ describe('Form Model Unit Tests:', function() { }); }); }); - + + + describe('Test FormField and Submission Logic', function() { + var new_form_fields_add1, new_form_fields_del, submission_fields, old_fields, form; + + before(function(){ + new_form_fields_add1 = _.clone(myForm.toObject().form_fields); + new_form_fields_add1.push( + {'fieldType':'textfield', 'title':'Last Name', 'fieldValue': ''} + ); + + new_form_fields_del = _.clone(myForm.toObject().form_fields); + new_form_fields_del.splice(0, 1); + + submission_fields = _.clone(myForm.toObject().form_fields); + submission_fields[0].fieldValue = 'David'; + submission_fields[1].fieldValue = true; + submission_fields[2].fieldValue = true; + + mySubmission = new FormSubmission({ + form_fields: submission_fields, + admin: user, + form: myForm, + timeElapsed: 17.55 + }); + + }); + + beforeEach(function(done){ + myForm.save(function(){ + mySubmission.save(function(){ + done(); + }); + }); + }); + + afterEach(function(done){ + mySubmission.remove(function(){ + done(); + }); + }); + + // it('should preserve deleted form_fields that have submissions without any problems', function(done) { + + // old_fields = myForm.toObject().form_fields; + // // console.log(old_fields); + + // // var expected_fields = old_fields.slice(1,3).concat(old_fields.slice(0,1)); + + // myForm.form_fields = new_form_fields_del; + + // myForm.save(function(err, _form) { + + // should.not.exist(err); + // should.exist(_form); + + // // var actual_fields = _.map(_form.toObject().form_fields, function(o){ _.omit(o, '_id')}); + // // old_fields = _.map(old_fields, function(o){ _.omit(o, '_id')}); + + // // 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'); + // 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.save(function(err, form + // should.not.exist(err); + // (form.form_fields).should.be.eql(old_fields, 'old form_fields not equal to newly saved form_fields'); + + // //Remove submission + // mySubmission.remove(function(err){ + // myForm.submissions.should.have.length(0); + // myForm.form_fields.should.not.containDeep(old_fields[0]); + // }); + // }); + // }); + }); + + describe('Submission of Form should add Patient to OscarHost', function() { + var mySubmission; + before(function(done){ + myForm.form_fields = [ + new Field({'fieldType':'textfield', 'title':'What\'s your first name', 'fieldValue': ''}), + new Field({'fieldType':'textfield', 'title':'And your last name', 'fieldValue': ''}), + new Field({'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': ''}), + new Field({'fieldType':'date', 'title':'When were you born?', 'fieldValue': ''}), + new Field({'fieldType':'number', 'title':'What\'s your phone #?', 'fieldValue': ''}), + ]; + var myFieldMap = {}; + myFieldMap[myForm.form_fields[0]._id] = 'firstName'; + myFieldMap[myForm.form_fields[1]._id] = 'lastName'; + myFieldMap[myForm.form_fields[2]._id] = 'sex'; + myFieldMap[myForm.form_fields[3]._id] = 'unparsedDOB'; + myFieldMap[myForm.form_fields[4]._id] = 'phone'; + + myForm.plugins.oscarhost = { + baseUrl: config.oscarhost.baseUrl, + settings: { + lookupField: '', + updateType: 'force_add', + fieldMap: myFieldMap, + }, + auth: config.oscarhost.auth, + }; + + myForm.save(function(err, form){ + if(err) done(err); + + var submission_fields = _.clone(myForm.toObject().form_fields); + submission_fields[0].fieldValue = 'David'; + submission_fields[1].fieldValue = 'Baldwynn'+Date.now(); + submission_fields[2].fieldValue = 'M'; + submission_fields[3].fieldValue = Date.now(); + submission_fields[4].fieldValue = 6043158008; + + mySubmission = new FormSubmission({ + form_fields: submission_fields, + admin: form.admin, + form: form, + timeElapsed: 17.55 + }); + done(); + }); + }); + it('should be able to submit a valid form without problems', function(done) { + mySubmission.save(function(err, submission) { + should.not.exist(err); + should.exist(submission.oscarDemoNum); + done(); + }); + }); + }); afterEach(function(done) { Form.remove().exec(function() { User.remove().exec(done); diff --git a/app/tests/user.server.routes.test.js b/app/tests/user.server.routes.test.js index f04d8d82..37574095 100644 --- a/app/tests/user.server.routes.test.js +++ b/app/tests/user.server.routes.test.js @@ -102,6 +102,7 @@ // // // }); +<<<<<<< HEAD // // mailbox.getEmails(function(err, _emails) { // // if(err) done(err); diff --git a/docs/OscarHost/Add_Demographic_WSDL.xml b/docs/OscarHost/Add_Demographic_WSDL.xml new file mode 100644 index 00000000..b9d485e3 --- /dev/null +++ b/docs/OscarHost/Add_Demographic_WSDL.xml @@ -0,0 +1,108 @@ + + + + + + + + +
2286 Ottawa
+ + + + + + + + + + + + West Vancouver + + + + 06 + + + + TestUserAddDemographic + + + + polydaic@gmail.com + + + + + + TestUser + + + + + + + + + + + AddDemographic + + 2015-10-01T18:39:46.817Z + + + + + + 06 + + + + + + + + + + + + 6048786969 + + + + V8V5S8 + + + + + + BC + + + + + + + + + + M + + + + + + + + + + Mr. + + + + 1994 +
+
+
+
diff --git a/scripts/oscarhost/test_addDemographic.js b/scripts/oscarhost/test_addDemographic.js new file mode 100644 index 00000000..cada1963 --- /dev/null +++ b/scripts/oscarhost/test_addDemographic.js @@ -0,0 +1,114 @@ +var soap = require('soap'), + async = require('async'), + demo = require('./test_headless'), + OscarSecurity = require('./OscarSecurity'); + +var url_demo = 'https://secure2.oscarhost.ca/kensington/ws/DemographicService?wsdl', + url_login = 'https://secure2.oscarhost.ca/kensington/ws/LoginService?wsdl', + args_demo = {arg0: 0}, + args_login = {arg0: 'username', arg1: 'password'}, + my_hin = 1234123123; + +var fakeDemo = { + "activeCount": 1, + "address": "880-9650 Velit. St.", + "alias": "", + "anonymous": "", + "chartNo": "", + "children":"", + "citizenship":"Canadian", + "city": "Lloydminster", + "dateJoined": new Date(), + "dateOfBirth": "10", + "demographicNo": 90348, + "email": "Sed.nunc@dis.co.uk", + "firstName": "Uriah F.", + "hin": 9146509343, + "lastName": "Little", + "lastUpdateDate": new Date(), + "monthOfBirth": "05", + "officialLanguage": "English", + "phone": "(306) 872-3210", + "phone2": "(306) 556-8264", + "providerNo": 4, + "province": "SK", + "sex": "F", + "spokenLanguage": "English", + "postal": "S4M 7T8", + "yearOfBirth": "2015" + }; + +var exampleDemo = { + activeCount: 1, + address: '880-9650 Velit. St.', + chartNo: '', + city: '', + dateJoined: Date.now(), + dateOfBirth: '10', + displayName: 'LITTLE, URIAH', + email: '', + familyDoctor: '', + firstName: 'Uriah F.', + hcType: 'BC', + hin: '', + hsAlertCount: 0, + lastName: 'Little', + lastUpdateDate: Date.now(), + lastUpdateUser: '', + links: '', + monthOfBirth: '05', + officialLanguage: 'English', + patientStatus: 'AC', + patientStatusDate: Date.now(), + phone: '250-', + phone2: '', + postal: "S4M 7T8", + providerNo: '4', + province: 'BC', + rosterStatus: '', + sex: 'M', + sexDesc: 'Female', + sin: '', + spokenLanguage: 'English', + title: 'MS.', + yearOfBirth: '2015' } + +var options = { + ignoredNamespaces: { + namespaces: ['targetNamespace', 'typedNamespace'], + override: true + } +} + +async.waterfall([ + function (callback) { + //Authenticate with API + 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) { + //Add demographic + soap.createClient(url_demo, options, function(err, client) { + client.setSecurity(new OscarSecurity(security_obj.securityId, security_obj.securityTokenKey) ); + + client.addDemographic({ arg0: exampleDemo }, function (err, result) { + if(err) callback(err); + console.log(client.describe()); + callback(null, result); + }); + }); + }, + +], function(err, result) { + if(err) throw err; + console.log(result); +}); + + + +