コード例 #1
0
ファイル: test_pillow.py プロジェクト: dimagi/commcare-hq
    def test_invalid_data_bulk_processor(self, process_change):
        self.config.validations = [
            Validation.wrap({
                "name": "impossible_condition",
                "error_message": "This condition is impossible to satisfy",
                "expression": {
                    "type": "boolean_expression",
                    "expression": {
                        "type": "property_name",
                        "property_name": "doesnt_exist"
                    },
                    "operator": "in",
                    "property_value": ["nonsense"]
                }
            })
        ]
        self.config.save()

        cases = self._create_and_process_changes()
        num_rows = self.adapter.get_query_object().count()
        self.assertEqual(num_rows, 0)
        invalid_data = InvalidUCRData.objects.all().values_list('doc_id', flat=True)
        self.assertEqual(set([case.case_id for case in cases]), set(invalid_data))
        # processor.process_change should not get called but processor.process_changes_chunk
        self.assertFalse(process_change.called)
コード例 #2
0
    def test_multiple_validations(self):
        self.config.validations = self.config.validations + [
            Validation.wrap({
                "name": "a_second_validation",
                "error_message": "another starred validation",
                "expression": {
                    "type": "boolean_expression",
                    "expression": {
                        "type": "property_name",
                        "property_name": "is_starred"
                    },
                    "operator": "in",
                    "property_value": ["yes", "no"]
                }
            })
        ]
        sample_doc, expected_indicators = get_sample_doc_and_indicators()

        self.assertIsNone(self.config.validate_document(sample_doc))

        sample_doc['is_starred'] = 'what is a star?'

        try:
            self.config.validate_document(sample_doc)
        except ValidationError as e:
            self.assertEqual(len(e.errors), 2)
        else:
            self.fail("There were no validation errors returned")
コード例 #3
0
    def test_invalid_data_serial_processor(self, process_changes_chunk):
        process_changes_chunk.side_effect = Exception
        self.config.validations = [
            Validation.wrap({
                "name": "impossible_condition",
                "error_message": "This condition is impossible to satisfy",
                "expression": {
                    "type": "boolean_expression",
                    "expression": {
                        "type": "property_name",
                        "property_name": "doesnt_exist"
                    },
                    "operator": "in",
                    "property_value": ["nonsense"]
                }
            })
        ]
        self.config.save()

        cases = self._create_and_process_changes()
        num_rows = self.adapter.get_query_object().count()
        self.assertEqual(num_rows, 0)
        invalid_data = InvalidUCRData.objects.all().values_list('doc_id',
                                                                flat=True)
        self.assertEqual(set([case.case_id for case in cases]),
                         set(invalid_data))
コード例 #4
0
    def test_invalid_data_bulk_processor(self, process_change):
        # re-fetch from DB to bust object caches
        self.config = DataSourceConfiguration.get(self.config.data_source_id)

        self.config.validations = [
            Validation.wrap({
                "name": "impossible_condition",
                "error_message": "This condition is impossible to satisfy",
                "expression": {
                    "type": "boolean_expression",
                    "expression": {
                        "type": "property_name",
                        "property_name": "doesnt_exist"
                    },
                    "operator": "in",
                    "property_value": ["nonsense"]
                }
            })
        ]
        self.config.save()

        cases = self._create_and_process_changes()
        num_rows = self.adapter.get_query_object().count()
        self.assertEqual(num_rows, 0)
        invalid_data = InvalidUCRData.objects.all().values_list('doc_id',
                                                                flat=True)
        self.assertEqual(set([case.case_id for case in cases]),
                         set(invalid_data))
        # processor.process_change should not get called but processor.process_changes_chunk
        self.assertFalse(process_change.called)
コード例 #5
0
    def test_multiple_validations(self):
        self.config.validations = self.config.validations + [
            Validation.wrap({
                "name": "a_second_validation",
                "error_message": "another starred validation",
                "expression": {
                    "type": "boolean_expression",
                    "expression": {
                        "type": "property_name",
                        "property_name": "is_starred"
                    },
                    "operator": "in",
                    "property_value": ["yes", "no"]
                }
            })
        ]
        sample_doc, expected_indicators = get_sample_doc_and_indicators()

        self.assertIsNone(self.config.validate_document(sample_doc))

        sample_doc['is_starred'] = 'what is a star?'

        try:
            self.config.validate_document(sample_doc)
        except ValidationError as e:
            self.assertEquals(len(e.errors), 2)
        else:
            self.fail("There were no validation errors returned")
