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:
      ${select('li')}
    cmlenz@363:
      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:
    • 1
    • 2
    • 3
    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')