Exemplo n.º 1
0
    def test_rule_allowed_patterns(self):
        """Parse an xml element with a text value not compliant to the provided regexpattern, and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_rule_allowed_patterns.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 0
Exemplo n.º 2
0
    def test_rule_optional_subelements(self):
        """Parse an xml element with an invalid subelement and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_rule_optional_subelements.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 1
        if len(validation_result) > 0:
            assert validation_result[0]["message_id"] == "0005"
Exemplo n.º 3
0
    def test_rule_obligatory_attributes(self):
        """Parse an xml element with a missing obligatory attribute and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_rule_obligatory_attributes.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 1
        if len(validation_result) > 0:
            assert validation_result[0]["message_id"] == "0004"
Exemplo n.º 4
0
    def test_root_element_namespace_evaluation(self):
        """Parse an xml document, evaluate the root element and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_root_element_namespace_evaluation.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 1
        if len(validation_result) == 1:
            assert validation_result[0]["message_id"] == "s0002"
Exemplo n.º 5
0
    def test_non_wellformed_input_file(self):
        """Parse a non-wellformed XML document and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_non_wellformed_input_file.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 1
        if len(validation_result) == 1:
            assert validation_result[0]["message_id"] == "e0001"
Exemplo n.º 6
0
    def test_attribute_definition_allowed_values(self):
        """Parse an xml element with a non-allowed attribute value, and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_attribute_definition_allowed_values.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 1
        if len(validation_result) > 0:
            assert validation_result[0]["message_id"] == "0012"
Exemplo n.º 7
0
    def test_rule_allowed_values(self):
        """Parse an xml element which has an invalid text value and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_rule_allowed_values.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 1
        if len(validation_result) > 0:
            assert validation_result[0]["message_id"] == "0010"
Exemplo n.º 8
0
    def test_ruleset_condition_reference_elements(self):
        """Parse an xml element where the conditions for the defined reference element are not met and check if the validation rule is rightly skipped.

        These tests starting with "test_ruleset_condition" are meant to assert whether the conditions set for applying a ruleset are correctly evaluated.
        """

        validation_result = validify.validate(
            "validify/tests/test_rule_condition_reference_elements.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 0
Exemplo n.º 9
0
    def test_ruleset_condition_attribute_values(self):
        """Parse an xml element with an invalid attribute value and check if the validation rule is skipped correctly.

        These tests starting with "test_ruleset_condition" are meant to assert whether the conditions set for applying a ruleset are correctly evaluated.
        """

        validation_result = validify.validate(
            "validify/tests/test_rule_condition_attribute_values.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 0
Exemplo n.º 10
0
    def test_non_valid_elementtree_input(self):
        """Pass a non-valid value (string) as ElementTree input parameter. Ensure that the resulting exception is handled."""

        validation_result = validify.validate(
            input_elementtree="1234",
            validation_rules=compile_test_rules(),
            log_to_console=False)

        assert len(validation_result) == 1
        if len(validation_result) == 1:
            assert validation_result[0]["message_id"] == "e0002"
Exemplo n.º 11
0
    def test_attribute_definition_allowed_patterns(self):
        """Parse an xml element with an attribute value not compliant to the provided regexpattern, and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_attribute_definition_allowed_patterns.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 2
        if len(validation_result) == 2:
            assert validation_result[0]["message_id"] == "0012"
            assert validation_result[1]["message_id"] == "0013"