コード例 #6
0
    def test_async_invalid_data(self):
        # re-fetch from DB to bust object caches
        self.config = DataSourceConfiguration.get(self.config.data_source_id)

        self.config.validations = [
            Validation.wrap({
                "name": "impossible_condition",
                "error_message": "This condition is impossible to satisfy",
                "expression": {
                    "type": "boolean_expression",
                    "expression": {
                        "type": "property_name",
                        "property_name": "doesnt_exist"
                    },
                    "operator": "in",
                    "property_value": ["nonsense"]
                }
            })
        ]

        self.config.save()
        parent_id, child_id = uuid.uuid4().hex, uuid.uuid4().hex
        since = self.pillow.get_change_feed().get_latest_offsets()
        for i in range(3):
            form, cases = post_case_blocks([
                CaseBlock.deprecated_init(
                    create=i == 0,
                    case_id=parent_id,
                    case_name='parent-name',
                    case_type='bug',
                    update={
                        'update-prop-parent': i
                    },
                ).as_xml(),
                CaseBlock.deprecated_init(create=i == 0,
                                          case_id=child_id,
                                          case_name='child-name',
                                          case_type='bug-child',
                                          index={
                                              'parent': ('bug', parent_id)
                                          },
                                          update={
                                              'update-prop-child': i
                                          }).as_xml()
            ],
                                           domain=self.domain)
        self.pillow.process_changes(since=since, forever=False)

        # run async queue
        queue_async_indicators()
        self.assertEqual(InvalidUCRData.objects.count(), 1)
コード例 #7
0
 def setUp(self):
     self.config = get_sample_data_source()
     self.config.validations = [
         Validation.wrap({
             "name": "is_starred_valid",
             "error_message": "is_starred has unexpected value",
             "expression": {
                 "type": "boolean_expression",
                 "expression": {
                     "type": "property_name",
                     "property_name": "is_starred"
                 },
                 "operator": "in",
                 "property_value": ["yes", "no"]
             }
         })
     ]
コード例 #8
0
 def setUp(self):
     self.config = get_sample_data_source()
     self.config.validations = [
         Validation.wrap({
             "name": "is_starred_valid",
             "error_message": "is_starred has unexpected value",
             "expression": {
                 "type": "boolean_expression",
                 "expression": {
                     "type": "property_name",
                     "property_name": "is_starred"
                 },
                 "operator": "in",
                 "property_value": ["yes", "no"]
             }
         })
     ]
コード例 #9
0
ファイル: test_pillow.py プロジェクト: dimagi/commcare-hq
    def test_async_invalid_data(self):
        self.config.validations = [
            Validation.wrap({
                "name": "impossible_condition",
                "error_message": "This condition is impossible to satisfy",
                "expression": {
                    "type": "boolean_expression",
                    "expression": {
                        "type": "property_name",
                        "property_name": "doesnt_exist"
                    },
                    "operator": "in",
                    "property_value": ["nonsense"]
                }
            })
        ]

        self.config.save()
        parent_id, child_id = uuid.uuid4().hex, uuid.uuid4().hex
        since = self.pillow.get_change_feed().get_latest_offsets()
        for i in range(3):
            form, cases = post_case_blocks(
                [
                    CaseBlock(
                        create=i == 0,
                        case_id=parent_id,
                        case_name='parent-name',
                        case_type='bug',
                        update={'update-prop-parent': i},
                    ).as_xml(),
                    CaseBlock(
                        create=i == 0,
                        case_id=child_id,
                        case_name='child-name',
                        case_type='bug-child',
                        index={'parent': ('bug', parent_id)},
                        update={'update-prop-child': i}
                    ).as_xml()
                ], domain=self.domain
            )
        self.pillow.process_changes(since=since, forever=False)

        # run async queue
        queue_async_indicators()
        self.assertEqual(InvalidUCRData.objects.count(), 1)