From: Adrian Moennich Date: Sun, 26 Feb 2017 16:28:47 +0000 (+0100) Subject: Add unit tests for namespace functionality X-Git-Tag: 2.10~24^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2a186998f3a7fe235dae608ebacab8e768a9837;p=thirdparty%2Fjinja.git Add unit tests for namespace functionality --- diff --git a/jinja2/__init__.py b/jinja2/__init__.py index ccc5d187..b7b495d8 100644 --- a/jinja2/__init__.py +++ b/jinja2/__init__.py @@ -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', diff --git a/tests/test_core_tags.py b/tests/test_core_tags.py index 4f56db78..a5c12979 100644 --- a/tests/test_core_tags.py +++ b/tests/test_core_tags.py @@ -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='') == 'foo: <unsafe>' + 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_