#!/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()