diff options
| author | Preston Timmons <prestontimmons@gmail.com> | 2014-11-11 19:32:44 -0600 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2014-12-02 19:18:35 -0500 |
| commit | b872134bfc14f6322bd1e4b0a08bf5bfd2c43a52 (patch) | |
| tree | f82fc6be418adeb1e7ff36728f82008770066999 /tests/template_tests/syntax_tests/test_autoescape.py | |
| parent | 4a4ad27712b44cebada1bdaebd082cf82df74610 (diff) | |
Fixed #23768 -- Rewrote template tests as unit tests.
Diffstat (limited to 'tests/template_tests/syntax_tests/test_autoescape.py')
| -rw-r--r-- | tests/template_tests/syntax_tests/test_autoescape.py | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/tests/template_tests/syntax_tests/test_autoescape.py b/tests/template_tests/syntax_tests/test_autoescape.py new file mode 100644 index 0000000000..6457fe31df --- /dev/null +++ b/tests/template_tests/syntax_tests/test_autoescape.py @@ -0,0 +1,121 @@ +from django.template.base import TemplateSyntaxError +from django.test import TestCase +from django.utils.safestring import mark_safe + +from .utils import render, setup, SafeClass, UnsafeClass + + +class AutoescapeTagTests(TestCase): + + @setup({'autoescape-tag01': '{% autoescape off %}hello{% endautoescape %}'}) + def test_autoescape_tag01(self): + output = render('autoescape-tag01') + self.assertEqual(output, 'hello') + + @setup({'autoescape-tag02': '{% autoescape off %}{{ first }}{% endautoescape %}'}) + def test_autoescape_tag02(self): + output = render('autoescape-tag02', {'first': '<b>hello</b>'}) + self.assertEqual(output, '<b>hello</b>') + + @setup({'autoescape-tag03': '{% autoescape on %}{{ first }}{% endautoescape %}'}) + def test_autoescape_tag03(self): + output = render('autoescape-tag03', {'first': '<b>hello</b>'}) + self.assertEqual(output, '<b>hello</b>') + + # Autoescape disabling and enabling nest in a predictable way. + @setup({'autoescape-tag04': '{% autoescape off %}' + '{{ first }} {% autoescape on %}{{ first }}{% endautoescape %}{% endautoescape %}'}) + def test_autoescape_tag04(self): + output = render('autoescape-tag04', {'first': '<a>'}) + self.assertEqual(output, '<a> <a>') + + @setup({'autoescape-tag05': '{% autoescape on %}{{ first }}{% endautoescape %}'}) + def test_autoescape_tag05(self): + output = render('autoescape-tag05', {'first': '<b>first</b>'}) + self.assertEqual(output, '<b>first</b>') + + # Strings (ASCII or unicode) already marked as "safe" are not + # auto-escaped + @setup({'autoescape-tag06': '{{ first }}'}) + def test_autoescape_tag06(self): + output = render('autoescape-tag06', {'first': mark_safe('<b>first</b>')}) + self.assertEqual(output, '<b>first</b>') + + @setup({'autoescape-tag07': '{% autoescape on %}{{ first }}{% endautoescape %}'}) + def test_autoescape_tag07(self): + output = render('autoescape-tag07', {'first': mark_safe('<b>Apple</b>')}) + self.assertEqual(output, '<b>Apple</b>') + + @setup({'autoescape-tag08': r'{% autoescape on %}' + r'{{ var|default_if_none:" endquote\" hah" }}{% endautoescape %}'}) + def test_autoescape_tag08(self): + """ + Literal string arguments to filters, if used in the result, are safe. + """ + output = render('autoescape-tag08', {"var": None}) + self.assertEqual(output, ' endquote" hah') + + # Objects which return safe strings as their __str__ method + # won't get double-escaped. + @setup({'autoescape-tag09': r'{{ unsafe }}'}) + def test_autoescape_tag09(self): + output = render('autoescape-tag09', {'unsafe': UnsafeClass()}) + self.assertEqual(output, 'you & me') + + @setup({'autoescape-tag10': r'{{ safe }}'}) + def test_autoescape_tag10(self): + output = render('autoescape-tag10', {'safe': SafeClass()}) + self.assertEqual(output, 'you > me') + + @setup({'autoescape-filtertag01': '{{ first }}{% filter safe %}{{ first }} x<y{% endfilter %}'}) + def test_autoescape_filtertag01(self): + """ + The "safe" and "escape" filters cannot work due to internal + implementation details (fortunately, the (no)autoescape block + tags can be used in those cases) + """ + with self.assertRaises(TemplateSyntaxError): + render('autoescape-filtertag01', {'first': '<a>'}) + + @setup({'autoescape-ifequal01': '{% ifequal var "this & that" %}yes{% endifequal %}'}) + def test_autoescape_ifequal01(self): + """ + ifequal compares unescaped vales. + """ + output = render('autoescape-ifequal01', {'var': 'this & that'}) + self.assertEqual(output, 'yes') + + # Arguments to filters are 'safe' and manipulate their input unescaped. + @setup({'autoescape-filters01': '{{ var|cut:"&" }}'}) + def test_autoescape_filters01(self): + output = render('autoescape-filters01', {'var': 'this & that'}) + self.assertEqual(output, 'this that') + + @setup({'autoescape-filters02': '{{ var|join:" & " }}'}) + def test_autoescape_filters02(self): + output = render('autoescape-filters02', {'var': ('Tom', 'Dick', 'Harry')}) + self.assertEqual(output, 'Tom & Dick & Harry') + + @setup({'autoescape-literals01': '{{ "this & that" }}'}) + def test_autoescape_literals01(self): + """ + Literal strings are safe. + """ + output = render('autoescape-literals01') + self.assertEqual(output, 'this & that') + + @setup({'autoescape-stringiterations01': '{% for l in var %}{{ l }},{% endfor %}'}) + def test_autoescape_stringiterations01(self): + """ + Iterating over strings outputs safe characters. + """ + output = render('autoescape-stringiterations01', {'var': 'K&R'}) + self.assertEqual(output, 'K,&,R,') + + @setup({'autoescape-lookup01': '{{ var.key }}'}) + def test_autoescape_lookup01(self): + """ + Escape requirement survives lookup. + """ + output = render('autoescape-lookup01', {'var': {'key': 'this & that'}}) + self.assertEqual(output, 'this & that') |
