def test_simple_case_management(self):
        app = Application.wrap(self.get_json('simple_app.json'))
        self.assertEqual('userreports_test', app.domain)
        data_sources = get_case_data_sources(app)
        self.assertEqual(1, len(data_sources))
        data_source = data_sources['ticket']
        self.assertEqual(app.domain, data_source.domain)
        self.assertEqual('CommCareCase', data_source.referenced_doc_type)
        self.assertEqual('ticket', data_source.table_id)
        self.assertEqual('ticket', data_source.display_name)

        # test the filter
        self.assertTrue(data_source.filter(
            {'doc_type': 'CommCareCase', 'domain': app.domain, 'type': 'ticket'}))
        self.assertFalse(data_source.filter(
            {'doc_type': 'CommCareCase', 'domain': 'wrong domain', 'type': 'ticket'}))
        self.assertFalse(data_source.filter(
            {'doc_type': 'NotCommCareCase', 'domain': app.domain, 'type': 'ticket'}))
        self.assertFalse(data_source.filter(
            {'doc_type': 'CommCareCase', 'domain': app.domain, 'type': 'not-ticket'}))

        # check the indicators
        expected_columns = set(
            ["doc_id", "modified_on", "user_id", "opened_on",
             "owner_id", "name", "category", "priority", "starred", "estimate"]
        )
        self.assertEqual(expected_columns, set(col_back.id for col_back in data_source.get_columns()))

        sample_doc = dict(
            _id='some-doc-id',
            doc_type="CommCareCase",
            modified_on="2014-11-12T15:37:49",
            user_id="23407238074",
            opened_on="2014-11-11T23:34:34",
            owner_id="0923409230948",
            name="priority ticket",
            domain=app.domain,
            type='ticket',
            category='bug',
            priority='4',
            starred='yes',
            estimate='2',
        )

        def _get_column_property(column):
            return column.id if column.id != 'doc_id' else '_id'

        default_case_property_datatypes = DEFAULT_CASE_PROPERTY_DATATYPES
        [row] = data_source.get_all_values(sample_doc)
        for result in row:
            if result.column.id != "repeat_iteration":
                self.assertEqual(sample_doc[_get_column_property(result.column)], result.value)
                if result.column.id in default_case_property_datatypes:
                    self.assertEqual(
                        result.column.datatype,
                        default_case_property_datatypes[result.column.id]
                    )
    def test_simple_case_management(self, datetime_mock):
        fake_time_now = datetime(2015, 4, 24, 12, 30, 8, 24886)
        datetime_mock.utcnow.return_value = fake_time_now

        app = Application.wrap(self.get_json('simple_app.json'))
        self.assertEqual('userreports_test', app.domain)
        data_sources = get_case_data_sources(app)
        self.assertEqual(1, len(data_sources))
        data_source = data_sources['ticket']
        self.assertEqual(app.domain, data_source.domain)
        self.assertEqual('CommCareCase', data_source.referenced_doc_type)
        self.assertEqual('ticket', data_source.table_id)
        self.assertEqual('ticket', data_source.display_name)

        # test the filter
        self.assertTrue(data_source.filter(
            {'doc_type': 'CommCareCase', 'domain': app.domain, 'type': 'ticket'}))
        self.assertFalse(data_source.filter(
            {'doc_type': 'CommCareCase', 'domain': 'wrong domain', 'type': 'ticket'}))
        self.assertFalse(data_source.filter(
            {'doc_type': 'NotCommCareCase', 'domain': app.domain, 'type': 'ticket'}))
        self.assertFalse(data_source.filter(
            {'doc_type': 'CommCareCase', 'domain': app.domain, 'type': 'not-ticket'}))

        # check the indicators
        expected_columns = set(
            ["doc_id", "modified_on", "user_id", "opened_on",
             "owner_id", "name", "category", "priority", "starred", "estimate", "inserted_at"]
        )
        self.assertEqual(expected_columns, set(col_back.id for col_back in data_source.get_columns()))

        modified_on = datetime(2014, 11, 12, 15, 37, 49)
        opened_on = datetime(2014, 11, 11, 23, 34, 34, 25)
        sample_doc = dict(
            _id='some-doc-id',
            doc_type="CommCareCase",
            modified_on=json_format_datetime(modified_on),
            user_id="23407238074",
            opened_on=json_format_datetime(opened_on),
            owner_id="0923409230948",
            name="priority ticket",
            domain=app.domain,
            type='ticket',
            category='bug',
            priority='4',
            starred='yes',
            estimate='2',
        )

        def _get_column_property(column):
            return column.id if column.id != 'doc_id' else '_id'

        default_case_property_datatypes = DEFAULT_CASE_PROPERTY_DATATYPES
        [row] = data_source.get_all_values(sample_doc)
        for result in row:
            if result.column.id == "inserted_at":
                self.assertEqual(result.column.datatype, 'datetime')
                self.assertEqual(fake_time_now, result.value)
            elif result.column.id == "modified_on":
                self.assertEqual(result.column.datatype, 'datetime')
                self.assertEqual(modified_on, result.value)
            elif result.column.id == "opened_on":
                self.assertEqual(result.column.datatype, 'datetime')
                self.assertEqual(opened_on, result.value)
            elif result.column.id not in ["repeat_iteration", "inserted_at"]:
                self.assertEqual(sample_doc[_get_column_property(result.column)], result.value)
                if result.column.id in default_case_property_datatypes:
                    self.assertEqual(
                        result.column.datatype,
                        default_case_property_datatypes[result.column.id]
                    )
    def test_simple_case_management(self, datetime_mock):
        fake_time_now = datetime(2015, 4, 24, 12, 30, 8, 24886)
        datetime_mock.utcnow.return_value = fake_time_now

        app = Application.wrap(self.get_json('simple_app.json'))
        self.assertEqual('userreports_test', app.domain)
        data_sources = get_case_data_sources(app)
        self.assertEqual(1, len(data_sources))
        data_source = data_sources['ticket']
        self.assertEqual(app.domain, data_source.domain)
        self.assertEqual('CommCareCase', data_source.referenced_doc_type)
        self.assertEqual('ticket', data_source.table_id)
        self.assertEqual('ticket', data_source.display_name)

        # test the filter
        self.assertTrue(
            data_source.filter({
                'doc_type': 'CommCareCase',
                'domain': app.domain,
                'type': 'ticket'
            }))
        self.assertFalse(
            data_source.filter({
                'doc_type': 'CommCareCase',
                'domain': 'wrong domain',
                'type': 'ticket'
            }))
        self.assertFalse(
            data_source.filter({
                'doc_type': 'NotCommCareCase',
                'domain': app.domain,
                'type': 'ticket'
            }))
        self.assertFalse(
            data_source.filter({
                'doc_type': 'CommCareCase',
                'domain': app.domain,
                'type': 'not-ticket'
            }))

        # check the indicators
        expected_columns = set([
            "doc_id", "modified_on", "user_id", "opened_on", "owner_id",
            "name", "category", "priority", "starred", "estimate",
            "inserted_at"
        ])
        self.assertEqual(
            expected_columns,
            set(col_back.id for col_back in data_source.get_columns()))

        modified_on = datetime(2014, 11, 12, 15, 37, 49)
        opened_on = datetime(2014, 11, 11, 23, 34, 34, 25)
        sample_doc = dict(
            _id='some-doc-id',
            doc_type="CommCareCase",
            modified_on=json_format_datetime(modified_on),
            user_id="23407238074",
            opened_on=json_format_datetime(opened_on),
            owner_id="0923409230948",
            name="priority ticket",
            domain=app.domain,
            type='ticket',
            category='bug',
            priority='4',
            starred='yes',
            estimate='2',
        )

        def _get_column_property(column):
            return column.id if column.id != 'doc_id' else '_id'

        default_case_property_datatypes = DEFAULT_CASE_PROPERTY_DATATYPES
        [row] = data_source.get_all_values(sample_doc)
        for result in row:
            if result.column.id == "inserted_at":
                self.assertEqual(result.column.datatype, 'datetime')
                self.assertEqual(fake_time_now, result.value)
            elif result.column.id == "modified_on":
                self.assertEqual(result.column.datatype, 'datetime')
                self.assertEqual(modified_on, result.value)
            elif result.column.id == "opened_on":
                self.assertEqual(result.column.datatype, 'datetime')
                self.assertEqual(opened_on, result.value)
            elif result.column.id not in ["repeat_iteration", "inserted_at"]:
                self.assertEqual(
                    sample_doc[_get_column_property(result.column)],
                    result.value)
                if result.column.id in default_case_property_datatypes:
                    self.assertEqual(
                        result.column.datatype,
                        default_case_property_datatypes[result.column.id])