From 844a24bbb97af663ebf8dbeab4499acafe105943 Mon Sep 17 00:00:00 2001
From: Carl Meyer
Date: Tue, 31 Jan 2012 20:36:11 +0000
Subject: Fixed #16921 -- Added assertHTMLEqual and assertHTMLNotEqual
assertions, and converted Django tests to use them where appropriate. Thanks
Greg Müllegger.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17414 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
tests/regressiontests/test_utils/tests.py | 254 ++++++++++++++++++++++++++++++
1 file changed, 254 insertions(+)
(limited to 'tests/regressiontests/test_utils')
diff --git a/tests/regressiontests/test_utils/tests.py b/tests/regressiontests/test_utils/tests.py
index b578bffc1a..19f35f9dbd 100644
--- a/tests/regressiontests/test_utils/tests.py
+++ b/tests/regressiontests/test_utils/tests.py
@@ -1,6 +1,8 @@
+# -*- coding: utf-8 -*-
from __future__ import with_statement, absolute_import
from django.forms import EmailField, IntegerField
+from django.http import HttpResponse
from django.template.loader import render_to_string
from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
from django.utils.unittest import skip
@@ -204,6 +206,258 @@ class SaveRestoreWarningState(TestCase):
self.restore_warnings_state()
+class HTMLEqualTests(TestCase):
+ def test_html_parser(self):
+ from django.test.html import parse_html
+ element = parse_html('')
+ self.assertEqual(len(element.children), 1)
+ self.assertEqual(element.children[0].name, 'p')
+ self.assertEqual(element.children[0].children[0], 'Hello')
+
+ parse_html('')
+ parse_html('
')
+ dom = parse_html('
foo')
+ self.assertEqual(len(dom.children), 1)
+ self.assertEqual(dom.name, 'p')
+ self.assertEqual(dom[0], 'foo')
+
+ def test_parse_html_in_script(self):
+ from django.test.html import parse_html
+ parse_html('');
+ parse_html('''
+
+ ''')
+
+ # script content will be parsed to text
+ dom = parse_html('''
+
+ ''')
+ self.assertEqual(len(dom.children), 1)
+ self.assertEqual(dom.children[0], "
foo
'' bar ")
+
+ def test_self_closing_tags(self):
+ from django.test.html import parse_html
+
+ self_closing_tags = ('br' , 'hr', 'input', 'img', 'meta', 'spacer',
+ 'link', 'frame', 'base', 'col')
+ for tag in self_closing_tags:
+ dom = parse_html('Hello <%s> world
' % tag)
+ self.assertEqual(len(dom.children), 3)
+ self.assertEqual(dom[0], 'Hello')
+ self.assertEqual(dom[1].name, tag)
+ self.assertEqual(dom[2], 'world')
+
+ dom = parse_html('Hello <%s /> world
' % tag)
+ self.assertEqual(len(dom.children), 3)
+ self.assertEqual(dom[0], 'Hello')
+ self.assertEqual(dom[1].name, tag)
+ self.assertEqual(dom[2], 'world')
+
+ def test_simple_equal_html(self):
+ self.assertHTMLEqual('', '')
+ self.assertHTMLEqual('
', '
')
+ self.assertHTMLEqual('
', '
')
+ self.assertHTMLEqual(
+ '',
+ '')
+ self.assertHTMLEqual(
+ '',
+ '')
+ self.assertHTMLEqual(
+ '',
+ '\n')
+ self.assertHTMLEqual(
+ '',
+ '')
+ self.assertHTMLEqual(
+ '',
+ '')
+ self.assertHTMLEqual(
+ 'Hello World !
',
+ 'Hello World\n\n!
')
+ self.assertHTMLEqual('
', '
')
+ self.assertHTMLEqual('
', '
')
+ self.assertHTMLEqual('
', '
')
+ self.assertHTMLEqual(' ', ' ')
+ self.assertHTMLEqual('Hello', '
Hello')
+ self.assertHTMLEqual('
Hello
World', 'Hello
World')
+
+ def test_ignore_comments(self):
+ self.assertHTMLEqual(
+ 'Hello World!
',
+ 'Hello World!
')
+
+ def test_unequal_html(self):
+ self.assertHTMLNotEqual('Hello
', 'Hello!
')
+ self.assertHTMLNotEqual('foobar
', 'foo bar
')
+ self.assertHTMLNotEqual('foo bar
', 'foo bar
')
+ self.assertHTMLNotEqual('foo nbsp
', 'foo
')
+ self.assertHTMLNotEqual('foo #20
', 'foo
')
+ self.assertHTMLNotEqual(
+ 'Hello World
',
+ 'Hello World
')
+ self.assertHTMLNotEqual(
+ 'Hello World
',
+ 'Hello World
')
+
+ def test_attributes(self):
+ self.assertHTMLEqual(
+ ' ',
+ ' ')
+ self.assertHTMLEqual(
+ ''' ''',
+ ' ')
+ self.assertHTMLNotEqual(
+ ' ',
+ ' ')
+
+ def test_complex_examples(self):
+ self.assertHTMLEqual(
+ """First name:
+
+Last name:
+
+Birthday:
+ """,
+ """
+
+ First name:
+
+
+ Last name:
+
+
+ Birthday:
+
+ """)
+
+ self.assertHTMLEqual(
+ """
+
+
+
+ Document
+
+
+
+
+ This is a valid paragraph
+
this is a div AFTER the p
+
+ """, """
+
+
+
+ Document
+
+
+
+ This is a valid paragraph
+
+
this is a div AFTER the p
+
+
+ """)
+
+ def test_html_contain(self):
+ from django.test.html import parse_html
+ # equal html contains each other
+ dom1 = parse_html('foo')
+ dom2 = parse_html('
foo
')
+ self.assertTrue(dom1 in dom2)
+ self.assertTrue(dom2 in dom1)
+
+ dom2 = parse_html('')
+ self.assertTrue(dom1 in dom2)
+ self.assertTrue(dom2 not in dom1)
+
+ self.assertFalse('foo
' in dom2)
+ self.assertTrue('foo' in dom2)
+
+ # when a root element is used ...
+ dom1 = parse_html('foo
bar
')
+ dom2 = parse_html('foo
bar
')
+ self.assertTrue(dom1 in dom2)
+ dom1 = parse_html('foo
')
+ self.assertTrue(dom1 in dom2)
+ dom1 = parse_html('bar
')
+ self.assertTrue(dom1 in dom2)
+
+ def test_count(self):
+ from django.test.html import parse_html
+ # equal html contains each other one time
+ dom1 = parse_html('foo')
+ dom2 = parse_html('
foo
')
+ self.assertEqual(dom1.count(dom2), 1)
+ self.assertEqual(dom2.count(dom1), 1)
+
+ dom2 = parse_html('foo
bar
')
+ self.assertEqual(dom2.count(dom1), 1)
+
+ dom2 = parse_html('foo foo
foo
')
+ self.assertEqual(dom2.count('foo'), 3)
+
+ dom2 = parse_html('foo
')
+ self.assertEqual(dom2.count('bar'), 0)
+ self.assertEqual(dom2.count('class'), 0)
+ self.assertEqual(dom2.count('p'), 0)
+ self.assertEqual(dom2.count('o'), 2)
+
+ dom2 = parse_html('foo
foo
')
+ self.assertEqual(dom2.count(dom1), 2)
+
+ dom2 = parse_html('')
+ self.assertEqual(dom2.count(dom1), 1)
+
+ dom2 = parse_html('')
+ self.assertEqual(dom2.count(dom1), 1)
+
+ dom2 = parse_html('foo
foo
')
+ self.assertEqual(dom2.count(dom1), 1)
+
+ dom2 = parse_html('foo
bar
')
+ self.assertEqual(dom2.count(dom1), 0)
+
+ def test_parsing_errors(self):
+ from django.test.html import HTMLParseError, parse_html
+ with self.assertRaises(AssertionError):
+ self.assertHTMLEqual('', '')
+ with self.assertRaises(AssertionError):
+ self.assertHTMLEqual('', '
')
+ with self.assertRaises(HTMLParseError):
+ parse_html('
')
+ with self.assertRaises(HTMLParseError):
+ parse_html('