Esempio n. 1
0
    def test_simple_invalid(self):
        self.assertEqual(
            validate_xpath('data node'),
            XpathValidationResponse(is_valid=False, message=
b"""Lexical error on line 1. Unrecognized text.
data node
-----^
"""))
Esempio n. 2
0
    def test_real_invalid(self):
        self.assertEqual(
            validate_xpath(
                "if(count(instance('commcaresession')/session/user/data/commcare_location_id) > 0, instance('commcaresession')/session/user/data/commcare_location_id, /data/meta/userID)"),
            XpathValidationResponse(is_valid=False, message=
b"""Lexical error on line 1. Unrecognized text.
...mmcare_location_id) > 0, instance('co
-----------------------^
"""))
Esempio n. 3
0
    def test_simple_invalid(self):
        self.assertEqual(
            validate_xpath('data node'),
            XpathValidationResponse(
                is_valid=False,
                message=b"""Lexical error on line 1. Unrecognized text.
data node
-----^
"""))
Esempio n. 4
0
    def test_real_invalid(self):
        self.assertEqual(
            validate_xpath(
                "if(count(instance('commcaresession')/session/user/data/commcare_location_id) > 0, instance('commcaresession')/session/user/data/commcare_location_id, /data/meta/userID)"
            ),
            XpathValidationResponse(
                is_valid=False,
                message=b"""Lexical error on line 1. Unrecognized text.
...mmcare_location_id) > 0, instance('co
-----------------------^
"""))
Esempio n. 5
0
    def validate_with_raise(self):
        '''
        This is the real validation logic, to be overridden/augmented by subclasses.
        '''
        errors = []
        needs_case_detail = self.module.requires_case_details()
        needs_case_type = needs_case_detail or any(
            f.is_registration_form() for f in self.module.get_forms())
        if needs_case_detail or needs_case_type:
            errors.extend(
                self.module.validator.get_case_errors(
                    needs_case_type=needs_case_type,
                    needs_case_detail=needs_case_detail))
        if self.module.case_list_form.form_id:
            try:
                form = self.module.get_app().get_form(
                    self.module.case_list_form.form_id)
            except FormNotFoundException:
                errors.append({
                    'type': 'case list form missing',
                    'module': self.get_module_info()
                })
            else:
                if not form.is_registration_form(self.module.case_type):
                    errors.append({
                        'type': 'case list form not registration',
                        'module': self.get_module_info(),
                        'form': form,
                    })
        if self.module.module_filter:
            is_valid, message = validate_xpath(self.module.module_filter)
            if not is_valid:
                errors.append({
                    'type': 'module filter has xpath error',
                    'xpath_error': message,
                    'module': self.get_module_info(),
                })

        return errors
Esempio n. 6
0
    def validate_with_raise(self):
        '''
        This is the real validation logic, to be overridden/augmented by subclasses.
        '''
        errors = []
        needs_case_detail = self.module.requires_case_details()
        needs_case_type = needs_case_detail or any(f.is_registration_form() for f in self.module.get_forms())
        if needs_case_detail or needs_case_type:
            errors.extend(self.module.validator.get_case_errors(
                needs_case_type=needs_case_type,
                needs_case_detail=needs_case_detail
            ))
        if self.module.case_list_form.form_id:
            try:
                form = self.module.get_app().get_form(self.module.case_list_form.form_id)
            except FormNotFoundException:
                errors.append({
                    'type': 'case list form missing',
                    'module': self.get_module_info()
                })
            else:
                if not form.is_registration_form(self.module.case_type):
                    errors.append({
                        'type': 'case list form not registration',
                        'module': self.get_module_info(),
                        'form': form,
                    })
        if self.module.module_filter:
            is_valid, message = validate_xpath(self.module.module_filter)
            if not is_valid:
                errors.append({
                    'type': 'module filter has xpath error',
                    'xpath_error': message,
                    'module': self.get_module_info(),
                })

        return errors
