1
2
3 """
4 Test cases related to XML Schema parsing and validation
5 """
6
7 import unittest, sys, os.path
8
9 this_dir = os.path.dirname(__file__)
10 if this_dir not in sys.path:
11 sys.path.insert(0, this_dir)
12
13 from common_imports import etree, BytesIO, HelperTestCase, fileInTestDir
14 from common_imports import doctest, make_doctest
15
18 tree_valid = self.parse('<a><b></b></a>')
19 tree_invalid = self.parse('<a><c></c></a>')
20 schema = self.parse('''
21 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
22 <xsd:element name="a" type="AType"/>
23 <xsd:complexType name="AType">
24 <xsd:sequence>
25 <xsd:element name="b" type="xsd:string" />
26 </xsd:sequence>
27 </xsd:complexType>
28 </xsd:schema>
29 ''')
30 schema = etree.XMLSchema(schema)
31 self.assert_(schema.validate(tree_valid))
32 self.assert_(not schema.validate(tree_invalid))
33
35 schema = self.parse('''
36 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
37 <xsd:element name="a" type="AType"/>
38 <xsd:complexType name="AType">
39 <xsd:sequence>
40 <xsd:element name="b" type="xsd:string" />
41 </xsd:sequence>
42 </xsd:complexType>
43 </xsd:schema>
44 ''')
45 schema = etree.XMLSchema(schema)
46 parser = etree.XMLParser(schema=schema)
47
48 tree_valid = self.parse('<a><b></b></a>', parser=parser)
49 self.assertEquals('a', tree_valid.getroot().tag)
50
51 self.assertRaises(etree.XMLSyntaxError,
52 self.parse, '<a><c></c></a>', parser=parser)
53
55 schema_file = BytesIO('''
56 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
57 <xsd:element name="a" type="AType"/>
58 <xsd:complexType name="AType">
59 <xsd:sequence>
60 <xsd:element name="b" type="xsd:string" />
61 </xsd:sequence>
62 </xsd:complexType>
63 </xsd:schema>
64 ''')
65 schema = etree.XMLSchema(file=schema_file)
66 parser = etree.XMLParser(schema=schema)
67
68 tree_valid = self.parse('<a><b></b></a>', parser=parser)
69 self.assertEquals('a', tree_valid.getroot().tag)
70
71 self.assertRaises(etree.XMLSyntaxError,
72 self.parse, '<a><c></c></a>', parser=parser)
73
75 schema = self.parse('''
76 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
77 <xsd:element name="a" type="AType"/>
78 <xsd:complexType name="AType">
79 <xsd:sequence>
80 <xsd:element name="b" type="xsd:string" />
81 </xsd:sequence>
82 </xsd:complexType>
83 </xsd:schema>
84 ''')
85 schema = etree.XMLSchema(schema)
86 xml = BytesIO('<a><b></b></a>')
87 events = [ (event, el.tag)
88 for (event, el) in etree.iterparse(xml, schema=schema) ]
89
90 self.assertEquals([('end', 'b'), ('end', 'a')],
91 events)
92
94 schema = self.parse('''
95 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
96 <xsd:element name="a" type="AType"/>
97 <xsd:complexType name="AType">
98 <xsd:sequence>
99 <xsd:element name="b" type="xsd:string" />
100 </xsd:sequence>
101 </xsd:complexType>
102 </xsd:schema>
103 ''')
104 schema = etree.XMLSchema(schema)
105 self.assertRaises(
106 etree.XMLSyntaxError,
107 list, etree.iterparse(BytesIO('<a><c></c></a>'), schema=schema))
108
111
113 schema = self.parse('''\
114 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
115 <element name="a" type="AType"/>
116 <xsd:complexType name="AType">
117 <xsd:sequence>
118 <xsd:element name="b" type="xsd:string" />
119 </xsd:sequence>
120 </xsd:complexType>
121 </xsd:schema>
122 ''')
123 self.assertRaises(etree.XMLSchemaParseError,
124 etree.XMLSchema, schema)
125
130
138
140 tree_valid = self.parse('<a><b></b></a>')
141 tree_invalid = self.parse('<a><c></c></a>')
142 schema = self.parse('''\
143 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
144 <xsd:element name="a" type="AType"/>
145 <xsd:complexType name="AType">
146 <xsd:sequence>
147 <xsd:element name="b" type="xsd:string" />
148 </xsd:sequence>
149 </xsd:complexType>
150 </xsd:schema>
151 ''')
152 self.assert_(tree_valid.xmlschema(schema))
153 self.assert_(not tree_invalid.xmlschema(schema))
154
155
157 suite = unittest.TestSuite()
158 suite.addTests([unittest.makeSuite(ETreeXMLSchemaTestCase)])
159 suite.addTests(
160 [make_doctest('../../../doc/validation.txt')])
161 return suite
162
163 if __name__ == '__main__':
164 print('to test use test.py %s' % __file__)
165