def testBlanktoNulls(self): orig = { '_id': 'blank_strings', 'form': { 'case': { "@xmlns": "http://commcarehq.org/case/transaction/v2", "@date_modified": "2013-10-14T10:59:44Z", "@user_id": "someuser", "@case_id": "mycase", "index": "", "attachment": "", "create": "", "update": "", } } } dict_props = ['index', 'attachment', 'create', 'update'] all_blank = copy.deepcopy(orig) all_blank['domain'] = settings.ES_XFORM_FULL_INDEX_DOMAINS[0] for_indexing = transform_xform_for_report_forms_index(all_blank) for prop in dict_props: self.assertIsNone(for_indexing['form']['case'][prop]) all_dicts = copy.deepcopy(orig) all_dicts['domain'] = settings.ES_XFORM_FULL_INDEX_DOMAINS[0] for prop in dict_props: all_dicts['form']['case'][prop] = {} for_index2 = transform_xform_for_report_forms_index(all_dicts) for prop in dict_props: self.assertIsNotNone(for_index2['form']['case'][prop])
def testConvertAndRestoreReportXFormDicts(self): orig = CONCEPT_XFORM orig['domain'] = settings.ES_XFORM_FULL_INDEX_DOMAINS[0] for_indexing = transform_xform_for_report_forms_index(orig) restored = restore_property_dict(for_indexing) #appVersion might be munged in meta, so swapping it out orig_appversion = orig['form']['meta']['appVersion'] restored_appversion = restored['form']['meta']['appVersion'] if isinstance(orig_appversion, dict): self.assertEqual(restored_appversion, orig_appversion['#text']) else: self.assertEqual(restored_appversion, orig_appversion) del(orig['form']['meta']['appVersion']) del(restored['form']['meta']['appVersion']) # user_type gets added in change_transform del(restored['user_type']) del(for_indexing['user_type']) # inserted during the transform del(restored['inserted_at']) del(for_indexing['inserted_at']) del(restored['form']['meta']['app_build_version']) del(restored['form']['meta']['commcare_version']) del(restored['form']['meta']['geo_point']) self.assertNotEqual(for_indexing, orig) self.assertNotEqual(for_indexing, restored) del restored['backend_id'] self.assertEqual(orig, restored)
def testReportXFormTransform(self): form = XFORM_SINGLE_CASE form['domain'] = settings.ES_XFORM_FULL_INDEX_DOMAINS[0] processed_form = transform_xform_for_report_forms_index(form) mapping = REPORT_XFORM_INDEX_INFO.mapping # root level for k, v in processed_form['form'].items(): if k in mapping['properties']['form']['properties']: if isinstance(v, dict): self.assertFalse( '#value' in v, msg= "Error, processed dict contains a #value dict for key [%s] when it shouldn't" % k) else: #it's not a dict, so that means it's ok if k in form: self.assertEqual(form[k], v) else: self.assertTrue(isinstance(v, dict)) if isinstance(form['form'][k], dict): #if the original is a dict, then, make sure the keys are the same self.assertFalse('#value' in v) self.assertEqual(sorted(form['form'][k].keys()), sorted(v.keys())) else: self.assertTrue('#value' in v) self.assertEqual(form['form'][k], v['#value'])
def testComputedConversion(self): """ Since we set dyanmic=True on reportxforms, need to do conversions on the computed_ properties so call conversion on computed_ dict as well, this test ensures that it's converted on change_transform :return: """ orig = { '_id': 'blank_strings', 'received_on': '2013-10-12T11:59:41Z', 'form': { 'case': { "@xmlns": "http://commcarehq.org/case/transaction/v2", "@date_modified": "2013-10-14T10:59:44Z", "@user_id": "someuser", "@case_id": "mycase", "index": "", "attachment": "", "create": "", "update": "", } }, 'computed_': { "mvp_indicators": { "last_muac": { "updated": "2013-02-04T21:54:28Z", "version": 1, "type": "FormDataAliasIndicatorDefinition", "multi_value": False, "value": None }, "muac": { "updated": "2013-02-04T21:54:28Z", "version": 1, "type": "FormDataAliasIndicatorDefinition", "multi_value": False, "value": { "#text": "", "@concept_id": "1343" } }, "vaccination_status": { "updated": "2013-02-04T21:54:28Z", "version": 1, "type": "FormDataAliasIndicatorDefinition", "multi_value": False, "value": "yes" }, } } } orig['domain'] = settings.ES_XFORM_FULL_INDEX_DOMAINS[0] for_indexing = transform_xform_for_report_forms_index(orig) restored = restore_property_dict(for_indexing) self.assertNotEqual(orig['computed_'], for_indexing['computed_']) self.assertEqual(orig['computed_'], restored['computed_'])
def testComputedConversion(self): """ Since we set dyanmic=True on reportxforms, need to do conversions on the computed_ properties so call conversion on computed_ dict as well, this test ensures that it's converted on change_transform :return: """ orig = { '_id': 'blank_strings', 'received_on': '2013-10-12T11:59:41Z', 'form': { 'case': { "@xmlns": "http://commcarehq.org/case/transaction/v2", "@date_modified": "2013-10-14T10:59:44Z", "@user_id": "someuser", "@case_id": "mycase", "index": "", "attachment": "", "create": "", "update": "", } }, 'computed_': { "mvp_indicators": { "last_muac": { "updated": "2013-02-04T21:54:28Z", "version": 1, "type": "FormDataAliasIndicatorDefinition", "multi_value": False, "value": None }, "muac": { "updated": "2013-02-04T21:54:28Z", "version": 1, "type": "FormDataAliasIndicatorDefinition", "multi_value": False, "value": { "#text": "", "@concept_id": "1343" } }, "vaccination_status": { "updated": "2013-02-04T21:54:28Z", "version": 1, "type": "FormDataAliasIndicatorDefinition", "multi_value": False, "value": "yes" }, } } } orig['domain'] = settings.ES_XFORM_FULL_INDEX_DOMAINS[0] for_indexing = transform_xform_for_report_forms_index(orig) restored = restore_property_dict(for_indexing) self.assertNotEqual(orig['computed_'], for_indexing['computed_']) self.assertEqual(orig['computed_'], restored['computed_'])
def testConceptReportConversion(self): orig = CONCEPT_XFORM orig['domain'] = settings.ES_XFORM_FULL_INDEX_DOMAINS[0] for_indexing = transform_xform_for_report_forms_index(orig) self.assertTrue(isinstance(for_indexing['form']['last_visit'], dict)) self.assertTrue('#value' in for_indexing['form']['last_visit']) self.assertTrue(isinstance(for_indexing['form']['member_available'], dict)) self.assertTrue(isinstance(for_indexing['form']['member_available']['#text'], dict)) self.assertTrue(isinstance(for_indexing['form']['member_available']['@concept_id'], dict)) self.assertEqual(for_indexing['form']['member_available'], { "#text": { "#value": "yes" }, "@concept_id": { "#value": "1890" } } ) self.assertEqual(for_indexing['form']['modern_fp'], [ { "fp_type": { "#text": { "#value": "iud" }, "@concept_id": { "#value": "374" } } }, { "fp_type": { "#text": { "#value": "ij" }, "@concept_id": { "#value": "374" } } } ] )
def testReportXFormTransform(self): form = XFORM_SINGLE_CASE form['domain'] = settings.ES_XFORM_FULL_INDEX_DOMAINS[0] processed_form = transform_xform_for_report_forms_index(form) mapping = REPORT_XFORM_INDEX_INFO.mapping # root level for k, v in processed_form['form'].items(): if k in mapping['properties']['form']['properties']: if isinstance(v, dict): self.assertFalse('#value' in v, msg="Error, processed dict contains a #value dict for key [%s] when it shouldn't" % k) else: #it's not a dict, so that means it's ok if k in form: self.assertEqual(form[k], v) else: self.assertTrue(isinstance(v, dict)) if isinstance(form['form'][k], dict): #if the original is a dict, then, make sure the keys are the same self.assertFalse('#value' in v) self.assertEqual(sorted(form['form'][k].keys()), sorted(v.keys())) else: self.assertTrue('#value' in v) self.assertEqual(form['form'][k], v['#value'])
def testSubCaseForm(self): """ Ensure that the dict format converter never touches any sub property that has a key of 'case' this is our way of handling case blocks. The properties in the case block ought not to be touched this current form only captures """ orig = { '_id': 'nested_case_blocks', 'form': { 'case': { "@xmlns": "http://commcarehq.org/case/transaction/v2", "@date_modified": "2013-10-14T10:59:44Z", "@user_id": "someuser", "@case_id": "mycase", }, 'subcase_0': { 'case': { "@xmlns": "http://commcarehq.org/case/transaction/v2", "index": { "parent": { "@case_type": "household", "#text": "some_parent" } }, "@date_modified": "2013-10-12T11:59:41Z", "create": { "case_type": "child", "owner_id": "some_owner", "case_name": "hello there" }, "@user_id": "someuser", "update": { "first_name": "asdlfjkasdf", "surname": "askljvlajskdlrwe", "dob": "2011-03-21", "sex": "male", "weight_date": "never", "household_head_health_id": "", "dob_known": "yes", "health_id": "", "length_date": "never", "dob_calc": "2011-03-21" }, "@case_id": "subcaseid" } }, 'really': { 'nested': { 'case': { "@xmlns": "http://commcarehq.org/case/transaction/v2", "index": { "parent": { "@case_type": "household", "#text": "some_parent" } }, "@date_modified": "2013-10-12T11:59:41Z", "create": { "case_type": "child", "owner_id": "some_owner", "case_name": "hello there" }, "@user_id": "someuser", "update": { "first_name": "asdlfjkasdf", "surname": "askljvlajskdlrwe", "dob": "2011-03-21", "sex": "male", "weight_date": "never", "household_head_health_id": "", "dob_known": "yes", "health_id": "", "length_date": "never", "dob_calc": "2011-03-21" }, "@case_id": "subcaseid2" } } }, 'array_cases': [ {'case': {'foo': 'bar'}}, {'case': {'boo': 'bar'}}, {'case': {'poo': 'bar'}}, ] } } orig['domain'] = settings.ES_XFORM_FULL_INDEX_DOMAINS[0] for_indexing = transform_xform_for_report_forms_index(orig) self.assertEqual(orig['form']['case'], for_indexing['form']['case']) self.assertEqual(orig['form']['subcase_0']['case'], for_indexing['form']['subcase_0']['case']) self.assertEqual(orig['form']['really']['nested']['case'], for_indexing['form']['really']['nested']['case'])