Esempio n. 7
0
 def test_good_hashtag(self):
     self.assertEqual(validate_xpath('#session'),
                      XpathValidationResponse(is_valid=True, message=None))
Esempio n. 8
0
 def test_real_valid(self):
     self.assertEqual(
         validate_xpath(
             "if(count(instance('commcaresession')/session/user/data/commcare_location_id) > 0, instance('commcaresession')/session/user/data/commcare_location_id, /data/meta/userID)"
         ), XpathValidationResponse(is_valid=True, message=None))
Esempio n. 9
0
 def test_disallowed_case_hashtag(self):
     self.assertEqual(
         validate_xpath('#case', allow_case_hashtags=False),
         XpathValidationResponse(
             is_valid=False, message=b"case is not a valid # expression\n"))
Esempio n. 10
0
 def test_disallowed_case_hashtag(self):
     self.assertEqual(
         validate_xpath('#case', allow_case_hashtags=False),
         XpathValidationResponse(is_valid=False,
                                 message=b"case is not a valid # expression\n"))
Esempio n. 11
0
 def test_case_hashtag(self):
     self.assertEqual(
         validate_xpath('#case', allow_case_hashtags=True),
         XpathValidationResponse(is_valid=True, message=None))
Esempio n. 12
0
 def test_bad_hashtag(self):
     self.assertEqual(
         validate_xpath('#hashtag'),
         XpathValidationResponse(is_valid=False,
                                 message=b"hashtag is not a valid # expression\n"))
Esempio n. 13
0
 def test_good_hashtag(self):
     self.assertEqual(
         validate_xpath('#session'),
         XpathValidationResponse(is_valid=True, message=None))
Esempio n. 14
0
 def test_real_valid(self):
     self.assertEqual(
         validate_xpath(
             "if(count(instance('commcaresession')/session/user/data/commcare_location_id) > 0, instance('commcaresession')/session/user/data/commcare_location_id, /data/meta/userID)"),
         XpathValidationResponse(is_valid=True, message=None))
Esempio n. 15
0
 def test_bad_hashtag(self):
     self.assertEqual(
         validate_xpath('#hashtag'),
         XpathValidationResponse(
             is_valid=False,
             message=b"hashtag is not a valid # expression\n"))
Esempio n. 16
0
 def test_case_hashtag(self):
     self.assertEqual(validate_xpath('#case', allow_case_hashtags=True),
                      XpathValidationResponse(is_valid=True, message=None))
Esempio n. 17
0
 def test_simple_valid(self):
     self.assertEqual(
         validate_xpath('/data/node'),
         XpathValidationResponse(is_valid=True, message=None))
Esempio n. 18
0
 def test_simple_valid(self):
     self.assertEqual(validate_xpath('/data/node'),
                      XpathValidationResponse(is_valid=True, message=None))
Esempio n. 19
0
 def test_whitespace(self):
     self.assertEqual(validate_xpath('\n1 =\t2\r + 3'),
                      XpathValidationResponse(is_valid=True, message=None))
