diff --git a/gluon/tests/test_template.py b/gluon/tests/test_template.py index 021a30a1..0ef30d0a 100644 --- a/gluon/tests/test_template.py +++ b/gluon/tests/test_template.py @@ -9,10 +9,11 @@ from fix_path import fix_sys_path fix_sys_path(__file__) +import template from template import render -class TestVirtualFields(unittest.TestCase): +class TestTemplate(unittest.TestCase): def testRun(self): self.assertEqual(render(content='{{for i in range(n):}}{{=i}}{{pass}}', @@ -61,6 +62,80 @@ class TestVirtualFields(unittest.TestCase): self.assertRaises( SyntaxError, render, content='{{pass\n=list((1,2,\n3))}}') + def testWithDummyFileSystem(self): + from os.path import join as pjoin + import contextlib + from StringIO import StringIO + from gluon.restricted import RestrictedError + + @contextlib.contextmanager + def monkey_patch(module, fn_name, patch): + try: + unpatch = getattr(module, fn_name) + except AttributeError: + unpatch = None + setattr(module, fn_name, patch) + try: + yield + finally: + if unpatch is None: + delattr(module, fn_name) + else: + setattr(module, fn_name, unpatch) + + def dummy_open(path, mode): + if path == pjoin('views', 'layout.html'): + return StringIO("{{block left_sidebar}}left{{end}}" + "{{include}}" + "{{block right_sidebar}}right{{end}}") + elif path == pjoin('views', 'layoutbrackets.html'): + return StringIO("[[block left_sidebar]]left[[end]]" + "[[include]]" + "[[block right_sidebar]]right[[end]]") + elif path == pjoin('views', 'default', 'index.html'): + return StringIO("{{extend 'layout.html'}}" + "{{block left_sidebar}}{{super}} {{end}}" + "to" + "{{block right_sidebar}} {{super}}{{end}}") + elif path == pjoin('views', 'default', 'indexbrackets.html'): + return StringIO("[[extend 'layoutbrackets.html']]" + "[[block left_sidebar]][[super]] [[end]]" + "to" + "[[block right_sidebar]] [[super]][[end]]") + elif path == pjoin('views', 'default', 'missing.html'): + return StringIO("{{extend 'wut'}}" + "{{block left_sidebar}}{{super}} {{end}}" + "to" + "{{block right_sidebar}} {{super}}{{end}}") + elif path == pjoin('views', 'default', 'noescape.html'): + return StringIO("""{{=NOESCAPE('')}}""") + raise IOError + + with monkey_patch(template, 'open', dummy_open): + self.assertEqual( + render(filename=pjoin('views', 'default', 'index.html'), + path='views'), + 'left to right') + self.assertEqual( + render(filename=pjoin('views', 'default', 'indexbrackets.html'), + path='views', delimiters=('[[', ']]')), + 'left to right') + self.assertRaises( + RestrictedError, + render, + filename=pjoin('views', 'default', 'missing.html'), + path='views') + response = template.DummyResponse() + response.delimiters = ('[[', ']]') + self.assertEqual( + render(filename=pjoin('views', 'default', 'indexbrackets.html'), + path='views', context={'response': response}), + 'left to right') + self.assertEqual( + render(filename=pjoin('views', 'default', 'noescape.html'), + context={'NOESCAPE': template.NOESCAPE}), + '') + if __name__ == '__main__': unittest.main()