116 lines
4.6 KiB
Python
116 lines
4.6 KiB
Python
import unittest
|
|
|
|
from sia.xml_validator import XMLValidator
|
|
|
|
class XMLValidatorTest(unittest.TestCase):
|
|
def setUp(self):
|
|
"""Set up test schema"""
|
|
self.test_schema = """<?xml version="1.0" encoding="UTF-8"?>
|
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
|
<xs:element name="test_element">
|
|
<xs:complexType>
|
|
<xs:simpleContent>
|
|
<xs:extension base="xs:string">
|
|
<xs:attribute name="id" type="xs:string" use="required"/>
|
|
<xs:attribute name="count" type="xs:integer"/>
|
|
</xs:extension>
|
|
</xs:simpleContent>
|
|
</xs:complexType>
|
|
</xs:element>
|
|
<xs:element name="simple_element">
|
|
<xs:complexType>
|
|
<xs:simpleContent>
|
|
<xs:extension base="xs:string"/>
|
|
</xs:simpleContent>
|
|
</xs:complexType>
|
|
</xs:element>
|
|
</xs:schema>"""
|
|
|
|
self.validator = XMLValidator(self.test_schema)
|
|
|
|
def test_initialization(self):
|
|
"""Test validator initialization and root element extraction"""
|
|
valid_elements = self.validator.get_valid_root_elements()
|
|
self.assertEqual(valid_elements, {'test_element', 'simple_element'})
|
|
|
|
def test_invalid_schema(self):
|
|
"""Test handling invalid schema"""
|
|
with self.assertRaises(ValueError):
|
|
XMLValidator("invalid schema")
|
|
|
|
def test_valid_xml(self):
|
|
"""Test validation of valid XML"""
|
|
xml = '<test_element id="123" count="42">test content</test_element>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNone(result)
|
|
|
|
# Test without optional attribute
|
|
xml = '<test_element id="123">test content</test_element>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNone(result)
|
|
|
|
# Test simple element
|
|
xml = '<simple_element>test content</simple_element>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNone(result)
|
|
|
|
def test_invalid_root_element(self):
|
|
"""Test validation with invalid root element"""
|
|
xml = '<invalid_element>test content</invalid_element>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNotNone(result)
|
|
self.assertIn("Invalid root element", result)
|
|
|
|
def test_missing_required_attribute(self):
|
|
"""Test validation with missing required attribute"""
|
|
xml = '<test_element>test content</test_element>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNotNone(result)
|
|
self.assertIn("Missing required attribute", result)
|
|
|
|
def test_invalid_integer_attribute(self):
|
|
"""Test validation with invalid integer attribute"""
|
|
xml = '<test_element id="123" count="not_a_number">test content</test_element>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNotNone(result)
|
|
self.assertIn("Invalid integer value", result)
|
|
|
|
def test_unexpected_attribute(self):
|
|
"""Test validation with unexpected attribute"""
|
|
xml = '<test_element id="123" invalid_attr="value">test content</test_element>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNotNone(result)
|
|
self.assertIn("Unexpected attribute", result)
|
|
|
|
def test_invalid_xml_syntax(self):
|
|
"""Test validation with invalid XML syntax"""
|
|
xml = '<test_element>unclosed tag'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNotNone(result)
|
|
self.assertIn("Invalid XML", result)
|
|
|
|
def test_whitespace_handling(self):
|
|
"""Test validation with whitespace in XML"""
|
|
xml = """
|
|
<test_element id="123">
|
|
test content
|
|
</test_element>
|
|
"""
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNone(result)
|
|
|
|
def test_empty_content(self):
|
|
"""Test validation with empty element content"""
|
|
xml = '<test_element id="123"></test_element>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNone(result)
|
|
|
|
xml = '<test_element id="123"/>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNone(result)
|
|
|
|
def test_special_characters(self):
|
|
"""Test validation with special characters"""
|
|
xml = '<test_element id="123"><![CDATA[Special & < > " \' chars]]></test_element>'
|
|
result = self.validator.validate(xml)
|
|
self.assertIsNone(result) |