summaryrefslogtreecommitdiff
path: root/test/test_stpl.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_stpl.py')
-rw-r--r--test/test_stpl.py95
1 files changed, 73 insertions, 22 deletions
diff --git a/test/test_stpl.py b/test/test_stpl.py
index c5fafe4..6c4cd2d 100644
--- a/test/test_stpl.py
+++ b/test/test_stpl.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
import unittest
from bottle import SimpleTemplate, TemplateError
@@ -5,58 +6,80 @@ class TestSimpleTemplate(unittest.TestCase):
def test_string(self):
""" Templates: Parse string"""
t = SimpleTemplate('start {{var}} end').render(var='var')
- self.assertEqual('start var end', ''.join(t))
+ self.assertEqual(u'start var end', ''.join(t))
def test_file(self):
""" Templates: Parse file"""
t = SimpleTemplate(name='./views/stpl_simple.tpl').render(var='var')
- self.assertEqual('start var end\n', ''.join(t))
+ self.assertEqual(u'start var end\n', ''.join(t))
def test_name(self):
""" Templates: Lookup by name """
t = SimpleTemplate(name='stpl_simple', lookup=['./views/']).render(var='var')
- self.assertEqual('start var end\n', ''.join(t))
+ self.assertEqual(u'start var end\n', ''.join(t))
+
+ def test_unicode(self):
+ """ Templates: Unicode variables """
+ t = SimpleTemplate('start {{var}} end').render(var=u'äöü')
+ self.assertEqual(u'start äöü end', ''.join(t))
+
+ def test_import(self):
+ """ Templates: import statement"""
+ t = '%from base64 import b64encode\nstart {{b64encode(var.encode("ascii") if hasattr(var, "encode") else var)}} end'
+ t = SimpleTemplate(t).render(var='var')
+ self.assertEqual(u'start dmFy end', ''.join(t))
def test_data(self):
""" Templates: Data representation """
t = SimpleTemplate('<{{var}}>')
- self.assertEqual('<True>', ''.join(t.render(var=True)))
- self.assertEqual('<False>', ''.join(t.render(var=False)))
- self.assertEqual('<None>', ''.join(t.render(var=None)))
- self.assertEqual('<0>', ''.join(t.render(var=0)))
- self.assertEqual('<5>', ''.join(t.render(var=5)))
- self.assertEqual('<b>', ''.join(t.render(var='b')))
- self.assertEqual('<1.0>', ''.join(t.render(var=1.0)))
- self.assertEqual('<[1, 2]>', ''.join(t.render(var=[1,2])))
+ self.assertEqual(u'<True>', ''.join(t.render(var=True)))
+ self.assertEqual(u'<False>', ''.join(t.render(var=False)))
+ self.assertEqual(u'<None>', ''.join(t.render(var=None)))
+ self.assertEqual(u'<0>', ''.join(t.render(var=0)))
+ self.assertEqual(u'<5>', ''.join(t.render(var=5)))
+ self.assertEqual(u'<b>', ''.join(t.render(var='b')))
+ self.assertEqual(u'<1.0>', ''.join(t.render(var=1.0)))
+ self.assertEqual(u'<[1, 2]>', ''.join(t.render(var=[1,2])))
+
+ def test_escape(self):
+ t = SimpleTemplate('<{{!var}}>')
+ self.assertEqual(u'<b>', ''.join(t.render(var='b')))
+ self.assertEqual(u'<&lt;&amp;&gt;>', ''.join(t.render(var='<&>')))
def test_blocks(self):
""" Templates: Code blocks and loops """
t = SimpleTemplate("start\n%for i in l:\n{{i}} \n%end\nend")
- self.assertEqual('start\n1 \n2 \n3 \nend', ''.join(t.render(l=[1,2,3])))
- self.assertEqual('start\nend', ''.join(t.render(l=[])))
+ self.assertEqual(u'start\n1 \n2 \n3 \nend', ''.join(t.render(l=[1,2,3])))
+ self.assertEqual(u'start\nend', ''.join(t.render(l=[])))
t = SimpleTemplate("start\n%if i:\n{{i}} \n%end\nend")
- self.assertEqual('start\nTrue \nend', ''.join(t.render(i=True)))
- self.assertEqual('start\nend', ''.join(t.render(i=False)))
+ self.assertEqual(u'start\nTrue \nend', ''.join(t.render(i=True)))
+ self.assertEqual(u'start\nend', ''.join(t.render(i=False)))
+
+ def test_onelineblocks(self):
+ """ Templates: one line code blocks """
+ t = SimpleTemplate("start\n%a=''\n%for i in l: a += str(i)\n{{a}}\nend")
+ self.assertEqual(u'start\n123\nend', ''.join(t.render(l=[1,2,3])))
+ self.assertEqual(u'start\n\nend', ''.join(t.render(l=[])))
def test_nobreak(self):
""" Templates: Nobreak statements"""
t = SimpleTemplate("start\\\\\n%pass\nend")
- self.assertEqual('startend', ''.join(t.render()))
+ self.assertEqual(u'startend', ''.join(t.render()))
def test_nonobreak(self):
""" Templates: Escaped nobreak statements"""
t = SimpleTemplate("start\\\\\n\\\\\n%pass\nend")
- self.assertEqual('start\\\\\nend', ''.join(t.render()))
+ self.assertEqual(u'start\\\\\nend', ''.join(t.render()))
def test_include(self):
""" Templates: Include statements"""
t = SimpleTemplate(name='stpl_include', lookup=['./views/'])
- self.assertEqual('before\nstart var end\nafter\n', ''.join(t.render(var='var')))
+ self.assertEqual(u'before\nstart var end\nafter\n', ''.join(t.render(var='var')))
def test_rebase(self):
""" Templates: %rebase and method passing """
t = SimpleTemplate(name='stpl_t2main', lookup=['./views/'])
- result='+base+\n+main+\n!1234!\n+include+\n-main-\n+include+\n-base-\n'
+ result=u'+base+\n+main+\n!1234!\n+include+\n-main-\n+include+\n-base-\n'
self.assertEqual(result, ''.join(t.render(content='1234')))
def test_notfound(self):
@@ -70,11 +93,39 @@ class TestSimpleTemplate(unittest.TestCase):
def test_winbreaks(self):
""" Templates: Test windows line breaks """
- t = SimpleTemplate('%var+=1\r\n{{var}}\r\n').render(var=5)
- self.assertEqual('6\r\n', ''.join(t))
+ t = SimpleTemplate('%var+=1\r\n{{var}}\r\n')
+ t = t.render(var=5)
+ self.assertEqual(u'6\r\n', ''.join(t))
-
+ def test_commentonly(self):
+ """ Templates: Commentd should behave like code-lines (e.g. flush text-lines) """
+ t = SimpleTemplate('...\n%#test\n...')
+ self.failIfEqual('#test', t.code.splitlines()[0])
+ def test_detect_pep263(self):
+ ''' PEP263 strings in code-lines change the template encoding on the fly '''
+ t = SimpleTemplate(u'%#coding: iso8859_15\nöäü?@€'.encode('utf8'))
+ self.failIfEqual(u'öäü?@€', ''.join(t.render()))
+ self.assertEqual(t.encoding, 'iso8859_15')
+ t = SimpleTemplate(u'%#coding: iso8859_15\nöäü?@€'.encode('iso8859_15'))
+ self.assertEqual(u'öäü?@€', ''.join(t.render()))
+ self.assertEqual(t.encoding, 'iso8859_15')
+ self.assertEqual(2, len(t.code.splitlines()))
+
+ def test_ignore_pep263_in_textline(self):
+ ''' PEP263 strings in text-lines have no effect '''
+ self.assertRaises(UnicodeError, SimpleTemplate, u'#coding: iso8859_15\nöäü?@€'.encode('iso8859_15'))
+ t = SimpleTemplate(u'#coding: iso8859_15\nöäü?@€'.encode('utf8'))
+ self.assertEqual(u'#coding: iso8859_15\nöäü?@€', ''.join(t.render()))
+ self.assertEqual(t.encoding, 'utf8')
+
+ def test_ignore_late_pep263(self):
+ ''' PEP263 strings must appear within the first two lines '''
+ self.assertRaises(UnicodeError, SimpleTemplate, u'\n\n%#coding: iso8859_15\nöäü?@€'.encode('iso8859_15'))
+ t = SimpleTemplate(u'\n\n%#coding: iso8859_15\nöäü?@€'.encode('utf8'))
+ self.assertEqual(u'\n\nöäü?@€', ''.join(t.render()))
+ self.assertEqual(t.encoding, 'utf8')
+
if __name__ == '__main__':
unittest.main()