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_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)
Example #3
0
    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_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)
Example #5
0
 def testDataSource(self):
     """
     Confirm that data sources for reports with multiselects use "choice_list" indicators for mselect questions.
     """
     builder_form = ConfigureListReportForm(
         "My Report",
         self.app._id,
         "form",
         self.form.unique_id,
         data={
             'user_filters': '[]',
             'default_filters': '[]',
             'columns': '[{"property": "/data/first_name", "display_text": "first name"}]',
         }
     )
     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 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_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)
Example #8
0
    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)
Example #9
0
    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(
            "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"}]',
            }
        )
        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(
            "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"}]',
            }
        )
        self.assertTrue(builder_form.is_valid())
        report = builder_form.update_report()

        self.assertNotEqual(report.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)
Example #11
0
    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(
            "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"}]',
            }
        )
        self.assertTrue(builder_form.is_valid())
        report_one = builder_form.create_report()

        # Make another report
        builder_form = ConfigureListReportForm(
            "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"}]',
            }
        )
        self.assertTrue(builder_form.is_valid())
        report_two = builder_form.create_report()

        self.assertNotEqual(report_one.config_id, report_two.config_id)