summaryrefslogtreecommitdiff
path: root/tests/template_tests/syntax_tests/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/template_tests/syntax_tests/utils.py')
-rw-r--r--tests/template_tests/syntax_tests/utils.py205
1 files changed, 205 insertions, 0 deletions
diff --git a/tests/template_tests/syntax_tests/utils.py b/tests/template_tests/syntax_tests/utils.py
new file mode 100644
index 0000000000..5445f5b8c4
--- /dev/null
+++ b/tests/template_tests/syntax_tests/utils.py
@@ -0,0 +1,205 @@
+# coding: utf-8
+
+from __future__ import unicode_literals
+
+import functools
+
+from django import template
+from django.template import Library
+from django.template.base import Context
+from django.template.engine import Engine
+from django.template.loader import get_template
+from django.test.utils import override_settings
+from django.utils import translation
+from django.utils.encoding import python_2_unicode_compatible
+from django.utils.safestring import mark_safe
+
+
+def render(template_name, context=None):
+ if context is None:
+ context = {}
+
+ t = get_template(template_name)
+ with translation.override(context.get('LANGUAGE_CODE', 'en-us')):
+ return t.render(Context(context))
+
+
+def setup(templates, *args):
+ """
+ Runs test method multiple times in the following order:
+
+ TEMPLATE_DEBUG CACHED TEMPLATE_STRING_IF_INVALID
+ -------------- ------ --------------------------
+ False False
+ False True
+ False False INVALID
+ False True INVALID
+ True False
+ True True
+ """
+
+ for arg in args:
+ templates.update(arg)
+
+ # numerous tests make use of an inclusion tag
+ # add this in here for simplicity
+ templates["inclusion.html"] = "{{ result }}"
+
+ def decorator(func):
+ @register_test_tags
+ @override_settings(TEMPLATE_LOADERS=[
+ ('django.template.loaders.cached.Loader', [
+ ('django.template.loaders.locmem.Loader', templates),
+ ]),
+ ])
+ def inner(self):
+ loader = Engine.get_default().template_loaders[0]
+
+ func(self)
+ func(self)
+ loader.reset()
+
+ with override_settings(TEMPLATE_STRING_IF_INVALID='INVALID'):
+ func(self)
+ func(self)
+ loader.reset()
+
+ with override_settings(TEMPLATE_DEBUG=True):
+ func(self)
+ func(self)
+ loader.reset()
+ return inner
+ return decorator
+
+
+# Custom template tag for tests
+
+register = Library()
+
+
+class EchoNode(template.Node):
+ def __init__(self, contents):
+ self.contents = contents
+
+ def render(self, context):
+ return ' '.join(self.contents)
+
+
+@register.tag
+def echo(parser, token):
+ return EchoNode(token.contents.split()[1:])
+register.tag('other_echo', echo)
+
+
+@register.filter
+def upper(value):
+ return value.upper()
+
+
+def register_test_tags(func):
+ @functools.wraps(func)
+ def inner(self):
+ template.libraries['testtags'] = register
+ func(self)
+ del template.libraries['testtags']
+ return inner
+
+
+# Helper objects
+
+class SomeException(Exception):
+ silent_variable_failure = True
+
+
+class SomeOtherException(Exception):
+ pass
+
+
+class ShouldNotExecuteException(Exception):
+ pass
+
+
+class SomeClass:
+ def __init__(self):
+ self.otherclass = OtherClass()
+
+ def method(self):
+ return 'SomeClass.method'
+
+ def method2(self, o):
+ return o
+
+ def method3(self):
+ raise SomeException
+
+ def method4(self):
+ raise SomeOtherException
+
+ def method5(self):
+ raise TypeError
+
+ def __getitem__(self, key):
+ if key == 'silent_fail_key':
+ raise SomeException
+ elif key == 'noisy_fail_key':
+ raise SomeOtherException
+ raise KeyError
+
+ @property
+ def silent_fail_attribute(self):
+ raise SomeException
+
+ @property
+ def noisy_fail_attribute(self):
+ raise SomeOtherException
+
+ @property
+ def attribute_error_attribute(self):
+ raise AttributeError
+
+
+class OtherClass:
+ def method(self):
+ return 'OtherClass.method'
+
+
+class TestObj(object):
+ def is_true(self):
+ return True
+
+ def is_false(self):
+ return False
+
+ def is_bad(self):
+ raise ShouldNotExecuteException()
+
+
+class SilentGetItemClass(object):
+ def __getitem__(self, key):
+ raise SomeException
+
+
+class SilentAttrClass(object):
+ def b(self):
+ raise SomeException
+ b = property(b)
+
+
+@python_2_unicode_compatible
+class UTF8Class:
+ "Class whose __str__ returns non-ASCII data on Python 2"
+ def __str__(self):
+ return 'ŠĐĆŽćžšđ'
+
+
+# These two classes are used to test auto-escaping of unicode output.
+@python_2_unicode_compatible
+class UnsafeClass:
+ def __str__(self):
+ return 'you & me'
+
+
+@python_2_unicode_compatible
+class SafeClass:
+ def __str__(self):
+ return mark_safe('you > me')