Esempio n. 20
0
    def validate_for_build(self, validate_module):
        errors = []

        try:
            module = self.form.get_module()
        except AttributeError:
            module = None

        meta = {
            'form_type': self.form.form_type,
            'module': module.validator.get_module_info() if module else {},
            'form': {
                "id": self.form.id if hasattr(self.form, 'id') else None,
                "name": self.form.name,
                'unique_id': self.form.unique_id,
            }
        }

        xml_valid = False
        if self.form.source == '' and self.form.form_type != 'shadow_form':
            errors.append(dict(type="blank form", **meta))
        else:
            try:
                _parse_xml(self.form.source)
                xml_valid = True
            except XFormException as e:
                errors.append(dict(
                    type="invalid xml",
                    message=six.text_type(e) if self.form.source else '',
                    **meta
                ))
            except ValueError:
                logging.error("Failed: _parse_xml(string=%r)" % self.form.source)
                raise

        try:
            questions = self.form.cached_get_questions()
        except XFormException as e:
            error = {'type': 'validation error', 'validation_message': six.text_type(e)}
            error.update(meta)
            errors.append(error)

        if not errors:
            has_questions = any(not q.get('is_group') for q in questions)
            if not has_questions and self.form.form_type != 'shadow_form':
                errors.append(dict(type="blank form", **meta))
            else:
                try:
                    self.form.validate_form()
                except XFormValidationError as e:
                    error = {'type': 'validation error', 'validation_message': six.text_type(e)}
                    error.update(meta)
                    errors.append(error)
                except XFormValidationFailed:
                    pass  # ignore this here as it gets picked up in other places

        if self.form.post_form_workflow == WORKFLOW_FORM:
            if not self.form.form_links:
                errors.append(dict(type="no form links", **meta))
            for form_link in self.form.form_links:
                try:
                    self.form.get_app().get_form(form_link.form_id)
                except FormNotFoundException:
                    errors.append(dict(type='bad form link', **meta))
        elif self.form.post_form_workflow == WORKFLOW_PARENT_MODULE:
            if not module.root_module:
                errors.append(dict(type='form link to missing root', **meta))

        # this isn't great but two of FormBase's subclasses have form_filter
        if hasattr(self.form, 'form_filter') and self.form.form_filter:
            with self.form.timing_context("validate_xpath"):
                is_valid, message = validate_xpath(self.form.form_filter, allow_case_hashtags=True)
            if not is_valid:
                error = {
                    'type': 'form filter has xpath error',
                    'xpath_error': message,
                }
                error.update(meta)
                errors.append(error)

        errors.extend(self.extended_build_validation(meta, xml_valid, validate_module))

        return errors
Esempio n. 21
0
 def test_unicode(self):
     self.assertEqual(validate_xpath('"Serviços e Supervisão"'),
                      XpathValidationResponse(is_valid=True, message=None))
Esempio n. 22
0
    def validate_for_build(self, validate_module):
        errors = []

        try:
            module = self.form.get_module()
        except AttributeError:
            module = None

        meta = {
            'form_type': self.form.form_type,
            'module': module.validator.get_module_info() if module else {},
            'form': {
                "id": self.form.id if hasattr(self.form, 'id') else None,
                "name": self.form.name,
                'unique_id': self.form.unique_id,
            }
        }

        xml_valid = False
        if self.form.source == '' and self.form.form_type != 'shadow_form':
            errors.append(dict(type="blank form", **meta))
        else:
            try:
                _parse_xml(self.form.source)
                xml_valid = True
            except XFormException as e:
                errors.append(dict(
                    type="invalid xml",
                    message=str(e) if self.form.source else '',
                    **meta
                ))
            except ValueError:
                logging.error("Failed: _parse_xml(string=%r)" % self.form.source)
                raise

        try:
            questions = self.form.cached_get_questions()
        except XFormException as e:
            error = {'type': 'validation error', 'validation_message': str(e)}
            error.update(meta)
            errors.append(error)

        if not errors:
            has_questions = any(not q.get('is_group') for q in questions)
            if not has_questions and self.form.form_type != 'shadow_form':
                errors.append(dict(type="blank form", **meta))
            else:
                try:
                    self.form.validate_form()
                except XFormValidationError as e:
                    error = {'type': 'validation error', 'validation_message': str(e)}
                    error.update(meta)
                    errors.append(error)
                except XFormValidationFailed:
                    pass  # ignore this here as it gets picked up in other places

        if self.form.post_form_workflow == WORKFLOW_FORM:
            if not self.form.form_links:
                errors.append(dict(type="no form links", **meta))
            for form_link in self.form.form_links:
                try:
                    self.form.get_app().get_form(form_link.form_id)
                except FormNotFoundException:
                    errors.append(dict(type='bad form link', **meta))
        elif self.form.post_form_workflow == WORKFLOW_MODULE:
            if module.put_in_root:
                errors.append(dict(type='form link to display only forms', **meta))
        elif self.form.post_form_workflow == WORKFLOW_PARENT_MODULE:
            if not module.root_module:
                errors.append(dict(type='form link to missing root', **meta))
            if module.root_module.put_in_root:
                errors.append(dict(type='form link to display only forms', **meta))

        # this isn't great but two of FormBase's subclasses have form_filter
        if hasattr(self.form, 'form_filter') and self.form.form_filter:
            with self.form.timing_context("validate_xpath"):
                is_valid, message = validate_xpath(self.form.form_filter, allow_case_hashtags=True)
            if not is_valid:
                error = {
                    'type': 'form filter has xpath error',
                    'xpath_error': message,
                }
                error.update(meta)
                errors.append(error)

        errors.extend(self.extended_build_validation(meta, xml_valid, validate_module))

        return errors
