#!/usr/bin/python """$Id$""" __author__ = "Joseph Walton " __version__ = "$Revision$" __copyright__ = "Copyright (c) 2004 Joseph Walton" import os, sys curdir = os.path.abspath(os.path.dirname(sys.argv[0])) srcdir = os.path.split(curdir)[0] if srcdir not in sys.path: sys.path.insert(0, srcdir) basedir = os.path.split(srcdir)[0] import unittest from feedvalidator import xmlEncoding from feedvalidator.logging import * ctAX='application/xml' class TestDecode(unittest.TestCase): def _assertEqualUnicode(self, a, b): self.assertNotEqual(a, None, 'Decoded strings should not equal None') self.assertEqual(type(a), unicode, 'Decoded strings should be Unicode (was ' + str(type(a)) + ')') self.assertEqual(type(b), unicode, 'Test suite error: test strings must be Unicode') self.assertEqual(a, b) def testProvidedEncoding(self): loggedEvents=[] (encoding, decoded) = xmlEncoding.decode(ctAX, 'UTF-8', '', loggedEvents) self.assertEquals('UTF-8', encoding) self._assertEqualUnicode(decoded, u'') self.assertEqual(loggedEvents, []) loggedEvents=[] (encoding, decoded) = xmlEncoding.decode(ctAX, 'UTF-8', '', loggedEvents) self.assertEquals('UTF-8', encoding) self._assertEqualUnicode(decoded, u'') self.assertEquals(loggedEvents, []) def testNoDeclarationOrBOM(self): loggedEvents=[] self.assertEquals(xmlEncoding.decode(ctAX, None, '', loggedEvents)[-1], None) self.assertEquals(len(loggedEvents), 1) self.assertEquals(loggedEvents[0].__class__, MissingEncoding, "Must warn if there's no clue as to encoding") # This document is currently detected as UTF-8, rather than None. # # def testMissingEncodingDeclaration(self): # loggedEvents=[] # self._assertEqualUnicode(xmlEncoding.decode(ctAX, None, '', loggedEvents), u'') # self.assertEquals(len(loggedEvents), 1) # self.assertEquals(loggedEvents[0].__class__, MissingEncoding, "Must warn if there's no clue as to encoding") def testJustDeclaration(self): loggedEvents=[] (encoding, decoded) = xmlEncoding.decode(ctAX, None, '', loggedEvents) self.assertEquals(encoding, 'utf-8') self._assertEqualUnicode(decoded, u'') self.assertEquals(loggedEvents, []) def testSupplyUnknownEncoding(self): loggedEvents=[] self.assertEquals(xmlEncoding.decode(ctAX, 'X-FAKE', '', loggedEvents)[-1], None) self.assertEquals(len(loggedEvents), 1) self.assertEquals(loggedEvents[0].__class__, UnknownEncoding, 'Must fail if an unknown encoding is used') def testDeclareUnknownEncoding(self): loggedEvents=[] self.assertEquals(xmlEncoding.decode(ctAX, None, '', loggedEvents)[-1], None) self.assert_(loggedEvents) self.assertEquals(loggedEvents[-1].__class__, UnknownEncoding) def testWarnMismatch(self): loggedEvents=[] self.assertEquals(xmlEncoding.decode(ctAX, 'US-ASCII', '', loggedEvents)[-1], u'') self.assert_(loggedEvents) self.assertEquals(loggedEvents[-1].__class__, EncodingMismatch) def testDecodeUTF8(self): loggedEvents=[] self.assertEquals(xmlEncoding.decode(ctAX, 'utf-8', '\xc2\xa3', loggedEvents)[-1], u'\u00a3') self.assertEquals(loggedEvents, []) def testDecodeBadUTF8(self): """Ensure bad UTF-8 is flagged as such, but still decoded.""" loggedEvents=[] self.assertEquals(xmlEncoding.decode(ctAX, 'utf-8', '\xa3', loggedEvents)[-1], u'\ufffd') self.assert_(loggedEvents) self.assertEquals(loggedEvents[-1].__class__, UnicodeError) def testRemovedBOM(self): """Make sure the initial BOM signature is not in the decoded string.""" loggedEvents=[] self.assertEquals(xmlEncoding.decode(ctAX, 'UTF-16', '\xff\xfe\x3c\x00\x78\x00\x2f\x00\x3e\x00', loggedEvents)[-1], u'') self.assertEquals(loggedEvents, []) class TestRemoveDeclaration(unittest.TestCase): def testRemoveSimple(self): self.assertEqual(xmlEncoding.removeDeclaration( ''), '') self.assertEqual(xmlEncoding.removeDeclaration( ""), "") def testNotRemoved(self): """Make sure that invalid, or missing, declarations aren't affected.""" for x in [ '', # Missing version '', # No declaration ' ' # Space before declaration ]: self.assertEqual(xmlEncoding.removeDeclaration(x), x) def buildTestSuite(): suite = unittest.TestSuite() loader = unittest.TestLoader() suite.addTest(loader.loadTestsFromTestCase(TestDecode)) suite.addTest(loader.loadTestsFromTestCase(TestRemoveDeclaration)) return suite if __name__ == "__main__": unittest.main()