import unittest from cStringIO import StringIO import xml.sax from xml.sax import handler from xml.sax import xmlreader # constants & helpers _drv_xmlproc = "xml.sax.drivers2.drv_xmlproc" _xmls_nons = "data" _xmls_blankns = "data" class _MyHandler(handler.ContentHandler): def __init__(self,testCase): self.__testCase = testCase def startElementNS(self,name,qname,atts): # XXX: is this right ? At least pyexpat and xmlproc do it this way. self.__testCase.failIf(name[0] != None) # XXX: or should it be this one ? #self.__testCase.failIf(name[0] != '') def _makeParser(driver,ns): reader = xml.sax.make_parser([driver]) reader.setFeature(handler.feature_namespaces,ns) return reader def _saxParse(testCase,driver,ns,h,xmls): reader = _makeParser(driver,ns) reader.setContentHandler(h) inps = xmlreader.InputSource() inps.setByteStream(StringIO(xmls)) reader.parse(inps) # test cases class MyTest(unittest.TestCase): def test_sax_xmlproc_nson__nons(self): _saxParse(self,_drv_xmlproc,1,_MyHandler(self),_xmls_nons) def test_sax_xmlproc_nson__blankns(self): _saxParse(self,_drv_xmlproc,1,_MyHandler(self),_xmls_blankns) class TestResolver(unittest.TestCase): document=""" ]> &bar; """ def setUp(self): f = open("tmp.xml","w") f.write("Content") f.close() def tearDown(self): import os os.remove("tmp.xml") def test_simple(self): class MyResolver(xml.sax.handler.EntityResolver): def __init__(self): self.invoked = 0 def resolveEntity(self, publicId, systemId): self.invoked = 1 return systemId reader = _makeParser(_drv_xmlproc,0) resolver = MyResolver() reader.setEntityResolver(resolver) inps = xmlreader.InputSource() inps.setByteStream(StringIO(self.document)) inps.setSystemId("tmp1.xml") reader.parse(inps) self.failUnless(resolver.invoked) def test_complex(self): # TODO: return an input source from the resolver pass if __name__ == "__main__": unittest.main()