def test_updating_report_that_shares_data_source(self): """ If a report builder builder report shares a data source with another report, then editing the report builder report should result in a new data source being created for the report. """ # Make report builder_form = ConfigureListReportForm( self.domain, "Test Report", self.app._id, "form", self.form.unique_id, existing_report=None, data={ 'user_filters': '[]', 'default_filters': '[]', 'columns': '[{"property": "/data/first_name", "display_text": "first name", "calculation":"Group By"}]', }) self.assertTrue(builder_form.is_valid()) report = builder_form.create_report() # Make another report that references the same data source report_two = ReportConfiguration(domain="domain", config_id=report.config_id) report_two.save() # Make an edit to the first report builder report builder_form = ConfigureListReportForm( self.domain, "Test Report", self.app._id, "form", self.form.unique_id, existing_report=report, data={ 'user_filters': '[]', 'default_filters': '[]', 'columns': '[{"property": "/data/first_name", "display_text": "first name", "calculation": "Group By"}]', }) self.assertTrue(builder_form.is_valid()) report = builder_form.update_report() self.assertNotEqual(report.config_id, report_two.config_id)
def testDataSource(self): """ Confirm that data sources for reports with multiselects use "choice_list" indicators for mselect questions. """ builder_form = ConfigureListReportForm( self.domain, "My Report", self.app._id, "form", self.form.unique_id, data={ 'user_filters': '[]', 'default_filters': '[]', 'columns': '[' ' {"property": "/data/first_name", "display_text": "first name", "calculation": "Group By"},' ' {"property": "/data/state", "display_text": "state", "calculation": "Count Per Choice"}' ']', }) self.assertTrue(builder_form.is_valid()) report = builder_form.create_report() data_source = report.config mselect_indicators = [ i for i in data_source.configured_indicators if i["type"] == "choice_list" ] self.assertEqual(len(mselect_indicators), 1) mselect_indicator = mselect_indicators[0] self.assertEqual(set(mselect_indicator['choices']), {'MA', 'MN', 'VT'})
def test_count_column_existence(self, _, __): """ Confirm that aggregated reports have a count column option, and that non aggregated reports do not. """ def get_count_column_columns(configuration_form): return len( filter(lambda x: isinstance(x, CountColumn), configuration_form.report_column_options.values())) list_report_form = ConfigureListReportForm( "my report", factory.app._id, "form", form1.unique_id, ) self.assertEqual(get_count_column_columns(list_report_form), 0) table_report_form = ConfigureTableReportForm( "my report", factory.app._id, "form", form1.unique_id, ) self.assertEqual(get_count_column_columns(table_report_form), 1)
def test_data_source_exclusivity(self): """ Report builder reports based on the same form/case_type should have different data sources (they were previously sharing them) """ # Make report builder_form = ConfigureListReportForm( self.domain, "Report one", self.app._id, "form", self.form.unique_id, existing_report=None, data={ 'user_filters': '[]', 'default_filters': '[]', 'columns': '[{"property": "/data/first_name", "display_text": "first name", "calculation": "Group By"}]', }) self.assertTrue(builder_form.is_valid()) report_one = builder_form.create_report() # Make another report builder_form = ConfigureListReportForm( self.domain, "Report two", self.app._id, "form", self.form.unique_id, existing_report=None, data={ 'user_filters': '[]', 'default_filters': '[]', 'columns': '[{"property": "/data/first_name", "display_text": "first name", "calculation": "Group By"}]', }) self.assertTrue(builder_form.is_valid()) report_two = builder_form.create_report() self.assertNotEqual(report_one.config_id, report_two.config_id)
def test_updating_out_of_date_report(self): """ Test that editing a report for an outdated data source creates a new data source. Data sources are tied to app version. """ # Make report builder_form = ConfigureListReportForm("Test Report", self.app._id, "form", self.form.unique_id, existing_report=None, data={ 'filters': '[]', 'columns': '[]', }) self.assertTrue(builder_form.is_valid()) report = builder_form.create_report() first_data_source_id = report.config_id # Bump version of app by saving it self.app.save() # Modify the report builder_form = ConfigureListReportForm("Test Report", self.app._id, "form", self.form.unique_id, existing_report=report, data={ 'filters': '[]', 'columns': '[]' }) self.assertTrue(builder_form.is_valid()) report = builder_form.update_report() second_data_source_id = report.config_id self.assertNotEqual(first_data_source_id, second_data_source_id)
def testReportColumnOptions(self): """ Confirm that form.report_column_options contains MultiselectQuestionColumnOption objects for mselect questions. """ builder_form = ConfigureListReportForm( "My Report", self.app._id, "form", self.form.unique_id, ) self.assertEqual( type(builder_form.report_column_options["/data/state"]), MultiselectQuestionColumnOption)
def test_data_source_columns(self): """ Report Builder should create a data source that includes columns for all possible aggregations, so that if the user switches between a list report and a summary report the data source has all the required columns (FB 268655) """ builder_form = ConfigureListReportForm(self.domain, "My Report", self.app._id, "form", self.form.unique_id, data={ 'user_filters': '[]', 'default_filters': '[]', 'columns': """[ {"property": "/data/first_name", "display_text": "first name"}, {"property": "/data/last_name", "display_text": "last name"}, {"property": "/data/children", "display_text": "children"} ]""", }) self.assertTrue(builder_form.is_valid()) with patch('corehq.apps.userreports.tasks.delete_data_source_task'): data_source_config_id = builder_form.create_temp_data_source_if_necessary( '*****@*****.**') data_source = DataSourceConfiguration.get(data_source_config_id) indicators = sorted([(ind['column_id'], ind['type']) for ind in data_source.configured_indicators]) expected_indicators = [ ('count', 'boolean'), ('data_children_25bd0e0d', 'expression'), # "children" should have 2 columns because it is ('data_children_25bd0e0d_decimal', 'expression'), # numeric ('data_dob_b6293169', 'expression'), ('data_first_name_ac8c51a7', 'expression'), ('data_last_name_ce36e9e1', 'expression'), ('data_state_6e36b993', 'choice_list'), ('data_state_6e36b993', 'expression'), ('deviceID_a7307e7d', 'expression'), ('timeEnd_09f40526', 'expression'), ('timeStart_c5a1ba73', 'expression'), ('userID_41e1d44e', 'expression'), ('username_ea02198f', 'expression'), ] self.assertEqual(indicators, expected_indicators)