Package lxml :: Package tests :: Module test_xmlschema
[frames] | no frames]

Source Code for Module lxml.tests.test_xmlschema

  1  # -*- coding: utf-8 -*- 
  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   
11 -class ETreeXMLSchemaTestCase(HelperTestCase):
12 - def test_xmlschema(self):
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
29 - def test_xmlschema_parse(self):
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
49 - def test_xmlschema_stringio(self):
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
69 - def test_xmlschema_iterparse(self):
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
105 self.assertRaises(ValueError, etree.XMLSchema, etree.ElementTree())
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
122 schema = self.parse('<test/>') 123 self.assertRaises(etree.XMLSchemaParseError, 124 etree.XMLSchema, schema)
125
126 - def test_xmlschema_file(self):
127 # this will only work if we access the file through path or 128 # file object.. 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
134 - def test_xmlschema_shortcut(self):
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
151 -def test_suite():
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