Esempio n. 23
0
    def validate_with_raise(self):
        '''
        This is the real validation logic, to be overridden/augmented by subclasses.
        '''
        errors = []
        app = self.module.get_app()
        needs_case_detail = self.module.requires_case_details()
        needs_case_type = needs_case_detail or any(
            f.is_registration_form() for f in self.module.get_forms())
        if needs_case_detail or needs_case_type:
            errors.extend(
                self.module.validator.get_case_errors(
                    needs_case_type=needs_case_type,
                    needs_case_detail=needs_case_detail))
        if self.module.case_list_form.form_id:
            try:
                form = app.get_form(self.module.case_list_form.form_id)
            except FormNotFoundException:
                errors.append({
                    'type': 'case list form missing',
                    'module': self.get_module_info()
                })
            else:
                if toggles.FOLLOWUP_FORMS_AS_CASE_LIST_FORM.enabled(
                        app.domain):
                    from corehq.apps.app_manager.views.modules import get_parent_select_followup_forms
                    valid_forms = [
                        f.unique_id for f in get_parent_select_followup_forms(
                            app, self.module)
                    ]
                    if form.unique_id not in valid_forms and not form.is_registration_form(
                            self.module.case_type):
                        errors.append({
                            'type': 'invalid case list followup form',
                            'module': self.get_module_info(),
                            'form': form,
                        })
                elif not form.is_registration_form(self.module.case_type):
                    errors.append({
                        'type': 'case list form not registration',
                        'module': self.get_module_info(),
                        'form': form,
                    })
        if self.module.module_filter:
            is_valid, message = validate_xpath(self.module.module_filter)
            if not is_valid:
                errors.append({
                    'type': 'module filter has xpath error',
                    'xpath_error': message,
                    'module': self.get_module_info(),
                })

        if self.module.put_in_root and self.module.session_endpoint_id:
            errors.append({
                'type': 'endpoint to display only forms',
                'module': self.get_module_info(),
            })

        if hasattr(self.module,
                   'parent_select') and self.module.parent_select.active:
            if self.module.parent_select.relationship == 'parent':
                from corehq.apps.app_manager.views.modules import get_modules_with_parent_case_type
                valid_modules = get_modules_with_parent_case_type(
                    app, self.module)
            else:
                from corehq.apps.app_manager.views.modules import get_all_case_modules
                valid_modules = get_all_case_modules(app, self.module)
            valid_module_ids = [info['unique_id'] for info in valid_modules]
            if self.module.parent_select.module_id not in valid_module_ids:
                errors.append({
                    'type': 'invalid parent select id',
                    'module': self.get_module_info(),
                })

        if module_uses_smart_links(self.module):
            if not self.module.session_endpoint_id:
                errors.append({
                    'type': 'smart links missing endpoint',
                    'module': self.get_module_info(),
                })
            if self.module.parent_select.active:
                errors.append({
                    'type': 'smart links select parent first',
                    'module': self.get_module_info(),
                })
            if self.module.is_multi_select():
                errors.append({
                    'type': 'smart links multi select',
                    'module': self.get_module_info(),
                })

        if module_loads_registry_case(self.module):
            if self.module.is_multi_select():
                errors.append({
                    'type': 'data registry multi select',
                    'module': self.get_module_info(),
                })

        return errors