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('

Hello

') + 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( + '

Hello

', + '

Hello

') + self.assertHTMLEqual( + '

Hello

', + '

Hello

') + self.assertHTMLEqual( + '
\n

Hello

', + '

Hello

\n') + self.assertHTMLEqual( + '

Hello\nWorld !

', + '

Hello World\n!

') + self.assertHTMLEqual( + '

Hello\nWorld !

', + '

Hello World\n!

') + 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( + '

HelloWorld

', + '

HelloWorld

') + self.assertHTMLNotEqual( + '

HelloWorld

', + '

HelloWorld

') + + def test_attributes(self): + self.assertHTMLEqual( + '', + '') + self.assertHTMLEqual( + '''''', + '') + self.assertHTMLNotEqual( + '', + '') + + def test_complex_examples(self): + self.assertHTMLEqual( + """ + + + + +""", + """ + + + + + + + + + + """) + + 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('

foo

') + 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('

foo

foo

') + self.assertEqual(dom2.count(dom1), 1) + + dom2 = parse_html('

foo

') + 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('