Exemplo n.º 12
0
    def test_rule_character_content_allowed(self):
        """Parse an xml element which has character content (while not allowed in the rule definition) and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_rule_character_content_allowed.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 2
        if len(validation_result) == 2:
            assert validation_result[0]["message_id"] == "0008"
            assert validation_result[1]["message_id"] == "0009"
Exemplo n.º 13
0
    def test_rule_max_occurence(self):
        """Parse an xml element which occurs more often than allowed, and ensure that the correct validation message is applied."""

        validation_result = validify.validate(
            "validify/tests/test_rule_max_occurence.xml",
            validation_rules=compile_test_rules(),
            log_to_console=False)
        assert len(validation_result) == 3
        if len(validation_result) == 3:
            assert validation_result[0]["message_id"] == "0007"
            assert validation_result[1]["message_id"] == "0007"
            assert validation_result[2]["message_id"] == "0007"
Exemplo n.º 14
0
    def test_elementtree_input(self):
        """Parse an ElementTree object, and ensure that rules are correctly applied to the document elements.

        See ./test_valid_elementtree_input.xml for an XML representation of the ElementTree example object.
        """

        xml_root_element = etree.Element("test_example")
        xml_test_element = etree.SubElement(xml_root_element, "value_test")
        xml_test_element.text = "invalid value"
        xml_tree = etree.ElementTree(xml_root_element)

        validation_result = validify.validate(
            input_elementtree=xml_tree,
            validation_rules=compile_test_rules(),
            log_to_console=False)

        assert len(validation_result) == 1
        if len(validation_result) == 1:
            assert validation_result[0]["message_id"] == "0010"
Exemplo n.º 15
0
def validate(input_file=None, input_elementtree=None, xmlns_def=None, validation_rules=None, message_lang=None, log_to_console=True, log_debug=False):
    """Validate a given xml file according to the supplied validation rules and return validation messages as a dictionary.

    All elements in the xml file will be processed.
    Since version 0.0.11, an etree.ElementTree object (parameter 'input_elementtree') can also be passed, instead of an input file string.
    For a documentation of parameters, see https://github.com/olivergoetze/validify.
    """

    if xmlns_def is None:
        xmlns_def = {}
    if validation_rules is None:
        validation_rules = compile_test_rules()
        log_message("No validation rules defined; using example rules for validation.", "warn", log_to_console)
    message_lang_options = ["de", "en"]
    if message_lang is None:
        message_lang = "de"
        log_message("No message language option delivered; using standard value 'de'.", "info", log_to_console)
    elif message_lang not in message_lang_options:
        message_lang = "de"
        log_message("Non-valid message language option delivered; using standard value 'de'.", "warn", log_to_console)

    validation_messages = []
    validation_results = []

    if input_file is not None or input_elementtree is not None:
        try:
            if input_file is not None:
                xml_in = etree.parse(input_file)
            else:
                xml_in = input_elementtree
            xml_root_element = xml_in.getroot()
            assess_root_element(xml_root_element, validation_rules, validation_messages, validation_results, message_lang)

            xml_elements = xml_in.findall("//{*}*")
            xml_elements = [xml_root_element] + xml_elements
            for xml_element in xml_elements:
                xml_element_sourceline = xml_element.sourceline  # get original source line before applying normalize-space
                normalize_space.parse_xml_content(xml_element)  # apply normalize-space so only actual character content is found
                validation_results = assess_element_structure(xml_element, xml_element_sourceline, xmlns_def, validation_rules, validation_messages, validation_results, message_lang, log_to_console, log_debug)
        except etree.XMLSyntaxError as e:
            message_id = "e0001"
            message_text = messages.get_message_by_id(message_id, message_lang).format(input_file, e)
            validation_messages.append(message_text)
            validation_results.append({"message_id": message_id, "message_text": message_text, "element_name": "",
                                       "element_local_name": "", "element_sourceline": "",
                                       "element_path": ""})
        except AttributeError as e:
            message_id = "e0002"
            message_text = messages.get_message_by_id(message_id, message_lang).format(e)
            validation_messages.append(message_text)
            validation_results.append({"message_id": message_id, "message_text": message_text, "element_name": "",
                                       "element_local_name": "", "element_sourceline": "",
                                       "element_path": ""})


    # Aggregate and output validation messages
    if len(validation_messages) > 0:
        if input_file is not None:  # log only when the input is a file and not an ElementTree.
            log_message("Validation results for file '{}':".format(input_file), "info", log_to_console)
        aggregated_validation_messages = collections.Counter(validation_messages)
        for validation_message in aggregated_validation_messages:
            log_message("{} ({} occurences)".format(validation_message, aggregated_validation_messages[validation_message]), "info", log_to_console)

    return validation_results