1# -*- coding: utf-8 -*-
2import unittest
3from bottle import Jinja2Template, jinja2_template, jinja2_view, touni
4from tools import warn
5
6
7class TestJinja2Template(unittest.TestCase):
8
9    def test_string(self):
10        """ Templates: Jinja2 string"""
11        t = Jinja2Template('start {{var}} end').render(var='var')
12        self.assertEqual('start var end', ''.join(t))
13
14    def test_file(self):
15        """ Templates: Jinja2 file"""
16        t = Jinja2Template(name='./views/jinja2_simple.tpl').render(var='var')
17        self.assertEqual('start var end', ''.join(t))
18
19    def test_name(self):
20        """ Templates: Jinja2 lookup by name """
21        t = Jinja2Template(name='jinja2_simple', lookup=['./views/']).render(var='var')
22        self.assertEqual('start var end', ''.join(t))
23
24    def test_notfound(self):
25        """ Templates: Unavailable templates"""
26        self.assertRaises(Exception, Jinja2Template, name="abcdef")
27
28    def test_error(self):
29        """ Templates: Exceptions"""
30        self.assertRaises(Exception, Jinja2Template, '{% for badsyntax')
31
32    def test_inherit(self):
33        """ Templates: Jinja2 lookup and inherience """
34        t = Jinja2Template(name='jinja2_inherit', lookup=['./views/']).render()
35        self.assertEqual('begin abc end', ''.join(t))
36
37    def test_custom_filters(self):
38        """Templates: jinja2 custom filters """
39        from bottle import jinja2_template as template
40        settings = dict(filters = {"star": lambda var: touni("").join((touni('*'), var, touni('*')))})
41        t = Jinja2Template("start {{var|star}} end", **settings)
42        self.assertEqual("start *var* end", t.render(var="var"))
43
44    def test_custom_tests(self):
45        """Templates: jinja2 custom tests """
46        from bottle import jinja2_template as template
47        TEMPL = touni("{% if var is even %}gerade{% else %}ungerade{% endif %}")
48        settings = dict(tests={"even": lambda x: False if x % 2 else True})
49        t = Jinja2Template(TEMPL, **settings)
50        self.assertEqual("gerade", t.render(var=2))
51        self.assertEqual("ungerade", t.render(var=1))
52
53    def test_template_shortcut(self):
54        result = jinja2_template('start {{var}} end', var='middle')
55        self.assertEqual(touni('start middle end'), result)
56
57    def test_view_decorator(self):
58        @jinja2_view('start {{var}} end')
59        def test():
60            return dict(var='middle')
61        self.assertEqual(touni('start middle end'), test())
62
63
64try:
65  import jinja2
66except ImportError:
67  warn("No Jinja2 template support. Skipping tests.")
68  del TestJinja2Template
69
70if __name__ == '__main__': #pragma: no cover
71    unittest.main()
72
73