cmlenz@336: # -*- coding: utf-8 -*-
cmlenz@336: #
cmlenz@408: # Copyright (C) 2006-2007 Edgewall Software
cmlenz@336: # All rights reserved.
cmlenz@336: #
cmlenz@336: # This software is licensed as described in the file COPYING, which
cmlenz@336: # you should have received as part of this distribution. The terms
cmlenz@336: # are also available at http://genshi.edgewall.org/wiki/License.
cmlenz@336: #
cmlenz@336: # This software consists of voluntary contributions made by many
cmlenz@336: # individuals. For the exact contribution history, see the revision
cmlenz@336: # history and logs, available at http://genshi.edgewall.org/log/.
cmlenz@336:
cmlenz@336: import doctest
cmlenz@363: import os
cmlenz@363: import shutil
cmlenz@374: from StringIO import StringIO
cmlenz@336: import sys
cmlenz@363: import tempfile
cmlenz@336: import unittest
cmlenz@336:
cmlenz@336: from genshi.core import Markup
cmlenz@374: from genshi.input import XML
cmlenz@400: from genshi.template.base import BadDirectiveError, TemplateSyntaxError
cmlenz@590: from genshi.template.loader import TemplateLoader, TemplateNotFound
cmlenz@336: from genshi.template.markup import MarkupTemplate
cmlenz@336:
cmlenz@336:
cmlenz@336: class MarkupTemplateTestCase(unittest.TestCase):
cmlenz@336: """Tests for markup template processing."""
cmlenz@336:
cmlenz@374: def test_parse_fileobj(self):
cmlenz@374: fileobj = StringIO(' ${var} $var')
cmlenz@374: tmpl = MarkupTemplate(fileobj)
cmlenz@374: self.assertEqual(' 42 42', str(tmpl.generate(var=42)))
cmlenz@374:
cmlenz@374: def test_parse_stream(self):
cmlenz@374: stream = XML(' ${var} $var')
cmlenz@374: tmpl = MarkupTemplate(stream)
cmlenz@374: self.assertEqual(' 42 42', str(tmpl.generate(var=42)))
cmlenz@374:
cmlenz@336: def test_interpolate_mixed3(self):
cmlenz@336: tmpl = MarkupTemplate(' ${var} $var')
cmlenz@336: self.assertEqual(' 42 42', str(tmpl.generate(var=42)))
cmlenz@336:
cmlenz@336: def test_interpolate_leading_trailing_space(self):
cmlenz@336: tmpl = MarkupTemplate('${ foo }')
cmlenz@336: self.assertEqual('bar', str(tmpl.generate(foo='bar')))
cmlenz@336:
cmlenz@336: def test_interpolate_multiline(self):
cmlenz@336: tmpl = MarkupTemplate("""${dict(
cmlenz@336: bar = 'baz'
cmlenz@336: )[foo]}""")
cmlenz@336: self.assertEqual('baz', str(tmpl.generate(foo='bar')))
cmlenz@336:
cmlenz@336: def test_interpolate_non_string_attrs(self):
cmlenz@336: tmpl = MarkupTemplate('')
cmlenz@336: self.assertEqual('', str(tmpl.generate()))
cmlenz@336:
cmlenz@336: def test_interpolate_list_result(self):
cmlenz@336: tmpl = MarkupTemplate('$foo')
cmlenz@336: self.assertEqual('buzz', str(tmpl.generate(foo=('buzz',))))
cmlenz@336:
cmlenz@336: def test_empty_attr(self):
cmlenz@336: tmpl = MarkupTemplate('')
cmlenz@336: self.assertEqual('', str(tmpl.generate()))
cmlenz@336:
cmlenz@336: def test_bad_directive_error(self):
cmlenz@336: xml = '
'
cmlenz@336: try:
cmlenz@336: tmpl = MarkupTemplate(xml, filename='test.html')
cmlenz@336: except BadDirectiveError, e:
cmlenz@336: self.assertEqual('test.html', e.filename)
cmlenz@336: if sys.version_info[:2] >= (2, 4):
cmlenz@336: self.assertEqual(1, e.lineno)
cmlenz@336:
cmlenz@336: def test_directive_value_syntax_error(self):
cmlenz@336: xml = """"""
cmlenz@336: try:
cmlenz@336: tmpl = MarkupTemplate(xml, filename='test.html')
cmlenz@336: self.fail('Expected SyntaxError')
cmlenz@336: except TemplateSyntaxError, e:
cmlenz@336: self.assertEqual('test.html', e.filename)
cmlenz@336: if sys.version_info[:2] >= (2, 4):
cmlenz@336: self.assertEqual(1, e.lineno)
cmlenz@336:
cmlenz@336: def test_expression_syntax_error(self):
cmlenz@336: xml = """
cmlenz@336: Foo ${bar"}
cmlenz@336:
"""
cmlenz@336: try:
cmlenz@336: tmpl = MarkupTemplate(xml, filename='test.html')
cmlenz@336: self.fail('Expected SyntaxError')
cmlenz@336: except TemplateSyntaxError, e:
cmlenz@336: self.assertEqual('test.html', e.filename)
cmlenz@336: if sys.version_info[:2] >= (2, 4):
cmlenz@336: self.assertEqual(2, e.lineno)
cmlenz@336:
cmlenz@336: def test_expression_syntax_error_multi_line(self):
cmlenz@336: xml = """
cmlenz@336:
cmlenz@336: ${bar"}
cmlenz@336:
cmlenz@336:
"""
cmlenz@336: try:
cmlenz@336: tmpl = MarkupTemplate(xml, filename='test.html')
cmlenz@336: self.fail('Expected SyntaxError')
cmlenz@336: except TemplateSyntaxError, e:
cmlenz@336: self.assertEqual('test.html', e.filename)
cmlenz@336: if sys.version_info[:2] >= (2, 4):
cmlenz@336: self.assertEqual(3, e.lineno)
cmlenz@336:
cmlenz@336: def test_markup_noescape(self):
cmlenz@336: """
cmlenz@336: Verify that outputting context data that is a `Markup` instance is not
cmlenz@336: escaped.
cmlenz@336: """
cmlenz@336: tmpl = MarkupTemplate("""
cmlenz@336: $myvar
cmlenz@336:
""")
cmlenz@336: self.assertEqual("""
cmlenz@336: foo
cmlenz@336:
""", str(tmpl.generate(myvar=Markup('foo'))))
cmlenz@336:
cmlenz@336: def test_text_noescape_quotes(self):
cmlenz@336: """
cmlenz@336: Verify that outputting context data in text nodes doesn't escape quotes.
cmlenz@336: """
cmlenz@336: tmpl = MarkupTemplate("""
cmlenz@336: $myvar
cmlenz@336:
""")
cmlenz@336: self.assertEqual("""
cmlenz@336: "foo"
cmlenz@336:
""", str(tmpl.generate(myvar='"foo"')))
cmlenz@336:
cmlenz@336: def test_attr_escape_quotes(self):
cmlenz@336: """
cmlenz@336: Verify that outputting context data in attribtes escapes quotes.
cmlenz@336: """
cmlenz@336: tmpl = MarkupTemplate("""
cmlenz@336:
cmlenz@336:
""")
cmlenz@336: self.assertEqual("""
cmlenz@336:
cmlenz@336:
""", str(tmpl.generate(myvar='"foo"')))
cmlenz@336:
cmlenz@336: def test_directive_element(self):
cmlenz@336: tmpl = MarkupTemplate("""
cmlenz@336:
bar
cmlenz@336:
""")
cmlenz@336: self.assertEqual("""
cmlenz@336: bar
cmlenz@336:
""", str(tmpl.generate(myvar='"foo"')))
cmlenz@336:
cmlenz@336: def test_normal_comment(self):
cmlenz@336: tmpl = MarkupTemplate("""
cmlenz@336:
cmlenz@336:
""")
cmlenz@336: self.assertEqual("""
cmlenz@336:
cmlenz@336:
""", str(tmpl.generate()))
cmlenz@336:
cmlenz@336: def test_template_comment(self):
cmlenz@336: tmpl = MarkupTemplate("""
cmlenz@336:
cmlenz@336:
cmlenz@336:
""")
cmlenz@336: self.assertEqual("""
cmlenz@336:
""", str(tmpl.generate()))
cmlenz@336:
cmlenz@336: def test_parse_with_same_namespace_nested(self):
cmlenz@336: tmpl = MarkupTemplate("""
cmlenz@336:
cmlenz@336:
cmlenz@336:
""")
cmlenz@336: self.assertEqual("""
cmlenz@336:
cmlenz@336:
cmlenz@336:
""", str(tmpl.generate()))
cmlenz@336:
cmlenz@336: def test_latin1_encoded_with_xmldecl(self):
cmlenz@336: tmpl = MarkupTemplate(u"""
cmlenz@336:
cmlenz@336: \xf6
cmlenz@336:
""".encode('iso-8859-1'), encoding='iso-8859-1')
cmlenz@460: self.assertEqual(u"""\n
cmlenz@336: \xf6
cmlenz@336:
""", unicode(tmpl.generate()))
cmlenz@336:
cmlenz@336: def test_latin1_encoded_explicit_encoding(self):
cmlenz@336: tmpl = MarkupTemplate(u"""
cmlenz@336: \xf6
cmlenz@336:
""".encode('iso-8859-1'), encoding='iso-8859-1')
cmlenz@336: self.assertEqual(u"""
cmlenz@336: \xf6
cmlenz@336:
""", unicode(tmpl.generate()))
cmlenz@336:
cmlenz@520: def test_exec_with_trailing_space(self):
cmlenz@520: """
cmlenz@520: Verify that a code block processing instruction with trailing space
cmlenz@520: does not cause a syntax error (see ticket #127).
cmlenz@520: """
cmlenz@520: MarkupTemplate(u"""
cmlenz@520:
cmlenz@520: """)
cmlenz@520:
cmlenz@405: def test_exec_import(self):
cmlenz@405: tmpl = MarkupTemplate(u"""
cmlenz@405:
cmlenz@405: ${timedelta(days=2)}
cmlenz@405:
""")
cmlenz@405: self.assertEqual(u"""
cmlenz@405: 2 days, 0:00:00
cmlenz@405:
""", str(tmpl.generate()))
cmlenz@405:
cmlenz@405: def test_exec_def(self):
cmlenz@405: tmpl = MarkupTemplate(u"""
cmlenz@405:
cmlenz@405:
cmlenz@405: ${foo()}
cmlenz@405:
""")
cmlenz@405: self.assertEqual(u"""
cmlenz@405: 42
cmlenz@405:
""", str(tmpl.generate()))
cmlenz@405:
cmlenz@437: def test_namespace_on_removed_elem(self):
cmlenz@437: """
cmlenz@437: Verify that a namespace declaration on an element that is removed from
cmlenz@437: the generated stream does not get pushed up to the next non-stripped
cmlenz@437: element (see ticket #107).
cmlenz@437: """
cmlenz@437: tmpl = MarkupTemplate("""
cmlenz@437:
cmlenz@437: Size
cmlenz@437:
cmlenz@437: """)
cmlenz@460: self.assertEqual("""\n
cmlenz@437:
cmlenz@437:
cmlenz@437: """, str(tmpl.generate()))
cmlenz@437:
cmlenz@363: def test_include_in_loop(self):
cmlenz@363: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@363: try:
cmlenz@363: file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
cmlenz@363: try:
cmlenz@363: file1.write("""Included $idx
""")
cmlenz@363: finally:
cmlenz@363: file1.close()
cmlenz@363:
cmlenz@363: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@363: try:
cmlenz@363: file2.write("""
cmlenz@363:
cmlenz@363: """)
cmlenz@363: finally:
cmlenz@363: file2.close()
cmlenz@363:
cmlenz@363: loader = TemplateLoader([dirname])
cmlenz@363: tmpl = loader.load('tmpl2.html')
cmlenz@363: self.assertEqual("""
cmlenz@363: Included 0
Included 1
Included 2
cmlenz@363: """, tmpl.generate(name='tmpl1').render())
cmlenz@363: finally:
cmlenz@363: shutil.rmtree(dirname)
cmlenz@363:
cmlenz@656: def test_dynamic_include_href(self):
cmlenz@363: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@363: try:
cmlenz@363: file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
cmlenz@363: try:
cmlenz@363: file1.write("""Included
""")
cmlenz@363: finally:
cmlenz@363: file1.close()
cmlenz@363:
cmlenz@363: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@363: try:
cmlenz@363: file2.write("""
cmlenz@363:
cmlenz@363: """)
cmlenz@363: finally:
cmlenz@363: file2.close()
cmlenz@363:
cmlenz@363: loader = TemplateLoader([dirname])
cmlenz@363: tmpl = loader.load('tmpl2.html')
cmlenz@363: self.assertEqual("""
cmlenz@363: Included
cmlenz@363: """, tmpl.generate(name='tmpl1').render())
cmlenz@363: finally:
cmlenz@363: shutil.rmtree(dirname)
cmlenz@363:
cmlenz@656: def test_select_included_elements(self):
cmlenz@363: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@363: try:
cmlenz@363: file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
cmlenz@363: try:
cmlenz@363: file1.write("""$item""")
cmlenz@363: finally:
cmlenz@363: file1.close()
cmlenz@363:
cmlenz@363: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@363: try:
cmlenz@363: file2.write("""
cmlenz@363:
cmlenz@363:
cmlenz@363: """)
cmlenz@363: finally:
cmlenz@363: file2.close()
cmlenz@363:
cmlenz@363: loader = TemplateLoader([dirname])
cmlenz@363: tmpl = loader.load('tmpl2.html')
cmlenz@363: self.assertEqual("""
cmlenz@363:
cmlenz@363: """, tmpl.generate().render())
cmlenz@363: finally:
cmlenz@363: shutil.rmtree(dirname)
cmlenz@363:
cmlenz@381: def test_fallback_when_include_found(self):
cmlenz@381: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@381: try:
cmlenz@381: file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
cmlenz@381: try:
cmlenz@381: file1.write("""Included
""")
cmlenz@381: finally:
cmlenz@381: file1.close()
cmlenz@381:
cmlenz@381: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@381: try:
cmlenz@381: file2.write("""
cmlenz@381:
cmlenz@381: Missing
cmlenz@381: """)
cmlenz@381: finally:
cmlenz@381: file2.close()
cmlenz@381:
cmlenz@381: loader = TemplateLoader([dirname])
cmlenz@381: tmpl = loader.load('tmpl2.html')
cmlenz@381: self.assertEqual("""
cmlenz@381: Included
cmlenz@381: """, tmpl.generate().render())
cmlenz@381: finally:
cmlenz@381: shutil.rmtree(dirname)
cmlenz@381:
cmlenz@590: def test_error_when_include_not_found(self):
cmlenz@590: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@590: try:
cmlenz@590: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@590: try:
cmlenz@590: file2.write("""
cmlenz@590:
cmlenz@590: """)
cmlenz@590: finally:
cmlenz@590: file2.close()
cmlenz@590:
cmlenz@590: loader = TemplateLoader([dirname], auto_reload=True)
cmlenz@590: tmpl = loader.load('tmpl2.html')
cmlenz@590: self.assertRaises(TemplateNotFound, tmpl.generate().render)
cmlenz@590: finally:
cmlenz@590: shutil.rmtree(dirname)
cmlenz@590:
cmlenz@381: def test_fallback_when_include_not_found(self):
cmlenz@381: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@381: try:
cmlenz@381: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@381: try:
cmlenz@381: file2.write("""
cmlenz@381:
cmlenz@381: Missing
cmlenz@381: """)
cmlenz@381: finally:
cmlenz@381: file2.close()
cmlenz@381:
cmlenz@381: loader = TemplateLoader([dirname])
cmlenz@381: tmpl = loader.load('tmpl2.html')
cmlenz@381: self.assertEqual("""
cmlenz@381: Missing
cmlenz@381: """, tmpl.generate().render())
cmlenz@381: finally:
cmlenz@381: shutil.rmtree(dirname)
cmlenz@381:
cmlenz@639: def test_fallback_when_auto_reload_true(self):
cmlenz@639: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@639: try:
cmlenz@639: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@639: try:
cmlenz@639: file2.write("""
cmlenz@639:
cmlenz@639: Missing
cmlenz@639: """)
cmlenz@639: finally:
cmlenz@639: file2.close()
cmlenz@639:
cmlenz@639: loader = TemplateLoader([dirname], auto_reload=True)
cmlenz@639: tmpl = loader.load('tmpl2.html')
cmlenz@639: self.assertEqual("""
cmlenz@639: Missing
cmlenz@639: """, tmpl.generate().render())
cmlenz@639: finally:
cmlenz@639: shutil.rmtree(dirname)
cmlenz@639:
cmlenz@381: def test_include_in_fallback(self):
cmlenz@381: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@381: try:
cmlenz@381: file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
cmlenz@381: try:
cmlenz@381: file1.write("""Included
""")
cmlenz@381: finally:
cmlenz@381: file1.close()
cmlenz@381:
cmlenz@381: file2 = open(os.path.join(dirname, 'tmpl3.html'), 'w')
cmlenz@381: try:
cmlenz@381: file2.write("""
cmlenz@381:
cmlenz@381:
cmlenz@381:
cmlenz@381: Missing
cmlenz@381:
cmlenz@381:
cmlenz@381:
cmlenz@381: """)
cmlenz@381: finally:
cmlenz@381: file2.close()
cmlenz@381:
cmlenz@381: loader = TemplateLoader([dirname])
cmlenz@381: tmpl = loader.load('tmpl3.html')
cmlenz@381: self.assertEqual("""
cmlenz@590: Included
cmlenz@381: """, tmpl.generate().render())
cmlenz@381: finally:
cmlenz@381: shutil.rmtree(dirname)
cmlenz@381:
cmlenz@381: def test_nested_include_fallback(self):
cmlenz@381: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@381: try:
cmlenz@381: file2 = open(os.path.join(dirname, 'tmpl3.html'), 'w')
cmlenz@381: try:
cmlenz@381: file2.write("""
cmlenz@381:
cmlenz@381:
cmlenz@381:
cmlenz@381: Missing
cmlenz@381:
cmlenz@381:
cmlenz@381:
cmlenz@381: """)
cmlenz@381: finally:
cmlenz@381: file2.close()
cmlenz@381:
cmlenz@381: loader = TemplateLoader([dirname])
cmlenz@381: tmpl = loader.load('tmpl3.html')
cmlenz@381: self.assertEqual("""
cmlenz@590: Missing
cmlenz@590: """, tmpl.generate().render())
cmlenz@590: finally:
cmlenz@590: shutil.rmtree(dirname)
cmlenz@590:
cmlenz@590: def test_nested_include_in_fallback(self):
cmlenz@590: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@590: try:
cmlenz@590: file1 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@590: try:
cmlenz@590: file1.write("""Included
""")
cmlenz@590: finally:
cmlenz@590: file1.close()
cmlenz@590:
cmlenz@590: file2 = open(os.path.join(dirname, 'tmpl3.html'), 'w')
cmlenz@590: try:
cmlenz@590: file2.write("""
cmlenz@590:
cmlenz@590:
cmlenz@590:
cmlenz@590:
cmlenz@590:
cmlenz@590: """)
cmlenz@590: finally:
cmlenz@590: file2.close()
cmlenz@590:
cmlenz@590: loader = TemplateLoader([dirname])
cmlenz@590: tmpl = loader.load('tmpl3.html')
cmlenz@590: self.assertEqual("""
cmlenz@590: Included
cmlenz@381: """, tmpl.generate().render())
cmlenz@381: finally:
cmlenz@381: shutil.rmtree(dirname)
cmlenz@381:
cmlenz@381: def test_include_fallback_with_directive(self):
cmlenz@381: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@381: try:
cmlenz@381: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@381: try:
cmlenz@381: file2.write("""
cmlenz@381:
cmlenz@381: tmpl1.html not found
cmlenz@381:
cmlenz@381: """)
cmlenz@381: finally:
cmlenz@381: file2.close()
cmlenz@381:
cmlenz@381: loader = TemplateLoader([dirname])
cmlenz@381: tmpl = loader.load('tmpl2.html')
cmlenz@381: self.assertEqual("""
cmlenz@381: tmpl1.html not found
cmlenz@381: """, tmpl.generate(debug=True).render())
cmlenz@381: finally:
cmlenz@381: shutil.rmtree(dirname)
cmlenz@381:
cmlenz@548: def test_include_inlined(self):
cmlenz@548: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@548: try:
cmlenz@548: file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
cmlenz@548: try:
cmlenz@548: file1.write("""Included
""")
cmlenz@548: finally:
cmlenz@548: file1.close()
cmlenz@548:
cmlenz@548: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@548: try:
cmlenz@548: file2.write("""
cmlenz@548:
cmlenz@548: """)
cmlenz@548: finally:
cmlenz@548: file2.close()
cmlenz@548:
cmlenz@548: loader = TemplateLoader([dirname], auto_reload=False)
cmlenz@548: tmpl = loader.load('tmpl2.html')
cmlenz@548: # if not inlined the following would be 5
cmlenz@548: self.assertEqual(7, len(tmpl.stream))
cmlenz@548: self.assertEqual("""
cmlenz@548: Included
cmlenz@548: """, tmpl.generate().render())
cmlenz@548: finally:
cmlenz@548: shutil.rmtree(dirname)
cmlenz@548:
cmlenz@548: def test_include_inlined_in_loop(self):
cmlenz@548: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@548: try:
cmlenz@548: file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
cmlenz@548: try:
cmlenz@548: file1.write("""Included $idx
""")
cmlenz@548: finally:
cmlenz@548: file1.close()
cmlenz@548:
cmlenz@548: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@548: try:
cmlenz@548: file2.write("""
cmlenz@548:
cmlenz@548: """)
cmlenz@548: finally:
cmlenz@548: file2.close()
cmlenz@548:
cmlenz@548: loader = TemplateLoader([dirname], auto_reload=False)
cmlenz@548: tmpl = loader.load('tmpl2.html')
cmlenz@548: self.assertEqual("""
cmlenz@548: Included 0
Included 1
Included 2
cmlenz@548: """, tmpl.generate().render())
cmlenz@548: finally:
cmlenz@548: shutil.rmtree(dirname)
cmlenz@548:
cmlenz@545: def test_allow_exec_false(self):
cmlenz@545: xml = ("""
cmlenz@545:
cmlenz@545:
cmlenz@545: This is replaced.
cmlenz@545:
cmlenz@545: """)
cmlenz@545: try:
cmlenz@545: tmpl = MarkupTemplate(xml, filename='test.html',
cmlenz@545: allow_exec=False)
cmlenz@545: self.fail('Expected SyntaxError')
cmlenz@545: except TemplateSyntaxError, e:
cmlenz@545: pass
cmlenz@545:
cmlenz@545: def test_allow_exec_true(self):
cmlenz@545: xml = ("""
cmlenz@545:
cmlenz@545:
cmlenz@545: This is replaced.
cmlenz@545:
cmlenz@545: """)
cmlenz@545: tmpl = MarkupTemplate(xml, filename='test.html', allow_exec=True)
cmlenz@336:
cmlenz@650: def test_exec_in_match(self):
cmlenz@650: xml = ("""
cmlenz@650:
cmlenz@650:
cmlenz@650: ${title}
cmlenz@650:
cmlenz@650: moot text
cmlenz@650: """)
cmlenz@650: tmpl = MarkupTemplate(xml, filename='test.html', allow_exec=True)
cmlenz@650: self.assertEqual("""
cmlenz@650:
cmlenz@650: wakka wakka wakka
cmlenz@650:
cmlenz@650: """, tmpl.generate().render())
cmlenz@650:
cmlenz@656: def test_nested_include_matches(self):
cmlenz@656: # See ticket #157
cmlenz@656: dirname = tempfile.mkdtemp(suffix='genshi_test')
cmlenz@656: try:
cmlenz@656: file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
cmlenz@656: try:
cmlenz@656: file1.write("""
cmlenz@656: Some content.
cmlenz@656: """)
cmlenz@656: finally:
cmlenz@656: file1.close()
cmlenz@656:
cmlenz@656: file2 = open(os.path.join(dirname, 'tmpl2.html'), 'w')
cmlenz@656: try:
cmlenz@656: file2.write("""
cmlenz@656:
cmlenz@656: Some full html document that includes file1.html
cmlenz@656:
cmlenz@656:
cmlenz@656: """)
cmlenz@656: finally:
cmlenz@656: file2.close()
cmlenz@656:
cmlenz@656: file3 = open(os.path.join(dirname, 'tmpl3.html'), 'w')
cmlenz@656: try:
cmlenz@656: file3.write("""
cmlenz@656:
cmlenz@656: Some added stuff.
cmlenz@656: ${select('*|text()')}
cmlenz@656:
cmlenz@656:
cmlenz@656:
cmlenz@656: """)
cmlenz@656: finally:
cmlenz@656: file3.close()
cmlenz@656:
cmlenz@656: loader = TemplateLoader([dirname])
cmlenz@656: tmpl = loader.load('tmpl3.html')
cmlenz@656: self.assertEqual("""
cmlenz@656:
cmlenz@656:
cmlenz@656: Some full html document that includes file1.html
cmlenz@656:
cmlenz@656: Some added stuff.
cmlenz@656: Some content.
cmlenz@656:
cmlenz@656:
cmlenz@656:
cmlenz@656: """, tmpl.generate().render())
cmlenz@656: finally:
cmlenz@656: shutil.rmtree(dirname)
cmlenz@656:
cmlenz@546:
cmlenz@336: def suite():
cmlenz@336: suite = unittest.TestSuite()
cmlenz@336: suite.addTest(doctest.DocTestSuite(MarkupTemplate.__module__))
cmlenz@336: suite.addTest(unittest.makeSuite(MarkupTemplateTestCase, 'test'))
cmlenz@336: return suite
cmlenz@336:
cmlenz@336: if __name__ == '__main__':
cmlenz@336: unittest.main(defaultTest='suite')