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