exports.parse_string_field_mixed = function(test) { test.expect(2); // textforms var doc = { message: "0000 foo 16A" }; var def = { fields: { foo: { type: 'string', labels: { short: 'foo', tiny: 'foo' } } } }; var data = smsparser.parse(def, doc); test.same(data, {foo: "16A"}); // muvuku doc = { message: "1!0000!16A" }; data = smsparser.parse(def, doc); test.same(data, {foo: "16A"}); test.done(); };
exports.parse_date_field = function(test) { test.expect(2); var doc = { message: "1!0000!2012-03-12" }; var def = { fields: { testdate: { type: 'date', labels: { short: 'testdate', tiny: 'TDATE' } } } }; var data = smsparser.parse(def, doc); test.same(data, {testdate: 1331510400000}); doc = { message: "0000 TDATE 2012-03-12" }; data = smsparser.parse(def, doc); test.same(data, {testdate: 1331510400000}); test.done(); };
exports['parse string field leading zero'] = function(test) { test.expect(2); // textforms var doc = { message: "0000 foo 012345" }; var def = { meta: { code: '0000' }, fields: { foo: { type: 'string', labels: { short: 'foo', tiny: 'foo' } } } }; var data = smsparser.parse(def, doc); test.same(data, {foo: "012345"}); // muvuku doc = { message: "1!0000!012345" }; data = smsparser.parse(def, doc); test.same(data, {foo: "012345"}); test.done(); };
var msbb_example_data_with_only_required_fields = function (test) { var def = jsonforms.getForm('MSBB'); var doc = { sent_timestamp: '2-1-12 15:35', from: '+13125551212', message: '1!MSBB!2012#1#24###bbbbbb' }; var obj = smsparser.parse(def, doc); var expectedObj = { ref_year: '2012', ref_month: '1', ref_day: 24, ref_rc: null, ref_hour: null, ref_name: 'bbbbbb', ref_age: undefined, ref_reason: undefined, ref_reason_other: undefined }; test.same(obj, expectedObj); test.done(); };
var add_sms = exports.add_sms = function(doc, request) { req = request; var options = { type: 'sms_message', form: smsparser.getFormCode(req.form.message) }; options = _.extend(req.form, options); // if locale was not passed in form data then check query string if (!options.locale) { options.locale = (req.query && req.query.locale) || utils.info.locale; } var def = utils.info.getForm(options.form), form_data = null, resp; if (options.form && def) { form_data = smsparser.parse(def, options); } var record = getDataRecord(options, form_data); return [ record, JSON.stringify(getDefaultResponse(record)) ]; };
exports['parse empty list field'] = function(test) { test.expect(1); var sms = { message: "1!0000!1#" }; var def = { fields: { "q1": { type: "integer", list: [[0, "Yes"], [1, "No"]], labels: { short: "question 1" } }, "q2": { type: "integer", list: [[0, "Yes"], [1, "No"]], labels: { short: "question 2" } } } }; var data = smsparser.parse(def, sms); // q2 should be null. empty string attempted to be parsed as number. test.same(data, {q1: "No", q2: null}); test.done(); };
exports.missing_fields = function(test) { test.expect(1); var doc = { "message":"1!YYYY!facility#2011#11#1#1#2#3", "type":"sms_message", "form":"YYYY"}, def = jsonforms.getForm(doc.form), data = smsparser.parse(def, doc); test.same(data, { "facility_id": "facility", "year": "2011", "month": "11", "misoprostol_administered": true, "quantity_dispensed": { "la_6x1": 1, "la_6x2": 2, "cotrimoxazole": 3, "zinc": undefined, "ors": undefined, "eye_ointment": undefined, }, "days_stocked_out": { "la_6x1": undefined, "la_6x2": undefined, "cotrimoxazole": undefined, "zinc": undefined, "ors": undefined, "eye_ointment": undefined } }); test.done(); };
exports.msbr_example_data = function (test) { var def = jsonforms.getForm('MSBR'); var doc = { sent_timestamp: '1-13-12 15:35', from: '+15551212', message: '1!MSBR!2012#12#20#12345678901#1111#bbbbbbbbbbbbbbbbbbbb#22#10#cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' }; test.expect(2); var obj = smsparser.parse(def, doc); var expectedObj = { ref_year: '2012', ref_month: '12', ref_day: 20, ref_rc: 12345678901, ref_hour: '1111', ref_name: 'bbbbbbbbbbbbbbbbbbbb', ref_age: 22, ref_reason: 'Diarrhée grave', ref_reason_other: 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' }; //console.log(obj); //console.log(expectedObj); test.same(obj, expectedObj); var arr = smsparser.parseArray(def, doc); var expectedArr = ['1-13-12 15:35', '+15551212', '2012', '12', '20', '12345678901', '1111', 'bbbbbbbbbbbbbbbbbbbb', '22', '10', 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'] test.same(arr, expectedArr); test.done(); };
exports.msbb_example_data = function (test) { test.expect(2); var def = jsonforms.getForm('MSBB'); var doc = { sent_timestamp: '2-1-12 15:35', from: '+13125551212', message: '1!MSBB!2012#2#1#12345678901#1111#bbbbbbbbbbbbbbbbbbbb#22#15#cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' }; var obj = smsparser.parse(def, doc); var expectedObj = { ref_year: 2012, ref_month: 2, ref_day: 1, ref_rc: '12345678901', ref_hour: 1111, ref_name: 'bbbbbbbbbbbbbbbbbbbb', ref_age: 22, ref_reason: 'Autres', ref_reason_other: 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' }; test.same(obj, expectedObj); msbb_example_data_with_only_required_fields(test); };
exports.msbg_example_data = function (test) { var def = jsonforms.getForm('MSBG'); var doc = { sent_timestamp: '1-16-12 15:35', from: '+15551212', message: '1!MSBG!2012#1#12345678901#123#456#789#123#456#789#123#456#789' }; test.expect(2); var obj = smsparser.parse(def, doc); var expectedObj = { case_year: '2012', case_month: '1', monthly_rc: "12345678901", monthly_cta1: 123, monthly_cta2: 456, monthly_cta3: 789, monthly_sro1: 123, monthly_sro2: 456, monthly_sro3: 789, monthly_ctm1: 123, monthly_ctm2: 456, monthly_ctm3: 789 }; test.same(obj, expectedObj); var arr = smsparser.parseArray(def, doc); var expectedArr = ['1-16-12 15:35', '+15551212', '2012', '1', 12345678901, 123, 456, 789, 123, 456, 789, 123, 456, 789]; test.same(arr, expectedArr); test.done(); };
exports.wrong_field_type = function(test) { test.expect(1); var doc = { "message":"1!YYYY!facility#2011#11#yyyyy#zzzz#2#3#4#5#6#9#8#7#6#5#4", "type":"sms_message", "form":"YYYY"}, def = jsonforms.getForm(doc.form), data = smsparser.parse(def, doc); test.same(data, { "facility_id": "facility", "year": "2011", "month": "11", "misoprostol_administered": null, "quantity_dispensed": { "la_6x1": null, "la_6x2": 2, "cotrimoxazole": 3, "zinc": 4, "ors": 5, "eye_ointment": 6, }, "days_stocked_out": { "la_6x1": 9, "la_6x2": 8, "cotrimoxazole": 7, "zinc": 6, "ors": 5, "eye_ointment": 4 } }); test.done(); };
exports['non ascii code is accepted'] = function(test) { test.expect(3); var def = { meta: { code: 'ग' }, fields: { foo: { type: 'string', labels: { short: 'foo', tiny: 'foo' } } } }; // textforms var doc = { message: "ग foo 16A" }; var data = smsparser.parse(def, doc); test.same(data, {foo: "16A"}); // compact var doc = { message: "ग 16A" }; var data = smsparser.parse(def, doc); test.same(data, {foo: "16A"}); // muvuku doc = { message: "1!ग!16A" }; data = smsparser.parse(def, doc); test.same(data, {foo: "16A"}); test.done(); };
exports['form not found'] = function(test) { test.expect(1); var doc = { "message":"1!X0X0!facility#2011#11#1#2#3#4#5#6#9#8#7#6#5#4", "type":"sms_message", "form":"X0X0"}, def = utils.info.getForm(doc.form), data = smsparser.parse(def, doc); test.same({}, data); test.done(); };
exports.parse_date_field_yyyz = function(test) { test.expect(2); var doc = { message: "1!YYYZ!##2012-03-12" }; var def = jsonforms.getForm('YYYZ'); var data = smsparser.parse(def, doc); test.same(data, {one:null, two:null, birthdate: 1331510400000}); doc = { message: "YYYZ BIR2012-03-12" }; data = smsparser.parse(def, doc); test.same(data, {birthdate: 1331510400000}); test.done(); };
exports.validations_is_numeric_month_stays_numeric = function(test) { test.expect(1); var doc = { message: "1!YYYY!foo#2011#11#" }, form = smsparser.getFormCode(doc.message), def = jsonforms.getForm(form), data = smsparser.parse(def, doc); test.same(11, data.month); test.done(); };
exports['support uppercase field keys'] = function(test) { var def = { meta: { code: 'R' }, fields: { OOOOO: { type: 'string', labels: { tiny: 'n' } } } }; // textforms var doc = { message: "R n jane", }; data = smsparser.parse(def, doc); test.same(data, {OOOOO: "jane"}); // compact textforms doc = { message: "R jane" }; data = smsparser.parse(def, doc); test.same(data, {OOOOO: "jane"}); // muvuku doc = { message: "1!R!jane" }; data = smsparser.parse(def, doc); test.same(data, {OOOOO: "jane"}); test.done(); };
exports.textforms_w_numeric_string = function(test) { test.expect(3); var doc = { message: 'YYYY CDT33#HFI001#ZDT999#RPY2012' }, def = jsonforms.getForm('YYYY'), data = smsparser.parse(def, doc); test.same(data, { facility_id: '001', quantity_dispensed: { cotrimoxazole: 33, zinc: 999 }, year: 2012 }); doc = { message: 'YYYY CDT33#HFI01ach#ZDT999#RPY2012' }, data = smsparser.parse(def, doc); test.same(data, { facility_id: '01ach', quantity_dispensed: { cotrimoxazole: 33, zinc: 999 }, year: 2012 }); doc = { message: 'YYYY CDT33#ZDT999#RPY2012' }, data = smsparser.parse(def, doc); test.same(data, { quantity_dispensed: { cotrimoxazole: 33, zinc: 999 }, year: 2012 }); test.done(); };
exports['parse javarosa message with special characters in a value'] = function (test) { var getForm = sinon.stub(utils.info, 'getForm').returns(definitions.forms.YYYY); var def = utils.info.getForm('YYYY'); var doc = { sent_timestamp: '12-11-11 15:00', from: '+15551212', message: 'J1!YYYY!HFI#!fac*!?ty!#RPY#2015' }; var obj = smsparser.parse(def, doc); test.same(obj.facility_id, "!fac*!?ty!"); test.same(obj.year, 2015); test.done(); };
exports['validations is numeric month stays numeric'] = function(test) { test.expect(2); var getForm = sinon.stub(utils.info, 'getForm').returns(definitions.forms.YYYY); var doc = { message: "1!YYYY!foo#2011#11#" }, form = smsparser.getFormCode(doc.message), def = utils.info.getForm(form), data = smsparser.parse(def, doc); test.ok(getForm.alwaysCalledWith('YYYY')); test.same(11, data.month); test.done(); };
exports['parse date field yyyz'] = function(test) { test.expect(3); var getForm = sinon.stub(utils.info, 'getForm').returns(definitions.forms.YYYZ); var doc = { message: "1!YYYZ!##2012-03-12" }; var def = utils.info.getForm('YYYZ'); var data = smsparser.parse(def, doc); test.ok(getForm.alwaysCalledWith('YYYZ')); test.same(data, {one:null, two:null, birthdate: 1331510400000}); doc = { message: "YYYZ BIR2012-03-12" }; data = smsparser.parse(def, doc); test.same(data, {birthdate: 1331510400000}); test.done(); };
exports['parse boolean field'] = function(test) { test.expect(2); var doc = { message: "1!0000!1" }; var def = { fields: { testbool: { type: 'boolean', labels: 'testbool' } } }; var data = smsparser.parse(def, doc); test.same(data, {testbool: true}); doc = { message: "1!0000!0" }; data = smsparser.parse(def, doc); test.same(data, {testbool: false}); test.done(); };
exports['compact textforms handles registrations starting with N'] = function(test) { var doc = { sent_timestamp: '1-13-12 15:35', from: '+15551212', message: 'R North West' }; var expectedObj = { name: 'North West' }; var obj = smsparser.parse(defR, doc); test.same(obj, expectedObj); test.done(); };
exports.textforms_numeric_no_spaces = function(test) { test.expect(1); var doc = { message: 'YYYY CDT33#ZDT999#RPY2012' }, def = jsonforms.getForm('YYYY'), data = smsparser.parse(def, doc); test.same(data, { quantity_dispensed: { cotrimoxazole: 33, zinc: 999 }, year: 2012 }); test.done(); };
exports['compact textforms handles too few fields'] = function(test) { var doc = { sent_timestamp: '1-13-12 15:35', from: '+15551212', message: 'ANCR "Sarah Connor" 24' }; var expectedObj = { name: 'Sarah Connor', lmp: 24 }; var obj = smsparser.parse(def, doc); test.same(obj, expectedObj); test.done(); };
exports.msbp_example_data = function (test) { var def = jsonforms.getForm('MSBP'); var doc = { sent_timestamp: '1-16-12 19:35', from: '+15551212', message: '1!MSBP!2012#1#16#12345678901#123#456#789#123#456#789#123#456#789#123#456#789#123#456#789#123' }; test.expect(2); var obj = smsparser.parse(def, doc); var expectedObj = { case_year: '2012', case_month: '1', case_day: 16, case_rc: 12345678901, case_pec_m: 123, case_pec_f: 456, case_urg_m: 789, case_urg_f: 123, case_tdr: 456, case_palu_m: 789, case_palu_f: 123, case_dia_m: 456, case_dia_f: 789, case_pneu_m: 123, case_pneu_f: 456, case_mal_m: 789, case_mal_f: 123, case_rev: 456, case_vad: 789, case_edu: 123 }; //console.log(obj); //console.log(expectedObj); test.same(obj, expectedObj); var arr = smsparser.parseArray(def, doc); var expectedArr = ['1-16-12 19:35', '+15551212', '2012', '1', 16, 12345678901, 123, 456, 789, 123, 456, 789, 123, 456, 789, 123, 456, 789, 123, 456, 789, 123]; test.same(arr, expectedArr); test.done(); };
exports['textforms without hash delim'] = function(test) { test.expect(2); var getForm = sinon.stub(utils.info, 'getForm').returns(definitions.forms.YYYY); var doc = { message: 'YYYY CDT 33 HFI foobar ZDT 999 RPY 2012' }, def = utils.info.getForm('YYYY'), data = smsparser.parse(def, doc); test.ok(getForm.alwaysCalledWith('YYYY')); test.same(data, { "quantity_dispensed": { "cotrimoxazole": null } }); test.done(); };
exports['compact textforms handles too many fields'] = function(test) { var doc = { sent_timestamp: '1-13-12 15:35', from: '+15551212', message: 'ANCR "Sarah Connor" 24 2012-03-12 comment' }; var expectedObj = { name: 'Sarah Connor', lmp: 24, somedate: 1331510400000 }; var obj = smsparser.parse(def, doc); test.same(obj, expectedObj); test.done(); };
exports['valid javarosa message with similarly named fields parses right'] = function (test) { var getForm = sinon.stub(utils.info, 'getForm').returns({ "meta": { "code": "T", "label": "Test" }, "fields": { "problem": { "labels": { "short": "Health Facility Identifier", "tiny": "P" }, "type": "string" }, "meta_problem": { "labels": { "short": "Health Facility Identifier", "tiny": "MetaP" }, "type": "string" } } }); var def = utils.info.getForm('T'); var doc = { sent_timestamp: '12-11-11 15:00', from: '+15551212', message: 'J1!T!p#Bar#metap#foo' }; var obj = smsparser.parse(def, doc); test.ok(getForm.alwaysCalledWith('T')); test.same(obj, { problem: "Bar", meta_problem: "foo" }); var arr = smsparser.parseArray(def, doc); test.same( arr, ["12-11-11 15:00", "+15551212", "Bar", "foo"] ); test.done(); };
exports['smsformats structured but no form'] = function(test) { var docs = [ {message: "1!0000!1"}, {message: "0000 ABC 123-123-123"} ]; for (var i in docs) { var doc = docs[i], form = smsparser.getFormCode(doc.message), def = utils.info.getForm(form); // assert parsing fails test.same({}, smsparser.parse(def, doc)); } test.done(); };
exports['compact textforms format'] = function(test) { var doc = { sent_timestamp: '1-13-12 15:35', from: '+15551212', message: 'ANCR sarah 24 2012-03-12' }; var expectedObj = { name: 'sarah', lmp: 24, somedate: 1331510400000 }; var obj = smsparser.parse(def, doc); test.same(obj, expectedObj); test.done(); };