From 612ef3e5c9ba172868d22d93be64a340b7742fc6 Mon Sep 17 00:00:00 2001
From: Preston Timmons
Date: Sat, 6 Apr 2013 13:59:39 -0500
Subject: Modified utils_tests for unittest2 discovery.
---
tests/utils_tests/test_html.py | 176 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 176 insertions(+)
create mode 100644 tests/utils_tests/test_html.py
(limited to 'tests/utils_tests/test_html.py')
diff --git a/tests/utils_tests/test_html.py b/tests/utils_tests/test_html.py
new file mode 100644
index 0000000000..090cc32d1c
--- /dev/null
+++ b/tests/utils_tests/test_html.py
@@ -0,0 +1,176 @@
+from __future__ import unicode_literals
+
+from datetime import datetime
+import os
+
+from django.utils import html
+from django.utils._os import upath
+from django.utils.unittest import TestCase
+
+
+class TestUtilsHtml(TestCase):
+
+ def check_output(self, function, value, output=None):
+ """
+ Check that function(value) equals output. If output is None,
+ check that function(value) equals value.
+ """
+ if output is None:
+ output = value
+ self.assertEqual(function(value), output)
+
+ def test_escape(self):
+ f = html.escape
+ items = (
+ ('&','&'),
+ ('<', '<'),
+ ('>', '>'),
+ ('"', '"'),
+ ("'", '''),
+ )
+ # Substitution patterns for testing the above items.
+ patterns = ("%s", "asdf%sfdsa", "%s1", "1%sb")
+ for value, output in items:
+ for pattern in patterns:
+ self.check_output(f, pattern % value, pattern % output)
+ # Check repeated values.
+ self.check_output(f, value * 2, output * 2)
+ # Verify it doesn't double replace &.
+ self.check_output(f, '<&', '<&')
+
+ def test_format_html(self):
+ self.assertEqual(
+ html.format_html("{0} {1} {third} {fourth}",
+ "< Dangerous >",
+ html.mark_safe("safe"),
+ third="< dangerous again",
+ fourth=html.mark_safe("safe again")
+ ),
+ "< Dangerous > safe < dangerous again safe again"
+ )
+
+ def test_linebreaks(self):
+ f = html.linebreaks
+ items = (
+ ("para1\n\npara2\r\rpara3", "para1
\n\npara2
\n\npara3
"),
+ ("para1\nsub1\rsub2\n\npara2", "para1
sub1
sub2
\n\npara2
"),
+ ("para1\r\n\r\npara2\rsub1\r\rpara4", "para1
\n\npara2
sub1
\n\npara4
"),
+ ("para1\tmore\n\npara2", "para1\tmore
\n\npara2
"),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
+
+ def test_strip_tags(self):
+ f = html.strip_tags
+ items = (
+ ('a', 'a'),
+ ('a', 'a'),
+ ('e', 'e'),
+ ('b', 'b'),
+ ('ab
c', 'abc'),
+ ('ab
c', 'abc'),
+ ('de
f', 'def'),
+ ('foobar', 'foobar'),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
+
+ # Test with more lengthy content (also catching performance regressions)
+ for filename in ('strip_tags1.html', 'strip_tags2.txt'):
+ path = os.path.join(os.path.dirname(upath(__file__)), 'files', filename)
+ with open(path, 'r') as fp:
+ start = datetime.now()
+ stripped = html.strip_tags(fp.read())
+ elapsed = datetime.now() - start
+ self.assertEqual(elapsed.seconds, 0)
+ self.assertIn("Please try again.", stripped)
+ self.assertNotIn('<', stripped)
+
+ def test_strip_spaces_between_tags(self):
+ f = html.strip_spaces_between_tags
+ # Strings that should come out untouched.
+ items = (' ', ' ', ' ', ' x')
+ for value in items:
+ self.check_output(f, value)
+ # Strings that have spaces to strip.
+ items = (
+ (' ', ''),
+ ('hello
\n world
', 'hello
world
'),
+ ('\n\t
\n
\n', '\n\n'),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
+
+ def test_strip_entities(self):
+ f = html.strip_entities
+ # Strings that should come out untouched.
+ values = ("&", "&a", "&a", "aa")
+ for value in values:
+ self.check_output(f, value)
+ # Valid entities that should be stripped from the patterns.
+ entities = ("", "", "&a;", "&fdasdfasdfasdf;")
+ patterns = (
+ ("asdf %(entity)s ", "asdf "),
+ ("%(entity)s%(entity)s", ""),
+ ("&%(entity)s%(entity)s", "&"),
+ ("%(entity)s3", "3"),
+ )
+ for entity in entities:
+ for in_pattern, output in patterns:
+ self.check_output(f, in_pattern % {'entity': entity}, output)
+
+ def test_fix_ampersands(self):
+ f = html.fix_ampersands
+ # Strings without ampersands or with ampersands already encoded.
+ values = ("a", "b", "&a;", "& &x; ", "asdf")
+ patterns = (
+ ("%s", "%s"),
+ ("&%s", "&%s"),
+ ("&%s&", "&%s&"),
+ )
+ for value in values:
+ for in_pattern, out_pattern in patterns:
+ self.check_output(f, in_pattern % value, out_pattern % value)
+ # Strings with ampersands that need encoding.
+ items = (
+ ("", "&#;"),
+ ("ͫ ;", "ͫ ;"),
+ ("abc;", "abc;"),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
+
+ def test_escapejs(self):
+ f = html.escapejs
+ items = (
+ ('"double quotes" and \'single quotes\'', '\\u0022double quotes\\u0022 and \\u0027single quotes\\u0027'),
+ (r'\ : backslashes, too', '\\u005C : backslashes, too'),
+ ('and lots of whitespace: \r\n\t\v\f\b', 'and lots of whitespace: \\u000D\\u000A\\u0009\\u000B\\u000C\\u0008'),
+ (r'', '\\u003Cscript\\u003Eand this\\u003C/script\\u003E'),
+ ('paragraph separator:\u2029and line separator:\u2028', 'paragraph separator:\\u2029and line separator:\\u2028'),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
+
+ def test_clean_html(self):
+ f = html.clean_html
+ items = (
+ ('I believe in semantic markup!
', 'I believe in semantic markup!
'),
+ ('I escape & I don\'t target', 'I escape & I don\'t target'),
+ ('I kill whitespace
', 'I kill whitespace
'),
+ # also a regression test for #7267: this used to raise an UnicodeDecodeError
+ ('* foo
* bar
', ''),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
+
+ def test_remove_tags(self):
+ f = html.remove_tags
+ items = (
+ ("Yes", "b i", "Yes"),
+ ("x y
", "a b", "x y
"),
+ )
+ for value, tags, output in items:
+ self.assertEqual(f(value, tags), output)
--
cgit v1.3