def setUpClass(cls): super(TestExportInstanceDBAccessors, cls).setUpClass() cls.form_instance_deid = FormExportInstance(domain=cls.domain, name='Forms', is_deidentified=True) cls.form_instance_wrong = FormExportInstance( domain='wrong-domain', name='Forms', ) cls.form_instance_daily_saved = FormExportInstance( domain='wrong-domain', is_daily_saved_export=True, ) cls.case_instance_deid = CaseExportInstance(domain=cls.domain, name='Cases', is_deidentified=True) cls.case_instance = CaseExportInstance(domain=cls.domain, name='Cases', is_deidentified=False) cls.case_instance_daily_saved = CaseExportInstance( domain='wrong-domain', is_daily_saved_export=True, ) cls.instances = [ cls.form_instance_deid, cls.form_instance_wrong, cls.form_instance_daily_saved, cls.case_instance, cls.case_instance_deid, cls.case_instance_daily_saved, ] for instance in cls.instances: instance.save()
def setUpClass(cls): cls.exports = [ FormExportInstance(is_daily_saved_export=True), FormExportInstance(is_daily_saved_export=False), CaseExportInstance(is_daily_saved_export=True), ] for export in cls.exports: export.save()
def setUpClass(cls): super(TestDailySavedExports, cls).setUpClass() cls.exports = [ FormExportInstance(is_daily_saved_export=True), FormExportInstance(is_daily_saved_export=False), CaseExportInstance(is_daily_saved_export=True), ] for export in cls.exports: export.save()
def setUpClass(cls): super(TestExportInstanceDBAccessors, cls).setUpClass() cls.form_instance = FormExportInstance( domain=cls.domain, name='Forms', is_deidentified=False ) cls.form_instance_deid = FormExportInstance( domain=cls.domain, name='Forms', is_deidentified=True ) cls.form_instance_wrong = FormExportInstance( domain='wrong-domain', name='Forms', ) cls.form_instance_daily_saved = FormExportInstance( domain='wrong-domain', is_daily_saved_export=True, auto_rebuild_enabled=True, last_accessed=datetime.utcnow() ) cls.case_instance_deid = CaseExportInstance( domain=cls.domain, name='Cases', is_deidentified=True ) cls.case_instance = CaseExportInstance( domain=cls.domain, name='Cases', is_deidentified=False ) cls.case_instance_daily_saved = CaseExportInstance( domain='wrong-domain', is_daily_saved_export=True, auto_rebuild_enabled=True, last_accessed=(datetime.utcnow() - timedelta(days=4)) ) cls.instances = [ cls.form_instance, cls.form_instance_deid, cls.form_instance_wrong, cls.form_instance_daily_saved, cls.case_instance, cls.case_instance_deid, cls.case_instance_daily_saved, ] for instance in cls.instances: instance.save()
def setUp(cls): cls.new_exports = [ FormExportInstance(), CaseExportInstance(), ] for export in cls.new_exports: export.save()
def test_populated_metadata_document(self): odata_config = FormExportInstance( _id='my_config_id', domain=self.domain.name, is_odata_config=True, tables=[ TableConfiguration( columns=[ ExportColumn(label='selected_property_1', selected=True), ExportColumn(label='selected_property_2', selected=True), ExportColumn(label='unselected_property'), ], ), ] ) odata_config.save() self.addCleanup(odata_config.delete) correct_credentials = self._get_correct_credentials() with flag_enabled('ODATA'): response = self._execute_query(correct_credentials) self.assertEqual(response.status_code, 200) self.assertEqual(response['Content-Type'], 'application/xml') self.assertEqual(response['OData-Version'], '4.0') self.assertXmlEqual( self.get_xml( 'populated_form_odata_metadata_document_from_config', override_path=PATH_TO_TEST_DATA ), response.content )
def test_multi_table_order(self): tables = [ TableConfiguration(label="My table {}".format(i), selected=True, path=[], columns=[ ExportColumn( label="Q{}".format(i), item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q{}'.format(i)) ], ), selected=True, ), ]) for i in range(10) ] export_instance = FormExportInstance(export_format=Format.HTML, tables=tables) writer = _get_writer([export_instance]) docs = [{ 'domain': 'my-domain', '_id': '1234', "form": {'q{}'.format(i): 'value {}'.format(i) for i in range(10)} }] with writer.open([export_instance]): _write_export_instance(writer, export_instance, docs) with ExportFile(writer.path, writer.format) as export: exported_tables = [ table for table in re.findall('<h2>(.*)</h2>', export.read()) ] expected_tables = [t.label for t in tables] self.assertEqual(expected_tables, exported_tables)
def test_ignore_form_link_label(self): export_with_form_link = FormExportInstance( is_odata_config=True, tables=[ TableConfiguration( selected=True, columns=[ ExportColumn( label='my_form_link', item=ExportItem( path=[ PathNode(name='form'), PathNode(name='meta'), PathNode(name='instanceID') ], transform=FORM_ID_TO_LINK, ), selected=True, ) ] ) ] ) export_with_form_link.save() self.addCleanup(export_with_form_link.delete) cleaned_export = FormExportInstance.get(export_with_form_link.get_id) self.assertEqual(cleaned_export.tables[0].columns[0].label, 'my_form_link')
def test_empty_table_label(self): export_instance = FormExportInstance( export_format=Format.JSON, domain=DOMAIN, case_type=DEFAULT_CASE_TYPE, split_multiselects=True, tables=[ TableConfiguration(label="", selected=True, path=[], columns=[ ExportColumn(label="Q1", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q1') ], ), selected=True), ]) ]) writer = _get_writer([export_instance]) with writer.open([export_instance]): _write_export_instance(writer, export_instance, self.docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual(json.loads(export.read()), { u'Sheet1': { u'headers': [u'Q1'], u'rows': [[u'foo'], [u'bip']], } })
def get_instance(cls, domain_name): return FormExportInstance( domain=domain_name, is_odata_config=True, transform_dates=False, tables=[ TableConfiguration( selected=True, columns=[ ExportColumn(label='received_on', selected=True, item=ExportItem( path=[PathNode(name='received_on')])), ExportColumn(label='started_time', selected=True, item=ExportItem(path=[ PathNode(name='form'), PathNode(name='meta'), PathNode(name='timeStart'), ])), ExportColumn(label='selected_property_1', selected=True), ExportColumn(label='selected_property_2', selected=True), ExportColumn(label='unselected_property'), ], ), ])
def test_split_questions_false(self): """Ensure multiselects are not split when `split_multiselects` is set to False""" export_instance = FormExportInstance( export_format=Format.JSON, domain=DOMAIN, case_type=DEFAULT_CASE_TYPE, split_multiselects=False, tables=[ TableConfiguration(label="My table", selected=True, path=[], columns=[ SplitExportColumn( label="MC", item=MultipleChoiceItem( path=[ PathNode(name='form'), PathNode(name='mc') ], options=[ Option(value='one'), Option(value='two'), ]), selected=True, ) ]) ]) assert_instance_gives_results( self.docs, export_instance, { 'My table': { 'headers': ['MC'], 'rows': [['two extra'], ['one two']], } })
def test_simple_table(self, export_save): """ Confirm that some simple documents and a simple FormExportInstance are writtern with _write_export_file() correctly """ export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration(label="My table", selected=True, columns=[ ExportColumn(label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True), ExportColumn(label="Q1", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q1') ], ), selected=True), ]) ]) assert_instance_gives_results( self.docs, export_instance, { 'My table': { 'headers': ['Q3', 'Q1'], 'rows': [['baz', 'foo'], ['bop', 'bip']], } }) self.assertTrue(export_save.called)
def test_empty_table_label(self, export_save): export_instance = FormExportInstance( export_format=Format.JSON, domain=DOMAIN, case_type=DEFAULT_CASE_TYPE, split_multiselects=True, tables=[ TableConfiguration(label="", selected=True, path=[], columns=[ ExportColumn(label="Q1", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q1') ], ), selected=True), ]) ]) assert_instance_gives_results( self.docs, export_instance, {'Sheet1': { 'headers': ['Q1'], 'rows': [['foo'], ['bip']], }}) self.assertTrue(export_save.called)
def test_transform_dates(self, export_save): """Ensure dates are transformed for excel when `transform_dates` is set to True""" export_instance = FormExportInstance( export_format=Format.JSON, domain=DOMAIN, case_type=DEFAULT_CASE_TYPE, transform_dates=True, tables=[ TableConfiguration(label="My table", selected=True, path=[], columns=[ ExportColumn( label="Date", item=MultipleChoiceItem(path=[ PathNode(name='form'), PathNode(name='date') ], ), selected=True, ) ]) ]) assert_instance_gives_results( self.docs, export_instance, { 'My table': { 'headers': ['Date'], 'rows': [[MISSING_VALUE], [ couch_to_excel_datetime( '2015-07-22T14:16:49.584880Z', None) ]], } }) self.assertTrue(export_save.called)
def test_formid_column_label(self): export_with_modified_formid_column = FormExportInstance( is_odata_config=True, tables=[ TableConfiguration( selected=True, columns=[ ExportColumn( label='modified_form_id_column', item=ExportItem( path=[ PathNode(name='form'), PathNode(name='meta'), PathNode(name='instanceID') ] ), selected=True, ) ] ) ] ) export_with_modified_formid_column.save() self.addCleanup(export_with_modified_formid_column.delete) cleaned_export = FormExportInstance.get(export_with_modified_formid_column.get_id) self.assertEqual(cleaned_export.tables[0].columns[0].label, 'formid')
def test_paginated_table(self, export_save): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration(label="My table", selected=True, columns=[ ExportColumn(label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True), ExportColumn(label="Q1", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q1') ], ), selected=True), ]) ]) assert_instance_gives_results( self.docs + self.docs, export_instance, { 'My table_000': { 'headers': ['Q3', 'Q1'], 'rows': [['baz', 'foo'], ['bop', 'bip']], }, 'My table_001': { 'headers': ['Q3', 'Q1'], 'rows': [['baz', 'foo'], ['bop', 'bip']], } }) self.assertTrue(export_save.called)
def test_populated_metadata_document(self): odata_config_1 = FormExportInstance( _id='odata_config_1', domain=self.domain.name, is_odata_config=True, tables=[TableConfiguration(columns=[])]) odata_config_1.save() self.addCleanup(odata_config_1.delete) odata_config_2 = FormExportInstance( _id='odata_config_2', domain=self.domain.name, is_odata_config=True, tables=[ TableConfiguration(columns=[ ExportColumn(label='selected_property_1', selected=True), ExportColumn(label='selected_property_2', selected=True), ExportColumn(label='unselected_property'), ], ), ]) odata_config_2.save() self.addCleanup(odata_config_2.delete) non_odata_config = FormExportInstance(domain=self.domain.name) non_odata_config.save() self.addCleanup(non_odata_config.delete) config_in_other_domain = FormExportInstance(domain='other_domain', is_odata_config=True) config_in_other_domain.save() self.addCleanup(config_in_other_domain.delete) correct_credentials = self._get_correct_credentials() with flag_enabled('ODATA'): with patch( 'corehq.apps.api.odata.views.get_odata_form_configs_by_domain', return_value=sorted(get_odata_form_configs_by_domain( self.domain.name), key=lambda _config: _config.get_id)): response = self._execute_query(correct_credentials) self.assertEqual(response.status_code, 200) self.assertEqual(response['Content-Type'], 'application/xml') self.assertEqual(response['OData-Version'], '4.0') self.assertXmlEqual( self.get_xml('populated_form_odata_metadata_document_from_config', override_path=PATH_TO_TEST_DATA), response.content)
def setUp(self): self.instance = FormExportInstance(tables=[ TableConfiguration(path=MAIN_TABLE), TableConfiguration(path=[ PathNode(name='data', is_repeat=False), PathNode(name='repeat', is_repeat=True) ], columns=[MultiMediaExportColumn(selected=True)]) ])
def test_populated_service_document(self): odata_config_1 = FormExportInstance(domain=self.domain.name, is_odata_config=True) odata_config_1.save() self.addCleanup(odata_config_1.delete) odata_config_2 = FormExportInstance(domain=self.domain.name, is_odata_config=True) odata_config_2.save() self.addCleanup(odata_config_2.delete) non_odata_config = FormExportInstance(domain=self.domain.name) non_odata_config.save() self.addCleanup(non_odata_config.delete) config_in_other_domain = FormExportInstance(domain='other_domain', is_odata_config=True) config_in_other_domain.save() self.addCleanup(config_in_other_domain.delete) correct_credentials = self._get_correct_credentials() with flag_enabled('ODATA'): response = self._execute_query(correct_credentials) self.assertEqual(response.status_code, 200) self.assertEqual(response['OData-Version'], '4.0') response_content = json.loads(response.content.decode('utf-8')) self.assertCountEqual(response_content, ['@odata.context', 'value']) self.assertEqual( response_content['@odata.context'], 'http://localhost:8000/a/test_domain/api/v0.5/odata/forms/$metadata' ) self.assertCountEqual(response_content['value'], [ { 'url': odata_config_1.get_id, 'kind': 'EntitySet', 'name': odata_config_1.get_id, }, { 'url': odata_config_2.get_id, 'kind': 'EntitySet', 'name': odata_config_2.get_id, }, ])
def test_multi_table(self): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, path=[], columns=[ ExportColumn( label="Q3", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q3')], ), selected=True, ), ] ), TableConfiguration( label="My other table", selected=True, path=[PathNode(name='form', is_repeat=False), PathNode(name="q2", is_repeat=False)], columns=[ ExportColumn( label="Q4", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4')], ), selected=True, ), ] ) ] ) writer = _get_writer([export_instance]) with writer.open([export_instance]): _write_export_instance(writer, export_instance, self.docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { u'My table': { u'headers': [u'Q3'], u'rows': [[u'baz'], [u'bop']], }, u'My other table': { u'headers': [u'Q4'], u'rows': [[u'bar'], [u'boop']], } } )
def test_case_name_transform(self): docs = [ { 'domain': 'my-domain', '_id': '1234', "form": { "caseid": "robin", }, }, { 'domain': 'my-domain', '_id': '1234', "form": { "caseid": "i-do-not-exist", }, } ] export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, columns=[ ExportColumn( label="case_name", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='caseid')], transform=CASE_NAME_TRANSFORM, ), selected=True ), ] ) ] ) writer = _get_writer([export_instance]) with writer.open([export_instance]): _write_export_instance(writer, export_instance, docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { u'My table': { u'headers': [u'case_name'], u'rows': [[u'batman'], [MISSING_VALUE]], } } )
def test_unselected_column_excluded(self): self.assertEqual( ODataFormSerializer.serialize_forms_using_config( [{ 'user_id': 'the-user-id' }], FormExportInstance(tables=[ TableConfiguration(columns=[ ExportColumn( label='user-id', item=ExportItem(path=[PathNode(name='user_id')]), selected=False, ) ]) ])), [{}])
def test_missing_value_is_null(self): self.assertEqual( ODataFormSerializer.serialize_forms_using_config( [{}], FormExportInstance(tables=[ TableConfiguration(columns=[ ExportColumn( label='user-id', item=ExportItem(path=[PathNode(name='user_id')]), selected=True, ) ]) ])), [{ 'user-id': '---' }])
def test_config_in_different_domain(self): export_config_in_other_domain = FormExportInstance( _id='config_id', tables=[TableConfiguration(columns=[])], domain='different_domain') export_config_in_other_domain.save() self.addCleanup(export_config_in_other_domain.delete) correct_credentials = self._get_correct_credentials() response = self.client.get( self._odata_feed_url_by_domain_and_config_id( self.domain.name, export_config_in_other_domain.get_id), HTTP_AUTHORIZATION='Basic ' + correct_credentials, ) self.assertEqual(response.status_code, 404)
def test_multi_table(self, export_save): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration(label="My table", selected=True, path=[], columns=[ ExportColumn( label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True, ), ]), TableConfiguration(label="My other table", selected=True, path=[ PathNode(name='form', is_repeat=False), PathNode(name="q2", is_repeat=False) ], columns=[ ExportColumn( label="Q4", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4') ], ), selected=True, ), ]) ]) assert_instance_gives_results( self.docs, export_instance, { 'My table': { 'headers': ['Q3'], 'rows': [['baz'], ['bop']], }, 'My other table': { 'headers': ['Q4'], 'rows': [['bar'], ['boop']], } }) self.assertTrue(export_save.called)
def test_simple_table(self): """ Confirm that some simple documents and a simple FormExportInstance are writtern with _write_export_file() correctly """ export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, columns=[ ExportColumn( label="Q3", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q3')], ), selected=True ), ExportColumn( label="Q1", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q1')], ), selected=True ), ] ) ] ) writer = _get_writer([export_instance]) with writer.open([export_instance]): _write_export_instance(writer, export_instance, self.docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { u'My table': { u'headers': [u'Q3', u'Q1'], u'rows': [[u'baz', u'foo'], [u'bop', u'bip']], } } )
def test_empty_location(self): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, columns=[ ExportColumn( label="location", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='meta'), PathNode(name='location')], ), selected=True ), ] ) ] ) docs = [ { 'domain': 'my-domain', '_id': '1234', 'form': { 'meta': { 'location': {'xmlns': 'abc'}, } } } ] writer = get_export_writer([export_instance]) with writer.open([export_instance]): write_export_instance(writer, export_instance, docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { 'My table': { 'headers': ['location'], 'rows': [[EMPTY_VALUE]], } } )
def test_array_data_in_scalar_question(self): ''' This test ensures that when a question id has array data that we return still return a string for scalar data. This happens rarely ''' doc = { 'domain': 'my-domain', '_id': '12345', "form": { "array": ["one", "two"], } } export_instance = FormExportInstance( export_format=Format.JSON, domain=DOMAIN, xmlns='xmlns', tables=[TableConfiguration( label="My table", selected=True, path=[], columns=[ ExportColumn( label="Scalar Array", item=ScalarItem(path=[PathNode(name='form'), PathNode(name='array')]), selected=True, ) ] )] ) writer = get_export_writer([export_instance]) with writer.open([export_instance]): write_export_instance(writer, export_instance, [doc]) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { 'My table': { 'headers': ['Scalar Array'], 'rows': [['one two']], } } )
def test_get_export_properties(self): export_instance = FormExportInstance(tables=[ TableConfiguration(label="My table", selected=True, path=[], columns=[ ExportColumn( label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True, ), ExportColumn( label="dontshow", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='dontshow') ], ), selected=False, ), ]), TableConfiguration(label="My other table", selected=True, path=[ PathNode(name='form', is_repeat=False), PathNode(name="q2", is_repeat=False) ], columns=[ ExportColumn( label="Q4", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4') ], ), selected=True, ), ]) ]) with mock.patch('corehq.apps.export.models.new.FormExportInstance.get', return_value=export_instance): props = _get_export_properties("fake id for my export instance", False) self.assertEqual(props, set(['q2-q4', 'q3']))
def test_user_permissions(self): self.web_user.set_role(self.domain.name, 'none') self.web_user.save() self.addCleanup(self._setup_user_permissions) export_config = FormExportInstance( _id='config_id', tables=[TableConfiguration(columns=[])], domain=self.domain.name, ) export_config.save() self.addCleanup(export_config.delete) correct_credentials = self._get_correct_credentials() with flag_enabled('ODATA'): response = self._execute_query(correct_credentials) self.assertEqual(response.status_code, 403)