def test_export_instance_from_saved(self): """This test ensures that when we build from a saved export instance that the selection that a user makes is still there""" build_ids_and_versions = { self.app_id: 3, } with mock.patch( 'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) instance.save() self.assertEqual(len(instance.tables), 1) self.assertEqual(len(instance.tables[0].columns), 1) self.assertTrue(instance.tables[0].columns[0].selected) # Simulate a selection instance.tables[0].columns[0].selected = False instance.save() self.assertFalse(instance.tables[0].columns[0].selected) with mock.patch( 'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.new_schema, saved_export=instance ) self.assertEqual(len(instance.tables), 2) self.assertEqual(len(instance.tables[0].columns), 2) # Selection from previous instance should hold the same and not revert to defaults self.assertFalse(instance.tables[0].columns[0].selected)
def test_export_instance_deleted_columns_updated(self): """This test ensures that when building from a saved export that the new instance correctly labels the old columns as advanced """ build_ids_and_versions = { self.app_id: 3, } with mock.patch( 'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) instance.save() self.assertEqual(len(instance.tables), 1) self.assertEqual(len(instance.tables[0].columns), 1) self.assertTrue(instance.tables[0].columns[0].selected) # Every column should now be marked as advanced build_ids_and_versions = { self.app_id: 4, } with mock.patch( 'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.new_schema, saved_export=instance ) self.assertEqual(len(instance.tables), 2) self.assertEqual(len(instance.tables[0].columns), 2) self.assertEqual(len(filter(lambda c: c.is_advanced, instance.tables[0].columns)), 2)
def test_generate_instance_from_schema(self, _, __): """Only questions that are in the main table and of the same version should be shown""" build_ids_and_versions = {self.app_id: 3} with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.schema) self.assertEqual(len(instance.tables), 2) index, split_column = instance.tables[0].get_column( [PathNode(name='data'), PathNode(name='question1')], 'MultipleChoiceItem', None) self.assertTrue(isinstance(split_column, SplitExportColumn)) index, stock_column = instance.tables[0].get_column([ PathNode(name='data'), PathNode(name='balance:question-id'), PathNode(name='@type') ], 'StockItem', None) self.assertTrue(isinstance(stock_column, StockFormExportColumn)) selected = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns) selected_system_props = len( [x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected]) self.assertEqual(len(selected), 2 + selected_system_props)
def test_generate_instance_from_schema(self, _, __): """Only questions that are in the main table and of the same version should be shown""" build_ids_and_versions = {self.app_id: 3} with mock.patch( 'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) self.assertEqual(len(instance.tables), 2) index, split_column = instance.tables[0].get_column( [PathNode(name='data'), PathNode(name='question1')], 'MultipleChoiceItem', None ) self.assertTrue(isinstance(split_column, SplitExportColumn)) selected = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns ) shown = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns ) selected_system_props = len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected]) self.assertEqual(len(selected), 1 + selected_system_props) self.assertEqual(len(shown), 1 + selected_system_props)
def test_ensure_that_column_is_not_deleted(self, _, __): """This test ensures that as long as ONE app in last_occurrences is the most recent version then the column is still marked as is_deleted=False """ build_ids_and_versions = { self.app_id: 3, self.second_app_id: 4, } with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.schema) selected = [ column for column in instance.tables[0].columns + instance.tables[1].columns if column.selected ] is_advanced = [ column for column in instance.tables[0].columns + instance.tables[1].columns if column.is_advanced ] selected_system_props = len( [x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected]) advanced_system_props = len( [x for x in MAIN_FORM_TABLE_PROPERTIES if x.is_advanced]) self.assertEqual(len(selected), 1 + selected_system_props) self.assertEqual(len(is_advanced), 0 + advanced_system_props)
def test_copy_instance(self, _): build_ids_and_versions = { self.app_id: 3, } with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.schema) instance.save() self.addCleanup(instance.delete) new_export = instance.copy_export() new_export.save() self.assertNotEqual(new_export._id, instance._id) self.assertEqual(new_export.name, '{} - Copy'.format(instance.name)) old_json = instance.to_json() del old_json['name'] del old_json['_id'] del old_json['_rev'] new_json = new_export.to_json() del new_json['name'] del new_json['_id'] del new_json['_rev'] self.assertDictEqual(old_json, new_json)
def test_copy_instance(self, _): build_ids_and_versions = { self.app_id: 3, } with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) instance.save() self.addCleanup(instance.delete) new_export = instance.copy_export() new_export.save() self.assertNotEqual(new_export._id, instance._id) self.assertEqual(new_export.name, '{} - Copy'.format(instance.name)) old_json = instance.to_json() del old_json['name'] del old_json['_id'] del old_json['_rev'] new_json = new_export.to_json() del new_json['name'] del new_json['_id'] del new_json['_rev'] self.assertDictEqual(old_json, new_json)
def test_ensure_that_column_is_not_deleted(self, _, __): """This test ensures that as long as ONE app in last_occurrences is the most recent version then the column is still marked as is_deleted=False """ build_ids_and_versions = { self.app_id: 3, self.second_app_id: 4, } with mock.patch( 'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) selected = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns ) is_advanced = filter( lambda column: column.is_advanced, instance.tables[0].columns + instance.tables[1].columns ) selected_system_props = len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected]) advanced_system_props = len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.is_advanced]) self.assertEqual(len(selected), 1 + selected_system_props) self.assertEqual(len(is_advanced), 0 + advanced_system_props)
def _generate_instance(self, build_ids_and_versions, saved_export=None): with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): return FormExportInstance.generate_instance_from_schema( self.schema, saved_export=saved_export)
def _update_instance(self, build_ids_and_versions, instance): with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.new_schema, saved_export=instance ) return instance
def test_export_instance_from_saved(self, _): """This test ensures that when we build from a saved export instance that the selection that a user makes is still there""" first_non_system_property = len(TOP_MAIN_FORM_TABLE_PROPERTIES) build_ids_and_versions = { self.app_id: 3, } with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.schema) instance.save() self.assertEqual(len(instance.tables), 1) self.assertEqual(len(instance.tables[0].columns), 1 + len(MAIN_FORM_TABLE_PROPERTIES)) self.assertTrue( instance.tables[0].columns[first_non_system_property].selected) item = instance.tables[0].columns[first_non_system_property].item # Simulate a selection instance.tables[0].columns[first_non_system_property].selected = False instance.save() self.assertFalse( instance.tables[0].columns[first_non_system_property].selected) with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.new_schema, saved_export=instance) self.assertEqual(len(instance.tables), 2) self.assertEqual(len(instance.tables[0].columns), 2 + len(MAIN_FORM_TABLE_PROPERTIES)) # Selection from previous instance should hold the same and not revert to defaults idx, column = instance.tables[0].get_column(item.path, item.doc_type, item.transform) self.assertFalse(column.selected)
def _get_instance(self, build_ids_and_versions): with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) instance.save() self.addCleanup(instance.delete) self.assertEqual(len(instance.tables), 1) self.assertEqual(len(instance.tables[0].columns), 3 + len(MAIN_FORM_TABLE_PROPERTIES)) self.assertTrue(instance.tables[0].columns[len(TOP_MAIN_FORM_TABLE_PROPERTIES)].selected) return instance
def test_export_instance_deleted_columns_updated(self, _): """This test ensures that when building from a saved export that the new instance correctly labels the old columns as advanced """ build_ids_and_versions = { self.app_id: 3, } with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.schema) instance.save() self.assertEqual(len(instance.tables), 1) self.assertEqual(len(instance.tables[0].columns), 1 + len(MAIN_FORM_TABLE_PROPERTIES)) self.assertTrue(instance.tables[0].columns[len( TOP_MAIN_FORM_TABLE_PROPERTIES)].selected) # Every column should now be marked as advanced build_ids_and_versions = { self.app_id: 4, } with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.new_schema, saved_export=instance) self.assertEqual(len(instance.tables), 2) self.assertEqual(len(instance.tables[0].columns), 2 + len(MAIN_FORM_TABLE_PROPERTIES)) self.assertEqual( len(filter(lambda c: c.is_advanced, instance.tables[0].columns)), 2 + len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.is_advanced]))
def test_ensure_that_column_is_deleted(self, _, __): """If both apps are out of date then, the question is indeed deleted""" build_ids_and_versions = { self.app_id: 3, self.second_app_id: 5, } with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) selected = [column for column in instance.tables[0].columns + instance.tables[1].columns if column.selected] shown = [column for column in instance.tables[0].columns + instance.tables[1].columns if column.selected] selected_system_props = len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected]) self.assertEqual(len(selected), 0 + selected_system_props) self.assertEqual(len(shown), 0 + selected_system_props)
def test_generate_instance_from_schema_deleted(self, _): """Given a higher app_version, all the old questions should not be shown or selected""" build_ids_and_versions = {self.app_id: 4} with mock.patch( 'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) self.assertEqual(len(instance.tables), 2) selected = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns ) shown = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns ) self.assertEqual(len(selected), 0) self.assertEqual(len(shown), 0)
def test_generate_instance_from_schema_deleted(self, _, __): """Given a higher app_version, all the old questions should not be shown or selected""" build_ids_and_versions = {self.app_id: 4} with mock.patch( 'corehq.apps.export.models.new.get_latest_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema( self.schema) self.assertEqual(len(instance.tables), 2) selected = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns) shown = filter(lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns) selected_system_props = len( [x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected]) self.assertEqual(len(selected), 0 + selected_system_props) self.assertEqual(len(shown), 0 + selected_system_props)
def test_ensure_that_column_is_deleted(self, _): """If both apps are out of date then, the question is indeed deleted""" build_ids_and_versions = { self.app_id: 3, self.second_app_id: 5, } with mock.patch( 'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) selected = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns ) shown = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns ) self.assertEqual(len(selected), 0) self.assertEqual(len(shown), 0)
def test_generate_instance_from_schema(self, _): """Only questions that are in the main table and of the same version should be shown""" build_ids_and_versions = {self.app_id: 3} with mock.patch( 'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions', return_value=build_ids_and_versions): instance = FormExportInstance.generate_instance_from_schema(self.schema) self.assertEqual(len(instance.tables), 2) selected = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns ) shown = filter( lambda column: column.selected, instance.tables[0].columns + instance.tables[1].columns ) self.assertEqual(len(selected), 1) self.assertEqual(len(shown), 1)
def test(self): schema = FormExportDataSchema.generate_schema_from_builds( self.domain, self.app._id, self.form_xmlns, only_process_current_builds=True, ) for group_schema in schema.group_schemas: # group_schema is an instance of ExportGroupSchem # group_schema.items is an array of ExportItems subclasses path = [node.name for node in group_schema.path] if path == []: main_group_schema = group_schema elif path == ['form', 'babies']: baby_repeat_group_schema = group_schema assertContainsExportItems( [ # Verify that a simple form question appears in the schema ('form.how_are_you_today', 'How are you today?'), ('form.how_many_babies', 'How many babies?'), ('form.add_a_prescription', 'Add a prescription?'), ('form.voucher-name', '#form/voucher-name'), ('form.is_this_a_delivery', 'Is this a delivery?'), ('form.facility_name', '#form/facility_name'), # Verify that the main parent case updates appear (case type "mom") ('form.case.@case_id', 'case.@case_id'), ('form.case.@date_modified', 'case.@date_modified'), ('form.case.@user_id', 'case.@user_id'), ('form.case.update.last_status', 'case.update.last_status'), # Verify that we see case updates for save-to-case cases # These are already in the form schema, so they get interpreted like any other question ('form.prescription.prescription.case.close', '#form/prescription/prescription/case/close'), ('form.prescription.prescription.case.create.case_name', '#form/prescription/prescription/case/create/case_name'), ('form.prescription.prescription.case.create.case_type', '#form/prescription/prescription/case/create/case_type'), ('form.prescription.prescription.case.update.number_of_babies', '#form/prescription/prescription/case/update/number_of_babies' ), ('form.prescription.prescription_name', '#form/prescription/prescription_name'), ('form.prescription.prescription.case.index.parent', '#form/prescription/prescription/case/index/parent'), ('form.prescription.prescription.case.@case_id', '#form/prescription/prescription/case/@case_id'), ('form.prescription.prescription.case.@user_id', '#form/prescription/prescription/case/@user_id'), ('form.prescription.prescription.case.@date_modified', '#form/prescription/prescription/case/@date_modified'), # # Verify that we see updates from subcases not in repeat groups (case type "voucher") ('form.subcase_0.case.@case_id', 'subcase_0.@case_id'), ('form.subcase_0.case.@date_modified', 'subcase_0.@date_modified'), ('form.subcase_0.case.@user_id', 'subcase_0.@user_id'), ('form.subcase_0.case.create.case_name', 'subcase_0.create.case_name'), ('form.subcase_0.case.create.case_type', 'subcase_0.create.case_type'), ('form.subcase_0.case.create.owner_id', 'subcase_0.create.owner_id'), ('form.subcase_0.case.index.parent.#text', 'subcase_0.index.#text'), ('form.subcase_0.case.index.parent.@case_type', 'subcase_0.index.@case_type'), ('form.subcase_0.case.update.how_many_babies', 'subcase_0.update.how_many_babies'), ], main_group_schema) # Verify that we see updates from subcases in repeat groups (case type "baby") assertContainsExportItems([ ('form.babies.case.@case_id', 'subcase_1.@case_id'), ('form.babies.case.@date_modified', 'subcase_1.@date_modified'), ('form.babies.case.@user_id', 'subcase_1.@user_id'), ('form.babies.case.create.case_name', 'subcase_1.create.case_name'), ('form.babies.case.create.case_type', 'subcase_1.create.case_type'), ('form.babies.case.create.owner_id', 'subcase_1.create.owner_id'), ('form.babies.case.update.eye_color', 'subcase_1.update.eye_color'), ('form.babies.case.update.facility_name', 'subcase_1.update.facility_name'), ('form.babies.case.index.parent.#text', 'subcase_1.index.#text'), ('form.babies.case.index.parent.@case_type', 'subcase_1.index.@case_type'), ('form.babies.eye_color', 'Eye color?'), ('form.babies.whats_the_babys_name', "What's the baby's name?"), ], baby_repeat_group_schema) instance = FormExportInstance.generate_instance_from_schema(schema) instance.export_format = Format.JSON # make everything show up in the export for table in instance.tables: table.selected = True for column in table.columns: if column.item.path[ -1].name == '@case_id' and not column.item.transform: self.assertFalse(column.is_advanced) column.selected = True with patch('corehq.apps.export.export.get_export_documents') as docs: docs.return_value = self.form_es_response export_data = get_export_json(instance) def get_form_data(table): headers = export_data[table]['headers'] return [ dict(zip(headers, row)) for row in export_data[table]['rows'] ] self.assertDictContainsSubset( { # normal form questions "form.add_a_prescription": "yes_then_close", "form.how_are_you_today": "fine_thanks", "form.how_many_babies": "2", "form.is_this_a_delivery": "yes", "form.voucher-name": "Petunia2017-08-29", # standard case update "form.case.update.last_status": "fine_thanks", "form.case.@case_id": "71626d9c-2d05-491f-81d9-becf8566618a", "form.case.@user_id": "853a24735ba89a3019ced7e3153dc60d", # save-to-case properties "form.prescription.prescription.case.close": "True", "form.prescription.prescription.case.create.case_name": "Petunia-prescription-2017-08-29", "form.prescription.prescription.case.create.case_type": "prescription", "form.prescription.prescription.case.update.number_of_babies": "2", "form.prescription.prescription_name": "Petunia-prescription-2017-08-29", "form.prescription.prescription.case.index.parent": "71626d9c-2d05-491f-81d9-becf8566618a", # non-repeating subcase actions "form.subcase_0.case.@case_id": "16954d55-a9be-40dd-98a8-dc7fae9c7ed6", "form.subcase_0.case.@date_modified": "2017-08-29 11:19:40", "form.subcase_0.case.@user_id": "853a24735ba89a3019ced7e3153dc60d", "form.subcase_0.case.create.case_name": "Petunia2017-08-29", "form.subcase_0.case.create.case_type": "voucher", "form.subcase_0.case.create.owner_id": "853a24735ba89a3019ced7e3153dc60d", "form.subcase_0.case.update.how_many_babies": "2", "form.subcase_0.case.index.parent.#text": "71626d9c-2d05-491f-81d9-becf8566618a", "form.subcase_0.case.index.parent.@case_type": "mom", }, get_form_data('Forms')[0]) self.assertDictEqual( { "number": "0.0", "number__0": 0, "number__1": 0, "form.babies.eye_color": "brown", "form.babies.whats_the_babys_name": "Bob", "form.babies.case.@case_id": "5539bd9d-d5d6-44c8-8f78-6915f16b6907", "form.babies.case.@date_modified": "2017-08-29 11:19:40", "form.babies.case.@user_id": "853a24735ba89a3019ced7e3153dc60d", "form.babies.case.create.case_name": "Bob", "form.babies.case.create.case_type": "baby", "form.babies.case.create.owner_id": "853a24735ba89a3019ced7e3153dc60d", "form.babies.case.index.parent.#text": "71626d9c-2d05-491f-81d9-becf8566618a", "form.babies.case.index.parent.@case_type": "mom", "form.babies.case.update.eye_color": "brown", "form.babies.case.update.facility_name": "test", }, get_form_data('Repeat- babies')[0])