]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Add unit tests for namespace functionality
authorAdrian Moennich <adrian@planetcoding.net>
Sun, 26 Feb 2017 16:28:47 +0000 (17:28 +0100)
committerAdrian Moennich <adrian@planetcoding.net>
Sat, 24 Jun 2017 08:56:54 +0000 (10:56 +0200)
jinja2/__init__.py
tests/test_core_tags.py

index ccc5d1878fdd559f7fc50674fda15c4225012592..b7b495d8d365b7278d3fb77b487baac353e4d4c2 100644 (file)
@@ -48,7 +48,7 @@ from jinja2.runtime import Undefined, DebugUndefined, StrictUndefined, \
 # exceptions
 from jinja2.exceptions import TemplateError, UndefinedError, \
      TemplateNotFound, TemplatesNotFound, TemplateSyntaxError, \
-     TemplateAssertionError
+     TemplateAssertionError, TemplateRuntimeError
 
 # decorators and public utilities
 from jinja2.filters import environmentfilter, contextfilter, \
@@ -64,6 +64,7 @@ __all__ = [
     'MemcachedBytecodeCache', 'Undefined', 'DebugUndefined',
     'StrictUndefined', 'TemplateError', 'UndefinedError', 'TemplateNotFound',
     'TemplatesNotFound', 'TemplateSyntaxError', 'TemplateAssertionError',
+    'TemplateRuntimeError',
     'ModuleLoader', 'environmentfilter', 'contextfilter', 'Markup', 'escape',
     'environmentfunction', 'contextfunction', 'clear_caches', 'is_undefined',
     'evalcontextfilter', 'evalcontextfunction', 'make_logging_undefined',
index 4f56db78db7363f7c8aabc3d979d0d2d43f265bc..a5c1297978f2ee33464326e77419038d43225c15 100644 (file)
@@ -9,8 +9,8 @@
     :license: BSD, see LICENSE for more details.
 """
 import pytest
-from jinja2 import Environment, TemplateSyntaxError, UndefinedError, \
-     DictLoader
+from jinja2 import Environment, TemplateSyntaxError, TemplateRuntimeError, \
+     UndefinedError, DictLoader
 
 
 @pytest.fixture
@@ -391,6 +391,59 @@ class TestSet(object):
                                '{% endset %}foo: {{ foo }}')
         assert tmpl.render(test='<unsafe>') == 'foo: <em>&lt;unsafe&gt;</em>'
 
+    def test_set_invalid(self, env_trim):
+        pytest.raises(TemplateSyntaxError, env_trim.from_string,
+                      "{% set foo['bar'] = 1 %}")
+        tmpl = env_trim.from_string('{% set foo.bar = 1 %}')
+        exc_info = pytest.raises(TemplateRuntimeError, tmpl.render, foo={})
+        assert 'non-namespace object' in exc_info.value.message
+
+    def test_namespace_redefined(self, env_trim):
+        tmpl = env_trim.from_string('{% set ns = namespace() %}'
+                                    '{% set ns.bar = "hi" %}')
+        exc_info = pytest.raises(TemplateRuntimeError, tmpl.render,
+                                 namespace=dict)
+        assert 'non-namespace object' in exc_info.value.message
+
+    def test_namespace(self, env_trim):
+        tmpl = env_trim.from_string('{% set ns = namespace() %}'
+                                    '{% set ns.bar = "42" %}'
+                                    '{{ ns.bar }}')
+        assert tmpl.render() == '42'
+
+    def test_namespace_block(self, env_trim):
+        tmpl = env_trim.from_string('{% set ns = namespace() %}'
+                                    '{% set ns.bar %}42{% endset %}'
+                                    '{{ ns.bar }}')
+        assert tmpl.render() == '42'
+
+    def test_init_namespace(self, env_trim):
+        tmpl = env_trim.from_string('{% set ns = namespace(d, self=37) %}'
+                                    '{% set ns.b = 42 %}'
+                                    '{{ ns.a }}|{{ ns.self }}|{{ ns.b }}')
+        assert tmpl.render(d={'a': 13}) == '13|37|42'
+
+    def test_namespace_loop(self, env_trim):
+        tmpl = env_trim.from_string('{% set ns = namespace(found=false) %}'
+                                    '{% for x in range(4) %}'
+                                    '{% if x == v %}'
+                                    '{% set ns.found = true %}'
+                                    '{% endif %}'
+                                    '{% endfor %}'
+                                    '{{ ns.found }}')
+        assert tmpl.render(v=3) == 'True'
+        assert tmpl.render(v=4) == 'False'
+
+    def test_namespace_macro(self, env_trim):
+        tmpl = env_trim.from_string('{% set ns = namespace() %}'
+                                    '{% set ns.a = 13 %}'
+                                    '{% macro magic(x) %}'
+                                    '{% set x.b = 37 %}'
+                                    '{% endmacro %}'
+                                    '{{ magic(ns) }}'
+                                    '{{ ns.a }}|{{ ns.b }}')
+        assert tmpl.render() == '13|37'
+
 
 @pytest.mark.core_tags
 @pytest.mark.with_