Imported specific functions in tests.utils_tests.test_html.

This commit is contained in:
Tim Graham 2017-02-01 18:37:16 -05:00
parent 597bfcbf8b
commit 2af8cd22a9
1 changed files with 36 additions and 37 deletions

View File

@ -2,8 +2,12 @@ import os
from datetime import datetime from datetime import datetime
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.utils import html, safestring
from django.utils.functional import lazystr from django.utils.functional import lazystr
from django.utils.html import (
conditional_escape, escape, escapejs, format_html, html_safe, linebreaks,
smart_urlquote, strip_spaces_between_tags, strip_tags,
)
from django.utils.safestring import mark_safe
class TestUtilsHtml(SimpleTestCase): class TestUtilsHtml(SimpleTestCase):
@ -18,7 +22,6 @@ class TestUtilsHtml(SimpleTestCase):
self.assertEqual(function(value), output) self.assertEqual(function(value), output)
def test_escape(self): def test_escape(self):
f = html.escape
items = ( items = (
('&', '&'), ('&', '&'),
('<', '&lt;'), ('<', '&lt;'),
@ -30,26 +33,26 @@ class TestUtilsHtml(SimpleTestCase):
patterns = ("%s", "asdf%sfdsa", "%s1", "1%sb") patterns = ("%s", "asdf%sfdsa", "%s1", "1%sb")
for value, output in items: for value, output in items:
for pattern in patterns: for pattern in patterns:
self.check_output(f, pattern % value, pattern % output) self.check_output(escape, pattern % value, pattern % output)
self.check_output(f, lazystr(pattern % value), pattern % output) self.check_output(escape, lazystr(pattern % value), pattern % output)
# Check repeated values. # Check repeated values.
self.check_output(f, value * 2, output * 2) self.check_output(escape, value * 2, output * 2)
# Verify it doesn't double replace &. # Verify it doesn't double replace &.
self.check_output(f, '<&', '&lt;&amp;') self.check_output(escape, '<&', '&lt;&amp;')
def test_format_html(self): def test_format_html(self):
self.assertEqual( self.assertEqual(
html.format_html("{} {} {third} {fourth}", format_html(
"{} {} {third} {fourth}",
"< Dangerous >", "< Dangerous >",
html.mark_safe("<b>safe</b>"), mark_safe("<b>safe</b>"),
third="< dangerous again", third="< dangerous again",
fourth=html.mark_safe("<i>safe again</i>") fourth=mark_safe("<i>safe again</i>"),
), ),
"&lt; Dangerous &gt; <b>safe</b> &lt; dangerous again <i>safe again</i>" "&lt; Dangerous &gt; <b>safe</b> &lt; dangerous again <i>safe again</i>"
) )
def test_linebreaks(self): def test_linebreaks(self):
f = html.linebreaks
items = ( items = (
("para1\n\npara2\r\rpara3", "<p>para1</p>\n\n<p>para2</p>\n\n<p>para3</p>"), ("para1\n\npara2\r\rpara3", "<p>para1</p>\n\n<p>para2</p>\n\n<p>para3</p>"),
("para1\nsub1\rsub2\n\npara2", "<p>para1<br />sub1<br />sub2</p>\n\n<p>para2</p>"), ("para1\nsub1\rsub2\n\npara2", "<p>para1<br />sub1<br />sub2</p>\n\n<p>para2</p>"),
@ -57,11 +60,10 @@ class TestUtilsHtml(SimpleTestCase):
("para1\tmore\n\npara2", "<p>para1\tmore</p>\n\n<p>para2</p>"), ("para1\tmore\n\npara2", "<p>para1\tmore</p>\n\n<p>para2</p>"),
) )
for value, output in items: for value, output in items:
self.check_output(f, value, output) self.check_output(linebreaks, value, output)
self.check_output(f, lazystr(value), output) self.check_output(linebreaks, lazystr(value), output)
def test_strip_tags(self): def test_strip_tags(self):
f = html.strip_tags
items = ( items = (
('<p>See: &#39;&eacute; is an apostrophe followed by e acute</p>', ('<p>See: &#39;&eacute; is an apostrophe followed by e acute</p>',
'See: &#39;&eacute; is an apostrophe followed by e acute'), 'See: &#39;&eacute; is an apostrophe followed by e acute'),
@ -83,14 +85,14 @@ class TestUtilsHtml(SimpleTestCase):
('&gotcha&#;<>', '&gotcha&#;<>'), ('&gotcha&#;<>', '&gotcha&#;<>'),
) )
for value, output in items: for value, output in items:
self.check_output(f, value, output) self.check_output(strip_tags, value, output)
self.check_output(f, lazystr(value), output) self.check_output(strip_tags, lazystr(value), output)
# Some convoluted syntax for which parsing may differ between python versions # Some convoluted syntax for which parsing may differ between python versions
output = html.strip_tags('<sc<!-- -->ript>test<<!-- -->/script>') output = strip_tags('<sc<!-- -->ript>test<<!-- -->/script>')
self.assertNotIn('<script>', output) self.assertNotIn('<script>', output)
self.assertIn('test', output) self.assertIn('test', output)
output = html.strip_tags('<script>alert()</script>&h') output = strip_tags('<script>alert()</script>&h')
self.assertNotIn('<script>', output) self.assertNotIn('<script>', output)
self.assertIn('alert()', output) self.assertIn('alert()', output)
@ -100,19 +102,18 @@ class TestUtilsHtml(SimpleTestCase):
with open(path, 'r') as fp: with open(path, 'r') as fp:
content = fp.read() content = fp.read()
start = datetime.now() start = datetime.now()
stripped = html.strip_tags(content) stripped = strip_tags(content)
elapsed = datetime.now() - start elapsed = datetime.now() - start
self.assertEqual(elapsed.seconds, 0) self.assertEqual(elapsed.seconds, 0)
self.assertIn("Please try again.", stripped) self.assertIn("Please try again.", stripped)
self.assertNotIn('<', stripped) self.assertNotIn('<', stripped)
def test_strip_spaces_between_tags(self): def test_strip_spaces_between_tags(self):
f = html.strip_spaces_between_tags
# Strings that should come out untouched. # Strings that should come out untouched.
items = (' <adf>', '<adf> ', ' </adf> ', ' <f> x</f>') items = (' <adf>', '<adf> ', ' </adf> ', ' <f> x</f>')
for value in items: for value in items:
self.check_output(f, value) self.check_output(strip_spaces_between_tags, value)
self.check_output(f, lazystr(value)) self.check_output(strip_spaces_between_tags, lazystr(value))
# Strings that have spaces to strip. # Strings that have spaces to strip.
items = ( items = (
('<d> </d>', '<d></d>'), ('<d> </d>', '<d></d>'),
@ -120,11 +121,10 @@ class TestUtilsHtml(SimpleTestCase):
('\n<p>\t</p>\n<p> </p>\n', '\n<p></p><p></p>\n'), ('\n<p>\t</p>\n<p> </p>\n', '\n<p></p><p></p>\n'),
) )
for value, output in items: for value, output in items:
self.check_output(f, value, output) self.check_output(strip_spaces_between_tags, value, output)
self.check_output(f, lazystr(value), output) self.check_output(strip_spaces_between_tags, lazystr(value), output)
def test_escapejs(self): def test_escapejs(self):
f = html.escapejs
items = ( items = (
('"double quotes" and \'single quotes\'', '\\u0022double quotes\\u0022 and \\u0027single quotes\\u0027'), ('"double quotes" and \'single quotes\'', '\\u0022double quotes\\u0022 and \\u0027single quotes\\u0027'),
(r'\ : backslashes, too', '\\u005C : backslashes, too'), (r'\ : backslashes, too', '\\u005C : backslashes, too'),
@ -139,11 +139,11 @@ class TestUtilsHtml(SimpleTestCase):
), ),
) )
for value, output in items: for value, output in items:
self.check_output(f, value, output) self.check_output(escapejs, value, output)
self.check_output(f, lazystr(value), output) self.check_output(escapejs, lazystr(value), output)
def test_smart_urlquote(self): def test_smart_urlquote(self):
quote = html.smart_urlquote quote = smart_urlquote
# IDNs are properly quoted # IDNs are properly quoted
self.assertEqual(quote('http://öäü.com/'), 'http://xn--4ca9at.com/') self.assertEqual(quote('http://öäü.com/'), 'http://xn--4ca9at.com/')
self.assertEqual(quote('http://öäü.com/öäü/'), 'http://xn--4ca9at.com/%C3%B6%C3%A4%C3%BC/') self.assertEqual(quote('http://öäü.com/öäü/'), 'http://xn--4ca9at.com/%C3%B6%C3%A4%C3%BC/')
@ -159,12 +159,11 @@ class TestUtilsHtml(SimpleTestCase):
def test_conditional_escape(self): def test_conditional_escape(self):
s = '<h1>interop</h1>' s = '<h1>interop</h1>'
self.assertEqual(html.conditional_escape(s), self.assertEqual(conditional_escape(s), '&lt;h1&gt;interop&lt;/h1&gt;')
'&lt;h1&gt;interop&lt;/h1&gt;') self.assertEqual(conditional_escape(mark_safe(s)), s)
self.assertEqual(html.conditional_escape(safestring.mark_safe(s)), s)
def test_html_safe(self): def test_html_safe(self):
@html.html_safe @html_safe
class HtmlClass: class HtmlClass:
def __str__(self): def __str__(self):
return "<h1>I'm a html class!</h1>" return "<h1>I'm a html class!</h1>"
@ -183,7 +182,7 @@ class TestUtilsHtml(SimpleTestCase):
def __str__(self): def __str__(self):
return 'some non html content' return 'some non html content'
@html.html_safe @html_safe
class Subclass(BaseClass): class Subclass(BaseClass):
def __str__(self): def __str__(self):
# overrides __str__ and is marked as html_safe # overrides __str__ and is marked as html_safe
@ -195,7 +194,7 @@ class TestUtilsHtml(SimpleTestCase):
def test_html_safe_defines_html_error(self): def test_html_safe_defines_html_error(self):
msg = "can't apply @html_safe to HtmlClass because it defines __html__()." msg = "can't apply @html_safe to HtmlClass because it defines __html__()."
with self.assertRaisesMessage(ValueError, msg): with self.assertRaisesMessage(ValueError, msg):
@html.html_safe @html_safe
class HtmlClass: class HtmlClass:
def __html__(self): def __html__(self):
return "<h1>I'm a html class!</h1>" return "<h1>I'm a html class!</h1>"
@ -203,6 +202,6 @@ class TestUtilsHtml(SimpleTestCase):
def test_html_safe_doesnt_define_str(self): def test_html_safe_doesnt_define_str(self):
msg = "can't apply @html_safe to HtmlClass because it doesn't define __str__()." msg = "can't apply @html_safe to HtmlClass because it doesn't define __str__()."
with self.assertRaisesMessage(ValueError, msg): with self.assertRaisesMessage(ValueError, msg):
@html.html_safe @html_safe
class HtmlClass: class HtmlClass:
pass pass