"""Tests of PageTemplateFile.""" import os, os.path import tempfile import unittest import Zope2 import transaction from Testing.makerequest import makerequest from Products.PageTemplates.PageTemplateFile import PageTemplateFile class TypeSniffingTestCase(unittest.TestCase): TEMPFILENAME = tempfile.mktemp(".zpt") def setUp(self): from zope.component import provideUtility from Products.PageTemplates.interfaces import IUnicodeEncodingConflictResolver from Products.PageTemplates.unicodeconflictresolver import DefaultUnicodeEncodingConflictResolver provideUtility(DefaultUnicodeEncodingConflictResolver, IUnicodeEncodingConflictResolver) def tearDown(self): if os.path.exists(self.TEMPFILENAME): os.unlink(self.TEMPFILENAME) def check_content_type(self, text, expected_type): f = open(self.TEMPFILENAME, "wb") f.write(text) f.close() pt = PageTemplateFile(self.TEMPFILENAME) pt.read() self.assertEqual(pt.content_type, expected_type) def test_sniffer_xml_ascii(self): self.check_content_type( "", "text/xml") self.check_content_type( "", "text/xml") def test_sniffer_xml_utf8(self): # w/out byte order mark self.check_content_type( "", "text/xml") self.check_content_type( "", "text/xml") # with byte order mark self.check_content_type( "\xef\xbb\xbf", "text/xml") self.check_content_type( "\xef\xbb\xbf", "text/xml") def test_sniffer_xml_utf16_be(self): # w/out byte order mark self.check_content_type( "\0<\0?\0x\0m\0l\0 \0v\0e\0r\0s\0i\0o\0n\0=\0'\01\0.\0000\0'" "\0 \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\08\0'\0?\0>" "\0<\0d\0o\0c\0/\0>", "text/xml") self.check_content_type( "\0<\0?\0x\0m\0l\0\t\0v\0e\0r\0s\0i\0o\0n\0=\0'\01\0.\0000\0'" "\0 \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\08\0'\0?\0>" "\0<\0d\0o\0c\0/\0>", "text/xml") # with byte order mark self.check_content_type( "\xfe\xff" "\0<\0?\0x\0m\0l\0 \0v\0e\0r\0s\0i\0o\0n\0=\0'\01\0.\0000\0'" "\0 \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\08\0'\0?\0>" "\0<\0d\0o\0c\0/\0>", "text/xml") self.check_content_type( "\xfe\xff" "\0<\0?\0x\0m\0l\0\t\0v\0e\0r\0s\0i\0o\0n\0=\0'\01\0.\0000\0'" "\0 \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\08\0'\0?\0>" "\0<\0d\0o\0c\0/\0>", "text/xml") def test_sniffer_xml_utf16_le(self): # w/out byte order mark self.check_content_type( "<\0?\0x\0m\0l\0 \0v\0e\0r\0s\0i\0o\0n\0=\0'\01\0.\0000\0'\0" " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\08\0'\0?\0>\0" "<\0d\0o\0c\0/\0>\n", "text/xml") self.check_content_type( "<\0?\0x\0m\0l\0\t\0v\0e\0r\0s\0i\0o\0n\0=\0'\01\0.\0000\0'\0" " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\08\0'\0?\0>\0" "<\0d\0o\0c\0/\0>\0", "text/xml") # with byte order mark self.check_content_type( "\xff\xfe" "<\0?\0x\0m\0l\0 \0v\0e\0r\0s\0i\0o\0n\0=\0'\01\0.\0000\0'\0" " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\08\0'\0?\0>\0" "<\0d\0o\0c\0/\0>\0", "text/xml") self.check_content_type( "\xff\xfe" "<\0?\0x\0m\0l\0\t\0v\0e\0r\0s\0i\0o\0n\0=\0'\01\0.\0000\0'\0" " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\08\0'\0?\0>\0" "<\0d\0o\0c\0/\0>\0", "text/xml") HTML_PUBLIC_ID = "-//W3C//DTD HTML 4.01 Transitional//EN" HTML_SYSTEM_ID = "http://www.w3.org/TR/html4/loose.dtd" def test_sniffer_html_ascii(self): self.check_content_type( "" % self.HTML_SYSTEM_ID, "text/html") self.check_content_type( "sample document", "text/html") # XXX This reflects a case that simply isn't handled by the # sniffer; there are many, but it gets it right more often than # before. def donttest_sniffer_xml_simple(self): self.check_content_type("", "text/xml") def test_getId(self): desired_id = os.path.splitext(os.path.split(self.TEMPFILENAME)[-1])[0] f = open(self.TEMPFILENAME, 'w') print >> f, 'Boring' f.close() pt = PageTemplateFile(self.TEMPFILENAME) pt_id = pt.getId() self.failUnlessEqual( pt_id, desired_id, 'getId() returned %r. Expecting %r' % (pt_id, desired_id) ) def test_getPhysicalPath(self): desired_id = os.path.splitext(os.path.split(self.TEMPFILENAME)[-1])[0] desired_path = (desired_id,) f = open(self.TEMPFILENAME, 'w') print >> f, 'Boring' f.close() pt = PageTemplateFile(self.TEMPFILENAME) pt_path = pt.getPhysicalPath() self.failUnlessEqual( pt_path, desired_path, 'getPhysicalPath() returned %r. Expecting %r' % ( desired_path, pt_path, ) ) class LineEndingsTestCase(unittest.TestCase): TEMPFILENAME = tempfile.mktemp(".zpt") TAL = ('''''') OUTPUT = 'foo bar spam eggs\n' def setUp(self): transaction.begin() self.root = makerequest(Zope2.app()) def tearDown(self): if os.path.exists(self.TEMPFILENAME): os.unlink(self.TEMPFILENAME) transaction.abort() self.root._p_jar.close() def runPTWithLineEndings(self, lineendings='\n'): text = lineendings.join(self.TAL) f = open(self.TEMPFILENAME, "wb") f.write(text) f.close() pt = PageTemplateFile(self.TEMPFILENAME).__of__(self.root) return pt() def test_unix(self): self.assertEqual(self.runPTWithLineEndings(), self.OUTPUT) def test_dos(self): self.assertEqual(self.runPTWithLineEndings('\r\n'), self.OUTPUT) def test_mac(self): self.assertEqual(self.runPTWithLineEndings('\r'), self.OUTPUT) def test_suite(): return unittest.TestSuite(( unittest.makeSuite(TypeSniffingTestCase), unittest.makeSuite(LineEndingsTestCase), )) if __name__ == "__main__": unittest.main(defaultTest="test_suite")