changeset 353:85d8e57a23e5 trunk

Unit tests for the template engine plugin(s).
author cmlenz
date Mon, 13 Nov 2006 10:15:53 +0000
parents 28b9ec2dce7f
children 6951db75824e
files genshi/template/plugin.py genshi/template/tests/__init__.py genshi/template/tests/plugin.py genshi/template/tests/templates/__init__.py genshi/template/tests/templates/functions.html genshi/template/tests/templates/functions.txt genshi/template/tests/templates/test.html genshi/template/tests/templates/test.txt
diffstat 8 files changed, 277 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/genshi/template/plugin.py
+++ b/genshi/template/plugin.py
@@ -26,6 +26,9 @@
 from genshi.template.markup import MarkupTemplate
 from genshi.template.text import TextTemplate
 
+__all__ = ['ConfigurationError', 'MarkupTemplateEnginePlugin',
+           'TextTemplateEnginePlugin']
+
 
 class ConfigurationError(Exception):
     """Exception raised when invalid plugin options are encountered."""
@@ -44,14 +47,15 @@
         self.options = options
 
         self.default_encoding = options.get('genshi.default_encoding', 'utf-8')
-        auto_reload = options.get('genshi.auto_reload', '1').lower() \
-                            in ('1', 'yes', 'true')
+        auto_reload = options.get('genshi.auto_reload', '1')
+        if isinstance(auto_reload, basestring):
+            auto_reload = auto_reload.lower() in ('1', 'on', 'yes', 'true')
         search_path = options.get('genshi.search_path', '').split(':')
         try:
             max_cache_size = int(options.get('genshi.max_cache_size', 25))
         except ValueError:
             raise ConfigurationError('Invalid value for max_cache_size: "%s"' %
-                                     max_cache_size)
+                                     options.get('genshi.max_cache_size'))
 
         self.loader = TemplateLoader(filter(None, search_path),
                                      auto_reload=auto_reload,
@@ -116,12 +120,12 @@
     def __init__(self, extra_vars_func=None, options=None):
         AbstractTemplateEnginePlugin.__init__(self, extra_vars_func, options)
 
-        doctype = options.get('genshi.default_doctype')
+        doctype = self.options.get('genshi.default_doctype')
         if doctype and doctype not in self.doctypes:
             raise ConfigurationError('Unknown doctype "%s"' % doctype)
         self.default_doctype = self.doctypes.get(doctype)
 
-        format = options.get('genshi.default_format', 'html')
+        format = self.options.get('genshi.default_format', 'html')
         if format not in ('html', 'xhtml', 'xml', 'text'):
             raise ConfigurationError('Unknown output format "%s"' % format)
         self.default_format = format
--- a/genshi/template/tests/__init__.py
+++ b/genshi/template/tests/__init__.py
@@ -17,13 +17,14 @@
 
 def suite():
     from genshi.template.tests import core, directives, eval, loader, markup, \
-                                      text
+                                      plugin, text
     suite = unittest.TestSuite()
     suite.addTest(core.suite())
     suite.addTest(directives.suite())
     suite.addTest(eval.suite())
     suite.addTest(loader.suite())
     suite.addTest(markup.suite())
+    suite.addTest(plugin.suite())
     suite.addTest(text.suite())
     return suite
 
new file mode 100644
--- /dev/null
+++ b/genshi/template/tests/plugin.py
@@ -0,0 +1,238 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2006 Edgewall Software
+# Copyright (C) 2006 Matthew Good
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://genshi.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://genshi.edgewall.org/log/.
+
+import doctest
+import os
+import unittest
+
+from genshi.core import Stream
+from genshi.output import DocType
+from genshi.template import MarkupTemplate, TextTemplate
+from genshi.template.plugin import ConfigurationError, \
+                                   MarkupTemplateEnginePlugin, \
+                                   TextTemplateEnginePlugin
+
+PACKAGE = 'genshi.template.tests'
+
+
+class MarkupTemplateEnginePluginTestCase(unittest.TestCase):
+
+    def test_init_no_options(self):
+        plugin = MarkupTemplateEnginePlugin()
+        self.assertEqual('utf-8', plugin.default_encoding)
+        self.assertEqual('html', plugin.default_format)
+        self.assertEqual(None, plugin.default_doctype)
+
+        self.assertEqual([], plugin.loader.search_path)
+        self.assertEqual(True, plugin.loader.auto_reload)
+        self.assertEqual(25, plugin.loader._cache.capacity)
+
+    def test_init_with_loader_options(self):
+        plugin = MarkupTemplateEnginePlugin(options={
+            'genshi.auto_reload': 'off',
+            'genshi.max_cache_size': '100',
+            'genshi.search_path': '/usr/share/tmpl:/usr/local/share/tmpl',
+        })
+        self.assertEqual(['/usr/share/tmpl', '/usr/local/share/tmpl'],
+                         plugin.loader.search_path)
+        self.assertEqual(False, plugin.loader.auto_reload)
+        self.assertEqual(100, plugin.loader._cache.capacity)
+
+    def test_init_with_invalid_cache_size(self):
+        self.assertRaises(ConfigurationError, MarkupTemplateEnginePlugin,
+                          options={'genshi.max_cache_size': 'thirty'})
+
+    def test_init_with_output_options(self):
+        plugin = MarkupTemplateEnginePlugin(options={
+            'genshi.default_encoding': 'iso-8859-15',
+            'genshi.default_format': 'xhtml',
+            'genshi.default_doctype': 'xhtml-strict',
+        })
+        self.assertEqual('iso-8859-15', plugin.default_encoding)
+        self.assertEqual('xhtml', plugin.default_format)
+        self.assertEqual(DocType.XHTML, plugin.default_doctype)
+
+    def test_init_with_invalid_output_format(self):
+        self.assertRaises(ConfigurationError, MarkupTemplateEnginePlugin,
+                          options={'genshi.default_format': 'foobar'})
+
+    def test_init_with_invalid_doctype(self):
+        self.assertRaises(ConfigurationError, MarkupTemplateEnginePlugin,
+                          options={'genshi.default_doctype': 'foobar'})
+
+    def test_load_template_from_file(self):
+        plugin = MarkupTemplateEnginePlugin()
+        tmpl = plugin.load_template(PACKAGE + '.templates.test')
+        self.assertEqual('test.html', os.path.basename(tmpl.filename))
+        assert isinstance(tmpl, MarkupTemplate)
+
+    def test_load_template_from_string(self):
+        plugin = MarkupTemplateEnginePlugin()
+        tmpl = plugin.load_template(None, template_string="""<p>
+          $message
+        </p>""")
+        self.assertEqual(None, tmpl.filename)
+        assert isinstance(tmpl, MarkupTemplate)
+
+    def test_transform_with_load(self):
+        plugin = MarkupTemplateEnginePlugin()
+        tmpl = plugin.load_template(PACKAGE + '.templates.test')
+        stream = plugin.transform({'message': 'Hello'}, tmpl)
+        assert isinstance(stream, Stream)
+
+    def test_transform_without_load(self):
+        plugin = MarkupTemplateEnginePlugin()
+        stream = plugin.transform({'message': 'Hello'},
+                                  PACKAGE + '.templates.test')
+        assert isinstance(stream, Stream)
+
+    def test_render(self):
+        plugin = MarkupTemplateEnginePlugin()
+        tmpl = plugin.load_template(PACKAGE + '.templates.test')
+        output = plugin.render({'message': 'Hello'}, template=tmpl)
+        self.assertEqual("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html lang="en">
+  <head>
+    <title>Test</title>
+  </head>
+  <body>
+    <h1>Test</h1>
+    <p>Hello</p>
+  </body>
+</html>""", output)
+
+    def test_render_with_format(self):
+        plugin = MarkupTemplateEnginePlugin()
+        tmpl = plugin.load_template(PACKAGE + '.templates.test')
+        output = plugin.render({'message': 'Hello'}, format='xhtml',
+                               template=tmpl)
+        self.assertEqual("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Test</title>
+  </head>
+  <body>
+    <h1>Test</h1>
+    <p>Hello</p>
+  </body>
+</html>""", output)
+
+    def test_render_with_doctype(self):
+        plugin = MarkupTemplateEnginePlugin(options={
+            'genshi.default_doctype': 'html-strict',
+        })
+        tmpl = plugin.load_template(PACKAGE + '.templates.test')
+        output = plugin.render({'message': 'Hello'}, template=tmpl)
+        self.assertEqual("""<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="en">
+  <head>
+    <title>Test</title>
+  </head>
+  <body>
+    <h1>Test</h1>
+    <p>Hello</p>
+  </body>
+</html>""", output)
+
+    def test_helper_functions(self):
+        plugin = MarkupTemplateEnginePlugin()
+        tmpl = plugin.load_template(PACKAGE + '.templates.functions')
+        output = plugin.render({'snippet': '<b>Foo</b>'}, template=tmpl)
+        self.assertEqual("""<div>
+False
+bar
+<b>Foo</b>
+<b>Foo</b>
+</div>""", output)
+
+
+class TextTemplateEnginePluginTestCase(unittest.TestCase):
+
+    def test_init_no_options(self):
+        plugin = TextTemplateEnginePlugin()
+        self.assertEqual('utf-8', plugin.default_encoding)
+        self.assertEqual('text', plugin.default_format)
+
+        self.assertEqual([], plugin.loader.search_path)
+        self.assertEqual(True, plugin.loader.auto_reload)
+        self.assertEqual(25, plugin.loader._cache.capacity)
+
+    def test_init_with_loader_options(self):
+        plugin = TextTemplateEnginePlugin(options={
+            'genshi.auto_reload': 'off',
+            'genshi.max_cache_size': '100',
+            'genshi.search_path': '/usr/share/tmpl:/usr/local/share/tmpl',
+        })
+        self.assertEqual(['/usr/share/tmpl', '/usr/local/share/tmpl'],
+                         plugin.loader.search_path)
+        self.assertEqual(False, plugin.loader.auto_reload)
+        self.assertEqual(100, plugin.loader._cache.capacity)
+
+    def test_init_with_output_options(self):
+        plugin = TextTemplateEnginePlugin(options={
+            'genshi.default_encoding': 'iso-8859-15',
+        })
+        self.assertEqual('iso-8859-15', plugin.default_encoding)
+
+    def test_load_template_from_file(self):
+        plugin = TextTemplateEnginePlugin()
+        tmpl = plugin.load_template(PACKAGE + '.templates.test')
+        assert isinstance(tmpl, TextTemplate)
+        self.assertEqual('test.txt', os.path.basename(tmpl.filename))
+
+    def test_load_template_from_string(self):
+        plugin = TextTemplateEnginePlugin()
+        tmpl = plugin.load_template(None, template_string="$message")
+        self.assertEqual(None, tmpl.filename)
+        assert isinstance(tmpl, TextTemplate)
+
+    def test_transform_without_load(self):
+        plugin = TextTemplateEnginePlugin()
+        stream = plugin.transform({'message': 'Hello'},
+                                  PACKAGE + '.templates.test')
+        assert isinstance(stream, Stream)
+
+    def test_transform_with_load(self):
+        plugin = TextTemplateEnginePlugin()
+        tmpl = plugin.load_template(PACKAGE + '.templates.test')
+        stream = plugin.transform({'message': 'Hello'}, tmpl)
+        assert isinstance(stream, Stream)
+
+    def test_render(self):
+        plugin = TextTemplateEnginePlugin()
+        tmpl = plugin.load_template(PACKAGE + '.templates.test')
+        output = plugin.render({'message': 'Hello'}, template=tmpl)
+        self.assertEqual("""Test
+====
+
+Hello
+""", output)
+
+    def test_helper_functions(self):
+        plugin = TextTemplateEnginePlugin()
+        tmpl = plugin.load_template(PACKAGE + '.templates.functions')
+        output = plugin.render({}, template=tmpl)
+        self.assertEqual("""False
+bar
+""", output)
+
+
+def suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(MarkupTemplateEnginePluginTestCase, 'test'))
+    suite.addTest(unittest.makeSuite(TextTemplateEnginePluginTestCase, 'test'))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='suite')
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/genshi/template/tests/templates/functions.html
@@ -0,0 +1,6 @@
+<div>
+${defined('foo')}
+${value_of('foo', 'bar')}
+${XML(snippet)}
+${HTML(snippet)}
+</div>
new file mode 100644
--- /dev/null
+++ b/genshi/template/tests/templates/functions.txt
@@ -0,0 +1,2 @@
+${defined('foo')}
+${value_of('foo', 'bar')}
new file mode 100644
--- /dev/null
+++ b/genshi/template/tests/templates/test.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html
+    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+      lang="en">
+
+  <head>
+    <title>Test</title>
+  </head>
+
+  <body>
+    <h1>Test</h1>
+    <p>$message</p>
+  </body>
+
+</html>
new file mode 100644
--- /dev/null
+++ b/genshi/template/tests/templates/test.txt
@@ -0,0 +1,4 @@
+Test
+====
+
+$message
Copyright (C) 2012-2017 Edgewall Software