diff options
| author | Carl Meyer <carl@oddbird.net> | 2012-01-31 20:36:11 +0000 |
|---|---|---|
| committer | Carl Meyer <carl@oddbird.net> | 2012-01-31 20:36:11 +0000 |
| commit | 844a24bbb97af663ebf8dbeab4499acafe105943 (patch) | |
| tree | 08068310b38a44f2644cd94fd80f4c10fd23536a | |
| parent | c82f1dcf95d4ecdc7e020a4715fbb1b097a6a796 (diff) | |
Fixed #16921 -- Added assertHTMLEqual and assertHTMLNotEqual assertions, and converted Django tests to use them where appropriate. Thanks Greg Müllegger.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17414 bcc190cf-cafb-0310-a4f2-bffc1f526a37
61 files changed, 1345 insertions, 639 deletions
diff --git a/django/test/html.py b/django/test/html.py new file mode 100644 index 0000000000..ff073ba728 --- /dev/null +++ b/django/test/html.py @@ -0,0 +1,221 @@ +""" +Comparing two html documents. +""" +import re +from HTMLParser import HTMLParseError +from django.utils.encoding import force_unicode +from django.utils.htmlparser import HTMLParser + + +WHITESPACE = re.compile('\s+') + + +def normalize_whitespace(string): + return WHITESPACE.sub(' ', string) + + +class Element(object): + def __init__(self, name, attributes): + self.name = name + self.attributes = sorted(attributes) + self.children = [] + + def append(self, element): + if isinstance(element, basestring): + element = force_unicode(element) + element = normalize_whitespace(element) + if self.children: + if isinstance(self.children[-1], basestring): + self.children[-1] += element + self.children[-1] = normalize_whitespace(self.children[-1]) + return + elif self.children: + # removing last children if it is only whitespace + # this can result in incorrect dom representations since + # whitespace between inline tags like <span> is significant + if isinstance(self.children[-1], basestring): + if self.children[-1].isspace(): + self.children.pop() + if element: + self.children.append(element) + + def finalize(self): + def rstrip_last_element(children): + if children: + if isinstance(children[-1], basestring): + children[-1] = children[-1].rstrip() + if not children[-1]: + children.pop() + children = rstrip_last_element(children) + return children + + rstrip_last_element(self.children) + for i, child in enumerate(self.children): + if isinstance(child, basestring): + self.children[i] = child.strip() + elif hasattr(child, 'finalize'): + child.finalize() + + def __eq__(self, element): + if not hasattr(element, 'name'): + return False + if hasattr(element, 'name') and self.name != element.name: + return False + if len(self.attributes) != len(element.attributes): + return False + if self.attributes != element.attributes: + # attributes without a value is same as attribute with value that + # equals the attributes name: + # <input checked> == <input checked="checked"> + for i in range(len(self.attributes)): + attr, value = self.attributes[i] + other_attr, other_value = element.attributes[i] + if value is None: + value = attr + if other_value is None: + other_value = other_attr + if attr != other_attr or value != other_value: + return False + if self.children != element.children: + return False + return True + + def __ne__(self, element): + return not self.__eq__(element) + + def _count(self, element, count=True): + if not isinstance(element, basestring): + if self == element: + return 1 + i = 0 + for child in self.children: + # child is text content and element is also text content, then + # make a simple "text" in "text" + if isinstance(child, basestring): + if isinstance(element, basestring): + if count: + i += child.count(element) + elif element in child: + return 1 + else: + i += child._count(element, count=count) + if not count and i: + return i + return i + + def __contains__(self, element): + return self._count(element, count=False) > 0 + + def count(self, element): + return self._count(element, count=True) + + def __getitem__(self, key): + return self.children[key] + + def __unicode__(self): + output = u'<%s' % self.name + for key, value in self.attributes: + if value: + output += u' %s="%s"' % (key, value) + else: + output += u' %s' % key + if self.children: + output += u'>\n' + output += u''.join(unicode(c) for c in self.children) + output += u'\n</%s>' % self.name + else: + output += u' />' + return output + + def __repr__(self): + return unicode(self) + + +class RootElement(Element): + def __init__(self): + super(RootElement, self).__init__(None, ()) + + def __unicode__(self): + return u''.join(unicode(c) for c in self.children) + + +class Parser(HTMLParser): + SELF_CLOSING_TAGS = ('br' , 'hr', 'input', 'img', 'meta', 'spacer', + 'link', 'frame', 'base', 'col') + + def __init__(self): + HTMLParser.__init__(self) + self.root = RootElement() + self.open_tags = [] + self.element_positions = {} + + def error(self, msg): + raise HTMLParseError(msg, self.getpos()) + + def format_position(self, position=None, element=None): + if not position and element: + position = self.element_positions[element] + if position is None: + position = self.getpos() + if hasattr(position, 'lineno'): + position = position.lineno, position.offset + return 'Line %d, Column %d' % position + + @property + def current(self): + if self.open_tags: + return self.open_tags[-1] + else: + return self.root + + def handle_startendtag(self, tag, attrs): + self.handle_starttag(tag, attrs) + if tag not in self.SELF_CLOSING_TAGS: + self.handle_endtag(tag) + + def handle_starttag(self, tag, attrs): + element = Element(tag, attrs) + self.current.append(element) + if tag not in self.SELF_CLOSING_TAGS: + self.open_tags.append(element) + self.element_positions[element] = self.getpos() + + def handle_endtag(self, tag): + if not self.open_tags: + self.error("Unexpected end tag `%s` (%s)" % ( + tag, self.format_position())) + element = self.open_tags.pop() + while element.name != tag: + if not self.open_tags: + self.error("Unexpected end tag `%s` (%s)" % ( + tag, self.format_position())) + element = self.open_tags.pop() + + def handle_data(self, data): + self.current.append(data) + + def handle_charref(self, name): + self.current.append('&%s;' % name) + + def handle_entityref(self, name): + self.current.append('&%s;' % name) + + +def parse_html(html): + """ + Takes a string that contains *valid* HTML and turns it into a Python object + structure that can be easily compared against other HTML on semantic + equivilance. Syntactical differences like which quotation is used on + arguments will be ignored. + + """ + parser = Parser() + parser.feed(html) + parser.close() + document = parser.root + document.finalize() + # Removing ROOT element if it's not necessary + if len(document.children) == 1: + if not isinstance(document.children[0], basestring): + document = document.children[0] + return document diff --git a/django/test/testcases.py b/django/test/testcases.py index 2e011e4cea..0110d5e24d 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -1,5 +1,6 @@ from __future__ import with_statement +import difflib import os import re import sys @@ -29,12 +30,14 @@ from django.forms.fields import CharField from django.http import QueryDict from django.test import _doctest as doctest from django.test.client import Client +from django.test.html import HTMLParseError, parse_html from django.test.signals import template_rendered from django.test.utils import (get_warnings_state, restore_warnings_state, override_settings) from django.test.utils import ContextList from django.utils import simplejson, unittest as ut2 from django.utils.encoding import smart_str, force_unicode +from django.utils.unittest.util import safe_repr from django.views.static import serve __all__ = ('DocTestRunner', 'OutputChecker', 'TestCase', 'TransactionTestCase', @@ -78,6 +81,16 @@ def restore_transaction_methods(): transaction.leave_transaction_management = real_leave_transaction_management transaction.managed = real_managed + +def assert_and_parse_html(self, html, user_msg, msg): + try: + dom = parse_html(html) + except HTMLParseError, e: + standardMsg = u'%s\n%s' % (msg, e.msg) + self.fail(self._formatMessage(user_msg, standardMsg)) + return dom + + class OutputChecker(doctest.OutputChecker): def check_output(self, want, got, optionflags): """ @@ -396,6 +409,39 @@ class SimpleTestCase(ut2.TestCase): self.assertTrue(isinstance(fieldclass(*field_args, **field_kwargs), fieldclass)) + def assertHTMLEqual(self, html1, html2, msg=None): + """ + Asserts that two html snippets are semantically the same, + e.g. whitespace in most cases is ignored, attribute ordering is not + significant. The passed in arguments must be valid HTML. + + """ + dom1 = assert_and_parse_html(self, html1, msg, + u'First argument is not valid html:') + dom2 = assert_and_parse_html(self, html2, msg, + u'Second argument is not valid html:') + + if dom1 != dom2: + standardMsg = '%s != %s' % ( + safe_repr(dom1, True), safe_repr(dom2, True)) + diff = ('\n' + '\n'.join(difflib.ndiff( + unicode(dom1).splitlines(), + unicode(dom2).splitlines()))) + standardMsg = self._truncateMessage(standardMsg, diff) + self.fail(self._formatMessage(msg, standardMsg)) + + def assertHTMLNotEqual(self, html1, html2, msg=None): + """Asserts that two HTML snippets are not semantically equivalent.""" + dom1 = assert_and_parse_html(self, html1, msg, + u'First argument is not valid html:') + dom2 = assert_and_parse_html(self, html2, msg, + u'Second argument is not valid html:') + + if dom1 == dom2: + standardMsg = '%s == %s' % ( + safe_repr(dom1, True), safe_repr(dom2, True)) + self.fail(self._formatMessage(msg, standardMsg)) + class TransactionTestCase(SimpleTestCase): # The class we'll use for the test client self.client. @@ -554,7 +600,7 @@ class TransactionTestCase(SimpleTestCase): (url, expected_url)) def assertContains(self, response, text, count=None, status_code=200, - msg_prefix=''): + msg_prefix='', html=False): """ Asserts that a response indicates that some content was retrieved successfully, (i.e., the HTTP status code was as expected), and that @@ -576,7 +622,13 @@ class TransactionTestCase(SimpleTestCase): msg_prefix + "Couldn't retrieve content: Response code was %d" " (expected %d)" % (response.status_code, status_code)) text = smart_str(text, response._charset) - real_count = response.content.count(text) + content = response.content + if html: + content = assert_and_parse_html(self, content, None, + u"Response's content is not valid html:") + text = assert_and_parse_html(self, text, None, + u"Second argument is not valid html:") + real_count = content.count(text) if count is not None: self.assertEqual(real_count, count, msg_prefix + "Found %d instances of '%s' in response" @@ -586,7 +638,7 @@ class TransactionTestCase(SimpleTestCase): msg_prefix + "Couldn't find '%s' in response" % text) def assertNotContains(self, response, text, status_code=200, - msg_prefix=''): + msg_prefix='', html=False): """ Asserts that a response indicates that some content was retrieved successfully, (i.e., the HTTP status code was as expected), and that @@ -606,7 +658,13 @@ class TransactionTestCase(SimpleTestCase): msg_prefix + "Couldn't retrieve content: Response code was %d" " (expected %d)" % (response.status_code, status_code)) text = smart_str(text, response._charset) - self.assertEqual(response.content.count(text), 0, + content = response.content + if html: + content = assert_and_parse_html(self, content, None, + u'Response\'s content is no valid html:') + text = assert_and_parse_html(self, text, None, + u'Second argument is no valid html:') + self.assertEqual(content.count(text), 0, msg_prefix + "Response should not contain '%s'" % text) def assertFormError(self, response, form, field, errors, msg_prefix=''): diff --git a/django/utils/htmlparser.py b/django/utils/htmlparser.py new file mode 100644 index 0000000000..ed743f5679 --- /dev/null +++ b/django/utils/htmlparser.py @@ -0,0 +1,94 @@ +import HTMLParser as _HTMLParser + + +class HTMLParser(_HTMLParser.HTMLParser): + """ + Patched version of stdlib's HTMLParser with patch from: + http://bugs.python.org/issue670664 + """ + def __init__(self): + _HTMLParser.HTMLParser.__init__(self) + self.cdata_tag = None + + def set_cdata_mode(self, tag): + self.interesting = _HTMLParser.interesting_cdata + self.cdata_tag = tag.lower() + + def clear_cdata_mode(self): + self.interesting = _HTMLParser.interesting_normal + self.cdata_tag = None + + # Internal -- handle starttag, return end or -1 if not terminated + def parse_starttag(self, i): + self.__starttag_text = None + endpos = self.check_for_whole_start_tag(i) + if endpos < 0: + return endpos + rawdata = self.rawdata + self.__starttag_text = rawdata[i:endpos] + + # Now parse the data between i+1 and j into a tag and attrs + attrs = [] + match = _HTMLParser.tagfind.match(rawdata, i + 1) + assert match, 'unexpected call to parse_starttag()' + k = match.end() + self.lasttag = tag = rawdata[i + 1:k].lower() + + while k < endpos: + m = _HTMLParser.attrfind.match(rawdata, k) + if not m: + break + attrname, rest, attrvalue = m.group(1, 2, 3) + if not rest: + attrvalue = None + elif attrvalue[:1] == '\'' == attrvalue[-1:] or \ + attrvalue[:1] == '"' == attrvalue[-1:]: + attrvalue = attrvalue[1:-1] + attrvalue = self.unescape(attrvalue) + attrs.append((attrname.lower(), attrvalue)) + k = m.end() + + end = rawdata[k:endpos].strip() + if end not in (">", "/>"): + lineno, offset = self.getpos() + if "\n" in self.__starttag_text: + lineno = lineno + self.__starttag_text.count("\n") + offset = len(self.__starttag_text) \ + - self.__starttag_text.rfind("\n") + else: + offset = offset + len(self.__starttag_text) + self.error("junk characters in start tag: %r" + % (rawdata[k:endpos][:20],)) + if end.endswith('/>'): + # XHTML-style empty tag: <span attr="value" /> + self.handle_startendtag(tag, attrs) + else: + self.handle_starttag(tag, attrs) + if tag in self.CDATA_CONTENT_ELEMENTS: + self.set_cdata_mode(tag) # <--------------------------- Changed + return endpos + + # Internal -- parse endtag, return end or -1 if incomplete + def parse_endtag(self, i): + rawdata = self.rawdata + assert rawdata[i:i + 2] == "</", "unexpected call to parse_endtag" + match = _HTMLParser.endendtag.search(rawdata, i + 1) # > + if not match: + return -1 + j = match.end() + match = _HTMLParser.endtagfind.match(rawdata, i) # </ + tag + > + if not match: + if self.cdata_tag is not None: # *** add *** + self.handle_data(rawdata[i:j]) # *** add *** + return j # *** add *** + self.error("bad end tag: %r" % (rawdata[i:j],)) + # --- changed start --------------------------------------------------- + tag = match.group(1).strip() + if self.cdata_tag is not None: + if tag.lower() != self.cdata_tag: + self.handle_data(rawdata[i:j]) + return j + # --- changed end ----------------------------------------------------- + self.handle_endtag(tag.lower()) + self.clear_cdata_mode() + return j diff --git a/docs/releases/1.4.txt b/docs/releases/1.4.txt index f2c97f603a..cb0f01ed7d 100644 --- a/docs/releases/1.4.txt +++ b/docs/releases/1.4.txt @@ -475,6 +475,21 @@ Time zone support is enabled by default in new projects created with :djadmin:`startproject`. If you want to use this feature in an existing project, read the :ref:`migration guide <time-zones-migration-guide>`. +HTML comparisons in tests +~~~~~~~~~~~~~~~~~~~~~~~~~ + +The :class:`~django.test.testcase.TestCase` base class now has some helpers to +compare HTML without tripping over irrelevant differences in whitespace, +argument quoting and ordering, and closing of self-closing tags. HTML can +either be compared directly with the new +:meth:`~django.test.testcase.TestCase.assertHTMLEqual` and +:meth:`~django.test.testcase.TestCase.assertHTMLNotEqual` assertions, or use +the ``html=True`` flag with +:meth:`~django.test.testcase.TestCase.assertContains` and +:meth:`~django.test.testcase.TestCase.assertNotContains` to test if the test +client's response contains a given HTML fragment. See the :ref:`assertion +documentation<assertions>` for more information. + Minor features ~~~~~~~~~~~~~~ diff --git a/docs/topics/testing.txt b/docs/topics/testing.txt index f0f0b445f9..ebc9f1ab28 100644 --- a/docs/topics/testing.txt +++ b/docs/topics/testing.txt @@ -1542,17 +1542,33 @@ your test suite. self.assertFieldOutput(EmailField, {'a@a.com': 'a@a.com'}, {'aaa': [u'Enter a valid e-mail address.']}) -.. method:: TestCase.assertContains(response, text, count=None, status_code=200, msg_prefix='') +.. method:: TestCase.assertContains(response, text, count=None, status_code=200, msg_prefix='', html=False) Asserts that a ``Response`` instance produced the given ``status_code`` and that ``text`` appears in the content of the response. If ``count`` is provided, ``text`` must occur exactly ``count`` times in the response. -.. method:: TestCase.assertNotContains(response, text, status_code=200, msg_prefix='') + .. versionadded:: 1.4 + + Set ``html`` to ``True`` to handle ``text`` as HTML. The comparison with + the response content will be based on HTML semantics instead of + character-by-character equality. Whitespace is ignored in most cases, + attribute ordering is not significant. See + :func:`~TestCase.assertHTMLEqual` for more details. + +.. method:: TestCase.assertNotContains(response, text, status_code=200, msg_prefix='', html=False) Asserts that a ``Response`` instance produced the given ``status_code`` and that ``text`` does not appears in the content of the response. + .. versionadded:: 1.4 + + Set ``html`` to ``True`` to handle ``text`` as HTML. The comparison with + the response content will be based on HTML semantics instead of + character-by-character equality. Whitespace is ignored in most cases, + attribute ordering is not significant. See + :func:`~TestCase.assertHTMLEqual` for more details. + .. method:: TestCase.assertFormError(response, form, field, errors, msg_prefix='') Asserts that a field on a form raises the provided list of errors when @@ -1656,6 +1672,48 @@ your test suite. Person.objects.create(name="Aaron") Person.objects.create(name="Daniel") +.. method:: TestCase.assertHTMLEqual(html1, html2, msg=None) + + .. versionadded:: 1.4 + + Asserts that the strings ``html1`` and ``html2`` are equal. The comparison + is based on HTML semantics. The comparison takes following things into + account: + + * Whitespace before and after HTML tags is ignored + * All types of whitespace are considered equivalent + * All open tags are closed implicitly, i.e. when a surrounding tag is + closed or the HTML document ends + * Empty tags are equivalent to their self-closing version + * The ordering of attributes of an HTML element is not significant + * Attributes without an argument are equal to attributes that equal in + name and value (see the examples) + + The following examples are valid tests and don't raise any + ``AssertionError``:: + + self.assertHTMLEqual('<p>Hello <b>world!</p>', + '''<p> + Hello <b>world! <b/> + </p>''') + self.assertHTMLEqual( + '<input type="checkbox" checked="checked" id="id_accept_terms" />', + '<input id="id_accept_terms" type='checkbox' checked>') + + ``html1`` and ``html2`` must be valid HTML. An ``AssertionError`` will be + raised if one of them cannot be parsed. + +.. method:: TestCase.assertHTMLNotEqual(html1, html2, msg=None) + + .. versionadded:: 1.4 + + Asserts that the strings ``html1`` and ``html2`` are *not* equal. The + comparison is based on HTML semantics. See + :func:`~TestCase.assertHTMLEqual` for details. + + ``html1`` and ``html2`` must be valid HTML. An ``AssertionError`` will be + raised if one of them cannot be parsed. + .. _topics-testing-email: diff --git a/tests/modeltests/generic_relations/tests.py b/tests/modeltests/generic_relations/tests.py index adfba82cd6..0ac552cf77 100644 --- a/tests/modeltests/generic_relations/tests.py +++ b/tests/modeltests/generic_relations/tests.py @@ -200,11 +200,11 @@ class GenericRelationsTests(TestCase): def test_generic_inline_formsets(self): GenericFormSet = generic_inlineformset_factory(TaggedItem, extra=1) formset = GenericFormSet() - self.assertEqual(u''.join(form.as_p() for form in formset.forms), u"""<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" maxlength="50" /></p> + self.assertHTMLEqual(u''.join(form.as_p() for form in formset.forms), u"""<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" maxlength="50" /></p> <p><label for="id_generic_relations-taggeditem-content_type-object_id-0-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-0-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-0-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" id="id_generic_relations-taggeditem-content_type-object_id-0-id" /></p>""") formset = GenericFormSet(instance=Animal()) - self.assertEqual(u''.join(form.as_p() for form in formset.forms), u"""<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" maxlength="50" /></p> + self.assertHTMLEqual(u''.join(form.as_p() for form in formset.forms), u"""<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" maxlength="50" /></p> <p><label for="id_generic_relations-taggeditem-content_type-object_id-0-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-0-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-0-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" id="id_generic_relations-taggeditem-content_type-object_id-0-id" /></p>""") platypus = Animal.objects.create( @@ -216,13 +216,13 @@ class GenericRelationsTests(TestCase): tagged_item_id = TaggedItem.objects.get( tag='shiny', object_id=platypus.id ).id - self.assertEqual(u''.join(form.as_p() for form in formset.forms), u"""<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" value="shiny" maxlength="50" /></p> + self.assertHTMLEqual(u''.join(form.as_p() for form in formset.forms), u"""<p><label for="id_generic_relations-taggeditem-content_type-object_id-0-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-0-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-0-tag" value="shiny" maxlength="50" /></p> <p><label for="id_generic_relations-taggeditem-content_type-object_id-0-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-0-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-0-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-0-id" value="%s" id="id_generic_relations-taggeditem-content_type-object_id-0-id" /></p><p><label for="id_generic_relations-taggeditem-content_type-object_id-1-tag">Tag:</label> <input id="id_generic_relations-taggeditem-content_type-object_id-1-tag" type="text" name="generic_relations-taggeditem-content_type-object_id-1-tag" maxlength="50" /></p> <p><label for="id_generic_relations-taggeditem-content_type-object_id-1-DELETE">Delete:</label> <input type="checkbox" name="generic_relations-taggeditem-content_type-object_id-1-DELETE" id="id_generic_relations-taggeditem-content_type-object_id-1-DELETE" /><input type="hidden" name="generic_relations-taggeditem-content_type-object_id-1-id" id="id_generic_relations-taggeditem-content_type-object_id-1-id" /></p>""" % tagged_item_id) lion = Animal.objects.create(common_name="Lion", latin_name="Panthera leo") formset = GenericFormSet(instance=lion, prefix='x') - self.assertEqual(u''.join(form.as_p() for form in formset.forms), u"""<p><label for="id_x-0-tag">Tag:</label> <input id="id_x-0-tag" type="text" name="x-0-tag" maxlength="50" /></p> + self.assertHTMLEqual(u''.join(form.as_p() for form in formset.forms), u"""<p><label for="id_x-0-tag">Tag:</label> <input id="id_x-0-tag" type="text" name="x-0-tag" maxlength="50" /></p> <p><label for="id_x-0-DELETE">Delete:</label> <input type="checkbox" name="x-0-DELETE" id="id_x-0-DELETE" /><input type="hidden" name="x-0-id" id="id_x-0-id" /></p>""") def test_gfk_manager(self): diff --git a/tests/modeltests/model_forms/tests.py b/tests/modeltests/model_forms/tests.py index c4abdbbc6e..a2ad024827 100644 --- a/tests/modeltests/model_forms/tests.py +++ b/tests/modeltests/model_forms/tests.py @@ -298,7 +298,7 @@ class ModelFormBaseTest(TestCase): class Meta(SomeCategoryForm.Meta): exclude = ['url'] - self.assertEqual( + self.assertHTMLEqual( str(SubclassMeta()), """<tr><th><label for="id_name">Name:</label></th><td><input id="id_name" type="text" name="name" maxlength="20" /></td></tr> <tr><th><label for="id_slug">Slug:</label></th><td><input id="id_slug" type="text" name="slug" maxlength="20" /></td></tr> @@ -313,7 +313,7 @@ class ModelFormBaseTest(TestCase): self.assertEqual(OrderFields.base_fields.keys(), ['url', 'name']) - self.assertEqual( + self.assertHTMLEqual( str(OrderFields()), """<tr><th><label for="id_url">The URL:</label></th><td><input id="id_url" type="text" name="url" maxlength="40" /></td></tr> <tr><th><label for="id_name">Name:</label></th><td><input id="id_name" type="text" name="name" maxlength="20" /></td></tr>""" @@ -344,15 +344,15 @@ class TestWidgetForm(forms.ModelForm): class TestWidgets(TestCase): def test_base_widgets(self): frm = TestWidgetForm() - self.assertEqual( + self.assertHTMLEqual( str(frm['name']), '<textarea id="id_name" rows="10" cols="40" name="name"></textarea>' ) - self.assertEqual( + self.assertHTMLEqual( str(frm['url']), '<input id="id_url" type="text" class="url" name="url" maxlength="40" />' ) - self.assertEqual( + self.assertHTMLEqual( str(frm['slug']), '<input id="id_slug" type="text" name="slug" maxlength="20" />' ) @@ -563,25 +563,25 @@ class OldFormForXTests(TestCase): def test_base_form(self): self.assertEqual(Category.objects.count(), 0) f = BaseCategoryForm() - self.assertEqual( + self.assertHTMLEqual( str(f), """<tr><th><label for="id_name">Name:</label></th><td><input id="id_name" type="text" name="name" maxlength="20" /></td></tr> <tr><th><label for="id_slug">Slug:</label></th><td><input id="id_slug" type="text" name="slug" maxlength="20" /></td></tr> <tr><th><label for="id_url">The URL:</label></th><td><input id="id_url" type="text" name="url" maxlength="40" /></td></tr>""" ) - self.assertEqual( + self.assertHTMLEqual( str(f.as_ul()), """<li><label for="id_name">Name:</label> <input id="id_name" type="text" name="name" maxlength="20" /></li> <li><label for="id_slug">Slug:</label> <input id="id_slug" type="text" name="slug" maxlength="20" /></li> <li><label for="id_url">The URL:</label> <input id="id_url" type="text" name="url" maxlength="40" /></li>""" ) - self.assertEqual( + self.assertHTMLEqual( str(f["name"]), """<input id="id_name" type="text" name="name" maxlength="20" />""") def test_auto_id(self): f = BaseCategoryForm(auto_id=False) - self.assertEqual( + self.assertHTMLEqual( str(f.as_ul()), """<li>Name: <input type="text" name="name" maxlength="20" /></li> <li>Slug: <input type="text" name="slug" maxlength="20" /></li> @@ -653,7 +653,7 @@ class OldFormForXTests(TestCase): # ManyToManyFields are represented by a MultipleChoiceField, ForeignKeys and any # fields with the 'choices' attribute are represented by a ChoiceField. f = ArticleForm(auto_id=False) - self.assertEqual(unicode(f), '''<tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr> + self.assertHTMLEqual(unicode(f), '''<tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr> <tr><th>Slug:</th><td><input type="text" name="slug" maxlength="50" /></td></tr> <tr><th>Pub date:</th><td><input type="text" name="pub_date" /></td></tr> <tr><th>Writer:</th><td><select name="writer"> @@ -681,14 +681,14 @@ class OldFormForXTests(TestCase): # a value of None. If a field isn't specified on a form, the object created # from the form can't provide a value for that field! f = PartialArticleForm(auto_id=False) - self.assertEqual(unicode(f), '''<tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr> + self.assertHTMLEqual(unicode(f), '''<tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr> <tr><th>Pub date:</th><td><input type="text" name="pub_date" /></td></tr>''') # When the ModelForm is passed an instance, that instance's current values are # inserted as 'initial' data in each Field. w = Writer.objects.get(name='Mike Royko') f = RoykoForm(auto_id=False, instance=w) - self.assertEqual(unicode(f), '''<tr><th>Name:</th><td><input type="text" name="name" value="Mike Royko" maxlength="50" /><br /><span class="helptext">Use both first and last names.</span></td></tr>''') + self.assertHTMLEqual(unicode(f), '''<tr><th>Name:</th><td><input type="text" name="name" value="Mike Royko" maxlength="50" /><br /><span class="helptext">Use both first and last names.</span></td></tr>''') art = Article( headline='Test article', @@ -701,7 +701,7 @@ class OldFormForXTests(TestCase): art_id_1 = art.id self.assertEqual(art_id_1 is not None, True) f = TestArticleForm(auto_id=False, instance=art) - self.assertEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" value="Test article" maxlength="50" /></li> + self.assertHTMLEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" value="Test article" maxlength="50" /></li> <li>Slug: <input type="text" name="slug" value="test-article" maxlength="50" /></li> <li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li> <li>Writer: <select name="writer"> @@ -741,7 +741,7 @@ class OldFormForXTests(TestCase): 'slug': 'new-headline', 'pub_date': u'1988-01-04' }, auto_id=False, instance=art) - self.assertEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /></li> + self.assertHTMLEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /></li> <li>Slug: <input type="text" name="slug" value="new-headline" maxlength="50" /></li> <li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li>''') self.assertEqual(f.is_valid(), True) @@ -755,7 +755,7 @@ class OldFormForXTests(TestCase): new_art.categories.add(Category.objects.get(name='Entertainment')) self.assertEqual(map(lambda o: o.name, new_art.categories.all()), ["Entertainment"]) f = TestArticleForm(auto_id=False, instance=new_art) - self.assertEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /></li> + self.assertHTMLEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /></li> <li>Slug: <input type="text" name="slug" value="new-headline" maxlength="50" /></li> <li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li> <li>Writer: <select name="writer"> @@ -783,7 +783,7 @@ class OldFormForXTests(TestCase): 'headline': 'Your headline here', 'categories': [str(c1.id), str(c2.id)] }) - self.assertEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" value="Your headline here" maxlength="50" /></li> + self.assertHTMLEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" value="Your headline here" maxlength="50" /></li> <li>Slug: <input type="text" name="slug" maxlength="50" /></li> <li>Pub date: <input type="text" name="pub_date" /></li> <li>Writer: <select name="writer"> @@ -877,7 +877,7 @@ class OldFormForXTests(TestCase): # at runtime, based on the data in the database when the form is displayed, not # the data in the database when the form is instantiated. f = ArticleForm(auto_id=False) - self.assertEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" maxlength="50" /></li> + self.assertHTMLEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" maxlength="50" /></li> <li>Slug: <input type="text" name="slug" maxlength="50" /></li> <li>Pub date: <input type="text" name="pub_date" /></li> <li>Writer: <select name="writer"> @@ -902,7 +902,7 @@ class OldFormForXTests(TestCase): self.assertEqual(c4.name, 'Fourth') w_bernstein = Writer.objects.create(name='Carl Bernstein') self.assertEqual(w_bernstein.name, 'Carl Bernstein') - self.assertEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" maxlength="50" /></li> + self.assertHTMLEqual(f.as_ul(), '''<li>Headline: <input type="text" name="headline" maxlength="50" /></li> <li>Slug: <input type="text" name="slug" maxlength="50" /></li> <li>Pub date: <input type="text" name="pub_date" /></li> <li>Writer: <select name="writer"> @@ -1081,7 +1081,7 @@ class OldFormForXTests(TestCase): bw2.delete() form = WriterProfileForm() - self.assertEqual(form.as_p(), '''<p><label for="id_writer">Writer:</label> <select name="writer" id="id_writer"> + self.assertHTMLEqual(form.as_p(), '''<p><label for="id_writer">Writer:</label> <select name="writer" id="id_writer"> <option value="" selected="selected">---------</option> <option value="%s">Bob Woodward</option> <option value="%s">Carl Bernstein</option> @@ -1099,7 +1099,7 @@ class OldFormForXTests(TestCase): self.assertEqual(unicode(instance), 'Bob Woodward is 65') form = WriterProfileForm(instance=instance) - self.assertEqual(form.as_p(), '''<p><label for="id_writer">Writer:</label> <select name="writer" id="id_writer"> + self.assertHTMLEqual(form.as_p(), '''<p><label for="id_writer">Writer:</label> <select name="writer" id="id_writer"> <option value="">---------</option> <option value="%s" selected="selected">Bob Woodward</option> <option value="%s">Carl Bernstein</option> @@ -1374,7 +1374,7 @@ class OldFormForXTests(TestCase): # Similar to a regular Form class you can define custom media to be used on # the ModelForm. f = ModelFormWithMedia() - self.assertEqual(unicode(f.media), '''<link href="/some/form/css" type="text/css" media="all" rel="stylesheet" /> + self.assertHTMLEqual(unicode(f.media), '''<link href="/some/form/css" type="text/css" media="all" rel="stylesheet" /> <script type="text/javascript" src="/some/form/javascript"></script>''') f = CommaSeparatedIntegerForm({'field': '1,2,3'}) @@ -1443,7 +1443,7 @@ class OldFormForXTests(TestCase): (22, u'Pear'))) form = InventoryForm(instance=core) - self.assertEqual(unicode(form['parent']), '''<select name="parent" id="id_parent"> + self.assertHTMLEqual(unicode(form['parent']), '''<select name="parent" id="id_parent"> <option value="">---------</option> <option value="86" selected="selected">Apple</option> <option value="87">Core</option> @@ -1464,7 +1464,7 @@ class OldFormForXTests(TestCase): self.assertEqual(CategoryForm.base_fields.keys(), ['description', 'url']) - self.assertEqual(unicode(CategoryForm()), '''<tr><th><label for="id_description">Description:</label></th><td><input type="text" name="description" id="id_description" /></td></tr> + self.assertHTMLEqual(unicode(CategoryForm()), '''<tr><th><label for="id_description">Description:</label></th><td><input type="text" name="description" id="id_description" /></td></tr> <tr><th><label for="id_url">The URL:</label></th><td><input id="id_url" type="text" name="url" maxlength="40" /></td></tr>''') # to_field_name should also work on ModelMultipleChoiceField ################## @@ -1479,5 +1479,5 @@ class OldFormForXTests(TestCase): def test_model_field_that_returns_none_to_exclude_itself_with_explicit_fields(self): self.assertEqual(CustomFieldForExclusionForm.base_fields.keys(), ['name']) - self.assertEqual(unicode(CustomFieldForExclusionForm()), + self.assertHTMLEqual(unicode(CustomFieldForExclusionForm()), '''<tr><th><label for="id_name">Name:</label></th><td><input id="id_name" type="text" name="name" maxlength="10" /></td></tr>''') diff --git a/tests/modeltests/model_formsets/tests.py b/tests/modeltests/model_formsets/tests.py index 2be3a0ddff..46941471b1 100644 --- a/tests/modeltests/model_formsets/tests.py +++ b/tests/modeltests/model_formsets/tests.py @@ -95,11 +95,11 @@ class ModelFormsetTest(TestCase): formset = AuthorFormSet(queryset=qs) self.assertEqual(len(formset.forms), 3) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" maxlength="100" /><input type="hidden" name="form-0-id" id="id_form-0-id" /></p>') - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_form-1-name">Name:</label> <input id="id_form-1-name" type="text" name="form-1-name" maxlength="100" /><input type="hidden" name="form-1-id" id="id_form-1-id" /></p>') - self.assertEqual(formset.forms[2].as_p(), + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_form-2-name">Name:</label> <input id="id_form-2-name" type="text" name="form-2-name" maxlength="100" /><input type="hidden" name="form-2-id" id="id_form-2-id" /></p>') data = { @@ -133,11 +133,11 @@ class ModelFormsetTest(TestCase): formset = AuthorFormSet(queryset=qs) self.assertEqual(len(formset.forms), 3) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" value="Arthur Rimbaud" maxlength="100" /><input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /></p>' % author2.id) - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_form-1-name">Name:</label> <input id="id_form-1-name" type="text" name="form-1-name" value="Charles Baudelaire" maxlength="100" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" /></p>' % author1.id) - self.assertEqual(formset.forms[2].as_p(), + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_form-2-name">Name:</label> <input id="id_form-2-name" type="text" name="form-2-name" maxlength="100" /><input type="hidden" name="form-2-id" id="id_form-2-id" /></p>') data = { @@ -171,16 +171,16 @@ class ModelFormsetTest(TestCase): formset = AuthorFormSet(queryset=qs) self.assertEqual(len(formset.forms), 4) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" value="Arthur Rimbaud" maxlength="100" /></p>\n' '<p><label for="id_form-0-DELETE">Delete:</label> <input type="checkbox" name="form-0-DELETE" id="id_form-0-DELETE" /><input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /></p>' % author2.id) - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_form-1-name">Name:</label> <input id="id_form-1-name" type="text" name="form-1-name" value="Charles Baudelaire" maxlength="100" /></p>\n' '<p><label for="id_form-1-DELETE">Delete:</label> <input type="checkbox" name="form-1-DELETE" id="id_form-1-DELETE" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" /></p>' % author1.id) - self.assertEqual(formset.forms[2].as_p(), + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_form-2-name">Name:</label> <input id="id_form-2-name" type="text" name="form-2-name" value="Paul Verlaine" maxlength="100" /></p>\n' '<p><label for="id_form-2-DELETE">Delete:</label> <input type="checkbox" name="form-2-DELETE" id="id_form-2-DELETE" /><input type="hidden" name="form-2-id" value="%d" id="id_form-2-id" /></p>' % author3.id) - self.assertEqual(formset.forms[3].as_p(), + self.assertHTMLEqual(formset.forms[3].as_p(), '<p><label for="id_form-3-name">Name:</label> <input id="id_form-3-name" type="text" name="form-3-name" maxlength="100" /></p>\n' '<p><label for="id_form-3-DELETE">Delete:</label> <input type="checkbox" name="form-3-DELETE" id="id_form-3-DELETE" /><input type="hidden" name="form-3-id" id="id_form-3-id" /></p>') @@ -381,7 +381,7 @@ class ModelFormsetTest(TestCase): BetterAuthorFormSet = modelformset_factory(BetterAuthor) formset = BetterAuthorFormSet() self.assertEqual(len(formset.forms), 1) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" maxlength="100" /></p>\n' '<p><label for="id_form-0-write_speed">Write speed:</label> <input type="text" name="form-0-write_speed" id="id_form-0-write_speed" /><input type="hidden" name="form-0-author_ptr" id="id_form-0-author_ptr" /></p>') @@ -404,10 +404,10 @@ class ModelFormsetTest(TestCase): formset = BetterAuthorFormSet() self.assertEqual(len(formset.forms), 2) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" value="Ernest Hemingway" maxlength="100" /></p>\n' '<p><label for="id_form-0-write_speed">Write speed:</label> <input type="text" name="form-0-write_speed" value="10" id="id_form-0-write_speed" /><input type="hidden" name="form-0-author_ptr" value="%d" id="id_form-0-author_ptr" /></p>' % hemingway_id) - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_form-1-name">Name:</label> <input id="id_form-1-name" type="text" name="form-1-name" maxlength="100" /></p>\n' '<p><label for="id_form-1-write_speed">Write speed:</label> <input type="text" name="form-1-write_speed" id="id_form-1-write_speed" /><input type="hidden" name="form-1-author_ptr" id="id_form-1-author_ptr" /></p>') @@ -436,11 +436,11 @@ class ModelFormsetTest(TestCase): formset = AuthorBooksFormSet(instance=author) self.assertEqual(len(formset.forms), 3) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_book_set-0-title">Title:</label> <input id="id_book_set-0-title" type="text" name="book_set-0-title" maxlength="100" /><input type="hidden" name="book_set-0-author" value="%d" id="id_book_set-0-author" /><input type="hidden" name="book_set-0-id" id="id_book_set-0-id" /></p>' % author.id) - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_book_set-1-title">Title:</label> <input id="id_book_set-1-title" type="text" name="book_set-1-title" maxlength="100" /><input type="hidden" name="book_set-1-author" value="%d" id="id_book_set-1-author" /><input type="hidden" name="book_set-1-id" id="id_book_set-1-id" /></p>' % author.id) - self.assertEqual(formset.forms[2].as_p(), + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_book_set-2-title">Title:</label> <input id="id_book_set-2-title" type="text" name="book_set-2-title" maxlength="100" /><input type="hidden" name="book_set-2-author" value="%d" id="id_book_set-2-author" /><input type="hidden" name="book_set-2-id" id="id_book_set-2-id" /></p>' % author.id) data = { @@ -470,11 +470,11 @@ class ModelFormsetTest(TestCase): formset = AuthorBooksFormSet(instance=author) self.assertEqual(len(formset.forms), 3) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_book_set-0-title">Title:</label> <input id="id_book_set-0-title" type="text" name="book_set-0-title" value="Les Fleurs du Mal" maxlength="100" /><input type="hidden" name="book_set-0-author" value="%d" id="id_book_set-0-author" /><input type="hidden" name="book_set-0-id" value="%d" id="id_book_set-0-id" /></p>' % (author.id, book1.id)) - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_book_set-1-title">Title:</label> <input id="id_book_set-1-title" type="text" name="book_set-1-title" maxlength="100" /><input type="hidden" name="book_set-1-author" value="%d" id="id_book_set-1-author" /><input type="hidden" name="book_set-1-id" id="id_book_set-1-id" /></p>' % author.id) - self.assertEqual(formset.forms[2].as_p(), + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_book_set-2-title">Title:</label> <input id="id_book_set-2-title" type="text" name="book_set-2-title" maxlength="100" /><input type="hidden" name="book_set-2-author" value="%d" id="id_book_set-2-author" /><input type="hidden" name="book_set-2-id" id="id_book_set-2-id" /></p>' % author.id) data = { @@ -534,9 +534,9 @@ class ModelFormsetTest(TestCase): formset = AuthorBooksFormSet(prefix="test") self.assertEqual(len(formset.forms), 2) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_test-0-title">Title:</label> <input id="id_test-0-title" type="text" name="test-0-title" maxlength="100" /><input type="hidden" name="test-0-author" id="id_test-0-author" /><input type="hidden" name="test-0-id" id="id_test-0-id" /></p>') - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_test-1-title">Title:</label> <input id="id_test-1-title" type="text" name="test-1-title" maxlength="100" /><input type="hidden" name="test-1-author" id="id_test-1-author" /><input type="hidden" name="test-1-id" id="id_test-1-id" /></p>') def test_inline_formsets_with_custom_pk(self): @@ -548,7 +548,7 @@ class ModelFormsetTest(TestCase): formset = AuthorBooksFormSet2(instance=author) self.assertEqual(len(formset.forms), 1) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_bookwithcustompk_set-0-my_pk">My pk:</label> <input type="text" name="bookwithcustompk_set-0-my_pk" id="id_bookwithcustompk_set-0-my_pk" /></p>\n' '<p><label for="id_bookwithcustompk_set-0-title">Title:</label> <input id="id_bookwithcustompk_set-0-title" type="text" name="bookwithcustompk_set-0-title" maxlength="100" /><input type="hidden" name="bookwithcustompk_set-0-author" value="1" id="id_bookwithcustompk_set-0-author" /></p>') @@ -580,7 +580,7 @@ class ModelFormsetTest(TestCase): formset = AuthorBooksFormSet3(instance=author) self.assertEqual(len(formset.forms), 1) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_alternatebook_set-0-title">Title:</label> <input id="id_alternatebook_set-0-title" type="text" name="alternatebook_set-0-title" maxlength="100" /></p>\n' '<p><label for="id_alternatebook_set-0-notes">Notes:</label> <input id="id_alternatebook_set-0-notes" type="text" name="alternatebook_set-0-notes" maxlength="100" /><input type="hidden" name="alternatebook_set-0-author" value="1" id="id_alternatebook_set-0-author" /><input type="hidden" name="alternatebook_set-0-book_ptr" id="id_alternatebook_set-0-book_ptr" /></p>') @@ -671,15 +671,15 @@ class ModelFormsetTest(TestCase): custom_qs = Book.objects.order_by('-title') formset = AuthorBooksFormSet(instance=author, queryset=custom_qs) self.assertEqual(len(formset.forms), 5) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_book_set-0-title">Title:</label> <input id="id_book_set-0-title" type="text" name="book_set-0-title" value="Les Paradis Artificiels" maxlength="100" /><input type="hidden" name="book_set-0-author" value="1" id="id_book_set-0-author" /><input type="hidden" name="book_set-0-id" value="1" id="id_book_set-0-id" /></p>') - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_book_set-1-title">Title:</label> <input id="id_book_set-1-title" type="text" name="book_set-1-title" value="Les Fleurs du Mal" maxlength="100" /><input type="hidden" name="book_set-1-author" value="1" id="id_book_set-1-author" /><input type="hidden" name="book_set-1-id" value="2" id="id_book_set-1-id" /></p>') - self.assertEqual(formset.forms[2].as_p(), + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_book_set-2-title">Title:</label> <input id="id_book_set-2-title" type="text" name="book_set-2-title" value="Flowers of Evil" maxlength="100" /><input type="hidden" name="book_set-2-author" value="1" id="id_book_set-2-author" /><input type="hidden" name="book_set-2-id" value="3" id="id_book_set-2-id" /></p>') - self.assertEqual(formset.forms[3].as_p(), + self.assertHTMLEqual(formset.forms[3].as_p(), '<p><label for="id_book_set-3-title">Title:</label> <input id="id_book_set-3-title" type="text" name="book_set-3-title" maxlength="100" /><input type="hidden" name="book_set-3-author" value="1" id="id_book_set-3-author" /><input type="hidden" name="book_set-3-id" id="id_book_set-3-id" /></p>') - self.assertEqual(formset.forms[4].as_p(), + self.assertHTMLEqual(formset.forms[4].as_p(), '<p><label for="id_book_set-4-title">Title:</label> <input id="id_book_set-4-title" type="text" name="book_set-4-title" maxlength="100" /><input type="hidden" name="book_set-4-author" value="1" id="id_book_set-4-author" /><input type="hidden" name="book_set-4-id" id="id_book_set-4-id" /></p>') data = { @@ -700,11 +700,11 @@ class ModelFormsetTest(TestCase): custom_qs = Book.objects.filter(title__startswith='F') formset = AuthorBooksFormSet(instance=author, queryset=custom_qs) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_book_set-0-title">Title:</label> <input id="id_book_set-0-title" type="text" name="book_set-0-title" value="Flowers of Evil" maxlength="100" /><input type="hidden" name="book_set-0-author" value="1" id="id_book_set-0-author" /><input type="hidden" name="book_set-0-id" value="3" id="id_book_set-0-id" /></p>') - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_book_set-1-title">Title:</label> <input id="id_book_set-1-title" type="text" name="book_set-1-title" maxlength="100" /><input type="hidden" name="book_set-1-author" value="1" id="id_book_set-1-author" /><input type="hidden" name="book_set-1-id" id="id_book_set-1-id" /></p>') - self.assertEqual(formset.forms[2].as_p(), + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_book_set-2-title">Title:</label> <input id="id_book_set-2-title" type="text" name="book_set-2-title" maxlength="100" /><input type="hidden" name="book_set-2-author" value="1" id="id_book_set-2-author" /><input type="hidden" name="book_set-2-id" id="id_book_set-2-id" /></p>') data = { @@ -725,7 +725,7 @@ class ModelFormsetTest(TestCase): CustomPrimaryKeyFormSet = modelformset_factory(CustomPrimaryKey) formset = CustomPrimaryKeyFormSet() self.assertEqual(len(formset.forms), 1) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_form-0-my_pk">My pk:</label> <input id="id_form-0-my_pk" type="text" name="form-0-my_pk" maxlength="10" /></p>\n' '<p><label for="id_form-0-some_field">Some field:</label> <input id="id_form-0-some_field" type="text" name="form-0-some_field" maxlength="100" /></p>') @@ -736,9 +736,9 @@ class ModelFormsetTest(TestCase): FormSet = inlineformset_factory(Place, Owner, extra=2, can_delete=False) formset = FormSet(instance=place) self.assertEqual(len(formset.forms), 2) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_owner_set-0-name">Name:</label> <input id="id_owner_set-0-name" type="text" name="owner_set-0-name" maxlength="100" /><input type="hidden" name="owner_set-0-place" value="1" id="id_owner_set-0-place" /><input type="hidden" name="owner_set-0-auto_id" id="id_owner_set-0-auto_id" /></p>') - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_owner_set-1-name">Name:</label> <input id="id_owner_set-1-name" type="text" name="owner_set-1-name" maxlength="100" /><input type="hidden" name="owner_set-1-place" value="1" id="id_owner_set-1-place" /><input type="hidden" name="owner_set-1-auto_id" id="id_owner_set-1-auto_id" /></p>') data = { @@ -760,12 +760,12 @@ class ModelFormsetTest(TestCase): formset = FormSet(instance=place) self.assertEqual(len(formset.forms), 3) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_owner_set-0-name">Name:</label> <input id="id_owner_set-0-name" type="text" name="owner_set-0-name" value="Joe Perry" maxlength="100" /><input type="hidden" name="owner_set-0-place" value="1" id="id_owner_set-0-place" /><input type="hidden" name="owner_set-0-auto_id" value="%d" id="id_owner_set-0-auto_id" /></p>' % owner1.auto_id) - self.assertEqual(formset.forms[1].as_p(), + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_owner_set-1-name">Name:</label> <input id="id_owner_set-1-name" type="text" name="owner_set-1-name" maxlength="100" /><input type="hidden" name="owner_set-1-place" value="1" id="id_owner_set-1-place" /><input type="hidden" name="owner_set-1-auto_id" id="id_owner_set-1-auto_id" /></p>') - self.assertEqual(formset.forms[2].as_p(), + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_owner_set-2-name">Name:</label> <input id="id_owner_set-2-name" type="text" name="owner_set-2-name" maxlength="100" /><input type="hidden" name="owner_set-2-place" value="1" id="id_owner_set-2-place" /><input type="hidden" name="owner_set-2-auto_id" id="id_owner_set-2-auto_id" /></p>') data = { @@ -791,7 +791,7 @@ class ModelFormsetTest(TestCase): FormSet = modelformset_factory(OwnerProfile) formset = FormSet() - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_form-0-owner">Owner:</label> <select name="form-0-owner" id="id_form-0-owner">\n' '<option value="" selected="selected">---------</option>\n' '<option value="%d">Joe Perry at Giordanos</option>\n' @@ -806,7 +806,7 @@ class ModelFormsetTest(TestCase): formset = FormSet(instance=owner1) self.assertEqual(len(formset.forms), 1) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_ownerprofile-0-age">Age:</label> <input type="text" name="ownerprofile-0-age" id="id_ownerprofile-0-age" /><input type="hidden" name="ownerprofile-0-owner" value="%d" id="id_ownerprofile-0-owner" /></p>' % owner1.auto_id) @@ -827,7 +827,7 @@ class ModelFormsetTest(TestCase): formset = FormSet(instance=owner1) self.assertEqual(len(formset.forms), 1) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_ownerprofile-0-age">Age:</label> <input type="text" name="ownerprofile-0-age" value="54" id="id_ownerprofile-0-age" /><input type="hidden" name="ownerprofile-0-owner" value="%d" id="id_ownerprofile-0-owner" /></p>' % owner1.auto_id) @@ -856,7 +856,7 @@ class ModelFormsetTest(TestCase): formset = FormSet(instance=place) self.assertEqual(len(formset.forms), 1) - self.assertEqual(formset.forms[0].as_p(), + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_location_set-0-lat">Lat:</label> <input id="id_location_set-0-lat" type="text" name="location_set-0-lat" maxlength="100" /></p>\n' '<p><label for="id_location_set-0-lon">Lon:</label> <input id="id_location_set-0-lon" type="text" name="location_set-0-lon" maxlength="100" /><input type="hidden" name="location_set-0-place" value="1" id="id_location_set-0-place" /><input type="hidden" name="location_set-0-id" id="id_location_set-0-id" /></p>') @@ -982,7 +982,7 @@ class ModelFormsetTest(TestCase): now = form.fields['date_joined'].initial() result = form.as_p() result = re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d+)?', '__DATETIME__', result) - self.assertEqual(result, + self.assertHTMLEqual(result, '<p><label for="id_membership_set-0-date_joined">Date joined:</label> <input type="text" name="membership_set-0-date_joined" value="__DATETIME__" id="id_membership_set-0-date_joined" /><input type="hidden" name="initial-membership_set-0-date_joined" value="__DATETIME__" id="initial-membership_set-0-id_membership_set-0-date_joined" /></p>\n' '<p><label for="id_membership_set-0-karma">Karma:</label> <input type="text" name="membership_set-0-karma" id="id_membership_set-0-karma" /><input type="hidden" name="membership_set-0-person" value="%d" id="id_membership_set-0-person" /><input type="hidden" name="membership_set-0-id" id="id_membership_set-0-id" /></p>' % person.id) diff --git a/tests/regressiontests/admin_inlines/tests.py b/tests/regressiontests/admin_inlines/tests.py index 3ea2ce476e..e00a56d364 100644 --- a/tests/regressiontests/admin_inlines/tests.py +++ b/tests/regressiontests/admin_inlines/tests.py @@ -34,7 +34,7 @@ class TestInline(TestCase): can_delete should be passed to inlineformset factory. """ response = self.client.get(self.change_url) - inner_formset = response.context[-1]['inline_admin_formsets'][0].formset + inner_formset = response.context['inline_admin_formsets'][0].formset expected = InnerInline.can_delete actual = inner_formset.can_delete self.assertEqual(expected, actual, 'can_delete must be equal') @@ -134,7 +134,7 @@ class TestInline(TestCase): 'id="id_-1-0-capo_famiglia" />') self.assertContains(response, '<input id="id_-1-0-name" type="text" class="vTextField" ' - 'name="-1-0-name" maxlength="100" />') + 'name="-1-0-name" maxlength="100" />', html=True) self.assertContains(response, '<input type="hidden" name="-2-0-id" id="id_-2-0-id" />') @@ -143,7 +143,7 @@ class TestInline(TestCase): 'id="id_-2-0-capo_famiglia" />') self.assertContains(response, '<input id="id_-2-0-name" type="text" class="vTextField" ' - 'name="-2-0-name" maxlength="100" />') + 'name="-2-0-name" maxlength="100" />', html=True) class TestInlineMedia(TestCase): urls = "regressiontests.admin_inlines.urls" diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 6037c2b187..b0120cef1d 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -1696,7 +1696,7 @@ class AdminViewListEditable(TestCase): "_save": "Save", } response = self.client.post('/test_admin/admin/admin_views/fooddelivery/', data) - self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist"><li>Food delivery with this Driver and Restaurant already exists.</li></ul></td></tr>', 1) + self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist"><li>Food delivery with this Driver and Restaurant already exists.</li></ul></td></tr>', 1, html=True) data = { "form-TOTAL_FORMS": "3", @@ -1723,7 +1723,7 @@ class AdminViewListEditable(TestCase): "_save": "Save", } response = self.client.post('/test_admin/admin/admin_views/fooddelivery/', data) - self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist"><li>Food delivery with this Driver and Restaurant already exists.</li></ul></td></tr>', 2) + self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist"><li>Food delivery with this Driver and Restaurant already exists.</li></ul></td></tr>', 2, html=True) def test_non_form_errors(self): # test if non-form errors are handled; ticket #12716 @@ -1880,7 +1880,7 @@ class AdminViewListEditable(TestCase): response = self.client.get('/test_admin/admin/admin_views/story/') self.assertContains(response, 'id="id_form-0-id"', 1) # Only one hidden field, in a separate place than the table. self.assertContains(response, 'id="id_form-1-id"', 1) - self.assertContains(response, '<div class="hiddenfields">\n<input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" />\n</div>' % (story2.id, story1.id)) + self.assertContains(response, '<div class="hiddenfields">\n<input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" />\n</div>' % (story2.id, story1.id), html=True) self.assertContains(response, '<td>%d</td>' % story1.id, 1) self.assertContains(response, '<td>%d</td>' % story2.id, 1) @@ -1894,7 +1894,7 @@ class AdminViewListEditable(TestCase): response = self.client.get('/test_admin/admin/admin_views/otherstory/') self.assertContains(response, 'id="id_form-0-id"', 1) # Only one hidden field, in a separate place than the table. self.assertContains(response, 'id="id_form-1-id"', 1) - self.assertContains(response, '<div class="hiddenfields">\n<input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" />\n</div>' % (story2.id, story1.id)) + self.assertContains(response, '<div class="hiddenfields">\n<input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" />\n</div>' % (story2.id, story1.id), html=True) self.assertContains(response, '<th><a href="%d/">%d</a></th>' % (story1.id, story1.id), 1) self.assertContains(response, '<th><a href="%d/">%d</a></th>' % (story2.id, story2.id), 1) @@ -1923,7 +1923,7 @@ class AdminSearchTest(TestCase): from django.contrib.admin.views.main import TO_FIELD_VAR response = self.client.get('/test_admin/admin/auth/user/?q=joe&%s=username' % TO_FIELD_VAR) self.assertContains(response, "\n1 user\n") - self.assertContains(response, '<input type="hidden" name="t" value="username"/>') + self.assertContains(response, '<input type="hidden" name="t" value="username"/>', html=True) def test_exact_matches(self): response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=bar') @@ -2114,8 +2114,8 @@ class AdminActionsTest(TestCase): response = self.client.post("/test_admin/admin/admin_views/question/", action_data) self.assertContains(response, "would require deleting the following protected related objects") - self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Because.</a></li>' % a1.pk) - self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Yes.</a></li>' % a2.pk) + self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Because.</a></li>' % a1.pk, html=True) + self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Yes.</a></li>' % a2.pk, html=True) def test_custom_function_mail_action(self): "Tests a custom action defined in a function" @@ -2159,13 +2159,12 @@ class AdminActionsTest(TestCase): Refs #15964. """ response = self.client.get('/test_admin/admin/admin_views/externalsubscriber/') - self.assertTrue('''<label>Action: <select name="action"> + self.assertContains(response, '''<label>Action: <select name="action"> <option value="" selected="selected">---------</option> <option value="delete_selected">Delete selected external subscribers</option> <option value="redirect_to">Redirect to (Awesome action)</option> <option value="external_mail">External mail (Another awesome action)</option> -</select>'''in response.content, - ) +</select>''', html=True) def test_model_without_action(self): "Tests a ModelAdmin without any action" @@ -2338,7 +2337,7 @@ class AdminCustomQuerysetTest(TestCase): post_data, follow=True) self.assertEqual(response.status_code, 200) # Message should contain non-ugly model name. Instance representation is set by unicode() (ugly) - self.assertContains(response, '<li class="info">The paper "Paper_Deferred_author object" was changed successfully.</li>') + self.assertContains(response, '<li class="info">The paper "Paper_Deferred_author object" was changed successfully.</li>', html=True) # defer() is used in ModelAdmin.queryset() cl = CoverLetter.objects.create(author=u"John Doe") @@ -2353,7 +2352,7 @@ class AdminCustomQuerysetTest(TestCase): post_data, follow=True) self.assertEqual(response.status_code, 200) # Message should contain non-ugly model name. Instance representation is set by model's __unicode__() - self.assertContains(response, '<li class="info">The cover letter "John Doe II" was changed successfully.</li>') + self.assertContains(response, '<li class="info">The cover letter "John Doe II" was changed successfully.</li>', html=True) class AdminInlineFileUploadTest(TestCase): urls = "regressiontests.admin_views.urls" @@ -2859,9 +2858,9 @@ class ReadonlyTest(TestCase): self.assertContains(response, '<div class="form-row field-value">') self.assertContains(response, '<div class="form-row">') self.assertContains(response, '<p class="help">', 3) - self.assertContains(response, '<p class="help">Some help text for the title (with unicode ŠĐĆŽćžšđ)</p>') - self.assertContains(response, '<p class="help">Some help text for the content (with unicode ŠĐĆŽćžšđ)</p>') - self.assertContains(response, '<p class="help">Some help text for the date (with unicode ŠĐĆŽćžšđ)</p>') + self.assertContains(response, '<p class="help">Some help text for the title (with unicode ŠĐĆŽćžšđ)</p>', html=True) + self.assertContains(response, '<p class="help">Some help text for the content (with unicode ŠĐĆŽćžšđ)</p>', html=True) + self.assertContains(response, '<p class="help">Some help text for the date (with unicode ŠĐĆŽćžšđ)</p>', html=True) p = Post.objects.create(title="I worked on readonly_fields", content="Its good stuff") response = self.client.get('/test_admin/admin/admin_views/post/%d/' % p.pk) @@ -3099,32 +3098,32 @@ class AdminDocsTest(TestCase): response = self.client.get('/test_admin/admin/doc/tags/') # The builtin tag group exists - self.assertContains(response, "<h2>Built-in tags</h2>", count=2) + self.assertContains(response, "<h2>Built-in tags</h2>", count=2, html=True) # A builtin tag exists in both the index and detail - self.assertContains(response, '<h3 id="built_in-autoescape">autoescape</h3>') - self.assertContains(response, '<li><a href="#built_in-autoescape">autoescape</a></li>') + self.assertContains(response, '<h3 id="built_in-autoescape">autoescape</h3>', html=True) + self.assertContains(response, '<li><a href="#built_in-autoescape">autoescape</a></li>', html=True) # An app tag exists in both the index and detail - self.assertContains(response, '<h3 id="flatpages-get_flatpages">get_flatpages</h3>') - self.assertContains(response, '<li><a href="#flatpages-get_flatpages">get_flatpages</a></li>') + self.assertContains(response, '<h3 id="flatpages-get_flatpages">get_flatpages</h3>', html=True) + self.assertContains(response, '<li><a href="#flatpages-get_flatpages">get_flatpages</a></li>', html=True) # The admin list tag group exists - self.assertContains(response, "<h2>admin_list</h2>", count=2) + self.assertContains(response, "<h2>admin_list</h2>", count=2, html=True) # An admin list tag exists in both the index and detail - self.assertContains(response, '<h3 id="admin_list-admin_actions">admin_actions</h3>') - self.assertContains(response, '<li><a href="#admin_list-admin_actions">admin_actions</a></li>') + self.assertContains(response, '<h3 id="admin_list-admin_actions">admin_actions</h3>', html=True) + self.assertContains(response, '<li><a href="#admin_list-admin_actions">admin_actions</a></li>', html=True) def test_filters(self): response = self.client.get('/test_admin/admin/doc/filters/') # The builtin filter group exists - self.assertContains(response, "<h2>Built-in filters</h2>", count=2) + self.assertContains(response, "<h2>Built-in filters</h2>", count=2, html=True) # A builtin filter exists in both the index and detail - self.assertContains(response, '<h3 id="built_in-add">add</h3>') - self.assertContains(response, '<li><a href="#built_in-add">add</a></li>') + self.assertContains(response, '<h3 id="built_in-add">add</h3>', html=True) + self.assertContains(response, '<li><a href="#built_in-add">add</a></li>', html=True) AdminDocsTest = unittest.skipUnless(docutils, "no docutils installed.")(AdminDocsTest) diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py index e28df32577..b678bb7e12 100644 --- a/tests/regressiontests/admin_widgets/tests.py +++ b/tests/regressiontests/admin_widgets/tests.py @@ -194,14 +194,14 @@ class AdminForeignKeyRawIdWidget(DjangoTestCase): class FilteredSelectMultipleWidgetTest(DjangoTestCase): def test_render(self): w = widgets.FilteredSelectMultiple('test', False) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', 'test')), '<select multiple="multiple" name="test" class="selectfilter">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 0, "%(ADMIN_MEDIA_PREFIX)s"); });</script>\n' % admin_media_prefix() ) def test_stacked_render(self): w = widgets.FilteredSelectMultiple('test', True) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', 'test')), '<select multiple="multiple" name="test" class="selectfilterstacked">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 1, "%(ADMIN_MEDIA_PREFIX)s"); });</script>\n' % admin_media_prefix() ) @@ -213,13 +213,13 @@ class AdminDateWidgetTest(DjangoTestCase): Refs #12073. """ w = widgets.AdminDateWidget() - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), '<input value="2007-12-01" type="text" class="vDateField" name="test" size="10" />', ) # pass attrs to widget w = widgets.AdminDateWidget(attrs={'size': 20, 'class': 'myDateField'}) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), '<input value="2007-12-01" type="text" class="myDateField" name="test" size="20" />', ) @@ -231,13 +231,13 @@ class AdminTimeWidgetTest(DjangoTestCase): Refs #12073. """ w = widgets.AdminTimeWidget() - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), '<input value="09:30:00" type="text" class="vTimeField" name="test" size="8" />', ) # pass attrs to widget w = widgets.AdminTimeWidget(attrs={'size': 20, 'class': 'myTimeField'}) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), '<input value="09:30:00" type="text" class="myTimeField" name="test" size="20" />', ) @@ -245,7 +245,7 @@ class AdminTimeWidgetTest(DjangoTestCase): class AdminSplitDateTimeWidgetTest(DjangoTestCase): def test_render(self): w = widgets.AdminSplitDateTime() - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), '<p class="datetime">Date: <input value="2007-12-01" type="text" class="vDateField" name="test_0" size="10" /><br />Time: <input value="09:30:00" type="text" class="vTimeField" name="test_1" size="8" /></p>', ) @@ -256,7 +256,7 @@ class AdminSplitDateTimeWidgetTest(DjangoTestCase): with self.settings(USE_L10N=True): with translation.override('de-at'): w.is_localized = True - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), '<p class="datetime">Datum: <input value="01.12.2007" type="text" class="vDateField" name="test_0" size="10" /><br />Zeit: <input value="09:30:00" type="text" class="vTimeField" name="test_1" size="8" /></p>', ) @@ -270,12 +270,12 @@ class AdminFileWidgetTest(DjangoTestCase): ) w = widgets.AdminFileWidget() - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', album.cover_art)), '<p class="file-upload">Currently: <a href="%(STORAGE_URL)salbums/hybrid_theory.jpg">albums\hybrid_theory.jpg</a> <span class="clearable-file-input"><input type="checkbox" name="test-clear" id="test-clear_id" /> <label for="test-clear_id">Clear</label></span><br />Change: <input type="file" name="test" /></p>' % { 'STORAGE_URL': default_storage.url('') }, ) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', SimpleUploadedFile('test', 'content'))), '<input type="file" name="test" />', ) @@ -290,7 +290,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): rel = models.Album._meta.get_field('band').rel w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', band.pk, attrs={})), '<input type="text" name="test" value="%(bandpk)s" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/band/?t=id" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Linkin Park</strong>' % dict(admin_media_prefix(), bandpk=band.pk) ) @@ -305,7 +305,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): ) rel = models.Inventory._meta.get_field('parent').rel w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) - self.assertEqual( + self.assertHTMLEqual( w.render('test', core.parent_id, attrs={}), '<input type="text" name="test" value="86" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Apple</strong>' % admin_media_prefix() ) @@ -318,7 +318,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): rel = models.Bee._meta.get_field('honeycomb').rel w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('honeycomb_widget', big_honeycomb.pk, attrs={})), '<input type="text" name="honeycomb_widget" value="%(hcombpk)s" /> <strong>Honeycomb object</strong>' % {'hcombpk': big_honeycomb.pk} ) @@ -331,7 +331,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): rel = models.Individual._meta.get_field('parent').rel w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('individual_widget', subject1.pk, attrs={})), '<input type="text" name="individual_widget" value="%(subj1pk)s" /> <strong>Individual object</strong>' % {'subj1pk': subject1.pk} ) @@ -347,7 +347,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): child_of_hidden = models.Inventory.objects.create( barcode=94, name='Child of hidden', parent=hidden ) - self.assertEqual( + self.assertHTMLEqual( w.render('test', child_of_hidden.parent_id, attrs={}), '<input type="text" name="test" value="93" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Hidden</strong>' % admin_media_prefix() ) @@ -363,12 +363,12 @@ class ManyToManyRawIdWidgetTest(DjangoTestCase): rel = models.Band._meta.get_field('members').rel w = widgets.ManyToManyRawIdWidget(rel, widget_admin_site) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', [m1.pk, m2.pk], attrs={})), '<input type="text" name="test" value="%(m1pk)s,%(m2pk)s" class="vManyToManyRawIdAdminField" /><a href="/widget_admin/admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="/static/admin/img/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % dict(admin_media_prefix(), m1pk=m1.pk, m2pk=m2.pk) ) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('test', [m1.pk])), '<input type="text" name="test" value="%(m1pk)s" class="vManyToManyRawIdAdminField" /><a href="/widget_admin/admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % dict(admin_media_prefix(), m1pk=m1.pk) ) @@ -391,12 +391,12 @@ class ManyToManyRawIdWidgetTest(DjangoTestCase): rel = models.Advisor._meta.get_field('companies').rel w = widgets.ManyToManyRawIdWidget(rel, widget_admin_site) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('company_widget1', [c1.pk, c2.pk], attrs={})), '<input type="text" name="company_widget1" value="%(c1pk)s,%(c2pk)s" />' % {'c1pk': c1.pk, 'c2pk': c2.pk} ) - self.assertEqual( + self.assertHTMLEqual( conditional_escape(w.render('company_widget2', [c1.pk])), '<input type="text" name="company_widget2" value="%(c1pk)s" />' % {'c1pk': c1.pk} ) diff --git a/tests/regressiontests/forms/tests/error_messages.py b/tests/regressiontests/forms/tests/error_messages.py index 1c262d683d..b7b4e986b3 100644 --- a/tests/regressiontests/forms/tests/error_messages.py +++ b/tests/regressiontests/forms/tests/error_messages.py @@ -5,7 +5,6 @@ from __future__ import absolute_import from django.core.files.uploadedfile import SimpleUploadedFile from django.forms import * from django.test import TestCase -from django.utils import unittest from django.utils.safestring import mark_safe from .fields import verify_exists_urls @@ -19,7 +18,7 @@ class AssertFormErrorsMixin(object): except ValidationError, e: self.assertEqual(e.messages, expected) -class FormsErrorMessagesTestCase(unittest.TestCase, AssertFormErrorsMixin): +class FormsErrorMessagesTestCase(TestCase, AssertFormErrorsMixin): def test_charfield(self): e = { 'required': 'REQUIRED', @@ -230,13 +229,13 @@ class FormsErrorMessagesTestCase(unittest.TestCase, AssertFormErrorsMixin): # This form should print errors the default way. form1 = TestForm({'first_name': 'John'}) - self.assertEqual(str(form1['last_name'].errors), '<ul class="errorlist"><li>This field is required.</li></ul>') - self.assertEqual(str(form1.errors['__all__']), '<ul class="errorlist"><li>I like to be awkward.</li></ul>') + self.assertHTMLEqual(str(form1['last_name'].errors), '<ul class="errorlist"><li>This field is required.</li></ul>') + self.assertHTMLEqual(str(form1.errors['__all__']), '<ul class="errorlist"><li>I like to be awkward.</li></ul>') # This one should wrap error groups in the customized way. form2 = TestForm({'first_name': 'John'}, error_class=CustomErrorList) - self.assertEqual(str(form2['last_name'].errors), '<div class="error"><p>This field is required.</p></div>') - self.assertEqual(str(form2.errors['__all__']), '<div class="error"><p>I like to be awkward.</p></div>') + self.assertHTMLEqual(str(form2['last_name'].errors), '<div class="error"><p>This field is required.</p></div>') + self.assertHTMLEqual(str(form2.errors['__all__']), '<div class="error"><p>I like to be awkward.</p></div>') class ModelChoiceFieldErrorMessagesTestCase(TestCase, AssertFormErrorsMixin): diff --git a/tests/regressiontests/forms/tests/extra.py b/tests/regressiontests/forms/tests/extra.py index cbec105e94..3c5dfabb61 100644 --- a/tests/regressiontests/forms/tests/extra.py +++ b/tests/regressiontests/forms/tests/extra.py @@ -8,7 +8,8 @@ from django.conf import settings from django.forms import * from django.forms.extras import SelectDateWidget from django.forms.util import ErrorList -from django.utils import translation, unittest +from django.test import TestCase +from django.utils import translation from django.utils.encoding import force_unicode, smart_unicode from .error_messages import AssertFormErrorsMixin @@ -20,7 +21,7 @@ class GetDate(Form): class GetDateShowHiddenInitial(Form): mydate = DateField(widget=SelectDateWidget, show_hidden_initial=True) -class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): +class FormsExtraTestCase(TestCase, AssertFormErrorsMixin): ############### # Extra stuff # ############### @@ -28,7 +29,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): # The forms library comes with some extra, higher-level Field and Widget def test_selectdate(self): w = SelectDateWidget(years=('2007','2008','2009','2010','2011','2012','2013','2014','2015','2016')) - self.assertEqual(w.render('mydate', ''), """<select name="mydate_month" id="id_mydate_month"> + self.assertHTMLEqual(w.render('mydate', ''), """<select name="mydate_month" id="id_mydate_month"> <option value="0">---</option> <option value="1">January</option> <option value="2">February</option> @@ -43,6 +44,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): <option value="11">November</option> <option value="12">December</option> </select> + <select name="mydate_day" id="id_mydate_day"> <option value="0">---</option> <option value="1">1</option> @@ -77,6 +79,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): <option value="30">30</option> <option value="31">31</option> </select> + <select name="mydate_year" id="id_mydate_year"> <option value="0">---</option> <option value="2007">2007</option> @@ -90,9 +93,9 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): <option value="2015">2015</option> <option value="2016">2016</option> </select>""") - self.assertEqual(w.render('mydate', None), w.render('mydate', '')) + self.assertHTMLEqual(w.render('mydate', None), w.render('mydate', '')) - self.assertEqual(w.render('mydate', '2010-04-15'), """<select name="mydate_month" id="id_mydate_month"> + self.assertHTMLEqual(w.render('mydate', '2010-04-15'), """<select name="mydate_month" id="id_mydate_month"> <option value="1">January</option> <option value="2">February</option> <option value="3">March</option> @@ -153,10 +156,10 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): </select>""") # Accepts a datetime or a string: - self.assertEqual(w.render('mydate', datetime.date(2010, 4, 15)), w.render('mydate', '2010-04-15')) + self.assertHTMLEqual(w.render('mydate', datetime.date(2010, 4, 15)), w.render('mydate', '2010-04-15')) # Invalid dates still render the failed date: - self.assertEqual(w.render('mydate', '2010-02-31'), """<select name="mydate_month" id="id_mydate_month"> + self.assertHTMLEqual(w.render('mydate', '2010-02-31'), """<select name="mydate_month" id="id_mydate_month"> <option value="1">January</option> <option value="2" selected="selected">February</option> <option value="3">March</option> @@ -218,7 +221,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): # Using a SelectDateWidget in a form: w = SelectDateWidget(years=('2007','2008','2009','2010','2011','2012','2013','2014','2015','2016'), required=False) - self.assertEqual(w.render('mydate', ''), """<select name="mydate_month" id="id_mydate_month"> + self.assertHTMLEqual(w.render('mydate', ''), """<select name="mydate_month" id="id_mydate_month"> <option value="0">---</option> <option value="1">January</option> <option value="2">February</option> @@ -280,7 +283,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): <option value="2015">2015</option> <option value="2016">2016</option> </select>""") - self.assertEqual(w.render('mydate', '2010-04-15'), """<select name="mydate_month" id="id_mydate_month"> + self.assertHTMLEqual(w.render('mydate', '2010-04-15'), """<select name="mydate_month" id="id_mydate_month"> <option value="0">---</option> <option value="1">January</option> <option value="2">February</option> @@ -351,7 +354,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): # we must be prepared to accept the input from the "as_hidden" # rendering as well. - self.assertEqual(a['mydate'].as_hidden(), '<input type="hidden" name="mydate" value="2008-4-1" id="id_mydate" />') + self.assertHTMLEqual(a['mydate'].as_hidden(), '<input type="hidden" name="mydate" value="2008-4-1" id="id_mydate" />') b = GetDate({'mydate':'2008-4-1'}) self.assertTrue(b.is_valid()) @@ -392,7 +395,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): return u'\n'.join(rendered_widgets) w = ComplexMultiWidget() - self.assertEqual(w.render('name', 'some text,JP,2007-04-25 06:24:00'), """<input type="text" name="name_0" value="some text" /> + self.assertHTMLEqual(w.render('name', 'some text,JP,2007-04-25 06:24:00'), """<input type="text" name="name_0" value="some text" /> <select multiple="multiple" name="name_1"> <option value="J" selected="selected">John</option> <option value="P" selected="selected">Paul</option> @@ -426,7 +429,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): field1 = ComplexField(widget=w) f = ComplexFieldForm() - self.assertEqual(f.as_table(), """<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" id="id_field1_0" /> + self.assertHTMLEqual(f.as_table(), """<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" id="id_field1_0" /> <select multiple="multiple" name="field1_1" id="id_field1_1"> <option value="J">John</option> <option value="P">Paul</option> @@ -436,7 +439,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): <input type="text" name="field1_2_0" id="id_field1_2_0" /><input type="text" name="field1_2_1" id="id_field1_2_1" /></td></tr>""") f = ComplexFieldForm({'field1_0':'some text','field1_1':['J','P'], 'field1_2_0':'2007-04-25', 'field1_2_1':'06:24:00'}) - self.assertEqual(f.as_table(), """<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" value="some text" id="id_field1_0" /> + self.assertHTMLEqual(f.as_table(), """<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" value="some text" id="id_field1_0" /> <select multiple="multiple" name="field1_1" id="id_field1_1"> <option value="J" selected="selected">John</option> <option value="P" selected="selected">Paul</option> @@ -595,7 +598,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): data = dict(email='invalid') f = CommentForm(data, auto_id=False, error_class=DivErrorList) - self.assertEqual(f.as_p(), """<p>Name: <input type="text" name="name" maxlength="50" /></p> + self.assertHTMLEqual(f.as_p(), """<p>Name: <input type="text" name="name" maxlength="50" /></p> <div class="errorlist"><div class="error">Enter a valid e-mail address.</div></div> <p>Email: <input type="text" name="email" value="invalid" /></p> <div class="errorlist"><div class="error">This field is required.</div></div> @@ -617,7 +620,7 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin): self.assertTrue(FormWithImage().is_multipart()) -class FormsExtraL10NTestCase(unittest.TestCase): +class FormsExtraL10NTestCase(TestCase): def setUp(self): super(FormsExtraL10NTestCase, self).setUp() self.old_use_l10n = getattr(settings, 'USE_L10N', False) @@ -633,7 +636,7 @@ class FormsExtraL10NTestCase(unittest.TestCase): w = SelectDateWidget(years=('2007','2008','2009','2010','2011','2012','2013','2014','2015','2016'), required=False) self.assertEqual(w.value_from_datadict({'date_year': '2010', 'date_month': '8', 'date_day': '13'}, {}, 'date'), '13-08-2010') - self.assertEqual(w.render('date', '13-08-2010'), """<select name="date_day" id="id_date_day"> + self.assertHTMLEqual(w.render('date', '13-08-2010'), """<select name="date_day" id="id_date_day"> <option value="0">---</option> <option value="1">1</option> <option value="2">2</option> diff --git a/tests/regressiontests/forms/tests/fields.py b/tests/regressiontests/forms/tests/fields.py index 7dd3a27dc1..03e0ff65a3 100644 --- a/tests/regressiontests/forms/tests/fields.py +++ b/tests/regressiontests/forms/tests/fields.py @@ -674,6 +674,7 @@ class FieldsTests(SimpleTestCase): self.assertEqual(u'', f.clean('')) self.assertEqual(u'http://www.google.com/', f.clean('http://www.google.com')) + @verify_exists_urls(('http://example.com/',)) def test_urlfield_5(self): f = URLField(min_length=15, max_length=20) self.assertRaisesMessage(ValidationError, "[u'Ensure this value has at least 15 characters (it has 13).']", f.clean, 'http://f.com') @@ -852,7 +853,7 @@ class FieldsTests(SimpleTestCase): hidden_nullbool1 = NullBooleanField(widget=HiddenInput, initial=True) hidden_nullbool2 = NullBooleanField(widget=HiddenInput, initial=False) f = HiddenNullBooleanForm() - self.assertEqual('<input type="hidden" name="hidden_nullbool1" value="True" id="id_hidden_nullbool1" /><input type="hidden" name="hidden_nullbool2" value="False" id="id_hidden_nullbool2" />', str(f)) + self.assertHTMLEqual('<input type="hidden" name="hidden_nullbool1" value="True" id="id_hidden_nullbool1" /><input type="hidden" name="hidden_nullbool2" value="False" id="id_hidden_nullbool2" />', str(f)) def test_nullbooleanfield_3(self): class HiddenNullBooleanForm(Form): diff --git a/tests/regressiontests/forms/tests/forms.py b/tests/regressiontests/forms/tests/forms.py index 4e9cc16f23..6425a007d1 100644 --- a/tests/regressiontests/forms/tests/forms.py +++ b/tests/regressiontests/forms/tests/forms.py @@ -5,9 +5,9 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.forms import * from django.http import QueryDict from django.template import Template, Context +from django.test import TestCase from django.utils.datastructures import MultiValueDict, MergeDict from django.utils.safestring import mark_safe -from django.utils.unittest import TestCase class Person(Form): @@ -34,14 +34,14 @@ class FormsTestCase(TestCase): self.assertTrue(p.is_bound) self.assertEqual(p.errors, {}) self.assertTrue(p.is_valid()) - self.assertEqual(p.errors.as_ul(), u'') + self.assertHTMLEqual(p.errors.as_ul(), u'') self.assertEqual(p.errors.as_text(), u'') self.assertEqual(p.cleaned_data["first_name"], u'John') self.assertEqual(p.cleaned_data["last_name"], u'Lennon') self.assertEqual(p.cleaned_data["birthday"], datetime.date(1940, 10, 9)) - self.assertEqual(str(p['first_name']), '<input type="text" name="first_name" value="John" id="id_first_name" />') - self.assertEqual(str(p['last_name']), '<input type="text" name="last_name" value="Lennon" id="id_last_name" />') - self.assertEqual(str(p['birthday']), '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" />') + self.assertHTMLEqual(str(p['first_name']), '<input type="text" name="first_name" value="John" id="id_first_name" />') + self.assertHTMLEqual(str(p['last_name']), '<input type="text" name="last_name" value="Lennon" id="id_last_name" />') + self.assertHTMLEqual(str(p['birthday']), '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" />') try: p['nonexistentfield'] self.fail('Attempts to access non-existent fields should fail.') @@ -53,7 +53,7 @@ class FormsTestCase(TestCase): for boundfield in p: form_output.append(str(boundfield)) - self.assertEqual('\n'.join(form_output), """<input type="text" name="first_name" value="John" id="id_first_name" /> + self.assertHTMLEqual('\n'.join(form_output), """<input type="text" name="first_name" value="John" id="id_first_name" /> <input type="text" name="last_name" value="Lennon" id="id_last_name" /> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" />""") @@ -67,7 +67,7 @@ class FormsTestCase(TestCase): ['Last name', u'Lennon'], ['Birthday', u'1940-10-9'] ]) - self.assertEqual(str(p), """<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr> + self.assertHTMLEqual(str(p), """<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr> <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" value="Lennon" id="id_last_name" /></td></tr> <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr>""") @@ -84,16 +84,16 @@ class FormsTestCase(TestCase): self.fail('Attempts to access cleaned_data when validation fails should fail.') except AttributeError: pass - self.assertEqual(str(p), """<tr><th><label for="id_first_name">First name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr> + self.assertHTMLEqual(str(p), """<tr><th><label for="id_first_name">First name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr> <tr><th><label for="id_last_name">Last name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="last_name" id="id_last_name" /></td></tr> <tr><th><label for="id_birthday">Birthday:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="birthday" id="id_birthday" /></td></tr>""") - self.assertEqual(p.as_table(), """<tr><th><label for="id_first_name">First name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr><th><label for="id_first_name">First name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr> <tr><th><label for="id_last_name">Last name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="last_name" id="id_last_name" /></td></tr> <tr><th><label for="id_birthday">Birthday:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="birthday" id="id_birthday" /></td></tr>""") - self.assertEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></li>""") - self.assertEqual(p.as_p(), """<ul class="errorlist"><li>This field is required.</li></ul> + self.assertHTMLEqual(p.as_p(), """<ul class="errorlist"><li>This field is required.</li></ul> <p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p> <ul class="errorlist"><li>This field is required.</li></ul> <p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p> @@ -113,31 +113,31 @@ class FormsTestCase(TestCase): self.fail('Attempts to access cleaned_data when validation fails should fail.') except AttributeError: pass - self.assertEqual(str(p), """<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> + self.assertHTMLEqual(str(p), """<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr> <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" id="id_birthday" /></td></tr>""") - self.assertEqual(p.as_table(), """<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr> <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" id="id_birthday" /></td></tr>""") - self.assertEqual(p.as_ul(), """<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li> <li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li> <li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></li>""") - self.assertEqual(p.as_p(), """<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p> + self.assertHTMLEqual(p.as_p(), """<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p> <p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p> <p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></p>""") def test_unicode_values(self): # Unicode values are handled properly. p = Person({'first_name': u'John', 'last_name': u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111', 'birthday': '1940-10-9'}) - self.assertEqual(p.as_table(), u'<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr>\n<tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></td></tr>\n<tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr>') - self.assertEqual(p.as_ul(), u'<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></li>\n<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></li>\n<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></li>') - self.assertEqual(p.as_p(), u'<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></p>\n<p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></p>\n<p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></p>') + self.assertHTMLEqual(p.as_table(), u'<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr>\n<tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></td></tr>\n<tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr>') + self.assertHTMLEqual(p.as_ul(), u'<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></li>\n<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></li>\n<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></li>') + self.assertHTMLEqual(p.as_p(), u'<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></p>\n<p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></p>\n<p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></p>') p = Person({'last_name': u'Lennon'}) self.assertEqual(p.errors['first_name'], [u'This field is required.']) self.assertEqual(p.errors['birthday'], [u'This field is required.']) self.assertFalse(p.is_valid()) - self.assertEqual(p.errors.as_ul(), u'<ul class="errorlist"><li>first_name<ul class="errorlist"><li>This field is required.</li></ul></li><li>birthday<ul class="errorlist"><li>This field is required.</li></ul></li></ul>') + self.assertHTMLEqual(p.errors.as_ul(), u'<ul class="errorlist"><li>first_name<ul class="errorlist"><li>This field is required.</li></ul></li><li>birthday<ul class="errorlist"><li>This field is required.</li></ul></li></ul>') self.assertEqual(p.errors.as_text(), """* first_name * This field is required. * birthday @@ -148,13 +148,13 @@ class FormsTestCase(TestCase): except AttributeError: pass self.assertEqual(p['first_name'].errors, [u'This field is required.']) - self.assertEqual(p['first_name'].errors.as_ul(), u'<ul class="errorlist"><li>This field is required.</li></ul>') + self.assertHTMLEqual(p['first_name'].errors.as_ul(), u'<ul class="errorlist"><li>This field is required.</li></ul>') self.assertEqual(p['first_name'].errors.as_text(), u'* This field is required.') p = Person() - self.assertEqual(str(p['first_name']), '<input type="text" name="first_name" id="id_first_name" />') - self.assertEqual(str(p['last_name']), '<input type="text" name="last_name" id="id_last_name" />') - self.assertEqual(str(p['birthday']), '<input type="text" name="birthday" id="id_birthday" />') + self.assertHTMLEqual(str(p['first_name']), '<input type="text" name="first_name" id="id_first_name" />') + self.assertHTMLEqual(str(p['last_name']), '<input type="text" name="last_name" id="id_last_name" />') + self.assertHTMLEqual(str(p['birthday']), '<input type="text" name="birthday" id="id_birthday" />') def test_cleaned_data_only_fields(self): # cleaned_data will always *only* contain a key for fields defined in the @@ -205,13 +205,13 @@ class FormsTestCase(TestCase): # into which the field's name will be inserted. It will also put a <label> around # the human-readable labels for a field. p = Person(auto_id='%s_id') - self.assertEqual(p.as_table(), """<tr><th><label for="first_name_id">First name:</label></th><td><input type="text" name="first_name" id="first_name_id" /></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr><th><label for="first_name_id">First name:</label></th><td><input type="text" name="first_name" id="first_name_id" /></td></tr> <tr><th><label for="last_name_id">Last name:</label></th><td><input type="text" name="last_name" id="last_name_id" /></td></tr> <tr><th><label for="birthday_id">Birthday:</label></th><td><input type="text" name="birthday" id="birthday_id" /></td></tr>""") - self.assertEqual(p.as_ul(), """<li><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></li> <li><label for="last_name_id">Last name:</label> <input type="text" name="last_name" id="last_name_id" /></li> <li><label for="birthday_id">Birthday:</label> <input type="text" name="birthday" id="birthday_id" /></li>""") - self.assertEqual(p.as_p(), """<p><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></p> + self.assertHTMLEqual(p.as_p(), """<p><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></p> <p><label for="last_name_id">Last name:</label> <input type="text" name="last_name" id="last_name_id" /></p> <p><label for="birthday_id">Birthday:</label> <input type="text" name="birthday" id="birthday_id" /></p>""") @@ -219,7 +219,7 @@ class FormsTestCase(TestCase): # If auto_id is any True value whose str() does not contain '%s', the "id" # attribute will be the name of the field. p = Person(auto_id=True) - self.assertEqual(p.as_ul(), """<li><label for="first_name">First name:</label> <input type="text" name="first_name" id="first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><label for="first_name">First name:</label> <input type="text" name="first_name" id="first_name" /></li> <li><label for="last_name">Last name:</label> <input type="text" name="last_name" id="last_name" /></li> <li><label for="birthday">Birthday:</label> <input type="text" name="birthday" id="birthday" /></li>""") @@ -227,7 +227,7 @@ class FormsTestCase(TestCase): # If auto_id is any False value, an "id" attribute won't be output unless it # was manually entered. p = Person(auto_id=False) - self.assertEqual(p.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> <li>Last name: <input type="text" name="last_name" /></li> <li>Birthday: <input type="text" name="birthday" /></li>""") @@ -235,7 +235,7 @@ class FormsTestCase(TestCase): # In this example, auto_id is False, but the "id" attribute for the "first_name" # field is given. Also note that field gets a <label>, while the others don't. p = PersonNew(auto_id=False) - self.assertEqual(p.as_ul(), """<li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /></li> <li>Last name: <input type="text" name="last_name" /></li> <li>Birthday: <input type="text" name="birthday" /></li>""") @@ -243,7 +243,7 @@ class FormsTestCase(TestCase): # If the "id" attribute is specified in the Form and auto_id is True, the "id" # attribute in the Form gets precedence. p = PersonNew(auto_id=True) - self.assertEqual(p.as_ul(), """<li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /></li> <li><label for="last_name">Last name:</label> <input type="text" name="last_name" id="last_name" /></li> <li><label for="birthday">Birthday:</label> <input type="text" name="birthday" id="birthday" /></li>""") @@ -253,26 +253,26 @@ class FormsTestCase(TestCase): get_spam = BooleanField() f = SignupForm(auto_id=False) - self.assertEqual(str(f['email']), '<input type="text" name="email" />') - self.assertEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />') + self.assertHTMLEqual(str(f['email']), '<input type="text" name="email" />') + self.assertHTMLEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />') f = SignupForm({'email': 'test@example.com', 'get_spam': True}, auto_id=False) - self.assertEqual(str(f['email']), '<input type="text" name="email" value="test@example.com" />') - self.assertEqual(str(f['get_spam']), '<input checked="checked" type="checkbox" name="get_spam" />') + self.assertHTMLEqual(str(f['email']), '<input type="text" name="email" value="test@example.com" />') + self.assertHTMLEqual(str(f['get_spam']), '<input checked="checked" type="checkbox" name="get_spam" />') # 'True' or 'true' should be rendered without a value attribute f = SignupForm({'email': 'test@example.com', 'get_spam': 'True'}, auto_id=False) - self.assertEqual(str(f['get_spam']), '<input checked="checked" type="checkbox" name="get_spam" />') + self.assertHTMLEqual(str(f['get_spam']), '<input checked="checked" type="checkbox" name="get_spam" />') f = SignupForm({'email': 'test@example.com', 'get_spam': 'true'}, auto_id=False) - self.assertEqual(str(f['get_spam']), '<input checked="checked" type="checkbox" name="get_spam" />') + self.assertHTMLEqual(str(f['get_spam']), '<input checked="checked" type="checkbox" name="get_spam" />') # A value of 'False' or 'false' should be rendered unchecked f = SignupForm({'email': 'test@example.com', 'get_spam': 'False'}, auto_id=False) - self.assertEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />') + self.assertHTMLEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />') f = SignupForm({'email': 'test@example.com', 'get_spam': 'false'}, auto_id=False) - self.assertEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />') + self.assertHTMLEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />') def test_widget_output(self): # Any Field can have a Widget class passed to its constructor: @@ -281,14 +281,14 @@ class FormsTestCase(TestCase): message = CharField(widget=Textarea) f = ContactForm(auto_id=False) - self.assertEqual(str(f['subject']), '<input type="text" name="subject" />') - self.assertEqual(str(f['message']), '<textarea rows="10" cols="40" name="message"></textarea>') + self.assertHTMLEqual(str(f['subject']), '<input type="text" name="subject" />') + self.assertHTMLEqual(str(f['message']), '<textarea name="message" rows="10" cols="40"></textarea>') # as_textarea(), as_text() and as_hidden() are shortcuts for changing the output # widget type: - self.assertEqual(f['subject'].as_textarea(), u'<textarea rows="10" cols="40" name="subject"></textarea>') - self.assertEqual(f['message'].as_text(), u'<input type="text" name="message" />') - self.assertEqual(f['message'].as_hidden(), u'<input type="hidden" name="message" />') + self.assertHTMLEqual(f['subject'].as_textarea(), u'<textarea name="subject" rows="10" cols="40"></textarea>') + self.assertHTMLEqual(f['message'].as_text(), u'<input type="text" name="message" />') + self.assertHTMLEqual(f['message'].as_hidden(), u'<input type="hidden" name="message" />') # The 'widget' parameter to a Field can also be an instance: class ContactForm(Form): @@ -296,15 +296,15 @@ class FormsTestCase(TestCase): message = CharField(widget=Textarea(attrs={'rows': 80, 'cols': 20})) f = ContactForm(auto_id=False) - self.assertEqual(str(f['message']), '<textarea rows="80" cols="20" name="message"></textarea>') + self.assertHTMLEqual(str(f['message']), '<textarea name="message" rows="80" cols="20"></textarea>') # Instance-level attrs are *not* carried over to as_textarea(), as_text() and # as_hidden(): - self.assertEqual(f['message'].as_text(), u'<input type="text" name="message" />') + self.assertHTMLEqual(f['message'].as_text(), u'<input type="text" name="message" />') f = ContactForm({'subject': 'Hello', 'message': 'I love you.'}, auto_id=False) - self.assertEqual(f['subject'].as_textarea(), u'<textarea rows="10" cols="40" name="subject">Hello</textarea>') - self.assertEqual(f['message'].as_text(), u'<input type="text" name="message" value="I love you." />') - self.assertEqual(f['message'].as_hidden(), u'<input type="hidden" name="message" value="I love you." />') + self.assertHTMLEqual(f['subject'].as_textarea(), u'<textarea rows="10" cols="40" name="subject">Hello</textarea>') + self.assertHTMLEqual(f['message'].as_text(), u'<input type="text" name="message" value="I love you." />') + self.assertHTMLEqual(f['message'].as_hidden(), u'<input type="hidden" name="message" value="I love you." />') def test_forms_with_choices(self): # For a form with a <select>, use ChoiceField: @@ -313,12 +313,12 @@ class FormsTestCase(TestCase): language = ChoiceField(choices=[('P', 'Python'), ('J', 'Java')]) f = FrameworkForm(auto_id=False) - self.assertEqual(str(f['language']), """<select name="language"> + self.assertHTMLEqual(str(f['language']), """<select name="language"> <option value="P">Python</option> <option value="J">Java</option> </select>""") f = FrameworkForm({'name': 'Django', 'language': 'P'}, auto_id=False) - self.assertEqual(str(f['language']), """<select name="language"> + self.assertHTMLEqual(str(f['language']), """<select name="language"> <option value="P" selected="selected">Python</option> <option value="J">Java</option> </select>""") @@ -330,7 +330,7 @@ class FormsTestCase(TestCase): language = ChoiceField(choices=[('', '------'), ('P', 'Python'), ('J', 'Java')]) f = FrameworkForm(auto_id=False) - self.assertEqual(str(f['language']), """<select name="language"> + self.assertHTMLEqual(str(f['language']), """<select name="language"> <option value="" selected="selected">------</option> <option value="P">Python</option> <option value="J">Java</option> @@ -342,12 +342,12 @@ class FormsTestCase(TestCase): language = ChoiceField(choices=[('P', 'Python'), ('J', 'Java')], widget=Select(attrs={'class': 'foo'})) f = FrameworkForm(auto_id=False) - self.assertEqual(str(f['language']), """<select class="foo" name="language"> + self.assertHTMLEqual(str(f['language']), """<select class="foo" name="language"> <option value="P">Python</option> <option value="J">Java</option> </select>""") f = FrameworkForm({'name': 'Django', 'language': 'P'}, auto_id=False) - self.assertEqual(str(f['language']), """<select class="foo" name="language"> + self.assertHTMLEqual(str(f['language']), """<select class="foo" name="language"> <option value="P" selected="selected">Python</option> <option value="J">Java</option> </select>""") @@ -360,12 +360,12 @@ class FormsTestCase(TestCase): language = ChoiceField(choices=[('P', 'Python'), ('J', 'Java')], widget=Select(choices=[('R', 'Ruby'), ('P', 'Perl')], attrs={'class': 'foo'})) f = FrameworkForm(auto_id=False) - self.assertEqual(str(f['language']), """<select class="foo" name="language"> + self.assertHTMLEqual(str(f['language']), """<select class="foo" name="language"> <option value="P">Python</option> <option value="J">Java</option> </select>""") f = FrameworkForm({'name': 'Django', 'language': 'P'}, auto_id=False) - self.assertEqual(str(f['language']), """<select class="foo" name="language"> + self.assertHTMLEqual(str(f['language']), """<select class="foo" name="language"> <option value="P" selected="selected">Python</option> <option value="J">Java</option> </select>""") @@ -376,10 +376,10 @@ class FormsTestCase(TestCase): language = ChoiceField() f = FrameworkForm(auto_id=False) - self.assertEqual(str(f['language']), """<select name="language"> + self.assertHTMLEqual(str(f['language']), """<select name="language"> </select>""") f.fields['language'].choices = [('P', 'Python'), ('J', 'Java')] - self.assertEqual(str(f['language']), """<select name="language"> + self.assertHTMLEqual(str(f['language']), """<select name="language"> <option value="P">Python</option> <option value="J">Java</option> </select>""") @@ -391,16 +391,16 @@ class FormsTestCase(TestCase): language = ChoiceField(choices=[('P', 'Python'), ('J', 'Java')], widget=RadioSelect) f = FrameworkForm(auto_id=False) - self.assertEqual(str(f['language']), """<ul> + self.assertHTMLEqual(str(f['language']), """<ul> <li><label><input type="radio" name="language" value="P" /> Python</label></li> <li><label><input type="radio" name="language" value="J" /> Java</label></li> </ul>""") - self.assertEqual(f.as_table(), """<tr><th>Name:</th><td><input type="text" name="name" /></td></tr> + self.assertHTMLEqual(f.as_table(), """<tr><th>Name:</th><td><input type="text" name="name" /></td></tr> <tr><th>Language:</th><td><ul> <li><label><input type="radio" name="language" value="P" /> Python</label></li> <li><label><input type="radio" name="language" value="J" /> Java</label></li> </ul></td></tr>""") - self.assertEqual(f.as_ul(), """<li>Name: <input type="text" name="name" /></li> + self.assertHTMLEqual(f.as_ul(), """<li>Name: <input type="text" name="name" /></li> <li>Language: <ul> <li><label><input type="radio" name="language" value="P" /> Python</label></li> <li><label><input type="radio" name="language" value="J" /> Java</label></li> @@ -410,7 +410,7 @@ class FormsTestCase(TestCase): # gets a distinct ID, formed by appending an underscore plus the button's # zero-based index. f = FrameworkForm(auto_id='id_%s') - self.assertEqual(str(f['language']), """<ul> + self.assertHTMLEqual(str(f['language']), """<ul> <li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> <li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> </ul>""") @@ -418,17 +418,17 @@ class FormsTestCase(TestCase): # When RadioSelect is used with auto_id, and the whole form is printed using # either as_table() or as_ul(), the label for the RadioSelect will point to the # ID of the *first* radio button. - self.assertEqual(f.as_table(), """<tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" id="id_name" /></td></tr> + self.assertHTMLEqual(f.as_table(), """<tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" id="id_name" /></td></tr> <tr><th><label for="id_language_0">Language:</label></th><td><ul> <li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> <li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> </ul></td></tr>""") - self.assertEqual(f.as_ul(), """<li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li> + self.assertHTMLEqual(f.as_ul(), """<li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li> <li><label for="id_language_0">Language:</label> <ul> <li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> <li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> </ul></li>""") - self.assertEqual(f.as_p(), """<p><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></p> + self.assertHTMLEqual(f.as_p(), """<p><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></p> <p><label for="id_language_0">Language:</label> <ul> <li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> <li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> @@ -439,11 +439,11 @@ class FormsTestCase(TestCase): name = ChoiceField(choices=[('john', 'John'), ('paul', 'Paul'), ('george', 'George'), ('ringo', 'Ringo')], widget=RadioSelect) f = BeatleForm(auto_id=False) - self.assertEqual('\n'.join([str(bf) for bf in f['name']]), """<label><input type="radio" name="name" value="john" /> John</label> + self.assertHTMLEqual('\n'.join([str(bf) for bf in f['name']]), """<label><input type="radio" name="name" value="john" /> John</label> <label><input type="radio" name="name" value="paul" /> Paul</label> <label><input type="radio" name="name" value="george" /> George</label> <label><input type="radio" name="name" value="ringo" /> Ringo</label>""") - self.assertEqual('\n'.join(['<div>%s</div>' % bf for bf in f['name']]), """<div><label><input type="radio" name="name" value="john" /> John</label></div> + self.assertHTMLEqual('\n'.join(['<div>%s</div>' % bf for bf in f['name']]), """<div><label><input type="radio" name="name" value="john" /> John</label></div> <div><label><input type="radio" name="name" value="paul" /> Paul</label></div> <div><label><input type="radio" name="name" value="george" /> George</label></div> <div><label><input type="radio" name="name" value="ringo" /> Ringo</label></div>""") @@ -454,7 +454,7 @@ class FormsTestCase(TestCase): name = CharField() f = BeatleForm(auto_id=False) - self.assertEqual('\n'.join([str(bf) for bf in f['name']]), u'<input type="text" name="name" />') + self.assertHTMLEqual('\n'.join([str(bf) for bf in f['name']]), u'<input type="text" name="name" />') def test_forms_with_multiple_choice(self): # MultipleChoiceField is a special case, as its data is required to be a list: @@ -463,7 +463,7 @@ class FormsTestCase(TestCase): composers = MultipleChoiceField() f = SongForm(auto_id=False) - self.assertEqual(str(f['composers']), """<select multiple="multiple" name="composers"> + self.assertHTMLEqual(str(f['composers']), """<select multiple="multiple" name="composers"> </select>""") class SongForm(Form): @@ -471,13 +471,13 @@ class FormsTestCase(TestCase): composers = MultipleChoiceField(choices=[('J', 'John Lennon'), ('P', 'Paul McCartney')]) f = SongForm(auto_id=False) - self.assertEqual(str(f['composers']), """<select multiple="multiple" name="composers"> + self.assertHTMLEqual(str(f['composers']), """<select multiple="multiple" name="composers"> <option value="J">John Lennon</option> <option value="P">Paul McCartney</option> </select>""") f = SongForm({'name': 'Yesterday', 'composers': ['P']}, auto_id=False) - self.assertEqual(str(f['name']), '<input type="text" name="name" value="Yesterday" />') - self.assertEqual(str(f['composers']), """<select multiple="multiple" name="composers"> + self.assertHTMLEqual(str(f['name']), '<input type="text" name="name" value="Yesterday" />') + self.assertHTMLEqual(str(f['composers']), """<select multiple="multiple" name="composers"> <option value="J">John Lennon</option> <option value="P" selected="selected">Paul McCartney</option> </select>""") @@ -491,9 +491,9 @@ class FormsTestCase(TestCase): # have multiple values, its as_hidden() renders multiple <input type="hidden"> # tags. f = SongForm({'name': 'Yesterday', 'composers': ['P']}, auto_id=False) - self.assertEqual(f['composers'].as_hidden(), '<input type="hidden" name="composers" value="P" />') + self.assertHTMLEqual(f['composers'].as_hidden(), '<input type="hidden" name="composers" value="P" />') f = SongForm({'name': 'From Me To You', 'composers': ['P', 'J']}, auto_id=False) - self.assertEqual(f['composers'].as_hidden(), """<input type="hidden" name="composers" value="P" /> + self.assertHTMLEqual(f['composers'].as_hidden(), """<input type="hidden" name="composers" value="P" /> <input type="hidden" name="composers" value="J" />""") # DateTimeField rendered as_hidden() is special too @@ -502,8 +502,8 @@ class FormsTestCase(TestCase): f = MessageForm({'when_0': '1992-01-01', 'when_1': '01:01'}) self.assertTrue(f.is_valid()) - self.assertEqual(str(f['when']), '<input type="text" name="when_0" value="1992-01-01" id="id_when_0" /><input type="text" name="when_1" value="01:01" id="id_when_1" />') - self.assertEqual(f['when'].as_hidden(), '<input type="hidden" name="when_0" value="1992-01-01" id="id_when_0" /><input type="hidden" name="when_1" value="01:01" id="id_when_1" />') + self.assertHTMLEqual(str(f['when']), '<input type="text" name="when_0" value="1992-01-01" id="id_when_0" /><input type="text" name="when_1" value="01:01" id="id_when_1" />') + self.assertHTMLEqual(f['when'].as_hidden(), '<input type="hidden" name="when_0" value="1992-01-01" id="id_when_0" /><input type="hidden" name="when_1" value="01:01" id="id_when_1" />') def test_mulitple_choice_checkbox(self): # MultipleChoiceField can also be used with the CheckboxSelectMultiple widget. @@ -512,17 +512,17 @@ class FormsTestCase(TestCase): composers = MultipleChoiceField(choices=[('J', 'John Lennon'), ('P', 'Paul McCartney')], widget=CheckboxSelectMultiple) f = SongForm(auto_id=False) - self.assertEqual(str(f['composers']), """<ul> + self.assertHTMLEqual(str(f['composers']), """<ul> <li><label><input type="checkbox" name="composers" value="J" /> John Lennon</label></li> <li><label><input type="checkbox" name="composers" value="P" /> Paul McCartney</label></li> </ul>""") f = SongForm({'composers': ['J']}, auto_id=False) - self.assertEqual(str(f['composers']), """<ul> + self.assertHTMLEqual(str(f['composers']), """<ul> <li><label><input checked="checked" type="checkbox" name="composers" value="J" /> John Lennon</label></li> <li><label><input type="checkbox" name="composers" value="P" /> Paul McCartney</label></li> </ul>""") f = SongForm({'composers': ['J', 'P']}, auto_id=False) - self.assertEqual(str(f['composers']), """<ul> + self.assertHTMLEqual(str(f['composers']), """<ul> <li><label><input checked="checked" type="checkbox" name="composers" value="J" /> John Lennon</label></li> <li><label><input checked="checked" type="checkbox" name="composers" value="P" /> Paul McCartney</label></li> </ul>""") @@ -536,7 +536,7 @@ class FormsTestCase(TestCase): composers = MultipleChoiceField(choices=[('J', 'John Lennon'), ('P', 'Paul McCartney')], widget=CheckboxSelectMultiple) f = SongForm(auto_id='%s_id') - self.assertEqual(str(f['composers']), """<ul> + self.assertHTMLEqual(str(f['composers']), """<ul> <li><label for="composers_id_0"><input type="checkbox" name="composers" value="J" id="composers_id_0" /> John Lennon</label></li> <li><label for="composers_id_1"><input type="checkbox" name="composers" value="P" id="composers_id_1" /> Paul McCartney</label></li> </ul>""") @@ -576,7 +576,7 @@ class FormsTestCase(TestCase): composers = MultipleChoiceField(choices=[('J', 'John Lennon'), ('P', 'Paul McCartney')], widget=MultipleHiddenInput) f = SongFormHidden(MultiValueDict(dict(name=['Yesterday'], composers=['J', 'P'])), auto_id=False) - self.assertEqual(f.as_ul(), """<li>Name: <input type="text" name="name" value="Yesterday" /><input type="hidden" name="composers" value="J" /> + self.assertHTMLEqual(f.as_ul(), """<li>Name: <input type="text" name="name" value="Yesterday" /><input type="hidden" name="composers" value="J" /> <input type="hidden" name="composers" value="P" /></li>""") # When using CheckboxSelectMultiple, the framework expects a list of input and @@ -605,13 +605,13 @@ class FormsTestCase(TestCase): raise ValidationError(mark_safe("'<b>%s</b>' is a safe string" % self.cleaned_data['special_safe_name'])) f = EscapingForm({'special_name': "Nothing to escape", 'special_safe_name': "Nothing to escape"}, auto_id=False) - self.assertEqual(f.as_table(), """<tr><th><em>Special</em> Field:</th><td><ul class="errorlist"><li>Something's wrong with 'Nothing to escape'</li></ul><input type="text" name="special_name" value="Nothing to escape" /></td></tr> + self.assertHTMLEqual(f.as_table(), """<tr><th><em>Special</em> Field:</th><td><ul class="errorlist"><li>Something's wrong with 'Nothing to escape'</li></ul><input type="text" name="special_name" value="Nothing to escape" /></td></tr> <tr><th><em>Special</em> Field:</th><td><ul class="errorlist"><li>'<b>Nothing to escape</b>' is a safe string</li></ul><input type="text" name="special_safe_name" value="Nothing to escape" /></td></tr>""") f = EscapingForm({ 'special_name': "Should escape < & > and <script>alert('xss')</script>", 'special_safe_name': "<i>Do not escape</i>" }, auto_id=False) - self.assertEqual(f.as_table(), """<tr><th><em>Special</em> Field:</th><td><ul class="errorlist"><li>Something's wrong with 'Should escape < & > and <script>alert('xss')</script>'</li></ul><input type="text" name="special_name" value="Should escape < & > and <script>alert('xss')</script>" /></td></tr> + self.assertHTMLEqual(f.as_table(), """<tr><th><em>Special</em> Field:</th><td><ul class="errorlist"><li>Something's wrong with 'Should escape < & > and <script>alert('xss')</script>'</li></ul><input type="text" name="special_name" value="Should escape < & > and <script>alert('xss')</script>" /></td></tr> <tr><th><em>Special</em> Field:</th><td><ul class="errorlist"><li>'<b><i>Do not escape</i></b>' is a safe string</li></ul><input type="text" name="special_safe_name" value="<i>Do not escape</i>" /></td></tr>""") def test_validating_multiple_fields(self): @@ -668,7 +668,7 @@ class FormsTestCase(TestCase): f = UserRegistration(auto_id=False) self.assertEqual(f.errors, {}) f = UserRegistration({}, auto_id=False) - self.assertEqual(f.as_table(), """<tr><th>Username:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="username" maxlength="10" /></td></tr> + self.assertHTMLEqual(f.as_table(), """<tr><th>Username:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="username" maxlength="10" /></td></tr> <tr><th>Password1:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="password" name="password1" /></td></tr> <tr><th>Password2:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="password" name="password2" /></td></tr>""") self.assertEqual(f.errors['username'], [u'This field is required.']) @@ -676,11 +676,11 @@ class FormsTestCase(TestCase): self.assertEqual(f.errors['password2'], [u'This field is required.']) f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'bar'}, auto_id=False) self.assertEqual(f.errors['__all__'], [u'Please make sure your passwords match.']) - self.assertEqual(f.as_table(), """<tr><td colspan="2"><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></td></tr> + self.assertHTMLEqual(f.as_table(), """<tr><td colspan="2"><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></td></tr> <tr><th>Username:</th><td><input type="text" name="username" value="adrian" maxlength="10" /></td></tr> <tr><th>Password1:</th><td><input type="password" name="password1" /></td></tr> <tr><th>Password2:</th><td><input type="password" name="password2" /></td></tr>""") - self.assertEqual(f.as_ul(), """<li><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></li> + self.assertHTMLEqual(f.as_ul(), """<li><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></li> <li>Username: <input type="text" name="username" value="adrian" maxlength="10" /></li> <li>Password1: <input type="password" name="password1" /></li> <li>Password2: <input type="password" name="password2" /></li>""") @@ -703,7 +703,7 @@ class FormsTestCase(TestCase): self.fields['birthday'] = DateField() p = Person(auto_id=False) - self.assertEqual(p.as_table(), """<tr><th>First name:</th><td><input type="text" name="first_name" /></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr><th>First name:</th><td><input type="text" name="first_name" /></td></tr> <tr><th>Last name:</th><td><input type="text" name="last_name" /></td></tr> <tr><th>Birthday:</th><td><input type="text" name="birthday" /></td></tr>""") @@ -718,11 +718,11 @@ class FormsTestCase(TestCase): field_list = [('field1', CharField()), ('field2', CharField())] my_form = MyForm(field_list=field_list) - self.assertEqual(my_form.as_table(), """<tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr> + self.assertHTMLEqual(my_form.as_table(), """<tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr> <tr><th>Field2:</th><td><input type="text" name="field2" /></td></tr>""") field_list = [('field3', CharField()), ('field4', CharField())] my_form = MyForm(field_list=field_list) - self.assertEqual(my_form.as_table(), """<tr><th>Field3:</th><td><input type="text" name="field3" /></td></tr> + self.assertHTMLEqual(my_form.as_table(), """<tr><th>Field3:</th><td><input type="text" name="field3" /></td></tr> <tr><th>Field4:</th><td><input type="text" name="field4" /></td></tr>""") class MyForm(Form): @@ -737,13 +737,13 @@ class FormsTestCase(TestCase): field_list = [('field1', CharField()), ('field2', CharField())] my_form = MyForm(field_list=field_list) - self.assertEqual(my_form.as_table(), """<tr><th>Default field 1:</th><td><input type="text" name="default_field_1" /></td></tr> + self.assertHTMLEqual(my_form.as_table(), """<tr><th>Default field 1:</th><td><input type="text" name="default_field_1" /></td></tr> <tr><th>Default field 2:</th><td><input type="text" name="default_field_2" /></td></tr> <tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr> <tr><th>Field2:</th><td><input type="text" name="field2" /></td></tr>""") field_list = [('field3', CharField()), ('field4', CharField())] my_form = MyForm(field_list=field_list) - self.assertEqual(my_form.as_table(), """<tr><th>Default field 1:</th><td><input type="text" name="default_field_1" /></td></tr> + self.assertHTMLEqual(my_form.as_table(), """<tr><th>Default field 1:</th><td><input type="text" name="default_field_1" /></td></tr> <tr><th>Default field 2:</th><td><input type="text" name="default_field_2" /></td></tr> <tr><th>Field3:</th><td><input type="text" name="field3" /></td></tr> <tr><th>Field4:</th><td><input type="text" name="field4" /></td></tr>""") @@ -836,25 +836,25 @@ class FormsTestCase(TestCase): birthday = DateField() p = Person(auto_id=False) - self.assertEqual(p.as_table(), """<tr><th>First name:</th><td><input type="text" name="first_name" /></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr><th>First name:</th><td><input type="text" name="first_name" /></td></tr> <tr><th>Last name:</th><td><input type="text" name="last_name" /></td></tr> <tr><th>Birthday:</th><td><input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></td></tr>""") - self.assertEqual(p.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> <li>Last name: <input type="text" name="last_name" /></li> <li>Birthday: <input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></li>""") - self.assertEqual(p.as_p(), """<p>First name: <input type="text" name="first_name" /></p> + self.assertHTMLEqual(p.as_p(), """<p>First name: <input type="text" name="first_name" /></p> <p>Last name: <input type="text" name="last_name" /></p> <p>Birthday: <input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></p>""") # With auto_id set, a HiddenInput still gets an ID, but it doesn't get a label. p = Person(auto_id='id_%s') - self.assertEqual(p.as_table(), """<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr> <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr> <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></td></tr>""") - self.assertEqual(p.as_ul(), """<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li> <li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li> <li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></li>""") - self.assertEqual(p.as_p(), """<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p> + self.assertHTMLEqual(p.as_p(), """<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p> <p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p> <p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></p>""") @@ -863,15 +863,15 @@ class FormsTestCase(TestCase): # prepended. This message is displayed at the top of the output, regardless of # its field's order in the form. p = Person({'first_name': 'John', 'last_name': 'Lennon', 'birthday': '1940-10-9'}, auto_id=False) - self.assertEqual(p.as_table(), """<tr><td colspan="2"><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr><td colspan="2"><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></td></tr> <tr><th>First name:</th><td><input type="text" name="first_name" value="John" /></td></tr> <tr><th>Last name:</th><td><input type="text" name="last_name" value="Lennon" /></td></tr> <tr><th>Birthday:</th><td><input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></td></tr>""") - self.assertEqual(p.as_ul(), """<li><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></li> + self.assertHTMLEqual(p.as_ul(), """<li><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></li> <li>First name: <input type="text" name="first_name" value="John" /></li> <li>Last name: <input type="text" name="last_name" value="Lennon" /></li> <li>Birthday: <input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></li>""") - self.assertEqual(p.as_p(), """<ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul> + self.assertHTMLEqual(p.as_p(), """<ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul> <p>First name: <input type="text" name="first_name" value="John" /></p> <p>Last name: <input type="text" name="last_name" value="Lennon" /></p> <p>Birthday: <input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></p>""") @@ -882,9 +882,9 @@ class FormsTestCase(TestCase): bar = CharField(widget=HiddenInput) p = TestForm(auto_id=False) - self.assertEqual(p.as_table(), '<input type="hidden" name="foo" /><input type="hidden" name="bar" />') - self.assertEqual(p.as_ul(), '<input type="hidden" name="foo" /><input type="hidden" name="bar" />') - self.assertEqual(p.as_p(), '<input type="hidden" name="foo" /><input type="hidden" name="bar" />') + self.assertHTMLEqual(p.as_table(), '<input type="hidden" name="foo" /><input type="hidden" name="bar" />') + self.assertHTMLEqual(p.as_ul(), '<input type="hidden" name="foo" /><input type="hidden" name="bar" />') + self.assertHTMLEqual(p.as_p(), '<input type="hidden" name="foo" /><input type="hidden" name="bar" />') def test_field_order(self): # A Form's fields are displayed in the same order in which they were defined. @@ -905,7 +905,7 @@ class FormsTestCase(TestCase): field14 = CharField() p = TestForm(auto_id=False) - self.assertEqual(p.as_table(), """<tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr> <tr><th>Field2:</th><td><input type="text" name="field2" /></td></tr> <tr><th>Field3:</th><td><input type="text" name="field3" /></td></tr> <tr><th>Field4:</th><td><input type="text" name="field4" /></td></tr> @@ -932,7 +932,7 @@ class FormsTestCase(TestCase): address = CharField() # no max_length defined here p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /></li> <li>Password: <input type="password" name="password" maxlength="10" /></li> <li>Realname: <input type="text" name="realname" maxlength="10" /></li> <li>Address: <input type="text" name="address" /></li>""") @@ -945,7 +945,7 @@ class FormsTestCase(TestCase): password = CharField(max_length=10, widget=PasswordInput) p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /></li> <li>Password: <input type="password" name="password" maxlength="10" /></li>""") def test_specifying_labels(self): @@ -958,7 +958,7 @@ class FormsTestCase(TestCase): password2 = CharField(widget=PasswordInput, label='Password (again)') p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), """<li>Your username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Your username: <input type="text" name="username" maxlength="10" /></li> <li>Password1: <input type="password" name="password1" /></li> <li>Password (again): <input type="password" name="password2" /></li>""") @@ -971,12 +971,12 @@ class FormsTestCase(TestCase): q4 = CharField(label='Answer this question!') q5 = CharField(label='The last question. Period.') - self.assertEqual(Questions(auto_id=False).as_p(), """<p>The first question: <input type="text" name="q1" /></p> + self.assertHTMLEqual(Questions(auto_id=False).as_p(), """<p>The first question: <input type="text" name="q1" /></p> <p>What is your name? <input type="text" name="q2" /></p> <p>The answer to life is: <input type="text" name="q3" /></p> <p>Answer this question! <input type="text" name="q4" /></p> <p>The last question. Period. <input type="text" name="q5" /></p>""") - self.assertEqual(Questions().as_p(), """<p><label for="id_q1">The first question:</label> <input type="text" name="q1" id="id_q1" /></p> + self.assertHTMLEqual(Questions().as_p(), """<p><label for="id_q1">The first question:</label> <input type="text" name="q1" id="id_q1" /></p> <p><label for="id_q2">What is your name?</label> <input type="text" name="q2" id="id_q2" /></p> <p><label for="id_q3">The answer to life is:</label> <input type="text" name="q3" id="id_q3" /></p> <p><label for="id_q4">Answer this question!</label> <input type="text" name="q4" id="id_q4" /></p> @@ -988,7 +988,7 @@ class FormsTestCase(TestCase): password = CharField(widget=PasswordInput, label=u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111') p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), u'<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="text" name="username" maxlength="10" /></li>\n<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="password" name="password" /></li>') + self.assertHTMLEqual(p.as_ul(), u'<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="text" name="username" maxlength="10" /></li>\n<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="password" name="password" /></li>') # If a label is set to the empty string for a field, that field won't get a label. class UserRegistration(Form): @@ -996,10 +996,10 @@ class FormsTestCase(TestCase): password = CharField(widget=PasswordInput) p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), """<li> <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li> <input type="text" name="username" maxlength="10" /></li> <li>Password: <input type="password" name="password" /></li>""") p = UserRegistration(auto_id='id_%s') - self.assertEqual(p.as_ul(), """<li> <input id="id_username" type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li> <input id="id_username" type="text" name="username" maxlength="10" /></li> <li><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /></li>""") # If label is None, Django will auto-create the label from the field name. This @@ -1009,10 +1009,10 @@ class FormsTestCase(TestCase): password = CharField(widget=PasswordInput) p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /></li> <li>Password: <input type="password" name="password" /></li>""") p = UserRegistration(auto_id='id_%s') - self.assertEqual(p.as_ul(), """<li><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /></li> <li><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /></li>""") def test_label_suffix(self): @@ -1026,16 +1026,16 @@ class FormsTestCase(TestCase): animal = CharField(label='Favorite animal') f = FavoriteForm(auto_id=False) - self.assertEqual(f.as_ul(), """<li>Favorite color? <input type="text" name="color" /></li> + self.assertHTMLEqual(f.as_ul(), """<li>Favorite color? <input type="text" name="color" /></li> <li>Favorite animal: <input type="text" name="animal" /></li>""") f = FavoriteForm(auto_id=False, label_suffix='?') - self.assertEqual(f.as_ul(), """<li>Favorite color? <input type="text" name="color" /></li> + self.assertHTMLEqual(f.as_ul(), """<li>Favorite color? <input type="text" name="color" /></li> <li>Favorite animal? <input type="text" name="animal" /></li>""") f = FavoriteForm(auto_id=False, label_suffix='') - self.assertEqual(f.as_ul(), """<li>Favorite color? <input type="text" name="color" /></li> + self.assertHTMLEqual(f.as_ul(), """<li>Favorite color? <input type="text" name="color" /></li> <li>Favorite animal <input type="text" name="animal" /></li>""") f = FavoriteForm(auto_id=False, label_suffix=u'\u2192') - self.assertEqual(f.as_ul(), u'<li>Favorite color? <input type="text" name="color" /></li>\n<li>Favorite animal\u2192 <input type="text" name="animal" /></li>') + self.assertHTMLEqual(f.as_ul(), u'<li>Favorite color? <input type="text" name="color" /></li>\n<li>Favorite animal\u2192 <input type="text" name="animal" /></li>') def test_initial_data(self): # You can specify initial data for a field by using the 'initial' argument to a @@ -1049,18 +1049,18 @@ class FormsTestCase(TestCase): # Here, we're not submitting any data, so the initial value will be displayed.) p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> <li>Password: <input type="password" name="password" /></li>""") # Here, we're submitting data, so the initial value will *not* be displayed. p = UserRegistration({}, auto_id=False) - self.assertEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>""") p = UserRegistration({'username': u''}, auto_id=False) - self.assertEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>""") p = UserRegistration({'username': u'foo'}, auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>""") # An 'initial' value is *not* used as a fallback if data is not provided. In this @@ -1082,21 +1082,21 @@ class FormsTestCase(TestCase): # Here, we're not submitting any data, so the initial value will be displayed.) p = UserRegistration(initial={'username': 'django'}, auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> <li>Password: <input type="password" name="password" /></li>""") p = UserRegistration(initial={'username': 'stephane'}, auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="stephane" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="stephane" maxlength="10" /></li> <li>Password: <input type="password" name="password" /></li>""") # The 'initial' parameter is meaningless if you pass data. p = UserRegistration({}, initial={'username': 'django'}, auto_id=False) - self.assertEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>""") p = UserRegistration({'username': u''}, initial={'username': 'django'}, auto_id=False) - self.assertEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>""") p = UserRegistration({'username': u'foo'}, initial={'username': 'django'}, auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>""") # A dynamic 'initial' value is *not* used as a fallback if data is not provided. @@ -1113,7 +1113,7 @@ class FormsTestCase(TestCase): password = CharField(widget=PasswordInput) p = UserRegistration(initial={'username': 'babik'}, auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="babik" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="babik" maxlength="10" /></li> <li>Password: <input type="password" name="password" /></li>""") def test_callable_initial_data(self): @@ -1139,7 +1139,7 @@ class FormsTestCase(TestCase): # Here, we're not submitting any data, so the initial value will be displayed.) p = UserRegistration(initial={'username': initial_django, 'options': initial_options}, auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> <li>Password: <input type="password" name="password" /></li> <li>Options: <select multiple="multiple" name="options"> <option value="f" selected="selected">foo</option> @@ -1149,7 +1149,7 @@ class FormsTestCase(TestCase): # The 'initial' parameter is meaningless if you pass data. p = UserRegistration({}, initial={'username': initial_django, 'options': initial_options}, auto_id=False) - self.assertEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Options: <select multiple="multiple" name="options"> <option value="f">foo</option> @@ -1157,7 +1157,7 @@ class FormsTestCase(TestCase): <option value="w">whiz</option> </select></li>""") p = UserRegistration({'username': u''}, initial={'username': initial_django}, auto_id=False) - self.assertEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Options: <select multiple="multiple" name="options"> <option value="f">foo</option> @@ -1165,7 +1165,7 @@ class FormsTestCase(TestCase): <option value="w">whiz</option> </select></li>""") p = UserRegistration({'username': u'foo', 'options':['f','b']}, initial={'username': initial_django}, auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li> <li>Options: <select multiple="multiple" name="options"> <option value="f" selected="selected">foo</option> @@ -1188,7 +1188,7 @@ class FormsTestCase(TestCase): options = MultipleChoiceField(choices=[('f','foo'),('b','bar'),('w','whiz')], initial=initial_other_options) p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li> <li>Password: <input type="password" name="password" /></li> <li>Options: <select multiple="multiple" name="options"> <option value="f">foo</option> @@ -1196,7 +1196,7 @@ class FormsTestCase(TestCase): <option value="w" selected="selected">whiz</option> </select></li>""") p = UserRegistration(initial={'username': initial_stephane, 'options': initial_options}, auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="stephane" maxlength="10" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="stephane" maxlength="10" /></li> <li>Password: <input type="password" name="password" /></li> <li>Options: <select multiple="multiple" name="options"> <option value="f" selected="selected">foo</option> @@ -1226,16 +1226,16 @@ class FormsTestCase(TestCase): password = CharField(widget=PasswordInput, help_text='Choose wisely.') p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /> <span class="helptext">e.g., user@example.com</span></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /> <span class="helptext">e.g., user@example.com</span></li> <li>Password: <input type="password" name="password" /> <span class="helptext">Choose wisely.</span></li>""") - self.assertEqual(p.as_p(), """<p>Username: <input type="text" name="username" maxlength="10" /> <span class="helptext">e.g., user@example.com</span></p> + self.assertHTMLEqual(p.as_p(), """<p>Username: <input type="text" name="username" maxlength="10" /> <span class="helptext">e.g., user@example.com</span></p> <p>Password: <input type="password" name="password" /> <span class="helptext">Choose wisely.</span></p>""") - self.assertEqual(p.as_table(), """<tr><th>Username:</th><td><input type="text" name="username" maxlength="10" /><br /><span class="helptext">e.g., user@example.com</span></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr><th>Username:</th><td><input type="text" name="username" maxlength="10" /><br /><span class="helptext">e.g., user@example.com</span></td></tr> <tr><th>Password:</th><td><input type="password" name="password" /><br /><span class="helptext">Choose wisely.</span></td></tr>""") # The help text is displayed whether or not data is provided for the form. p = UserRegistration({'username': u'foo'}, auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="foo" maxlength="10" /> <span class="helptext">e.g., user@example.com</span></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" value="foo" maxlength="10" /> <span class="helptext">e.g., user@example.com</span></li> <li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /> <span class="helptext">Choose wisely.</span></li>""") # help_text is not displayed for hidden fields. It can be used for documentation @@ -1246,7 +1246,7 @@ class FormsTestCase(TestCase): next = CharField(widget=HiddenInput, initial='/', help_text='Redirect destination') p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /> <span class="helptext">e.g., user@example.com</span></li> + self.assertHTMLEqual(p.as_ul(), """<li>Username: <input type="text" name="username" maxlength="10" /> <span class="helptext">e.g., user@example.com</span></li> <li>Password: <input type="password" name="password" /><input type="hidden" name="next" value="/" /></li>""") # Help text can include arbitrary Unicode characters. @@ -1254,7 +1254,7 @@ class FormsTestCase(TestCase): username = CharField(max_length=10, help_text='ŠĐĆŽćžšđ') p = UserRegistration(auto_id=False) - self.assertEqual(p.as_ul(), u'<li>Username: <input type="text" name="username" maxlength="10" /> <span class="helptext">\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</span></li>') + self.assertHTMLEqual(p.as_ul(), u'<li>Username: <input type="text" name="username" maxlength="10" /> <span class="helptext">\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</span></li>') def test_subclassing_forms(self): # You can subclass a Form to add fields. The resulting form subclass will have @@ -1269,11 +1269,11 @@ class FormsTestCase(TestCase): instrument = CharField() p = Person(auto_id=False) - self.assertEqual(p.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> <li>Last name: <input type="text" name="last_name" /></li> <li>Birthday: <input type="text" name="birthday" /></li>""") m = Musician(auto_id=False) - self.assertEqual(m.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> + self.assertHTMLEqual(m.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> <li>Last name: <input type="text" name="last_name" /></li> <li>Birthday: <input type="text" name="birthday" /></li> <li>Instrument: <input type="text" name="instrument" /></li>""") @@ -1292,7 +1292,7 @@ class FormsTestCase(TestCase): haircut_type = CharField() b = Beatle(auto_id=False) - self.assertEqual(b.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> + self.assertHTMLEqual(b.as_ul(), """<li>First name: <input type="text" name="first_name" /></li> <li>Last name: <input type="text" name="last_name" /></li> <li>Birthday: <input type="text" name="birthday" /></li> <li>Instrument: <input type="text" name="instrument" /></li> @@ -1317,12 +1317,12 @@ class FormsTestCase(TestCase): 'person1-birthday': u'1940-10-9' } p = Person(data, prefix='person1') - self.assertEqual(p.as_ul(), """<li><label for="id_person1-first_name">First name:</label> <input type="text" name="person1-first_name" value="John" id="id_person1-first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><label for="id_person1-first_name">First name:</label> <input type="text" name="person1-first_name" value="John" id="id_person1-first_name" /></li> <li><label for="id_person1-last_name">Last name:</label> <input type="text" name="person1-last_name" value="Lennon" id="id_person1-last_name" /></li> <li><label for="id_person1-birthday">Birthday:</label> <input type="text" name="person1-birthday" value="1940-10-9" id="id_person1-birthday" /></li>""") - self.assertEqual(str(p['first_name']), '<input type="text" name="person1-first_name" value="John" id="id_person1-first_name" />') - self.assertEqual(str(p['last_name']), '<input type="text" name="person1-last_name" value="Lennon" id="id_person1-last_name" />') - self.assertEqual(str(p['birthday']), '<input type="text" name="person1-birthday" value="1940-10-9" id="id_person1-birthday" />') + self.assertHTMLEqual(str(p['first_name']), '<input type="text" name="person1-first_name" value="John" id="id_person1-first_name" />') + self.assertHTMLEqual(str(p['last_name']), '<input type="text" name="person1-last_name" value="Lennon" id="id_person1-last_name" />') + self.assertHTMLEqual(str(p['birthday']), '<input type="text" name="person1-birthday" value="1940-10-9" id="id_person1-birthday" />') self.assertEqual(p.errors, {}) self.assertTrue(p.is_valid()) self.assertEqual(p.cleaned_data['first_name'], u'John') @@ -1393,7 +1393,7 @@ class FormsTestCase(TestCase): return self.prefix and '%s-prefix-%s' % (self.prefix, field_name) or field_name p = Person(prefix='foo') - self.assertEqual(p.as_ul(), """<li><label for="id_foo-prefix-first_name">First name:</label> <input type="text" name="foo-prefix-first_name" id="id_foo-prefix-first_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li><label for="id_foo-prefix-first_name">First name:</label> <input type="text" name="foo-prefix-first_name" id="id_foo-prefix-first_name" /></li> <li><label for="id_foo-prefix-last_name">Last name:</label> <input type="text" name="foo-prefix-last_name" id="id_foo-prefix-last_name" /></li> <li><label for="id_foo-prefix-birthday">Birthday:</label> <input type="text" name="foo-prefix-birthday" id="id_foo-prefix-birthday" /></li>""") data = { @@ -1415,37 +1415,37 @@ class FormsTestCase(TestCase): is_cool = NullBooleanField() p = Person({'name': u'Joe'}, auto_id=False) - self.assertEqual(str(p['is_cool']), """<select name="is_cool"> + self.assertHTMLEqual(str(p['is_cool']), """<select name="is_cool"> <option value="1" selected="selected">Unknown</option> <option value="2">Yes</option> <option value="3">No</option> </select>""") p = Person({'name': u'Joe', 'is_cool': u'1'}, auto_id=False) - self.assertEqual(str(p['is_cool']), """<select name="is_cool"> + self.assertHTMLEqual(str(p['is_cool']), """<select name="is_cool"> <option value="1" selected="selected">Unknown</option> <option value="2">Yes</option> <option value="3">No</option> </select>""") p = Person({'name': u'Joe', 'is_cool': u'2'}, auto_id=False) - self.assertEqual(str(p['is_cool']), """<select name="is_cool"> + self.assertHTMLEqual(str(p['is_cool']), """<select name="is_cool"> <option value="1">Unknown</option> <option value="2" selected="selected">Yes</option> <option value="3">No</option> </select>""") p = Person({'name': u'Joe', 'is_cool': u'3'}, auto_id=False) - self.assertEqual(str(p['is_cool']), """<select name="is_cool"> + self.assertHTMLEqual(str(p['is_cool']), """<select name="is_cool"> <option value="1">Unknown</option> <option value="2">Yes</option> <option value="3" selected="selected">No</option> </select>""") p = Person({'name': u'Joe', 'is_cool': True}, auto_id=False) - self.assertEqual(str(p['is_cool']), """<select name="is_cool"> + self.assertHTMLEqual(str(p['is_cool']), """<select name="is_cool"> <option value="1">Unknown</option> <option value="2" selected="selected">Yes</option> <option value="3">No</option> </select>""") p = Person({'name': u'Joe', 'is_cool': False}, auto_id=False) - self.assertEqual(str(p['is_cool']), """<select name="is_cool"> + self.assertHTMLEqual(str(p['is_cool']), """<select name="is_cool"> <option value="1">Unknown</option> <option value="2">Yes</option> <option value="3" selected="selected">No</option> @@ -1458,23 +1458,23 @@ class FormsTestCase(TestCase): file1 = FileField() f = FileForm(auto_id=False) - self.assertEqual(f.as_table(), '<tr><th>File1:</th><td><input type="file" name="file1" /></td></tr>') + self.assertHTMLEqual(f.as_table(), '<tr><th>File1:</th><td><input type="file" name="file1" /></td></tr>') f = FileForm(data={}, files={}, auto_id=False) - self.assertEqual(f.as_table(), '<tr><th>File1:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="file" name="file1" /></td></tr>') + self.assertHTMLEqual(f.as_table(), '<tr><th>File1:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="file" name="file1" /></td></tr>') f = FileForm(data={}, files={'file1': SimpleUploadedFile('name', '')}, auto_id=False) - self.assertEqual(f.as_table(), '<tr><th>File1:</th><td><ul class="errorlist"><li>The submitted file is empty.</li></ul><input type="file" name="file1" /></td></tr>') + self.assertHTMLEqual(f.as_table(), '<tr><th>File1:</th><td><ul class="errorlist"><li>The submitted file is empty.</li></ul><input type="file" name="file1" /></td></tr>') f = FileForm(data={}, files={'file1': 'something that is not a file'}, auto_id=False) - self.assertEqual(f.as_table(), '<tr><th>File1:</th><td><ul class="errorlist"><li>No file was submitted. Check the encoding type on the form.</li></ul><input type="file" name="file1" /></td></tr>') + self.assertHTMLEqual(f.as_table(), '<tr><th>File1:</th><td><ul class="errorlist"><li>No file was submitted. Check the encoding type on the form.</li></ul><input type="file" name="file1" /></td></tr>') f = FileForm(data={}, files={'file1': SimpleUploadedFile('name', 'some content')}, auto_id=False) - self.assertEqual(f.as_table(), '<tr><th>File1:</th><td><input type="file" name="file1" /></td></tr>') + self.assertHTMLEqual(f.as_table(), '<tr><th>File1:</th><td><input type="file" name="file1" /></td></tr>') self.assertTrue(f.is_valid()) f = FileForm(data={}, files={'file1': SimpleUploadedFile('我隻氣墊船裝滿晒鱔.txt', 'मेरी मँडराने वाली नाव सर्पमीनों से भरी ह')}, auto_id=False) - self.assertEqual(f.as_table(), '<tr><th>File1:</th><td><input type="file" name="file1" /></td></tr>') + self.assertHTMLEqual(f.as_table(), '<tr><th>File1:</th><td><input type="file" name="file1" /></td></tr>') def test_basic_processing_in_view(self): class UserRegistration(Form): @@ -1501,7 +1501,7 @@ class FormsTestCase(TestCase): return t.render(Context({'form': form})) # Case 1: GET (an empty form, with no errors).) - self.assertEqual(my_function('GET', {}), """<form action="" method="post"> + self.assertHTMLEqual(my_function('GET', {}), """<form action="" method="post"> <table> <tr><th>Username:</th><td><input type="text" name="username" maxlength="10" /></td></tr> <tr><th>Password1:</th><td><input type="password" name="password1" /></td></tr> @@ -1510,7 +1510,7 @@ class FormsTestCase(TestCase): <input type="submit" /> </form>""") # Case 2: POST with erroneous data (a redisplayed form, with errors).) - self.assertEqual(my_function('POST', {'username': 'this-is-a-long-username', 'password1': 'foo', 'password2': 'bar'}), """<form action="" method="post"> + self.assertHTMLEqual(my_function('POST', {'username': 'this-is-a-long-username', 'password1': 'foo', 'password2': 'bar'}), """<form action="" method="post"> <table> <tr><td colspan="2"><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></td></tr> <tr><th>Username:</th><td><ul class="errorlist"><li>Ensure this value has at most 10 characters (it has 23).</li></ul><input type="text" name="username" value="this-is-a-long-username" maxlength="10" /></td></tr> @@ -1520,7 +1520,7 @@ class FormsTestCase(TestCase): <input type="submit" /> </form>""") # Case 3: POST with valid data (the success message).) - self.assertEqual(my_function('POST', {'username': 'adrian', 'password1': 'secret', 'password2': 'secret'}), "VALID: {'username': u'adrian', 'password1': u'secret', 'password2': u'secret'}") + self.assertHTMLEqual(my_function('POST', {'username': 'adrian', 'password1': 'secret', 'password2': 'secret'}), "VALID: {'username': u'adrian', 'password1': u'secret', 'password2': u'secret'}") def test_templates_with_forms(self): class UserRegistration(Form): @@ -1545,13 +1545,13 @@ class FormsTestCase(TestCase): {{ form.password2.errors.as_ul }}<p><label>Password (again): {{ form.password2 }}</label></p> <input type="submit" /> </form>''') - self.assertEqual(t.render(Context({'form': UserRegistration(auto_id=False)})), """<form action=""> + self.assertHTMLEqual(t.render(Context({'form': UserRegistration(auto_id=False)})), """<form action=""> <p><label>Your username: <input type="text" name="username" maxlength="10" /></label></p> <p><label>Password: <input type="password" name="password1" /></label></p> <p><label>Password (again): <input type="password" name="password2" /></label></p> <input type="submit" /> </form>""") - self.assertEqual(t.render(Context({'form': UserRegistration({'username': 'django'}, auto_id=False)})), """<form action=""> + self.assertHTMLEqual(t.render(Context({'form': UserRegistration({'username': 'django'}, auto_id=False)})), """<form action=""> <p><label>Your username: <input type="text" name="username" value="django" maxlength="10" /></label></p> <ul class="errorlist"><li>This field is required.</li></ul><p><label>Password: <input type="password" name="password1" /></label></p> <ul class="errorlist"><li>This field is required.</li></ul><p><label>Password (again): <input type="password" name="password2" /></label></p> @@ -1568,7 +1568,7 @@ class FormsTestCase(TestCase): <p><label>{{ form.password2.label }}: {{ form.password2 }}</label></p> <input type="submit" /> </form>''') - self.assertEqual(t.render(Context({'form': UserRegistration(auto_id=False)})), """<form action=""> + self.assertHTMLEqual(t.render(Context({'form': UserRegistration(auto_id=False)})), """<form action=""> <p><label>Username: <input type="text" name="username" maxlength="10" /></label></p> <p><label>Password1: <input type="password" name="password1" /></label></p> <p><label>Password2: <input type="password" name="password2" /></label></p> @@ -1585,13 +1585,13 @@ class FormsTestCase(TestCase): <p>{{ form.password2.label_tag }}: {{ form.password2 }}</p> <input type="submit" /> </form>''') - self.assertEqual(t.render(Context({'form': UserRegistration(auto_id=False)})), """<form action=""> + self.assertHTMLEqual(t.render(Context({'form': UserRegistration(auto_id=False)})), """<form action=""> <p>Username: <input type="text" name="username" maxlength="10" /></p> <p>Password1: <input type="password" name="password1" /></p> <p>Password2: <input type="password" name="password2" /></p> <input type="submit" /> </form>""") - self.assertEqual(t.render(Context({'form': UserRegistration(auto_id='id_%s')})), """<form action=""> + self.assertHTMLEqual(t.render(Context({'form': UserRegistration(auto_id='id_%s')})), """<form action=""> <p><label for="id_username">Username</label>: <input id="id_username" type="text" name="username" maxlength="10" /></p> <p><label for="id_password1">Password1</label>: <input type="password" name="password1" id="id_password1" /></p> <p><label for="id_password2">Password2</label>: <input type="password" name="password2" id="id_password2" /></p> @@ -1606,7 +1606,7 @@ class FormsTestCase(TestCase): <p>{{ form.password2.label_tag }}: {{ form.password2 }}</p> <input type="submit" /> </form>''') - self.assertEqual(t.render(Context({'form': UserRegistration(auto_id=False)})), """<form action=""> + self.assertHTMLEqual(t.render(Context({'form': UserRegistration(auto_id=False)})), """<form action=""> <p>Username: <input type="text" name="username" maxlength="10" /><br />Good luck picking a username that doesn't already exist.</p> <p>Password1: <input type="password" name="password1" /></p> <p>Password2: <input type="password" name="password2" /></p> @@ -1622,11 +1622,14 @@ class FormsTestCase(TestCase): for bf in f: form_output.append(bf.label_tag(attrs={'class': 'pretty'})) - self.assertEqual(form_output, [ + expected_form_output = [ '<label for="id_username" class="pretty">Username</label>', '<label for="id_password1" class="pretty">Password1</label>', '<label for="id_password2" class="pretty">Password2</label>', - ]) + ] + self.assertEqual(len(form_output), len(expected_form_output)) + for i in range(len(form_output)): + self.assertHTMLEqual(form_output[i], expected_form_output[i]) # To display the errors that aren't associated with a particular field -- e.g., # the errors caused by Form.clean() -- use {{ form.non_field_errors }} in the @@ -1638,7 +1641,7 @@ class FormsTestCase(TestCase): {{ form.password2.errors.as_ul }}<p><label>Password (again): {{ form.password2 }}</label></p> <input type="submit" /> </form>''') - self.assertEqual(t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)})), """<form action=""> + self.assertHTMLEqual(t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)})), """<form action=""> <p><label>Your username: <input type="text" name="username" value="django" maxlength="10" /></label></p> <p><label>Password: <input type="password" name="password1" /></label></p> <p><label>Password (again): <input type="password" name="password2" /></label></p> @@ -1651,7 +1654,7 @@ class FormsTestCase(TestCase): {{ form.password2.errors.as_ul }}<p><label>Password (again): {{ form.password2 }}</label></p> <input type="submit" /> </form>''') - self.assertEqual(t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)})), """<form action=""> + self.assertHTMLEqual(t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)})), """<form action=""> <ul class="errorlist"><li>Please make sure your passwords match.</li></ul> <p><label>Your username: <input type="text" name="username" value="django" maxlength="10" /></label></p> <p><label>Password: <input type="password" name="password1" /></label></p> @@ -1727,7 +1730,7 @@ class FormsTestCase(TestCase): class MyForm(Form): field1 = CharField(max_length=50, show_hidden_initial=True) - self.assertEqual(MyForm().as_table(), '<tr><th><label for="id_field1">Field1:</label></th><td><input id="id_field1" type="text" name="field1" maxlength="50" /><input type="hidden" name="initial-field1" id="initial-id_field1" /></td></tr>') + self.assertHTMLEqual(MyForm().as_table(), '<tr><th><label for="id_field1">Field1:</label></th><td><input id="id_field1" type="text" name="field1" maxlength="50" /><input type="hidden" name="initial-field1" id="initial-id_field1" /></td></tr>') def test_error_html_required_html_classes(self): class Person(Form): @@ -1740,7 +1743,7 @@ class FormsTestCase(TestCase): p.error_css_class = 'error' p.required_css_class = 'required' - self.assertEqual(p.as_ul(), """<li class="required error"><ul class="errorlist"><li>This field is required.</li></ul><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li> + self.assertHTMLEqual(p.as_ul(), """<li class="required error"><ul class="errorlist"><li>This field is required.</li></ul><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li> <li class="required"><label for="id_is_cool">Is cool:</label> <select name="is_cool" id="id_is_cool"> <option value="1" selected="selected">Unknown</option> <option value="2">Yes</option> @@ -1749,7 +1752,7 @@ class FormsTestCase(TestCase): <li><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></li> <li class="required error"><ul class="errorlist"><li>This field is required.</li></ul><label for="id_age">Age:</label> <input type="text" name="age" id="id_age" /></li>""") - self.assertEqual(p.as_p(), """<ul class="errorlist"><li>This field is required.</li></ul> + self.assertHTMLEqual(p.as_p(), """<ul class="errorlist"><li>This field is required.</li></ul> <p class="required error"><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></p> <p class="required"><label for="id_is_cool">Is cool:</label> <select name="is_cool" id="id_is_cool"> <option value="1" selected="selected">Unknown</option> @@ -1760,7 +1763,7 @@ class FormsTestCase(TestCase): <ul class="errorlist"><li>This field is required.</li></ul> <p class="required error"><label for="id_age">Age:</label> <input type="text" name="age" id="id_age" /></p>""") - self.assertEqual(p.as_table(), """<tr class="required error"><th><label for="id_name">Name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="name" id="id_name" /></td></tr> + self.assertHTMLEqual(p.as_table(), """<tr class="required error"><th><label for="id_name">Name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="name" id="id_name" /></td></tr> <tr class="required"><th><label for="id_is_cool">Is cool:</label></th><td><select name="is_cool" id="id_is_cool"> <option value="1" selected="selected">Unknown</option> <option value="2">Yes</option> @@ -1774,4 +1777,4 @@ class FormsTestCase(TestCase): happened_at = SplitDateTimeField(widget=widgets.SplitHiddenDateTimeWidget) form = EventForm() - self.assertEqual(form.as_ul(), u'<input type="hidden" name="happened_at_0" id="id_happened_at_0" /><input type="hidden" name="happened_at_1" id="id_happened_at_1" />') + self.assertHTMLEqual(form.as_ul(), u'<input type="hidden" name="happened_at_0" id="id_happened_at_0" /><input type="hidden" name="happened_at_1" id="id_happened_at_1" />') diff --git a/tests/regressiontests/forms/tests/formsets.py b/tests/regressiontests/forms/tests/formsets.py index f21805334e..05ef978c45 100644 --- a/tests/regressiontests/forms/tests/formsets.py +++ b/tests/regressiontests/forms/tests/formsets.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.forms import Form, CharField, IntegerField, ValidationError, DateField from django.forms.formsets import formset_factory, BaseFormSet -from django.utils.unittest import TestCase +from django.test import TestCase class Choice(Form): @@ -47,7 +47,7 @@ class FormsFormsetTestCase(TestCase): # for adding data. By default, it displays 1 blank form. It can display more, # but we'll look at how to do so later. formset = ChoiceFormSet(auto_id=False, prefix='choices') - self.assertEqual(str(formset), """<input type="hidden" name="choices-TOTAL_FORMS" value="1" /><input type="hidden" name="choices-INITIAL_FORMS" value="0" /><input type="hidden" name="choices-MAX_NUM_FORMS" /> + self.assertHTMLEqual(str(formset), """<input type="hidden" name="choices-TOTAL_FORMS" value="1" /><input type="hidden" name="choices-INITIAL_FORMS" value="0" /><input type="hidden" name="choices-MAX_NUM_FORMS" /> <tr><th>Choice:</th><td><input type="text" name="choices-0-choice" /></td></tr> <tr><th>Votes:</th><td><input type="text" name="choices-0-votes" /></td></tr>""") @@ -132,7 +132,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(form.as_ul()) - self.assertEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> + self.assertHTMLEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> <li>Votes: <input type="text" name="choices-0-votes" value="100" /></li> <li>Choice: <input type="text" name="choices-1-choice" /></li> <li>Votes: <input type="text" name="choices-1-votes" /></li>""") @@ -205,7 +205,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(form.as_ul()) - self.assertEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" /></li> + self.assertHTMLEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" /></li> <li>Votes: <input type="text" name="choices-0-votes" /></li> <li>Choice: <input type="text" name="choices-1-choice" /></li> <li>Votes: <input type="text" name="choices-1-votes" /></li> @@ -296,7 +296,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(form.as_ul()) - self.assertEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> + self.assertHTMLEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> <li>Votes: <input type="text" name="choices-0-votes" value="100" /></li> <li>Choice: <input type="text" name="choices-1-choice" /></li> <li>Votes: <input type="text" name="choices-1-votes" /></li> @@ -308,7 +308,7 @@ class FormsFormsetTestCase(TestCase): # Make sure retrieving an empty form works, and it shows up in the form list self.assertTrue(formset.empty_form.empty_permitted) - self.assertEqual(formset.empty_form.as_ul(), """<li>Choice: <input type="text" name="choices-__prefix__-choice" /></li> + self.assertHTMLEqual(formset.empty_form.as_ul(), """<li>Choice: <input type="text" name="choices-__prefix__-choice" /></li> <li>Votes: <input type="text" name="choices-__prefix__-votes" /></li>""") def test_formset_with_deletion(self): @@ -326,7 +326,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(form.as_ul()) - self.assertEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> + self.assertHTMLEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> <li>Votes: <input type="text" name="choices-0-votes" value="100" /></li> <li>Delete: <input type="checkbox" name="choices-0-DELETE" /></li> <li>Choice: <input type="text" name="choices-1-choice" value="Fergie" /></li> @@ -423,7 +423,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(form.as_ul()) - self.assertEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> + self.assertHTMLEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> <li>Votes: <input type="text" name="choices-0-votes" value="100" /></li> <li>Order: <input type="text" name="choices-0-ORDER" value="1" /></li> <li>Choice: <input type="text" name="choices-1-choice" value="Fergie" /></li> @@ -534,7 +534,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(form.as_ul()) - self.assertEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> + self.assertHTMLEqual('\n'.join(form_output), """<li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> <li>Votes: <input type="text" name="choices-0-votes" value="100" /></li> <li>Order: <input type="text" name="choices-0-ORDER" value="1" /></li> <li>Delete: <input type="checkbox" name="choices-0-DELETE" /></li> @@ -660,7 +660,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(str(form)) - self.assertEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" id="id_form-0-name" /></td></tr> + self.assertHTMLEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" id="id_form-0-name" /></td></tr> <tr><th><label for="id_form-1-name">Name:</label></th><td><input type="text" name="form-1-name" id="id_form-1-name" /></td></tr> <tr><th><label for="id_form-2-name">Name:</label></th><td><input type="text" name="form-2-name" id="id_form-2-name" /></td></tr>""") @@ -681,7 +681,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(str(form)) - self.assertEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" id="id_form-0-name" /></td></tr> + self.assertHTMLEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" id="id_form-0-name" /></td></tr> <tr><th><label for="id_form-1-name">Name:</label></th><td><input type="text" name="form-1-name" id="id_form-1-name" /></td></tr>""") # Ensure that max_num has no effect when extra is less than max_num. @@ -693,7 +693,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(str(form)) - self.assertEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" id="id_form-0-name" /></td></tr>""") + self.assertHTMLEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" id="id_form-0-name" /></td></tr>""") def test_max_num_with_initial_data(self): # max_num with initial data @@ -712,7 +712,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(str(form)) - self.assertEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" value="Fernet and Coke" id="id_form-0-name" /></td></tr> + self.assertHTMLEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" value="Fernet and Coke" id="id_form-0-name" /></td></tr> <tr><th><label for="id_form-1-name">Name:</label></th><td><input type="text" name="form-1-name" id="id_form-1-name" /></td></tr>""") def test_max_num_zero(self): @@ -748,7 +748,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(str(form)) - self.assertEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" value="Gin Tonic" id="id_form-0-name" /></td></tr> + self.assertHTMLEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" value="Gin Tonic" id="id_form-0-name" /></td></tr> <tr><th><label for="id_form-1-name">Name:</label></th><td><input type="text" name="form-1-name" value="Bloody Mary" id="id_form-1-name" /></td></tr>""") # One form from initial and extra=3 with max_num=2 should result in the one @@ -763,7 +763,7 @@ class FormsFormsetTestCase(TestCase): for form in formset.forms: form_output.append(str(form)) - self.assertEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" value="Gin Tonic" id="id_form-0-name" /></td></tr> + self.assertHTMLEqual('\n'.join(form_output), """<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" value="Gin Tonic" id="id_form-0-name" /></td></tr> <tr><th><label for="id_form-1-name">Name:</label></th><td><input type="text" name="form-1-name" id="id_form-1-name" /></td></tr>""") def test_regression_6926(self): @@ -862,19 +862,19 @@ ChoiceFormSet = formset_factory(Choice) class FormsetAsFooTests(TestCase): def test_as_table(self): formset = ChoiceFormSet(data, auto_id=False, prefix='choices') - self.assertEqual(formset.as_table(),"""<input type="hidden" name="choices-TOTAL_FORMS" value="1" /><input type="hidden" name="choices-INITIAL_FORMS" value="0" /><input type="hidden" name="choices-MAX_NUM_FORMS" value="0" /> + self.assertHTMLEqual(formset.as_table(),"""<input type="hidden" name="choices-TOTAL_FORMS" value="1" /><input type="hidden" name="choices-INITIAL_FORMS" value="0" /><input type="hidden" name="choices-MAX_NUM_FORMS" value="0" /> <tr><th>Choice:</th><td><input type="text" name="choices-0-choice" value="Calexico" /></td></tr> <tr><th>Votes:</th><td><input type="text" name="choices-0-votes" value="100" /></td></tr>""") def test_as_p(self): formset = ChoiceFormSet(data, auto_id=False, prefix='choices') - self.assertEqual(formset.as_p(),"""<input type="hidden" name="choices-TOTAL_FORMS" value="1" /><input type="hidden" name="choices-INITIAL_FORMS" value="0" /><input type="hidden" name="choices-MAX_NUM_FORMS" value="0" /> + self.assertHTMLEqual(formset.as_p(),"""<input type="hidden" name="choices-TOTAL_FORMS" value="1" /><input type="hidden" name="choices-INITIAL_FORMS" value="0" /><input type="hidden" name="choices-MAX_NUM_FORMS" value="0" /> <p>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></p> <p>Votes: <input type="text" name="choices-0-votes" value="100" /></p>""") def test_as_ul(self): formset = ChoiceFormSet(data, auto_id=False, prefix='choices') - self.assertEqual(formset.as_ul(),"""<input type="hidden" name="choices-TOTAL_FORMS" value="1" /><input type="hidden" name="choices-INITIAL_FORMS" value="0" /><input type="hidden" name="choices-MAX_NUM_FORMS" value="0" /> + self.assertHTMLEqual(formset.as_ul(),"""<input type="hidden" name="choices-TOTAL_FORMS" value="1" /><input type="hidden" name="choices-INITIAL_FORMS" value="0" /><input type="hidden" name="choices-MAX_NUM_FORMS" value="0" /> <li>Choice: <input type="text" name="choices-0-choice" value="Calexico" /></li> <li>Votes: <input type="text" name="choices-0-votes" value="100" /></li>""") @@ -938,7 +938,7 @@ class TestIsBoundBehavior(TestCase): self.assertFalse(empty_forms[1].is_bound) # The empty forms should be equal. - self.assertEqual(empty_forms[0].as_p(), empty_forms[1].as_p()) + self.assertHTMLEqual(empty_forms[0].as_p(), empty_forms[1].as_p()) class TestEmptyFormSet(TestCase): "Test that an empty formset still calls clean()" diff --git a/tests/regressiontests/forms/tests/models.py b/tests/regressiontests/forms/tests/models.py index 12546081d7..b5e2c3a885 100644 --- a/tests/regressiontests/forms/tests/models.py +++ b/tests/regressiontests/forms/tests/models.py @@ -47,7 +47,7 @@ class ModelFormCallableModelDefault(TestCase): obj1 = ChoiceOptionModel.objects.create(id=1, name='default') obj2 = ChoiceOptionModel.objects.create(id=2, name='option 2') obj3 = ChoiceOptionModel.objects.create(id=3, name='option 3') - self.assertEqual(ChoiceFieldForm().as_p(), """<p><label for="id_choice">Choice:</label> <select name="choice" id="id_choice"> + self.assertHTMLEqual(ChoiceFieldForm().as_p(), """<p><label for="id_choice">Choice:</label> <select name="choice" id="id_choice"> <option value="1" selected="selected">ChoiceOption 1</option> <option value="2">ChoiceOption 2</option> <option value="3">ChoiceOption 3</option> @@ -73,7 +73,7 @@ class ModelFormCallableModelDefault(TestCase): obj1 = ChoiceOptionModel.objects.create(id=1, name='default') obj2 = ChoiceOptionModel.objects.create(id=2, name='option 2') obj3 = ChoiceOptionModel.objects.create(id=3, name='option 3') - self.assertEqual(ChoiceFieldForm(initial={ + self.assertHTMLEqual(ChoiceFieldForm(initial={ 'choice': obj2, 'choice_int': obj2, 'multi_choice': [obj2,obj3], diff --git a/tests/regressiontests/forms/tests/regressions.py b/tests/regressiontests/forms/tests/regressions.py index 272f9a5877..a93781da20 100644 --- a/tests/regressiontests/forms/tests/regressions.py +++ b/tests/regressiontests/forms/tests/regressions.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import with_statement from django.forms import * -from django.utils.unittest import TestCase +from django.test import TestCase from django.utils.translation import ugettext_lazy, override from regressiontests.forms.models import Cheese @@ -16,7 +16,7 @@ class FormsRegressionsTestCase(TestCase): f1 = CharField(max_length=10, widget=TextInput(attrs=extra_attrs)) f2 = CharField(widget=TextInput(attrs=extra_attrs)) - self.assertEqual(TestForm(auto_id=False).as_p(), u'<p>F1: <input type="text" class="special" name="f1" maxlength="10" /></p>\n<p>F2: <input type="text" class="special" name="f2" /></p>') + self.assertHTMLEqual(TestForm(auto_id=False).as_p(), u'<p>F1: <input type="text" class="special" name="f1" maxlength="10" /></p>\n<p>F2: <input type="text" class="special" name="f2" /></p>') def test_regression_3600(self): # Tests for form i18n # @@ -26,13 +26,13 @@ class FormsRegressionsTestCase(TestCase): username = CharField(max_length=10, label=ugettext_lazy('Username')) f = SomeForm() - self.assertEqual(f.as_p(), '<p><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>') + self.assertHTMLEqual(f.as_p(), '<p><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>') # Translations are done at rendering time, so multi-lingual apps can define forms) with override('de'): - self.assertEqual(f.as_p(), '<p><label for="id_username">Benutzername:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>') + self.assertHTMLEqual(f.as_p(), '<p><label for="id_username">Benutzername:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>') with override('pl', deactivate=True): - self.assertEqual(f.as_p(), u'<p><label for="id_username">Nazwa u\u017cytkownika:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>') + self.assertHTMLEqual(f.as_p(), u'<p><label for="id_username">Nazwa u\u017cytkownika:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>') def test_regression_5216(self): # There was some problems with form translations in #5216 @@ -41,8 +41,8 @@ class FormsRegressionsTestCase(TestCase): field_2 = CharField(max_length=10, label=ugettext_lazy('field_2'), widget=TextInput(attrs={'id': 'field_2_id'})) f = SomeForm() - self.assertEqual(f['field_1'].label_tag(), '<label for="id_field_1">field_1</label>') - self.assertEqual(f['field_2'].label_tag(), '<label for="field_2_id">field_2</label>') + self.assertHTMLEqual(f['field_1'].label_tag(), '<label for="id_field_1">field_1</label>') + self.assertHTMLEqual(f['field_2'].label_tag(), '<label for="field_2_id">field_2</label>') # Unicode decoding problems... GENDERS = ((u'\xc5', u'En tied\xe4'), (u'\xf8', u'Mies'), (u'\xdf', u'Nainen')) @@ -51,7 +51,7 @@ class FormsRegressionsTestCase(TestCase): somechoice = ChoiceField(choices=GENDERS, widget=RadioSelect(), label=u'\xc5\xf8\xdf') f = SomeForm() - self.assertEqual(f.as_p(), u'<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label for="id_somechoice_0"><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label for="id_somechoice_1"><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label for="id_somechoice_2"><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>') + self.assertHTMLEqual(f.as_p(), u'<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label for="id_somechoice_0"><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label for="id_somechoice_1"><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label for="id_somechoice_2"><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>') # Testing choice validation with UTF-8 bytestrings as input (these are the # Russian abbreviations "мес." and "шт.". @@ -63,7 +63,7 @@ class FormsRegressionsTestCase(TestCase): # Translated error messages used to be buggy. with override('ru'): f = SomeForm({}) - self.assertEqual(f.as_p(), u'<ul class="errorlist"><li>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.</li></ul>\n<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label for="id_somechoice_0"><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label for="id_somechoice_1"><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label for="id_somechoice_2"><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>') + self.assertHTMLEqual(f.as_p(), u'<ul class="errorlist"><li>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.</li></ul>\n<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label for="id_somechoice_0"><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label for="id_somechoice_1"><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label for="id_somechoice_2"><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>') # Deep copying translated text shouldn't raise an error) from django.utils.translation import gettext_lazy @@ -88,8 +88,8 @@ class FormsRegressionsTestCase(TestCase): data = IntegerField(widget=HiddenInput) f = HiddenForm({}) - self.assertEqual(f.as_p(), u'<ul class="errorlist"><li>(Hidden field data) This field is required.</li></ul>\n<p> <input type="hidden" name="data" id="id_data" /></p>') - self.assertEqual(f.as_table(), u'<tr><td colspan="2"><ul class="errorlist"><li>(Hidden field data) This field is required.</li></ul><input type="hidden" name="data" id="id_data" /></td></tr>') + self.assertHTMLEqual(f.as_p(), u'<ul class="errorlist"><li>(Hidden field data) This field is required.</li></ul>\n<p> <input type="hidden" name="data" id="id_data" /></p>') + self.assertHTMLEqual(f.as_table(), u'<tr><td colspan="2"><ul class="errorlist"><li>(Hidden field data) This field is required.</li></ul><input type="hidden" name="data" id="id_data" /></td></tr>') def test_xss_error_messages(self): ################################################### @@ -107,13 +107,13 @@ class FormsRegressionsTestCase(TestCase): field = ChoiceField(choices=[('one', 'One')]) f = SomeForm({'field': '<script>'}) - self.assertEqual(t.render(Context({'form': f})), u'<ul class="errorlist"><li>field<ul class="errorlist"><li>Select a valid choice. <script> is not one of the available choices.</li></ul></li></ul>') + self.assertHTMLEqual(t.render(Context({'form': f})), u'<ul class="errorlist"><li>field<ul class="errorlist"><li>Select a valid choice. <script> is not one of the available choices.</li></ul></li></ul>') class SomeForm(Form): field = MultipleChoiceField(choices=[('one', 'One')]) f = SomeForm({'field': ['<script>']}) - self.assertEqual(t.render(Context({'form': f})), u'<ul class="errorlist"><li>field<ul class="errorlist"><li>Select a valid choice. <script> is not one of the available choices.</li></ul></li></ul>') + self.assertHTMLEqual(t.render(Context({'form': f})), u'<ul class="errorlist"><li>field<ul class="errorlist"><li>Select a valid choice. <script> is not one of the available choices.</li></ul></li></ul>') from regressiontests.forms.models import ChoiceModel @@ -121,7 +121,7 @@ class FormsRegressionsTestCase(TestCase): field = ModelMultipleChoiceField(ChoiceModel.objects.all()) f = SomeForm({'field': ['<script>']}) - self.assertEqual(t.render(Context({'form': f})), u'<ul class="errorlist"><li>field<ul class="errorlist"><li>"<script>" is not a valid value for a primary key.</li></ul></li></ul>') + self.assertHTMLEqual(t.render(Context({'form': f})), u'<ul class="errorlist"><li>field<ul class="errorlist"><li>"<script>" is not a valid value for a primary key.</li></ul></li></ul>') def test_regression_14234(self): """ diff --git a/tests/regressiontests/forms/tests/util.py b/tests/regressiontests/forms/tests/util.py index bb6ffd8095..dddb8c7e56 100644 --- a/tests/regressiontests/forms/tests/util.py +++ b/tests/regressiontests/forms/tests/util.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- from django.core.exceptions import ValidationError -from django.forms.util import * +from django.forms.util import flatatt, ErrorDict, ErrorList +from django.test import TestCase +from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy -from django.utils.unittest import TestCase class FormsUtilTestCase(TestCase): @@ -23,39 +24,39 @@ class FormsUtilTestCase(TestCase): ################### # Can take a string. - self.assertEqual(str(ErrorList(ValidationError("There was an error.").messages)), + self.assertHTMLEqual(str(ErrorList(ValidationError("There was an error.").messages)), '<ul class="errorlist"><li>There was an error.</li></ul>') # Can take a unicode string. - self.assertEqual(str(ErrorList(ValidationError(u"Not \u03C0.").messages)), - '<ul class="errorlist"><li>Not π.</li></ul>') + self.assertHTMLEqual(unicode(ErrorList(ValidationError(u"Not \u03C0.").messages)), + u'<ul class="errorlist"><li>Not π.</li></ul>') # Can take a lazy string. - self.assertEqual(str(ErrorList(ValidationError(ugettext_lazy("Error.")).messages)), + self.assertHTMLEqual(str(ErrorList(ValidationError(ugettext_lazy("Error.")).messages)), '<ul class="errorlist"><li>Error.</li></ul>') # Can take a list. - self.assertEqual(str(ErrorList(ValidationError(["Error one.", "Error two."]).messages)), + self.assertHTMLEqual(str(ErrorList(ValidationError(["Error one.", "Error two."]).messages)), '<ul class="errorlist"><li>Error one.</li><li>Error two.</li></ul>') # Can take a mixture in a list. - self.assertEqual(str(ErrorList(ValidationError(["First error.", u"Not \u03C0.", ugettext_lazy("Error.")]).messages)), + self.assertHTMLEqual(str(ErrorList(ValidationError(["First error.", u"Not \u03C0.", ugettext_lazy("Error.")]).messages)), '<ul class="errorlist"><li>First error.</li><li>Not π.</li><li>Error.</li></ul>') class VeryBadError: def __unicode__(self): return u"A very bad error." # Can take a non-string. - self.assertEqual(str(ErrorList(ValidationError(VeryBadError()).messages)), + self.assertHTMLEqual(str(ErrorList(ValidationError(VeryBadError()).messages)), '<ul class="errorlist"><li>A very bad error.</li></ul>') # Escapes non-safe input but not input marked safe. example = 'Example of link: <a href="http://www.example.com/">example</a>' - self.assertEqual(str(ErrorList([example])), + self.assertHTMLEqual(str(ErrorList([example])), '<ul class="errorlist"><li>Example of link: <a href="http://www.example.com/">example</a></li></ul>') - self.assertEqual(str(ErrorList([mark_safe(example)])), + self.assertHTMLEqual(str(ErrorList([mark_safe(example)])), '<ul class="errorlist"><li>Example of link: <a href="http://www.example.com/">example</a></li></ul>') - self.assertEqual(str(ErrorDict({'name': example})), + self.assertHTMLEqual(str(ErrorDict({'name': example})), '<ul class="errorlist"><li>nameExample of link: <a href="http://www.example.com/">example</a></li></ul>') - self.assertEqual(str(ErrorDict({'name': mark_safe(example)})), + self.assertHTMLEqual(str(ErrorDict({'name': mark_safe(example)})), '<ul class="errorlist"><li>nameExample of link: <a href="http://www.example.com/">example</a></li></ul>') diff --git a/tests/regressiontests/forms/tests/widgets.py b/tests/regressiontests/forms/tests/widgets.py index ac78ad701b..ce15b8b708 100644 --- a/tests/regressiontests/forms/tests/widgets.py +++ b/tests/regressiontests/forms/tests/widgets.py @@ -10,7 +10,7 @@ from django.forms.widgets import RadioFieldRenderer from django.utils import formats from django.utils.safestring import mark_safe from django.utils.translation import activate, deactivate -from django.utils.unittest import TestCase +from django.test import TestCase class FormsWidgetTestCase(TestCase): @@ -19,129 +19,129 @@ class FormsWidgetTestCase(TestCase): # validation. def test_textinput(self): w = TextInput() - self.assertEqual(w.render('email', ''), u'<input type="text" name="email" />') - self.assertEqual(w.render('email', None), u'<input type="text" name="email" />') - self.assertEqual(w.render('email', 'test@example.com'), u'<input type="text" name="email" value="test@example.com" />') - self.assertEqual(w.render('email', 'some "quoted" & ampersanded value'), u'<input type="text" name="email" value="some "quoted" & ampersanded value" />') - self.assertEqual(w.render('email', 'test@example.com', attrs={'class': 'fun'}), u'<input type="text" name="email" value="test@example.com" class="fun" />') + self.assertHTMLEqual(w.render('email', ''), u'<input type="text" name="email" />') + self.assertHTMLEqual(w.render('email', None), u'<input type="text" name="email" />') + self.assertHTMLEqual(w.render('email', 'test@example.com'), u'<input type="text" name="email" value="test@example.com" />') + self.assertHTMLEqual(w.render('email', 'some "quoted" & ampersanded value'), u'<input type="text" name="email" value="some "quoted" & ampersanded value" />') + self.assertHTMLEqual(w.render('email', 'test@example.com', attrs={'class': 'fun'}), u'<input type="text" name="email" value="test@example.com" class="fun" />') # Note that doctest in Python 2.4 (and maybe 2.5?) doesn't support non-ascii # characters in output, so we're displaying the repr() here. - self.assertEqual(w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<input type="text" name="email" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" class="fun" />') + self.assertHTMLEqual(w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<input type="text" name="email" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" class="fun" />') # You can also pass 'attrs' to the constructor: w = TextInput(attrs={'class': 'fun'}) - self.assertEqual(w.render('email', ''), u'<input type="text" class="fun" name="email" />') - self.assertEqual(w.render('email', 'foo@example.com'), u'<input type="text" class="fun" value="foo@example.com" name="email" />') + self.assertHTMLEqual(w.render('email', ''), u'<input type="text" class="fun" name="email" />') + self.assertHTMLEqual(w.render('email', 'foo@example.com'), u'<input type="text" class="fun" value="foo@example.com" name="email" />') # 'attrs' passed to render() get precedence over those passed to the constructor: w = TextInput(attrs={'class': 'pretty'}) - self.assertEqual(w.render('email', '', attrs={'class': 'special'}), u'<input type="text" class="special" name="email" />') + self.assertHTMLEqual(w.render('email', '', attrs={'class': 'special'}), u'<input type="text" class="special" name="email" />') # 'attrs' can be safe-strings if needed) w = TextInput(attrs={'onBlur': mark_safe("function('foo')")}) - self.assertEqual(w.render('email', ''), u'<input onBlur="function(\'foo\')" type="text" name="email" />') + self.assertHTMLEqual(w.render('email', ''), u'<input onBlur="function(\'foo\')" type="text" name="email" />') def test_passwordinput(self): w = PasswordInput() - self.assertEqual(w.render('email', ''), u'<input type="password" name="email" />') - self.assertEqual(w.render('email', None), u'<input type="password" name="email" />') - self.assertEqual(w.render('email', 'secret'), u'<input type="password" name="email" />') + self.assertHTMLEqual(w.render('email', ''), u'<input type="password" name="email" />') + self.assertHTMLEqual(w.render('email', None), u'<input type="password" name="email" />') + self.assertHTMLEqual(w.render('email', 'secret'), u'<input type="password" name="email" />') # The render_value argument lets you specify whether the widget should render # its value. For security reasons, this is off by default. w = PasswordInput(render_value=True) - self.assertEqual(w.render('email', ''), u'<input type="password" name="email" />') - self.assertEqual(w.render('email', None), u'<input type="password" name="email" />') - self.assertEqual(w.render('email', 'test@example.com'), u'<input type="password" name="email" value="test@example.com" />') - self.assertEqual(w.render('email', 'some "quoted" & ampersanded value'), u'<input type="password" name="email" value="some "quoted" & ampersanded value" />') - self.assertEqual(w.render('email', 'test@example.com', attrs={'class': 'fun'}), u'<input type="password" name="email" value="test@example.com" class="fun" />') + self.assertHTMLEqual(w.render('email', ''), u'<input type="password" name="email" />') + self.assertHTMLEqual(w.render('email', None), u'<input type="password" name="email" />') + self.assertHTMLEqual(w.render('email', 'test@example.com'), u'<input type="password" name="email" value="test@example.com" />') + self.assertHTMLEqual(w.render('email', 'some "quoted" & ampersanded value'), u'<input type="password" name="email" value="some "quoted" & ampersanded value" />') + self.assertHTMLEqual(w.render('email', 'test@example.com', attrs={'class': 'fun'}), u'<input type="password" name="email" value="test@example.com" class="fun" />') # You can also pass 'attrs' to the constructor: w = PasswordInput(attrs={'class': 'fun'}, render_value=True) - self.assertEqual(w.render('email', ''), u'<input type="password" class="fun" name="email" />') - self.assertEqual(w.render('email', 'foo@example.com'), u'<input type="password" class="fun" value="foo@example.com" name="email" />') + self.assertHTMLEqual(w.render('email', ''), u'<input type="password" class="fun" name="email" />') + self.assertHTMLEqual(w.render('email', 'foo@example.com'), u'<input type="password" class="fun" value="foo@example.com" name="email" />') # 'attrs' passed to render() get precedence over those passed to the constructor: w = PasswordInput(attrs={'class': 'pretty'}, render_value=True) - self.assertEqual(w.render('email', '', attrs={'class': 'special'}), u'<input type="password" class="special" name="email" />') + self.assertHTMLEqual(w.render('email', '', attrs={'class': 'special'}), u'<input type="password" class="special" name="email" />') - self.assertEqual(w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<input type="password" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />') + self.assertHTMLEqual(w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<input type="password" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />') def test_hiddeninput(self): w = HiddenInput() - self.assertEqual(w.render('email', ''), u'<input type="hidden" name="email" />') - self.assertEqual(w.render('email', None), u'<input type="hidden" name="email" />') - self.assertEqual(w.render('email', 'test@example.com'), u'<input type="hidden" name="email" value="test@example.com" />') - self.assertEqual(w.render('email', 'some "quoted" & ampersanded value'), u'<input type="hidden" name="email" value="some "quoted" & ampersanded value" />') - self.assertEqual(w.render('email', 'test@example.com', attrs={'class': 'fun'}), u'<input type="hidden" name="email" value="test@example.com" class="fun" />') + self.assertHTMLEqual(w.render('email', ''), u'<input type="hidden" name="email" />') + self.assertHTMLEqual(w.render('email', None), u'<input type="hidden" name="email" />') + self.assertHTMLEqual(w.render('email', 'test@example.com'), u'<input type="hidden" name="email" value="test@example.com" />') + self.assertHTMLEqual(w.render('email', 'some "quoted" & ampersanded value'), u'<input type="hidden" name="email" value="some "quoted" & ampersanded value" />') + self.assertHTMLEqual(w.render('email', 'test@example.com', attrs={'class': 'fun'}), u'<input type="hidden" name="email" value="test@example.com" class="fun" />') # You can also pass 'attrs' to the constructor: w = HiddenInput(attrs={'class': 'fun'}) - self.assertEqual(w.render('email', ''), u'<input type="hidden" class="fun" name="email" />') - self.assertEqual(w.render('email', 'foo@example.com'), u'<input type="hidden" class="fun" value="foo@example.com" name="email" />') + self.assertHTMLEqual(w.render('email', ''), u'<input type="hidden" class="fun" name="email" />') + self.assertHTMLEqual(w.render('email', 'foo@example.com'), u'<input type="hidden" class="fun" value="foo@example.com" name="email" />') # 'attrs' passed to render() get precedence over those passed to the constructor: w = HiddenInput(attrs={'class': 'pretty'}) - self.assertEqual(w.render('email', '', attrs={'class': 'special'}), u'<input type="hidden" class="special" name="email" />') + self.assertHTMLEqual(w.render('email', '', attrs={'class': 'special'}), u'<input type="hidden" class="special" name="email" />') - self.assertEqual(w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<input type="hidden" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />') + self.assertHTMLEqual(w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<input type="hidden" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />') # 'attrs' passed to render() get precedence over those passed to the constructor: w = HiddenInput(attrs={'class': 'pretty'}) - self.assertEqual(w.render('email', '', attrs={'class': 'special'}), u'<input type="hidden" class="special" name="email" />') + self.assertHTMLEqual(w.render('email', '', attrs={'class': 'special'}), u'<input type="hidden" class="special" name="email" />') # Boolean values are rendered to their string forms ("True" and "False"). w = HiddenInput() - self.assertEqual(w.render('get_spam', False), u'<input type="hidden" name="get_spam" value="False" />') - self.assertEqual(w.render('get_spam', True), u'<input type="hidden" name="get_spam" value="True" />') + self.assertHTMLEqual(w.render('get_spam', False), u'<input type="hidden" name="get_spam" value="False" />') + self.assertHTMLEqual(w.render('get_spam', True), u'<input type="hidden" name="get_spam" value="True" />') def test_multiplehiddeninput(self): w = MultipleHiddenInput() - self.assertEqual(w.render('email', []), u'') - self.assertEqual(w.render('email', None), u'') - self.assertEqual(w.render('email', ['test@example.com']), u'<input type="hidden" name="email" value="test@example.com" />') - self.assertEqual(w.render('email', ['some "quoted" & ampersanded value']), u'<input type="hidden" name="email" value="some "quoted" & ampersanded value" />') - self.assertEqual(w.render('email', ['test@example.com', 'foo@example.com']), u'<input type="hidden" name="email" value="test@example.com" />\n<input type="hidden" name="email" value="foo@example.com" />') - self.assertEqual(w.render('email', ['test@example.com'], attrs={'class': 'fun'}), u'<input type="hidden" name="email" value="test@example.com" class="fun" />') - self.assertEqual(w.render('email', ['test@example.com', 'foo@example.com'], attrs={'class': 'fun'}), u'<input type="hidden" name="email" value="test@example.com" class="fun" />\n<input type="hidden" name="email" value="foo@example.com" class="fun" />') + self.assertHTMLEqual(w.render('email', []), u'') + self.assertHTMLEqual(w.render('email', None), u'') + self.assertHTMLEqual(w.render('email', ['test@example.com']), u'<input type="hidden" name="email" value="test@example.com" />') + self.assertHTMLEqual(w.render('email', ['some "quoted" & ampersanded value']), u'<input type="hidden" name="email" value="some "quoted" & ampersanded value" />') + self.assertHTMLEqual(w.render('email', ['test@example.com', 'foo@example.com']), u'<input type="hidden" name="email" value="test@example.com" />\n<input type="hidden" name="email" value="foo@example.com" />') + self.assertHTMLEqual(w.render('email', ['test@example.com'], attrs={'class': 'fun'}), u'<input type="hidden" name="email" value="test@example.com" class="fun" />') + self.assertHTMLEqual(w.render('email', ['test@example.com', 'foo@example.com'], attrs={'class': 'fun'}), u'<input type="hidden" name="email" value="test@example.com" class="fun" />\n<input type="hidden" name="email" value="foo@example.com" class="fun" />') # You can also pass 'attrs' to the constructor: w = MultipleHiddenInput(attrs={'class': 'fun'}) - self.assertEqual(w.render('email', []), u'') - self.assertEqual(w.render('email', ['foo@example.com']), u'<input type="hidden" class="fun" value="foo@example.com" name="email" />') - self.assertEqual(w.render('email', ['foo@example.com', 'test@example.com']), u'<input type="hidden" class="fun" value="foo@example.com" name="email" />\n<input type="hidden" class="fun" value="test@example.com" name="email" />') + self.assertHTMLEqual(w.render('email', []), u'') + self.assertHTMLEqual(w.render('email', ['foo@example.com']), u'<input type="hidden" class="fun" value="foo@example.com" name="email" />') + self.assertHTMLEqual(w.render('email', ['foo@example.com', 'test@example.com']), u'<input type="hidden" class="fun" value="foo@example.com" name="email" />\n<input type="hidden" class="fun" value="test@example.com" name="email" />') # 'attrs' passed to render() get precedence over those passed to the constructor: w = MultipleHiddenInput(attrs={'class': 'pretty'}) - self.assertEqual(w.render('email', ['foo@example.com'], attrs={'class': 'special'}), u'<input type="hidden" class="special" value="foo@example.com" name="email" />') + self.assertHTMLEqual(w.render('email', ['foo@example.com'], attrs={'class': 'special'}), u'<input type="hidden" class="special" value="foo@example.com" name="email" />') - self.assertEqual(w.render('email', ['ŠĐĆŽćžšđ'], attrs={'class': 'fun'}), u'<input type="hidden" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />') + self.assertHTMLEqual(w.render('email', ['ŠĐĆŽćžšđ'], attrs={'class': 'fun'}), u'<input type="hidden" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />') # 'attrs' passed to render() get precedence over those passed to the constructor: w = MultipleHiddenInput(attrs={'class': 'pretty'}) - self.assertEqual(w.render('email', ['foo@example.com'], attrs={'class': 'special'}), u'<input type="hidden" class="special" value="foo@example.com" name="email" />') + self.assertHTMLEqual(w.render('email', ['foo@example.com'], attrs={'class': 'special'}), u'<input type="hidden" class="special" value="foo@example.com" name="email" />') # Each input gets a separate ID. w = MultipleHiddenInput() - self.assertEqual(w.render('letters', list('abc'), attrs={'id': 'hideme'}), u'<input type="hidden" name="letters" value="a" id="hideme_0" />\n<input type="hidden" name="letters" value="b" id="hideme_1" />\n<input type="hidden" name="letters" value="c" id="hideme_2" />') + self.assertHTMLEqual(w.render('letters', list('abc'), attrs={'id': 'hideme'}), u'<input type="hidden" name="letters" value="a" id="hideme_0" />\n<input type="hidden" name="letters" value="b" id="hideme_1" />\n<input type="hidden" name="letters" value="c" id="hideme_2" />') def test_fileinput(self): # FileInput widgets don't ever show the value, because the old value is of no use # if you are updating the form or if the provided file generated an error. w = FileInput() - self.assertEqual(w.render('email', ''), u'<input type="file" name="email" />') - self.assertEqual(w.render('email', None), u'<input type="file" name="email" />') - self.assertEqual(w.render('email', 'test@example.com'), u'<input type="file" name="email" />') - self.assertEqual(w.render('email', 'some "quoted" & ampersanded value'), u'<input type="file" name="email" />') - self.assertEqual(w.render('email', 'test@example.com', attrs={'class': 'fun'}), u'<input type="file" name="email" class="fun" />') + self.assertHTMLEqual(w.render('email', ''), u'<input type="file" name="email" />') + self.assertHTMLEqual(w.render('email', None), u'<input type="file" name="email" />') + self.assertHTMLEqual(w.render('email', 'test@example.com'), u'<input type="file" name="email" />') + self.assertHTMLEqual(w.render('email', 'some "quoted" & ampersanded value'), u'<input type="file" name="email" />') + self.assertHTMLEqual(w.render('email', 'test@example.com', attrs={'class': 'fun'}), u'<input type="file" name="email" class="fun" />') # You can also pass 'attrs' to the constructor: w = FileInput(attrs={'class': 'fun'}) - self.assertEqual(w.render('email', ''), u'<input type="file" class="fun" name="email" />') - self.assertEqual(w.render('email', 'foo@example.com'), u'<input type="file" class="fun" name="email" />') + self.assertHTMLEqual(w.render('email', ''), u'<input type="file" class="fun" name="email" />') + self.assertHTMLEqual(w.render('email', 'foo@example.com'), u'<input type="file" class="fun" name="email" />') - self.assertEqual(w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<input type="file" class="fun" name="email" />') + self.assertHTMLEqual(w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<input type="file" class="fun" name="email" />') # Test for the behavior of _has_changed for FileInput. The value of data will # more than likely come from request.FILES. The value of initial data will @@ -164,64 +164,64 @@ class FormsWidgetTestCase(TestCase): def test_textarea(self): w = Textarea() - self.assertEqual(w.render('msg', ''), u'<textarea rows="10" cols="40" name="msg"></textarea>') - self.assertEqual(w.render('msg', None), u'<textarea rows="10" cols="40" name="msg"></textarea>') - self.assertEqual(w.render('msg', 'value'), u'<textarea rows="10" cols="40" name="msg">value</textarea>') - self.assertEqual(w.render('msg', 'some "quoted" & ampersanded value'), u'<textarea rows="10" cols="40" name="msg">some "quoted" & ampersanded value</textarea>') - self.assertEqual(w.render('msg', mark_safe('pre "quoted" value')), u'<textarea rows="10" cols="40" name="msg">pre "quoted" value</textarea>') - self.assertEqual(w.render('msg', 'value', attrs={'class': 'pretty', 'rows': 20}), u'<textarea class="pretty" rows="20" cols="40" name="msg">value</textarea>') + self.assertHTMLEqual(w.render('msg', ''), u'<textarea rows="10" cols="40" name="msg"></textarea>') + self.assertHTMLEqual(w.render('msg', None), u'<textarea rows="10" cols="40" name="msg"></textarea>') + self.assertHTMLEqual(w.render('msg', 'value'), u'<textarea rows="10" cols="40" name="msg">value</textarea>') + self.assertHTMLEqual(w.render('msg', 'some "quoted" & ampersanded value'), u'<textarea rows="10" cols="40" name="msg">some "quoted" & ampersanded value</textarea>') + self.assertHTMLEqual(w.render('msg', mark_safe('pre "quoted" value')), u'<textarea rows="10" cols="40" name="msg">pre "quoted" value</textarea>') + self.assertHTMLEqual(w.render('msg', 'value', attrs={'class': 'pretty', 'rows': 20}), u'<textarea class="pretty" rows="20" cols="40" name="msg">value</textarea>') # You can also pass 'attrs' to the constructor: w = Textarea(attrs={'class': 'pretty'}) - self.assertEqual(w.render('msg', ''), u'<textarea rows="10" cols="40" name="msg" class="pretty"></textarea>') - self.assertEqual(w.render('msg', 'example'), u'<textarea rows="10" cols="40" name="msg" class="pretty">example</textarea>') + self.assertHTMLEqual(w.render('msg', ''), u'<textarea rows="10" cols="40" name="msg" class="pretty"></textarea>') + self.assertHTMLEqual(w.render('msg', 'example'), u'<textarea rows="10" cols="40" name="msg" class="pretty">example</textarea>') # 'attrs' passed to render() get precedence over those passed to the constructor: w = Textarea(attrs={'class': 'pretty'}) - self.assertEqual(w.render('msg', '', attrs={'class': 'special'}), u'<textarea rows="10" cols="40" name="msg" class="special"></textarea>') + self.assertHTMLEqual(w.render('msg', '', attrs={'class': 'special'}), u'<textarea rows="10" cols="40" name="msg" class="special"></textarea>') - self.assertEqual(w.render('msg', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<textarea rows="10" cols="40" name="msg" class="fun">\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</textarea>') + self.assertHTMLEqual(w.render('msg', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), u'<textarea rows="10" cols="40" name="msg" class="fun">\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</textarea>') def test_checkboxinput(self): w = CheckboxInput() - self.assertEqual(w.render('is_cool', ''), u'<input type="checkbox" name="is_cool" />') - self.assertEqual(w.render('is_cool', None), u'<input type="checkbox" name="is_cool" />') - self.assertEqual(w.render('is_cool', False), u'<input type="checkbox" name="is_cool" />') - self.assertEqual(w.render('is_cool', True), u'<input checked="checked" type="checkbox" name="is_cool" />') + self.assertHTMLEqual(w.render('is_cool', ''), u'<input type="checkbox" name="is_cool" />') + self.assertHTMLEqual(w.render('is_cool', None), u'<input type="checkbox" name="is_cool" />') + self.assertHTMLEqual(w.render('is_cool', False), u'<input type="checkbox" name="is_cool" />') + self.assertHTMLEqual(w.render('is_cool', True), u'<input checked="checked" type="checkbox" name="is_cool" />') # Using any value that's not in ('', None, False, True) will check the checkbox # and set the 'value' attribute. - self.assertEqual(w.render('is_cool', 'foo'), u'<input checked="checked" type="checkbox" name="is_cool" value="foo" />') + self.assertHTMLEqual(w.render('is_cool', 'foo'), u'<input checked="checked" type="checkbox" name="is_cool" value="foo" />') - self.assertEqual(w.render('is_cool', False, attrs={'class': 'pretty'}), u'<input type="checkbox" name="is_cool" class="pretty" />') + self.assertHTMLEqual(w.render('is_cool', False, attrs={'class': 'pretty'}), u'<input type="checkbox" name="is_cool" class="pretty" />') # regression for #17114 - self.assertEqual(w.render('is_cool', 0), u'<input checked="checked" type="checkbox" name="is_cool" value="0" />') - self.assertEqual(w.render('is_cool', 1), u'<input checked="checked" type="checkbox" name="is_cool" value="1" />') + self.assertHTMLEqual(w.render('is_cool', 0), u'<input checked="checked" type="checkbox" name="is_cool" value="0" />') + self.assertHTMLEqual(w.render('is_cool', 1), u'<input checked="checked" type="checkbox" name="is_cool" value="1" />') # You can also pass 'attrs' to the constructor: w = CheckboxInput(attrs={'class': 'pretty'}) - self.assertEqual(w.render('is_cool', ''), u'<input type="checkbox" class="pretty" name="is_cool" />') + self.assertHTMLEqual(w.render('is_cool', ''), u'<input type="checkbox" class="pretty" name="is_cool" />') # 'attrs' passed to render() get precedence over those passed to the constructor: w = CheckboxInput(attrs={'class': 'pretty'}) - self.assertEqual(w.render('is_cool', '', attrs={'class': 'special'}), u'<input type="checkbox" class="special" name="is_cool" />') + self.assertHTMLEqual(w.render('is_cool', '', attrs={'class': 'special'}), u'<input type="checkbox" class="special" name="is_cool" />') # You can pass 'check_test' to the constructor. This is a callable that takes the # value and returns True if the box should be checked. w = CheckboxInput(check_test=lambda value: value.startswith('hello')) - self.assertEqual(w.render('greeting', ''), u'<input type="checkbox" name="greeting" />') - self.assertEqual(w.render('greeting', 'hello'), u'<input checked="checked" type="checkbox" name="greeting" value="hello" />') - self.assertEqual(w.render('greeting', 'hello there'), u'<input checked="checked" type="checkbox" name="greeting" value="hello there" />') - self.assertEqual(w.render('greeting', 'hello & goodbye'), u'<input checked="checked" type="checkbox" name="greeting" value="hello & goodbye" />') + self.assertHTMLEqual(w.render('greeting', ''), u'<input type="checkbox" name="greeting" />') + self.assertHTMLEqual(w.render('greeting', 'hello'), u'<input checked="checked" type="checkbox" name="greeting" value="hello" />') + self.assertHTMLEqual(w.render('greeting', 'hello there'), u'<input checked="checked" type="checkbox" name="greeting" value="hello there" />') + self.assertHTMLEqual(w.render('greeting', 'hello & goodbye'), u'<input checked="checked" type="checkbox" name="greeting" value="hello & goodbye" />') # A subtlety: If the 'check_test' argument cannot handle a value and raises any # exception during its __call__, then the exception will be swallowed and the box # will not be checked. In this example, the 'check_test' assumes the value has a # startswith() method, which fails for the values True, False and None. - self.assertEqual(w.render('greeting', True), u'<input type="checkbox" name="greeting" />') - self.assertEqual(w.render('greeting', False), u'<input type="checkbox" name="greeting" />') - self.assertEqual(w.render('greeting', None), u'<input type="checkbox" name="greeting" />') + self.assertHTMLEqual(w.render('greeting', True), u'<input type="checkbox" name="greeting" />') + self.assertHTMLEqual(w.render('greeting', False), u'<input type="checkbox" name="greeting" />') + self.assertHTMLEqual(w.render('greeting', None), u'<input type="checkbox" name="greeting" />') # The CheckboxInput widget will return False if the key is not found in the data # dictionary (because HTML form submission doesn't send any result for unchecked @@ -238,7 +238,7 @@ class FormsWidgetTestCase(TestCase): def test_select(self): w = Select() - self.assertEqual(w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select name="beatle"> + self.assertHTMLEqual(w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select name="beatle"> <option value="J" selected="selected">John</option> <option value="P">Paul</option> <option value="G">George</option> @@ -246,7 +246,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # If the value is None, none of the options are selected: - self.assertEqual(w.render('beatle', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select name="beatle"> + self.assertHTMLEqual(w.render('beatle', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select name="beatle"> <option value="J">John</option> <option value="P">Paul</option> <option value="G">George</option> @@ -254,7 +254,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # If the value corresponds to a label (but not to an option value), none of the options are selected: - self.assertEqual(w.render('beatle', 'John', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select name="beatle"> + self.assertHTMLEqual(w.render('beatle', 'John', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select name="beatle"> <option value="J">John</option> <option value="P">Paul</option> <option value="G">George</option> @@ -262,7 +262,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # Only one option can be selected, see #8103: - self.assertEqual(w.render('choices', '0', choices=(('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('0', 'extra'))), """<select name="choices"> + self.assertHTMLEqual(w.render('choices', '0', choices=(('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('0', 'extra'))), """<select name="choices"> <option value="0" selected="selected">0</option> <option value="1">1</option> <option value="2">2</option> @@ -271,17 +271,17 @@ class FormsWidgetTestCase(TestCase): </select>""") # The value is compared to its str(): - self.assertEqual(w.render('num', 2, choices=[('1', '1'), ('2', '2'), ('3', '3')]), """<select name="num"> + self.assertHTMLEqual(w.render('num', 2, choices=[('1', '1'), ('2', '2'), ('3', '3')]), """<select name="num"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> </select>""") - self.assertEqual(w.render('num', '2', choices=[(1, 1), (2, 2), (3, 3)]), """<select name="num"> + self.assertHTMLEqual(w.render('num', '2', choices=[(1, 1), (2, 2), (3, 3)]), """<select name="num"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> </select>""") - self.assertEqual(w.render('num', 2, choices=[(1, 1), (2, 2), (3, 3)]), """<select name="num"> + self.assertHTMLEqual(w.render('num', 2, choices=[(1, 1), (2, 2), (3, 3)]), """<select name="num"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> @@ -292,7 +292,7 @@ class FormsWidgetTestCase(TestCase): def get_choices(): for i in range(5): yield (i, i) - self.assertEqual(w.render('num', 2, choices=get_choices()), """<select name="num"> + self.assertHTMLEqual(w.render('num', 2, choices=get_choices()), """<select name="num"> <option value="0">0</option> <option value="1">1</option> <option value="2" selected="selected">2</option> @@ -303,21 +303,21 @@ class FormsWidgetTestCase(TestCase): class SomeForm(Form): somechoice = ChoiceField(choices=chain((('', '-'*9),), [(thing['id'], thing['name']) for thing in things])) f = SomeForm() - self.assertEqual(f.as_table(), u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>') - self.assertEqual(f.as_table(), u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>') + self.assertHTMLEqual(f.as_table(), u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>') + self.assertHTMLEqual(f.as_table(), u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>') f = SomeForm({'somechoice': 2}) - self.assertEqual(f.as_table(), u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="">---------</option>\n<option value="1">And Boom</option>\n<option value="2" selected="selected">One More Thing!</option>\n</select></td></tr>') + self.assertHTMLEqual(f.as_table(), u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="">---------</option>\n<option value="1">And Boom</option>\n<option value="2" selected="selected">One More Thing!</option>\n</select></td></tr>') # You can also pass 'choices' to the constructor: w = Select(choices=[(1, 1), (2, 2), (3, 3)]) - self.assertEqual(w.render('num', 2), """<select name="num"> + self.assertHTMLEqual(w.render('num', 2), """<select name="num"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> </select>""") # If 'choices' is passed to both the constructor and render(), then they'll both be in the output: - self.assertEqual(w.render('num', 2, choices=[(4, 4), (5, 5)]), """<select name="num"> + self.assertHTMLEqual(w.render('num', 2, choices=[(4, 4), (5, 5)]), """<select name="num"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> @@ -326,7 +326,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # Choices are escaped correctly - self.assertEqual(w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you > me')))), """<select name="escape"> + self.assertHTMLEqual(w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you > me')))), """<select name="escape"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> @@ -335,19 +335,19 @@ class FormsWidgetTestCase(TestCase): </select>""") # Unicode choices are correctly rendered as HTML - self.assertEqual(w.render('email', 'ŠĐĆŽćžšđ', choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]), u'<select name="email">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>') + self.assertHTMLEqual(w.render('email', 'ŠĐĆŽćžšđ', choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]), u'<select name="email">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>') # If choices is passed to the constructor and is a generator, it can be iterated # over multiple times without getting consumed: w = Select(choices=get_choices()) - self.assertEqual(w.render('num', 2), """<select name="num"> + self.assertHTMLEqual(w.render('num', 2), """<select name="num"> <option value="0">0</option> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> <option value="4">4</option> </select>""") - self.assertEqual(w.render('num', 3), """<select name="num"> + self.assertHTMLEqual(w.render('num', 3), """<select name="num"> <option value="0">0</option> <option value="1">1</option> <option value="2">2</option> @@ -357,7 +357,7 @@ class FormsWidgetTestCase(TestCase): # Choices can be nested one level in order to create HTML optgroups: w.choices=(('outer1', 'Outer 1'), ('Group "1"', (('inner1', 'Inner 1'), ('inner2', 'Inner 2')))) - self.assertEqual(w.render('nestchoice', None), """<select name="nestchoice"> + self.assertHTMLEqual(w.render('nestchoice', None), """<select name="nestchoice"> <option value="outer1">Outer 1</option> <optgroup label="Group "1""> <option value="inner1">Inner 1</option> @@ -365,7 +365,7 @@ class FormsWidgetTestCase(TestCase): </optgroup> </select>""") - self.assertEqual(w.render('nestchoice', 'outer1'), """<select name="nestchoice"> + self.assertHTMLEqual(w.render('nestchoice', 'outer1'), """<select name="nestchoice"> <option value="outer1" selected="selected">Outer 1</option> <optgroup label="Group "1""> <option value="inner1">Inner 1</option> @@ -373,7 +373,7 @@ class FormsWidgetTestCase(TestCase): </optgroup> </select>""") - self.assertEqual(w.render('nestchoice', 'inner1'), """<select name="nestchoice"> + self.assertHTMLEqual(w.render('nestchoice', 'inner1'), """<select name="nestchoice"> <option value="outer1">Outer 1</option> <optgroup label="Group "1""> <option value="inner1" selected="selected">Inner 1</option> @@ -388,22 +388,22 @@ class FormsWidgetTestCase(TestCase): <option value="2" selected="selected">Yes</option> <option value="3">No</option> </select>""") - self.assertEqual(w.render('is_cool', False), """<select name="is_cool"> + self.assertHTMLEqual(w.render('is_cool', False), """<select name="is_cool"> <option value="1">Unknown</option> <option value="2">Yes</option> <option value="3" selected="selected">No</option> </select>""") - self.assertEqual(w.render('is_cool', None), """<select name="is_cool"> + self.assertHTMLEqual(w.render('is_cool', None), """<select name="is_cool"> <option value="1" selected="selected">Unknown</option> <option value="2">Yes</option> <option value="3">No</option> </select>""") - self.assertEqual(w.render('is_cool', '2'), """<select name="is_cool"> + self.assertHTMLEqual(w.render('is_cool', '2'), """<select name="is_cool"> <option value="1">Unknown</option> <option value="2" selected="selected">Yes</option> <option value="3">No</option> </select>""") - self.assertEqual(w.render('is_cool', '3'), """<select name="is_cool"> + self.assertHTMLEqual(w.render('is_cool', '3'), """<select name="is_cool"> <option value="1">Unknown</option> <option value="2">Yes</option> <option value="3" selected="selected">No</option> @@ -418,19 +418,19 @@ class FormsWidgetTestCase(TestCase): def test_selectmultiple(self): w = SelectMultiple() - self.assertEqual(w.render('beatles', ['J'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> + self.assertHTMLEqual(w.render('beatles', ['J'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> <option value="J" selected="selected">John</option> <option value="P">Paul</option> <option value="G">George</option> <option value="R">Ringo</option> </select>""") - self.assertEqual(w.render('beatles', ['J', 'P'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> + self.assertHTMLEqual(w.render('beatles', ['J', 'P'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> <option value="J" selected="selected">John</option> <option value="P" selected="selected">Paul</option> <option value="G">George</option> <option value="R">Ringo</option> </select>""") - self.assertEqual(w.render('beatles', ['J', 'P', 'R'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> + self.assertHTMLEqual(w.render('beatles', ['J', 'P', 'R'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> <option value="J" selected="selected">John</option> <option value="P" selected="selected">Paul</option> <option value="G">George</option> @@ -438,7 +438,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # If the value is None, none of the options are selected: - self.assertEqual(w.render('beatles', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> + self.assertHTMLEqual(w.render('beatles', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> <option value="J">John</option> <option value="P">Paul</option> <option value="G">George</option> @@ -446,7 +446,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # If the value corresponds to a label (but not to an option value), none of the options are selected: - self.assertEqual(w.render('beatles', ['John'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> + self.assertHTMLEqual(w.render('beatles', ['John'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> <option value="J">John</option> <option value="P">Paul</option> <option value="G">George</option> @@ -454,7 +454,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # Multiple options (with the same value) can be selected, see #8103: - self.assertEqual(w.render('choices', ['0'], choices=(('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('0', 'extra'))), """<select multiple="multiple" name="choices"> + self.assertHTMLEqual(w.render('choices', ['0'], choices=(('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('0', 'extra'))), """<select multiple="multiple" name="choices"> <option value="0" selected="selected">0</option> <option value="1">1</option> <option value="2">2</option> @@ -463,7 +463,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # If multiple values are given, but some of them are not valid, the valid ones are selected: - self.assertEqual(w.render('beatles', ['J', 'G', 'foo'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> + self.assertHTMLEqual(w.render('beatles', ['J', 'G', 'foo'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select multiple="multiple" name="beatles"> <option value="J" selected="selected">John</option> <option value="P">Paul</option> <option value="G" selected="selected">George</option> @@ -471,17 +471,17 @@ class FormsWidgetTestCase(TestCase): </select>""") # The value is compared to its str(): - self.assertEqual(w.render('nums', [2], choices=[('1', '1'), ('2', '2'), ('3', '3')]), """<select multiple="multiple" name="nums"> + self.assertHTMLEqual(w.render('nums', [2], choices=[('1', '1'), ('2', '2'), ('3', '3')]), """<select multiple="multiple" name="nums"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> </select>""") - self.assertEqual(w.render('nums', ['2'], choices=[(1, 1), (2, 2), (3, 3)]), """<select multiple="multiple" name="nums"> + self.assertHTMLEqual(w.render('nums', ['2'], choices=[(1, 1), (2, 2), (3, 3)]), """<select multiple="multiple" name="nums"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> </select>""") - self.assertEqual(w.render('nums', [2], choices=[(1, 1), (2, 2), (3, 3)]), """<select multiple="multiple" name="nums"> + self.assertHTMLEqual(w.render('nums', [2], choices=[(1, 1), (2, 2), (3, 3)]), """<select multiple="multiple" name="nums"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> @@ -491,7 +491,7 @@ class FormsWidgetTestCase(TestCase): def get_choices(): for i in range(5): yield (i, i) - self.assertEqual(w.render('nums', [2], choices=get_choices()), """<select multiple="multiple" name="nums"> + self.assertHTMLEqual(w.render('nums', [2], choices=get_choices()), """<select multiple="multiple" name="nums"> <option value="0">0</option> <option value="1">1</option> <option value="2" selected="selected">2</option> @@ -501,14 +501,14 @@ class FormsWidgetTestCase(TestCase): # You can also pass 'choices' to the constructor: w = SelectMultiple(choices=[(1, 1), (2, 2), (3, 3)]) - self.assertEqual(w.render('nums', [2]), """<select multiple="multiple" name="nums"> + self.assertHTMLEqual(w.render('nums', [2]), """<select multiple="multiple" name="nums"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> </select>""") # If 'choices' is passed to both the constructor and render(), then they'll both be in the output: - self.assertEqual(w.render('nums', [2], choices=[(4, 4), (5, 5)]), """<select multiple="multiple" name="nums"> + self.assertHTMLEqual(w.render('nums', [2], choices=[(4, 4), (5, 5)]), """<select multiple="multiple" name="nums"> <option value="1">1</option> <option value="2" selected="selected">2</option> <option value="3">3</option> @@ -517,7 +517,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # Choices are escaped correctly - self.assertEqual(w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you > me')))), """<select multiple="multiple" name="escape"> + self.assertHTMLEqual(w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you > me')))), """<select multiple="multiple" name="escape"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> @@ -526,7 +526,7 @@ class FormsWidgetTestCase(TestCase): </select>""") # Unicode choices are correctly rendered as HTML - self.assertEqual(w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]), u'<select multiple="multiple" name="nums">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>') + self.assertHTMLEqual(w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]), u'<select multiple="multiple" name="nums">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>') # Test the usage of _has_changed self.assertFalse(w._has_changed(None, None)) @@ -538,7 +538,7 @@ class FormsWidgetTestCase(TestCase): # Choices can be nested one level in order to create HTML optgroups: w.choices = (('outer1', 'Outer 1'), ('Group "1"', (('inner1', 'Inner 1'), ('inner2', 'Inner 2')))) - self.assertEqual(w.render('nestchoice', None), """<select multiple="multiple" name="nestchoice"> + self.assertHTMLEqual(w.render('nestchoice', None), """<select multiple="multiple" name="nestchoice"> <option value="outer1">Outer 1</option> <optgroup label="Group "1""> <option value="inner1">Inner 1</option> @@ -546,7 +546,7 @@ class FormsWidgetTestCase(TestCase): </optgroup> </select>""") - self.assertEqual(w.render('nestchoice', ['outer1']), """<select multiple="multiple" name="nestchoice"> + self.assertHTMLEqual(w.render('nestchoice', ['outer1']), """<select multiple="multiple" name="nestchoice"> <option value="outer1" selected="selected">Outer 1</option> <optgroup label="Group "1""> <option value="inner1">Inner 1</option> @@ -554,7 +554,7 @@ class FormsWidgetTestCase(TestCase): </optgroup> </select>""") - self.assertEqual(w.render('nestchoice', ['inner1']), """<select multiple="multiple" name="nestchoice"> + self.assertHTMLEqual(w.render('nestchoice', ['inner1']), """<select multiple="multiple" name="nestchoice"> <option value="outer1">Outer 1</option> <optgroup label="Group "1""> <option value="inner1" selected="selected">Inner 1</option> @@ -562,7 +562,7 @@ class FormsWidgetTestCase(TestCase): </optgroup> </select>""") - self.assertEqual(w.render('nestchoice', ['outer1', 'inner2']), """<select multiple="multiple" name="nestchoice"> + self.assertHTMLEqual(w.render('nestchoice', ['outer1', 'inner2']), """<select multiple="multiple" name="nestchoice"> <option value="outer1" selected="selected">Outer 1</option> <optgroup label="Group "1""> <option value="inner1">Inner 1</option> @@ -572,7 +572,7 @@ class FormsWidgetTestCase(TestCase): def test_radioselect(self): w = RadioSelect() - self.assertEqual(w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label><input checked="checked" type="radio" name="beatle" value="J" /> John</label></li> <li><label><input type="radio" name="beatle" value="P" /> Paul</label></li> <li><label><input type="radio" name="beatle" value="G" /> George</label></li> @@ -580,7 +580,7 @@ class FormsWidgetTestCase(TestCase): </ul>""") # If the value is None, none of the options are checked: - self.assertEqual(w.render('beatle', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatle', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label><input type="radio" name="beatle" value="J" /> John</label></li> <li><label><input type="radio" name="beatle" value="P" /> Paul</label></li> <li><label><input type="radio" name="beatle" value="G" /> George</label></li> @@ -588,7 +588,7 @@ class FormsWidgetTestCase(TestCase): </ul>""") # If the value corresponds to a label (but not to an option value), none of the options are checked: - self.assertEqual(w.render('beatle', 'John', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatle', 'John', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label><input type="radio" name="beatle" value="J" /> John</label></li> <li><label><input type="radio" name="beatle" value="P" /> Paul</label></li> <li><label><input type="radio" name="beatle" value="G" /> George</label></li> @@ -596,17 +596,17 @@ class FormsWidgetTestCase(TestCase): </ul>""") # The value is compared to its str(): - self.assertEqual(w.render('num', 2, choices=[('1', '1'), ('2', '2'), ('3', '3')]), """<ul> + self.assertHTMLEqual(w.render('num', 2, choices=[('1', '1'), ('2', '2'), ('3', '3')]), """<ul> <li><label><input type="radio" name="num" value="1" /> 1</label></li> <li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li> <li><label><input type="radio" name="num" value="3" /> 3</label></li> </ul>""") - self.assertEqual(w.render('num', '2', choices=[(1, 1), (2, 2), (3, 3)]), """<ul> + self.assertHTMLEqual(w.render('num', '2', choices=[(1, 1), (2, 2), (3, 3)]), """<ul> <li><label><input type="radio" name="num" value="1" /> 1</label></li> <li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li> <li><label><input type="radio" name="num" value="3" /> 3</label></li> </ul>""") - self.assertEqual(w.render('num', 2, choices=[(1, 1), (2, 2), (3, 3)]), """<ul> + self.assertHTMLEqual(w.render('num', 2, choices=[(1, 1), (2, 2), (3, 3)]), """<ul> <li><label><input type="radio" name="num" value="1" /> 1</label></li> <li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li> <li><label><input type="radio" name="num" value="3" /> 3</label></li> @@ -616,7 +616,7 @@ class FormsWidgetTestCase(TestCase): def get_choices(): for i in range(5): yield (i, i) - self.assertEqual(w.render('num', 2, choices=get_choices()), """<ul> + self.assertHTMLEqual(w.render('num', 2, choices=get_choices()), """<ul> <li><label><input type="radio" name="num" value="0" /> 0</label></li> <li><label><input type="radio" name="num" value="1" /> 1</label></li> <li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li> @@ -626,14 +626,14 @@ class FormsWidgetTestCase(TestCase): # You can also pass 'choices' to the constructor: w = RadioSelect(choices=[(1, 1), (2, 2), (3, 3)]) - self.assertEqual(w.render('num', 2), """<ul> + self.assertHTMLEqual(w.render('num', 2), """<ul> <li><label><input type="radio" name="num" value="1" /> 1</label></li> <li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li> <li><label><input type="radio" name="num" value="3" /> 3</label></li> </ul>""") # If 'choices' is passed to both the constructor and render(), then they'll both be in the output: - self.assertEqual(w.render('num', 2, choices=[(4, 4), (5, 5)]), """<ul> + self.assertHTMLEqual(w.render('num', 2, choices=[(4, 4), (5, 5)]), """<ul> <li><label><input type="radio" name="num" value="1" /> 1</label></li> <li><label><input checked="checked" type="radio" name="num" value="2" /> 2</label></li> <li><label><input type="radio" name="num" value="3" /> 3</label></li> @@ -657,19 +657,19 @@ class FormsWidgetTestCase(TestCase): inp_set3.append('<p>%s %s</p>' % (inp.tag(), inp.choice_label)) inp_set4.append('%s %s %s %s %s' % (inp.name, inp.value, inp.choice_value, inp.choice_label, inp.is_checked())) - self.assertEqual('\n'.join(inp_set1), """<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label> + self.assertHTMLEqual('\n'.join(inp_set1), """<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label> <label><input type="radio" name="beatle" value="P" /> Paul</label> <label><input type="radio" name="beatle" value="G" /> George</label> <label><input type="radio" name="beatle" value="R" /> Ringo</label>""") - self.assertEqual('\n'.join(inp_set2), """<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label><br /> + self.assertHTMLEqual('\n'.join(inp_set2), """<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label><br /> <label><input type="radio" name="beatle" value="P" /> Paul</label><br /> <label><input type="radio" name="beatle" value="G" /> George</label><br /> <label><input type="radio" name="beatle" value="R" /> Ringo</label><br />""") - self.assertEqual('\n'.join(inp_set3), """<p><input checked="checked" type="radio" name="beatle" value="J" /> John</p> + self.assertHTMLEqual('\n'.join(inp_set3), """<p><input checked="checked" type="radio" name="beatle" value="J" /> John</p> <p><input type="radio" name="beatle" value="P" /> Paul</p> <p><input type="radio" name="beatle" value="G" /> George</p> <p><input type="radio" name="beatle" value="R" /> Ringo</p>""") - self.assertEqual('\n'.join(inp_set4), """beatle J J John True + self.assertHTMLEqual('\n'.join(inp_set4), """beatle J J John True beatle J P Paul False beatle J G George False beatle J R Ringo False""") @@ -679,7 +679,7 @@ beatle J R Ringo False""") def render(self): return u'<br />\n'.join([unicode(choice) for choice in self]) w = RadioSelect(renderer=MyRenderer) - self.assertEqual(w.render('beatle', 'G', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<label><input type="radio" name="beatle" value="J" /> John</label><br /> + self.assertHTMLEqual(w.render('beatle', 'G', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<label><input type="radio" name="beatle" value="J" /> John</label><br /> <label><input type="radio" name="beatle" value="P" /> Paul</label><br /> <label><input checked="checked" type="radio" name="beatle" value="G" /> George</label><br /> <label><input type="radio" name="beatle" value="R" /> Ringo</label>""") @@ -688,7 +688,7 @@ beatle J R Ringo False""") class CustomRadioSelect(RadioSelect): renderer = MyRenderer w = CustomRadioSelect() - self.assertEqual(w.render('beatle', 'G', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<label><input type="radio" name="beatle" value="J" /> John</label><br /> + self.assertHTMLEqual(w.render('beatle', 'G', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<label><input type="radio" name="beatle" value="J" /> John</label><br /> <label><input type="radio" name="beatle" value="P" /> Paul</label><br /> <label><input checked="checked" type="radio" name="beatle" value="G" /> George</label><br /> <label><input type="radio" name="beatle" value="R" /> Ringo</label>""") @@ -696,8 +696,8 @@ beatle J R Ringo False""") # A RadioFieldRenderer object also allows index access to individual RadioInput w = RadioSelect() r = w.get_renderer('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) - self.assertEqual(str(r[1]), '<label><input type="radio" name="beatle" value="P" /> Paul</label>') - self.assertEqual(str(r[0]), '<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label>') + self.assertHTMLEqual(str(r[1]), '<label><input type="radio" name="beatle" value="P" /> Paul</label>') + self.assertHTMLEqual(str(r[0]), '<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label>') self.assertTrue(r[0].is_checked()) self.assertFalse(r[1].is_checked()) self.assertEqual((r[1].name, r[1].value, r[1].choice_value, r[1].choice_label), ('beatle', u'J', u'P', u'Paul')) @@ -710,18 +710,18 @@ beatle J R Ringo False""") # Choices are escaped correctly w = RadioSelect() - self.assertEqual(w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you > me')))), """<ul> + self.assertHTMLEqual(w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you > me')))), """<ul> <li><label><input type="radio" name="escape" value="bad" /> you & me</label></li> <li><label><input type="radio" name="escape" value="good" /> you > me</label></li> </ul>""") # Unicode choices are correctly rendered as HTML w = RadioSelect() - self.assertEqual(unicode(w.render('email', 'ŠĐĆŽćžšđ', choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])), u'<ul>\n<li><label><input checked="checked" type="radio" name="email" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="radio" name="email" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>') + self.assertHTMLEqual(unicode(w.render('email', 'ŠĐĆŽćžšđ', choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])), u'<ul>\n<li><label><input checked="checked" type="radio" name="email" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="radio" name="email" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>') # Attributes provided at instantiation are passed to the constituent inputs w = RadioSelect(attrs={'id':'foo'}) - self.assertEqual(w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label for="foo_0"><input checked="checked" type="radio" id="foo_0" value="J" name="beatle" /> John</label></li> <li><label for="foo_1"><input type="radio" id="foo_1" value="P" name="beatle" /> Paul</label></li> <li><label for="foo_2"><input type="radio" id="foo_2" value="G" name="beatle" /> George</label></li> @@ -730,7 +730,7 @@ beatle J R Ringo False""") # Attributes provided at render-time are passed to the constituent inputs w = RadioSelect() - self.assertEqual(w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')), attrs={'id':'bar'}), """<ul> + self.assertHTMLEqual(w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')), attrs={'id':'bar'}), """<ul> <li><label for="bar_0"><input checked="checked" type="radio" id="bar_0" value="J" name="beatle" /> John</label></li> <li><label for="bar_1"><input type="radio" id="bar_1" value="P" name="beatle" /> Paul</label></li> <li><label for="bar_2"><input type="radio" id="bar_2" value="G" name="beatle" /> George</label></li> @@ -739,19 +739,19 @@ beatle J R Ringo False""") def test_checkboxselectmultiple(self): w = CheckboxSelectMultiple() - self.assertEqual(w.render('beatles', ['J'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatles', ['J'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label><input checked="checked" type="checkbox" name="beatles" value="J" /> John</label></li> <li><label><input type="checkbox" name="beatles" value="P" /> Paul</label></li> <li><label><input type="checkbox" name="beatles" value="G" /> George</label></li> <li><label><input type="checkbox" name="beatles" value="R" /> Ringo</label></li> </ul>""") - self.assertEqual(w.render('beatles', ['J', 'P'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatles', ['J', 'P'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label><input checked="checked" type="checkbox" name="beatles" value="J" /> John</label></li> <li><label><input checked="checked" type="checkbox" name="beatles" value="P" /> Paul</label></li> <li><label><input type="checkbox" name="beatles" value="G" /> George</label></li> <li><label><input type="checkbox" name="beatles" value="R" /> Ringo</label></li> </ul>""") - self.assertEqual(w.render('beatles', ['J', 'P', 'R'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatles', ['J', 'P', 'R'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label><input checked="checked" type="checkbox" name="beatles" value="J" /> John</label></li> <li><label><input checked="checked" type="checkbox" name="beatles" value="P" /> Paul</label></li> <li><label><input type="checkbox" name="beatles" value="G" /> George</label></li> @@ -759,7 +759,7 @@ beatle J R Ringo False""") </ul>""") # If the value is None, none of the options are selected: - self.assertEqual(w.render('beatles', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatles', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label><input type="checkbox" name="beatles" value="J" /> John</label></li> <li><label><input type="checkbox" name="beatles" value="P" /> Paul</label></li> <li><label><input type="checkbox" name="beatles" value="G" /> George</label></li> @@ -767,7 +767,7 @@ beatle J R Ringo False""") </ul>""") # If the value corresponds to a label (but not to an option value), none of the options are selected: - self.assertEqual(w.render('beatles', ['John'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatles', ['John'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label><input type="checkbox" name="beatles" value="J" /> John</label></li> <li><label><input type="checkbox" name="beatles" value="P" /> Paul</label></li> <li><label><input type="checkbox" name="beatles" value="G" /> George</label></li> @@ -775,7 +775,7 @@ beatle J R Ringo False""") </ul>""") # If multiple values are given, but some of them are not valid, the valid ones are selected: - self.assertEqual(w.render('beatles', ['J', 'G', 'foo'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> + self.assertHTMLEqual(w.render('beatles', ['J', 'G', 'foo'], choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<ul> <li><label><input checked="checked" type="checkbox" name="beatles" value="J" /> John</label></li> <li><label><input type="checkbox" name="beatles" value="P" /> Paul</label></li> <li><label><input checked="checked" type="checkbox" name="beatles" value="G" /> George</label></li> @@ -783,17 +783,17 @@ beatle J R Ringo False""") </ul>""") # The value is compared to its str(): - self.assertEqual(w.render('nums', [2], choices=[('1', '1'), ('2', '2'), ('3', '3')]), """<ul> + self.assertHTMLEqual(w.render('nums', [2], choices=[('1', '1'), ('2', '2'), ('3', '3')]), """<ul> <li><label><input type="checkbox" name="nums" value="1" /> 1</label></li> <li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li> <li><label><input type="checkbox" name="nums" value="3" /> 3</label></li> </ul>""") - self.assertEqual(w.render('nums', ['2'], choices=[(1, 1), (2, 2), (3, 3)]), """<ul> + self.assertHTMLEqual(w.render('nums', ['2'], choices=[(1, 1), (2, 2), (3, 3)]), """<ul> <li><label><input type="checkbox" name="nums" value="1" /> 1</label></li> <li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li> <li><label><input type="checkbox" name="nums" value="3" /> 3</label></li> </ul>""") - self.assertEqual(w.render('nums', [2], choices=[(1, 1), (2, 2), (3, 3)]), """<ul> + self.assertHTMLEqual(w.render('nums', [2], choices=[(1, 1), (2, 2), (3, 3)]), """<ul> <li><label><input type="checkbox" name="nums" value="1" /> 1</label></li> <li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li> <li><label><input type="checkbox" name="nums" value="3" /> 3</label></li> @@ -803,7 +803,7 @@ beatle J R Ringo False""") def get_choices(): for i in range(5): yield (i, i) - self.assertEqual(w.render('nums', [2], choices=get_choices()), """<ul> + self.assertHTMLEqual(w.render('nums', [2], choices=get_choices()), """<ul> <li><label><input type="checkbox" name="nums" value="0" /> 0</label></li> <li><label><input type="checkbox" name="nums" value="1" /> 1</label></li> <li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li> @@ -813,14 +813,14 @@ beatle J R Ringo False""") # You can also pass 'choices' to the constructor: w = CheckboxSelectMultiple(choices=[(1, 1), (2, 2), (3, 3)]) - self.assertEqual(w.render('nums', [2]), """<ul> + self.assertHTMLEqual(w.render('nums', [2]), """<ul> <li><label><input type="checkbox" name="nums" value="1" /> 1</label></li> <li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li> <li><label><input type="checkbox" name="nums" value="3" /> 3</label></li> </ul>""") # If 'choices' is passed to both the constructor and render(), then they'll both be in the output: - self.assertEqual(w.render('nums', [2], choices=[(4, 4), (5, 5)]), """<ul> + self.assertHTMLEqual(w.render('nums', [2], choices=[(4, 4), (5, 5)]), """<ul> <li><label><input type="checkbox" name="nums" value="1" /> 1</label></li> <li><label><input checked="checked" type="checkbox" name="nums" value="2" /> 2</label></li> <li><label><input type="checkbox" name="nums" value="3" /> 3</label></li> @@ -829,7 +829,7 @@ beatle J R Ringo False""") </ul>""") # Choices are escaped correctly - self.assertEqual(w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you > me')))), """<ul> + self.assertHTMLEqual(w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you > me')))), """<ul> <li><label><input type="checkbox" name="escape" value="1" /> 1</label></li> <li><label><input type="checkbox" name="escape" value="2" /> 2</label></li> <li><label><input type="checkbox" name="escape" value="3" /> 3</label></li> @@ -847,10 +847,10 @@ beatle J R Ringo False""") self.assertFalse(w._has_changed([2, 1], [u'1', u'2'])) # Unicode choices are correctly rendered as HTML - self.assertEqual(w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]), u'<ul>\n<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>\n<li><label><input type="checkbox" name="nums" value="2" /> 2</label></li>\n<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>\n<li><label><input checked="checked" type="checkbox" name="nums" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="checkbox" name="nums" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>') + self.assertHTMLEqual(w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]), u'<ul>\n<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>\n<li><label><input type="checkbox" name="nums" value="2" /> 2</label></li>\n<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>\n<li><label><input checked="checked" type="checkbox" name="nums" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="checkbox" name="nums" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>') # Each input gets a separate ID - self.assertEqual(CheckboxSelectMultiple().render('letters', list('ac'), choices=zip(list('abc'), list('ABC')), attrs={'id': 'abc'}), """<ul> + self.assertHTMLEqual(CheckboxSelectMultiple().render('letters', list('ac'), choices=zip(list('abc'), list('ABC')), attrs={'id': 'abc'}), """<ul> <li><label for="abc_0"><input checked="checked" type="checkbox" name="letters" value="a" id="abc_0" /> A</label></li> <li><label for="abc_1"><input type="checkbox" name="letters" value="b" id="abc_1" /> B</label></li> <li><label for="abc_2"><input checked="checked" type="checkbox" name="letters" value="c" id="abc_2" /> C</label></li> @@ -866,11 +866,11 @@ beatle J R Ringo False""") return u'<br />'.join(rendered_widgets) w = MyMultiWidget(widgets=(TextInput(attrs={'class': 'big'}), TextInput(attrs={'class': 'small'}))) - self.assertEqual(w.render('name', ['john', 'lennon']), u'<input type="text" class="big" value="john" name="name_0" /><br /><input type="text" class="small" value="lennon" name="name_1" />') - self.assertEqual(w.render('name', 'john__lennon'), u'<input type="text" class="big" value="john" name="name_0" /><br /><input type="text" class="small" value="lennon" name="name_1" />') - self.assertEqual(w.render('name', 'john__lennon', attrs={'id':'foo'}), u'<input id="foo_0" type="text" class="big" value="john" name="name_0" /><br /><input id="foo_1" type="text" class="small" value="lennon" name="name_1" />') + self.assertHTMLEqual(w.render('name', ['john', 'lennon']), u'<input type="text" class="big" value="john" name="name_0" /><br /><input type="text" class="small" value="lennon" name="name_1" />') + self.assertHTMLEqual(w.render('name', 'john__lennon'), u'<input type="text" class="big" value="john" name="name_0" /><br /><input type="text" class="small" value="lennon" name="name_1" />') + self.assertHTMLEqual(w.render('name', 'john__lennon', attrs={'id':'foo'}), u'<input id="foo_0" type="text" class="big" value="john" name="name_0" /><br /><input id="foo_1" type="text" class="small" value="lennon" name="name_1" />') w = MyMultiWidget(widgets=(TextInput(attrs={'class': 'big'}), TextInput(attrs={'class': 'small'})), attrs={'id': 'bar'}) - self.assertEqual(w.render('name', ['john', 'lennon']), u'<input id="bar_0" type="text" class="big" value="john" name="name_0" /><br /><input id="bar_1" type="text" class="small" value="lennon" name="name_1" />') + self.assertHTMLEqual(w.render('name', ['john', 'lennon']), u'<input id="bar_0" type="text" class="big" value="john" name="name_0" /><br /><input id="bar_1" type="text" class="small" value="lennon" name="name_1" />') w = MyMultiWidget(widgets=(TextInput(), TextInput())) @@ -889,18 +889,18 @@ beatle J R Ringo False""") def test_splitdatetime(self): w = SplitDateTimeWidget() - self.assertEqual(w.render('date', ''), u'<input type="text" name="date_0" /><input type="text" name="date_1" />') - self.assertEqual(w.render('date', None), u'<input type="text" name="date_0" /><input type="text" name="date_1" />') - self.assertEqual(w.render('date', datetime.datetime(2006, 1, 10, 7, 30)), u'<input type="text" name="date_0" value="2006-01-10" /><input type="text" name="date_1" value="07:30:00" />') - self.assertEqual(w.render('date', [datetime.date(2006, 1, 10), datetime.time(7, 30)]), u'<input type="text" name="date_0" value="2006-01-10" /><input type="text" name="date_1" value="07:30:00" />') + self.assertHTMLEqual(w.render('date', ''), u'<input type="text" name="date_0" /><input type="text" name="date_1" />') + self.assertHTMLEqual(w.render('date', None), u'<input type="text" name="date_0" /><input type="text" name="date_1" />') + self.assertHTMLEqual(w.render('date', datetime.datetime(2006, 1, 10, 7, 30)), u'<input type="text" name="date_0" value="2006-01-10" /><input type="text" name="date_1" value="07:30:00" />') + self.assertHTMLEqual(w.render('date', [datetime.date(2006, 1, 10), datetime.time(7, 30)]), u'<input type="text" name="date_0" value="2006-01-10" /><input type="text" name="date_1" value="07:30:00" />') # You can also pass 'attrs' to the constructor. In this case, the attrs will be w = SplitDateTimeWidget(attrs={'class': 'pretty'}) - self.assertEqual(w.render('date', datetime.datetime(2006, 1, 10, 7, 30)), u'<input type="text" class="pretty" value="2006-01-10" name="date_0" /><input type="text" class="pretty" value="07:30:00" name="date_1" />') + self.assertHTMLEqual(w.render('date', datetime.datetime(2006, 1, 10, 7, 30)), u'<input type="text" class="pretty" value="2006-01-10" name="date_0" /><input type="text" class="pretty" value="07:30:00" name="date_1" />') # Use 'date_format' and 'time_format' to change the way a value is displayed. w = SplitDateTimeWidget(date_format='%d/%m/%Y', time_format='%H:%M') - self.assertEqual(w.render('date', datetime.datetime(2006, 1, 10, 7, 30)), u'<input type="text" name="date_0" value="10/01/2006" /><input type="text" name="date_1" value="07:30" />') + self.assertHTMLEqual(w.render('date', datetime.datetime(2006, 1, 10, 7, 30)), u'<input type="text" name="date_0" value="10/01/2006" /><input type="text" name="date_1" value="07:30" />') self.assertTrue(w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), [u'2008-05-06', u'12:40:00'])) self.assertFalse(w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), [u'06/05/2008', u'12:40'])) @@ -908,18 +908,18 @@ beatle J R Ringo False""") def test_datetimeinput(self): w = DateTimeInput() - self.assertEqual(w.render('date', None), u'<input type="text" name="date" />') + self.assertHTMLEqual(w.render('date', None), u'<input type="text" name="date" />') d = datetime.datetime(2007, 9, 17, 12, 51, 34, 482548) self.assertEqual(str(d), '2007-09-17 12:51:34.482548') # The microseconds are trimmed on display, by default. - self.assertEqual(w.render('date', d), u'<input type="text" name="date" value="2007-09-17 12:51:34" />') - self.assertEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51, 34)), u'<input type="text" name="date" value="2007-09-17 12:51:34" />') - self.assertEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51)), u'<input type="text" name="date" value="2007-09-17 12:51:00" />') + self.assertHTMLEqual(w.render('date', d), u'<input type="text" name="date" value="2007-09-17 12:51:34" />') + self.assertHTMLEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51, 34)), u'<input type="text" name="date" value="2007-09-17 12:51:34" />') + self.assertHTMLEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51)), u'<input type="text" name="date" value="2007-09-17 12:51:00" />') # Use 'format' to change the way a value is displayed. w = DateTimeInput(format='%d/%m/%Y %H:%M') - self.assertEqual(w.render('date', d), u'<input type="text" name="date" value="17/09/2007 12:51" />') + self.assertHTMLEqual(w.render('date', d), u'<input type="text" name="date" value="17/09/2007 12:51" />') self.assertFalse(w._has_changed(d, '17/09/2007 12:51')) # Make sure a custom format works with _has_changed. The hidden input will use @@ -930,19 +930,19 @@ beatle J R Ringo False""") def test_dateinput(self): w = DateInput() - self.assertEqual(w.render('date', None), u'<input type="text" name="date" />') + self.assertHTMLEqual(w.render('date', None), u'<input type="text" name="date" />') d = datetime.date(2007, 9, 17) self.assertEqual(str(d), '2007-09-17') - self.assertEqual(w.render('date', d), u'<input type="text" name="date" value="2007-09-17" />') - self.assertEqual(w.render('date', datetime.date(2007, 9, 17)), u'<input type="text" name="date" value="2007-09-17" />') + self.assertHTMLEqual(w.render('date', d), u'<input type="text" name="date" value="2007-09-17" />') + self.assertHTMLEqual(w.render('date', datetime.date(2007, 9, 17)), u'<input type="text" name="date" value="2007-09-17" />') # We should be able to initialize from a unicode value. - self.assertEqual(w.render('date', u'2007-09-17'), u'<input type="text" name="date" value="2007-09-17" />') + self.assertHTMLEqual(w.render('date', u'2007-09-17'), u'<input type="text" name="date" value="2007-09-17" />') # Use 'format' to change the way a value is displayed. w = DateInput(format='%d/%m/%Y') - self.assertEqual(w.render('date', d), u'<input type="text" name="date" value="17/09/2007" />') + self.assertHTMLEqual(w.render('date', d), u'<input type="text" name="date" value="17/09/2007" />') self.assertFalse(w._has_changed(d, '17/09/2007')) # Make sure a custom format works with _has_changed. The hidden input will use @@ -953,21 +953,21 @@ beatle J R Ringo False""") def test_timeinput(self): w = TimeInput() - self.assertEqual(w.render('time', None), u'<input type="text" name="time" />') + self.assertHTMLEqual(w.render('time', None), u'<input type="text" name="time" />') t = datetime.time(12, 51, 34, 482548) self.assertEqual(str(t), '12:51:34.482548') # The microseconds are trimmed on display, by default. - self.assertEqual(w.render('time', t), u'<input type="text" name="time" value="12:51:34" />') - self.assertEqual(w.render('time', datetime.time(12, 51, 34)), u'<input type="text" name="time" value="12:51:34" />') - self.assertEqual(w.render('time', datetime.time(12, 51)), u'<input type="text" name="time" value="12:51:00" />') + self.assertHTMLEqual(w.render('time', t), u'<input type="text" name="time" value="12:51:34" />') + self.assertHTMLEqual(w.render('time', datetime.time(12, 51, 34)), u'<input type="text" name="time" value="12:51:34" />') + self.assertHTMLEqual(w.render('time', datetime.time(12, 51)), u'<input type="text" name="time" value="12:51:00" />') # We should be able to initialize from a unicode value. - self.assertEqual(w.render('time', u'13:12:11'), u'<input type="text" name="time" value="13:12:11" />') + self.assertHTMLEqual(w.render('time', u'13:12:11'), u'<input type="text" name="time" value="13:12:11" />') # Use 'format' to change the way a value is displayed. w = TimeInput(format='%H:%M') - self.assertEqual(w.render('time', t), u'<input type="text" name="time" value="12:51" />') + self.assertHTMLEqual(w.render('time', t), u'<input type="text" name="time" value="12:51" />') self.assertFalse(w._has_changed(t, '12:51')) # Make sure a custom format works with _has_changed. The hidden input will use @@ -980,12 +980,12 @@ beatle J R Ringo False""") from django.forms.widgets import SplitHiddenDateTimeWidget w = SplitHiddenDateTimeWidget() - self.assertEqual(w.render('date', ''), u'<input type="hidden" name="date_0" /><input type="hidden" name="date_1" />') + self.assertHTMLEqual(w.render('date', ''), u'<input type="hidden" name="date_0" /><input type="hidden" name="date_1" />') d = datetime.datetime(2007, 9, 17, 12, 51, 34, 482548) - self.assertEqual(str(d), '2007-09-17 12:51:34.482548') - self.assertEqual(w.render('date', d), u'<input type="hidden" name="date_0" value="2007-09-17" /><input type="hidden" name="date_1" value="12:51:34" />') - self.assertEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51, 34)), u'<input type="hidden" name="date_0" value="2007-09-17" /><input type="hidden" name="date_1" value="12:51:34" />') - self.assertEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51)), u'<input type="hidden" name="date_0" value="2007-09-17" /><input type="hidden" name="date_1" value="12:51:00" />') + self.assertHTMLEqual(str(d), '2007-09-17 12:51:34.482548') + self.assertHTMLEqual(w.render('date', d), u'<input type="hidden" name="date_0" value="2007-09-17" /><input type="hidden" name="date_1" value="12:51:34" />') + self.assertHTMLEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51, 34)), u'<input type="hidden" name="date_0" value="2007-09-17" /><input type="hidden" name="date_1" value="12:51:34" />') + self.assertHTMLEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51)), u'<input type="hidden" name="date_0" value="2007-09-17" /><input type="hidden" name="date_1" value="12:51:00" />') class NullBooleanSelectLazyForm(Form): @@ -1012,26 +1012,26 @@ class FormsI18NWidgetsTestCase(TestCase): w = DateTimeInput() d = datetime.datetime(2007, 9, 17, 12, 51, 34, 482548) w.is_localized = True - self.assertEqual(w.render('date', d), u'<input type="text" name="date" value="17.09.2007 12:51:34" />') + self.assertHTMLEqual(w.render('date', d), u'<input type="text" name="date" value="17.09.2007 12:51:34" />') def test_dateinput(self): w = DateInput() d = datetime.date(2007, 9, 17) w.is_localized = True - self.assertEqual(w.render('date', d), u'<input type="text" name="date" value="17.09.2007" />') + self.assertHTMLEqual(w.render('date', d), u'<input type="text" name="date" value="17.09.2007" />') def test_timeinput(self): w = TimeInput() t = datetime.time(12, 51, 34, 482548) w.is_localized = True - self.assertEqual(w.render('time', t), u'<input type="text" name="time" value="12:51:34" />') + self.assertHTMLEqual(w.render('time', t), u'<input type="text" name="time" value="12:51:34" />') def test_splithiddendatetime(self): from django.forms.widgets import SplitHiddenDateTimeWidget w = SplitHiddenDateTimeWidget() w.is_localized = True - self.assertEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51)), u'<input type="hidden" name="date_0" value="17.09.2007" /><input type="hidden" name="date_1" value="12:51:00" />') + self.assertHTMLEqual(w.render('date', datetime.datetime(2007, 9, 17, 12, 51)), u'<input type="hidden" name="date_0" value="17.09.2007" /><input type="hidden" name="date_1" value="12:51:00" />') def test_nullbooleanselect(self): """ @@ -1040,7 +1040,7 @@ class FormsI18NWidgetsTestCase(TestCase): Refs #17190 """ f = NullBooleanSelectLazyForm() - self.assertEqual(f.fields['bool'].widget.render('id_bool', True), u'<select name="id_bool">\n<option value="1">Unbekannt</option>\n<option value="2" selected="selected">Ja</option>\n<option value="3">Nein</option>\n</select>') + self.assertHTMLEqual(f.fields['bool'].widget.render('id_bool', True), u'<select name="id_bool">\n<option value="1">Unbekannt</option>\n<option value="2" selected="selected">Ja</option>\n<option value="3">Nein</option>\n</select>') class SelectAndTextWidget(MultiWidget): @@ -1116,7 +1116,7 @@ class ClearableFileInputTests(TestCase): """ widget = ClearableFileInput() widget.is_required = False - self.assertEqual(widget.render('myfile', FakeFieldFile()), + self.assertHTMLEqual(widget.render('myfile', FakeFieldFile()), u'Currently: <a href="something">something</a> <input type="checkbox" name="myfile-clear" id="myfile-clear_id" /> <label for="myfile-clear_id">Clear</label><br />Change: <input type="file" name="myfile" />') def test_html_escaped(self): @@ -1149,7 +1149,7 @@ class ClearableFileInputTests(TestCase): """ widget = ClearableFileInput() widget.is_required = True - self.assertEqual(widget.render('myfile', FakeFieldFile()), + self.assertHTMLEqual(widget.render('myfile', FakeFieldFile()), u'Currently: <a href="something">something</a> <br />Change: <input type="file" name="myfile" />') def test_clear_input_renders_only_if_initial(self): @@ -1160,7 +1160,7 @@ class ClearableFileInputTests(TestCase): """ widget = ClearableFileInput() widget.is_required = False - self.assertEqual(widget.render('myfile', None), + self.assertHTMLEqual(widget.render('myfile', None), u'<input type="file" name="myfile" />') def test_clear_input_checked_returns_false(self): diff --git a/tests/regressiontests/generic_inline_admin/tests.py b/tests/regressiontests/generic_inline_admin/tests.py index 2c82acfd01..db81eec47a 100644 --- a/tests/regressiontests/generic_inline_admin/tests.py +++ b/tests/regressiontests/generic_inline_admin/tests.py @@ -101,22 +101,22 @@ class GenericAdminViewTest(TestCase): # Works with no queryset formset = EpisodeMediaFormSet(instance=e) self.assertEqual(len(formset.forms), 5) - self.assertEqual(formset.forms[0].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="text" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/podcast.mp3" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>' % self.mp3_media_pk) - self.assertEqual(formset.forms[1].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="text" name="generic_inline_admin-media-content_type-object_id-1-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>' % self.png_media_pk) - self.assertEqual(formset.forms[2].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-2-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-2-url" type="text" name="generic_inline_admin-media-content_type-object_id-2-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-2-id" id="id_generic_inline_admin-media-content_type-object_id-2-id" /></p>') + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="text" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/podcast.mp3" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>' % self.mp3_media_pk) + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="text" name="generic_inline_admin-media-content_type-object_id-1-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>' % self.png_media_pk) + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-2-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-2-url" type="text" name="generic_inline_admin-media-content_type-object_id-2-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-2-id" id="id_generic_inline_admin-media-content_type-object_id-2-id" /></p>') # A queryset can be used to alter display ordering formset = EpisodeMediaFormSet(instance=e, queryset=Media.objects.order_by('url')) self.assertEqual(len(formset.forms), 5) - self.assertEqual(formset.forms[0].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="text" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>' % self.png_media_pk) - self.assertEqual(formset.forms[1].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="text" name="generic_inline_admin-media-content_type-object_id-1-url" value="http://example.com/podcast.mp3" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>' % self.mp3_media_pk) - self.assertEqual(formset.forms[2].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-2-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-2-url" type="text" name="generic_inline_admin-media-content_type-object_id-2-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-2-id" id="id_generic_inline_admin-media-content_type-object_id-2-id" /></p>') + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="text" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>' % self.png_media_pk) + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="text" name="generic_inline_admin-media-content_type-object_id-1-url" value="http://example.com/podcast.mp3" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>' % self.mp3_media_pk) + self.assertHTMLEqual(formset.forms[2].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-2-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-2-url" type="text" name="generic_inline_admin-media-content_type-object_id-2-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-2-id" id="id_generic_inline_admin-media-content_type-object_id-2-id" /></p>') # Works with a queryset that omits items formset = EpisodeMediaFormSet(instance=e, queryset=Media.objects.filter(url__endswith=".png")) self.assertEqual(len(formset.forms), 4) - self.assertEqual(formset.forms[0].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="text" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>' % self.png_media_pk) - self.assertEqual(formset.forms[1].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="text" name="generic_inline_admin-media-content_type-object_id-1-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>') + self.assertHTMLEqual(formset.forms[0].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-0-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-0-url" type="text" name="generic_inline_admin-media-content_type-object_id-0-url" value="http://example.com/logo.png" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-0-id" value="%s" id="id_generic_inline_admin-media-content_type-object_id-0-id" /></p>' % self.png_media_pk) + self.assertHTMLEqual(formset.forms[1].as_p(), '<p><label for="id_generic_inline_admin-media-content_type-object_id-1-url">Url:</label> <input id="id_generic_inline_admin-media-content_type-object_id-1-url" type="text" name="generic_inline_admin-media-content_type-object_id-1-url" maxlength="200" /><input type="hidden" name="generic_inline_admin-media-content_type-object_id-1-id" id="id_generic_inline_admin-media-content_type-object_id-1-id" /></p>') def testGenericInlineFormsetFactory(self): # Regression test for #10522. diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py index 0a2852e039..77bd35bab1 100644 --- a/tests/regressiontests/i18n/tests.py +++ b/tests/regressiontests/i18n/tests.py @@ -388,7 +388,7 @@ class FormattingTests(TestCase): }) self.assertEqual(True, form2.is_valid()) self.assertEqual(datetime.date(2009, 12, 31), form2.cleaned_data['date_field']) - self.assertEqual( + self.assertHTMLEqual( u'<select name="mydate_month" id="id_mydate_month">\n<option value="1">gener</option>\n<option value="2">febrer</option>\n<option value="3">mar\xe7</option>\n<option value="4">abril</option>\n<option value="5">maig</option>\n<option value="6">juny</option>\n<option value="7">juliol</option>\n<option value="8">agost</option>\n<option value="9">setembre</option>\n<option value="10">octubre</option>\n<option value="11">novembre</option>\n<option value="12" selected="selected">desembre</option>\n</select>\n<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>', SelectDateWidget(years=range(2009, 2019)).render('mydate', datetime.date(2009, 12, 31)) ) @@ -517,14 +517,14 @@ class FormattingTests(TestCase): }) self.assertEqual(True, form5.is_valid()) self.assertEqual(datetime.date(2009, 12, 31), form5.cleaned_data['date_field']) - self.assertEqual( + self.assertHTMLEqual( u'<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_month" id="id_mydate_month">\n<option value="1">gener</option>\n<option value="2">febrer</option>\n<option value="3">mar\xe7</option>\n<option value="4">abril</option>\n<option value="5">maig</option>\n<option value="6">juny</option>\n<option value="7">juliol</option>\n<option value="8">agost</option>\n<option value="9">setembre</option>\n<option value="10">octubre</option>\n<option value="11">novembre</option>\n<option value="12" selected="selected">desembre</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>', SelectDateWidget(years=range(2009, 2019)).render('mydate', datetime.date(2009, 12, 31)) ) # Russian locale (with E as month) with translation.override('ru', deactivate=True): - self.assertEqual( + self.assertHTMLEqual( u'<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_month" id="id_mydate_month">\n<option value="1">\u042f\u043d\u0432\u0430\u0440\u044c</option>\n<option value="2">\u0424\u0435\u0432\u0440\u0430\u043b\u044c</option>\n<option value="3">\u041c\u0430\u0440\u0442</option>\n<option value="4">\u0410\u043f\u0440\u0435\u043b\u044c</option>\n<option value="5">\u041c\u0430\u0439</option>\n<option value="6">\u0418\u044e\u043d\u044c</option>\n<option value="7">\u0418\u044e\u043b\u044c</option>\n<option value="8">\u0410\u0432\u0433\u0443\u0441\u0442</option>\n<option value="9">\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c</option>\n<option value="10">\u041e\u043a\u0442\u044f\u0431\u0440\u044c</option>\n<option value="11">\u041d\u043e\u044f\u0431\u0440\u044c</option>\n<option value="12" selected="selected">\u0414\u0435\u043a\u0430\u0431\u0440\u044c</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>', SelectDateWidget(years=range(2009, 2019)).render('mydate', datetime.date(2009, 12, 31)) ) @@ -589,7 +589,7 @@ class FormattingTests(TestCase): }) self.assertEqual(True, form6.is_valid()) self.assertEqual(datetime.date(2009, 12, 31), form6.cleaned_data['date_field']) - self.assertEqual( + self.assertHTMLEqual( u'<select name="mydate_month" id="id_mydate_month">\n<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12" selected="selected">December</option>\n</select>\n<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>', SelectDateWidget(years=range(2009, 2019)).render('mydate', datetime.date(2009, 12, 31)) ) @@ -617,7 +617,7 @@ class FormattingTests(TestCase): 'products_delivered': 12000, }) self.assertEqual(True, form6.is_valid()) - self.assertEqual( + self.assertHTMLEqual( form6.as_ul(), u'<li><label for="id_name">Name:</label> <input id="id_name" type="text" name="name" value="acme" maxlength="50" /></li>\n<li><label for="id_date_added">Date added:</label> <input type="text" name="date_added" value="31.12.2009 06:00:00" id="id_date_added" /></li>\n<li><label for="id_cents_paid">Cents paid:</label> <input type="text" name="cents_paid" value="59,47" id="id_cents_paid" /></li>\n<li><label for="id_products_delivered">Products delivered:</label> <input type="text" name="products_delivered" value="12000" id="id_products_delivered" /></li>' ) diff --git a/tests/regressiontests/localflavor/ar/tests.py b/tests/regressiontests/localflavor/ar/tests.py index fae78c9525..b48fb7cff3 100644 --- a/tests/regressiontests/localflavor/ar/tests.py +++ b/tests/regressiontests/localflavor/ar/tests.py @@ -33,7 +33,7 @@ class ARLocalFlavorTests(SimpleTestCase): <option value="V">Tierra del Fuego, Ant\xe1rtida e Islas del Atl\xe1ntico Sur</option> <option value="T">Tucum\xe1n</option> </select>''' - self.assertEqual(f.render('provincias', 'A'), out) + self.assertHTMLEqual(f.render('provincias', 'A'), out) def test_ARPostalCodeField(self): error_format = [u'Enter a postal code in the format NNNN or ANNNNAAA.'] diff --git a/tests/regressiontests/localflavor/at/tests.py b/tests/regressiontests/localflavor/at/tests.py index 5a5b99b189..d47e970123 100644 --- a/tests/regressiontests/localflavor/at/tests.py +++ b/tests/regressiontests/localflavor/at/tests.py @@ -18,7 +18,7 @@ class ATLocalFlavorTests(SimpleTestCase): <option value="VO">Vorarlberg</option> <option value="WI" selected="selected">Vienna</option> </select>''' - self.assertEqual(f.render('bundesland', 'WI'), out) + self.assertHTMLEqual(f.render('bundesland', 'WI'), out) def test_ATZipCodeField(self): error_format = [u'Enter a zip code in the format XXXX.'] diff --git a/tests/regressiontests/localflavor/au/tests.py b/tests/regressiontests/localflavor/au/tests.py index de74b1f2b9..42673a902b 100644 --- a/tests/regressiontests/localflavor/au/tests.py +++ b/tests/regressiontests/localflavor/au/tests.py @@ -76,7 +76,7 @@ class AULocalflavorTests(SimpleTestCase): <option value="VIC">Victoria</option> <option value="WA">Western Australia</option> </select>''' - self.assertEqual(f.render('state', 'NSW'), out) + self.assertHTMLEqual(f.render('state', 'NSW'), out) def test_AUPostCodeField(self): error_format = [u'Enter a 4 digit postcode.'] diff --git a/tests/regressiontests/localflavor/be/tests.py b/tests/regressiontests/localflavor/be/tests.py index 2f246c9ddd..6cfdfb3ffa 100644 --- a/tests/regressiontests/localflavor/be/tests.py +++ b/tests/regressiontests/localflavor/be/tests.py @@ -59,7 +59,7 @@ class BELocalFlavorTests(SimpleTestCase): <option value="VLG" selected="selected">Flemish Region</option> <option value="WAL">Wallonia</option> </select>''' - self.assertEqual(f.render('regions', 'VLG'), out) + self.assertHTMLEqual(f.render('regions', 'VLG'), out) def test_BEProvinceSelect(self): f = BEProvinceSelect() @@ -76,4 +76,4 @@ class BELocalFlavorTests(SimpleTestCase): <option value="WBR">Walloon Brabant</option> <option value="VWV">West Flanders</option> </select>''' - self.assertEqual(f.render('provinces', 'WLG'), out) + self.assertHTMLEqual(f.render('provinces', 'WLG'), out) diff --git a/tests/regressiontests/localflavor/br/tests.py b/tests/regressiontests/localflavor/br/tests.py index 1281a147c2..5777bc3500 100644 --- a/tests/regressiontests/localflavor/br/tests.py +++ b/tests/regressiontests/localflavor/br/tests.py @@ -105,7 +105,7 @@ class BRLocalFlavorTests(SimpleTestCase): <option value="SE">Sergipe</option> <option value="TO">Tocantins</option> </select>''' - self.assertEqual(f.render('states', 'PR'), out) + self.assertHTMLEqual(f.render('states', 'PR'), out) def test_BRStateChoiceField(self): error_invalid = [u'Select a valid brazilian state. That state is not one of the available states.'] diff --git a/tests/regressiontests/localflavor/ca/tests.py b/tests/regressiontests/localflavor/ca/tests.py index 556328e0ef..05d2fe2ac4 100644 --- a/tests/regressiontests/localflavor/ca/tests.py +++ b/tests/regressiontests/localflavor/ca/tests.py @@ -36,7 +36,7 @@ class CALocalFlavorTests(SimpleTestCase): <option value="SK">Saskatchewan</option> <option value="YT">Yukon</option> </select>''' - self.assertEqual(f.render('province', 'AB'), out) + self.assertHTMLEqual(f.render('province', 'AB'), out) def test_CAPostalCodeField(self): error_format = [u'Enter a postal code in the format XXX XXX.'] diff --git a/tests/regressiontests/localflavor/ch/tests.py b/tests/regressiontests/localflavor/ch/tests.py index 5c939e1d7e..17660a46d2 100644 --- a/tests/regressiontests/localflavor/ch/tests.py +++ b/tests/regressiontests/localflavor/ch/tests.py @@ -35,7 +35,7 @@ class CHLocalFlavorTests(SimpleTestCase): <option value="ZG">Zug</option> <option value="ZH">Zurich</option> </select>''' - self.assertEqual(f.render('state', 'AG'), out) + self.assertHTMLEqual(f.render('state', 'AG'), out) def test_CHZipCodeField(self): error_format = [u'Enter a zip code in the format XXXX.'] diff --git a/tests/regressiontests/localflavor/cl/tests.py b/tests/regressiontests/localflavor/cl/tests.py index c6e75b19da..250f5645a0 100644 --- a/tests/regressiontests/localflavor/cl/tests.py +++ b/tests/regressiontests/localflavor/cl/tests.py @@ -23,7 +23,7 @@ class CLLocalFlavorTests(SimpleTestCase): <option value="XIV">Regi\xf3n de Los R\xedos</option> <option value="XV">Regi\xf3n de Arica-Parinacota</option> </select>''' - self.assertEqual(f.render('foo', 'bar'), out) + self.assertHTMLEqual(f.render('foo', 'bar'), out) def test_CLRutField(self): error_invalid = [u'The Chilean RUT is not valid.'] diff --git a/tests/regressiontests/localflavor/cn/tests.py b/tests/regressiontests/localflavor/cn/tests.py index 8b91e66daf..ac4331cca9 100644 --- a/tests/regressiontests/localflavor/cn/tests.py +++ b/tests/regressiontests/localflavor/cn/tests.py @@ -43,7 +43,7 @@ class CNLocalFlavorTests(SimpleTestCase): <option value="yunnan">\u4e91\u5357</option> <option value="zhejiang">\u6d59\u6c5f</option> </select>''' - self.assertEqual(f.render('provinces', 'hubei'), correct_output) + self.assertHTMLEqual(f.render('provinces', 'hubei'), correct_output) def test_CNPostCodeField(self): error_format = [u'Enter a post code in the format XXXXXX.'] diff --git a/tests/regressiontests/localflavor/co/tests.py b/tests/regressiontests/localflavor/co/tests.py index bea7c8e137..4ab1768082 100644 --- a/tests/regressiontests/localflavor/co/tests.py +++ b/tests/regressiontests/localflavor/co/tests.py @@ -40,4 +40,4 @@ class COLocalFlavorTests(SimpleTestCase): <option value="VAU">Vaup\xe9s</option> <option value="VID">Vichada</option> </select>""" - self.assertEqual(d.render('department', 'COR'), out) + self.assertHTMLEqual(d.render('department', 'COR'), out) diff --git a/tests/regressiontests/localflavor/cz/tests.py b/tests/regressiontests/localflavor/cz/tests.py index 56ac731ff6..becc02ba9c 100644 --- a/tests/regressiontests/localflavor/cz/tests.py +++ b/tests/regressiontests/localflavor/cz/tests.py @@ -37,7 +37,7 @@ class CZLocalFlavorTests(SimpleTestCase): <option value="ZL">Zlin Region</option> <option value="MS">Moravian-Silesian Region</option> </select>''' - self.assertEqual(f.render('regions', 'TT'), out) + self.assertHTMLEqual(f.render('regions', 'TT'), out) def test_CZPostalCodeField(self): error_format = [u'Enter a postal code in the format XXXXX or XXX XX.'] diff --git a/tests/regressiontests/localflavor/de/tests.py b/tests/regressiontests/localflavor/de/tests.py index 99afd7194e..a3f75ce2f1 100644 --- a/tests/regressiontests/localflavor/de/tests.py +++ b/tests/regressiontests/localflavor/de/tests.py @@ -25,7 +25,7 @@ class DELocalFlavorTests(SimpleTestCase): <option value="SH">Schleswig-Holstein</option> <option value="TH" selected="selected">Thuringia</option> </select>''' - self.assertEqual(f.render('states', 'TH'), out) + self.assertHTMLEqual(f.render('states', 'TH'), out) def test_DEZipCodeField(self): error_format = [u'Enter a zip code in the format XXXXX.'] diff --git a/tests/regressiontests/localflavor/ec/tests.py b/tests/regressiontests/localflavor/ec/tests.py index d324d0ca1e..0ebe2f396d 100644 --- a/tests/regressiontests/localflavor/ec/tests.py +++ b/tests/regressiontests/localflavor/ec/tests.py @@ -31,4 +31,4 @@ class ECLocalFlavorTests(SimpleTestCase): <option value="T">Tungurahua</option> <option value="Z">Zamora Chinchipe</option> </select>""" - self.assertEqual(p.render('province', 'U'), out) + self.assertHTMLEqual(p.render('province', 'U'), out) diff --git a/tests/regressiontests/localflavor/es/tests.py b/tests/regressiontests/localflavor/es/tests.py index ccd08b168d..c989e3e9ca 100644 --- a/tests/regressiontests/localflavor/es/tests.py +++ b/tests/regressiontests/localflavor/es/tests.py @@ -26,7 +26,7 @@ class ESLocalFlavorTests(SimpleTestCase): <option value="NA">Foral Community of Navarre</option> <option value="VC">Valencian Community</option> </select>''' - self.assertEqual(f.render('regions', 'CT'), out) + self.assertHTMLEqual(f.render('regions', 'CT'), out) def test_ESProvinceSelect(self): f = ESProvinceSelect() @@ -84,7 +84,7 @@ class ESLocalFlavorTests(SimpleTestCase): <option value="51">Ceuta</option> <option value="52">Melilla</option> </select>''' - self.assertEqual(f.render('provinces', '08'), out) + self.assertHTMLEqual(f.render('provinces', '08'), out) def test_ESPostalCodeField(self): error_invalid = [u'Enter a valid postal code in the range and format 01XXX - 52XXX.'] diff --git a/tests/regressiontests/localflavor/fi/tests.py b/tests/regressiontests/localflavor/fi/tests.py index 74a6ed2d9d..70fce29f45 100644 --- a/tests/regressiontests/localflavor/fi/tests.py +++ b/tests/regressiontests/localflavor/fi/tests.py @@ -351,7 +351,7 @@ class FILocalFlavorTests(SimpleTestCase): <option value="ahtari">\xc4ht\xe4ri</option> <option value="aanekoski">\xc4\xe4nekoski</option> </select>''' - self.assertEqual(f.render('municipalities', 'turku'), out) + self.assertHTMLEqual(f.render('municipalities', 'turku'), out) def test_FIZipCodeField(self): error_format = [u'Enter a zip code in the format XXXXX.'] diff --git a/tests/regressiontests/localflavor/fr/tests.py b/tests/regressiontests/localflavor/fr/tests.py index 64f4d353ae..2ada11c25a 100644 --- a/tests/regressiontests/localflavor/fr/tests.py +++ b/tests/regressiontests/localflavor/fr/tests.py @@ -142,4 +142,4 @@ class FRLocalFlavorTests(SimpleTestCase): <option value="987">987 - Polynesie Francaise</option> <option value="988">988 - Nouvelle-Caledonie</option> </select>''' - self.assertEqual(f.render('dep', 'Paris'), out) + self.assertHTMLEqual(f.render('dep', 'Paris'), out) diff --git a/tests/regressiontests/localflavor/hr/tests.py b/tests/regressiontests/localflavor/hr/tests.py index f3357b6405..7050d7c5c2 100644 --- a/tests/regressiontests/localflavor/hr/tests.py +++ b/tests/regressiontests/localflavor/hr/tests.py @@ -32,7 +32,7 @@ class HRLocalFlavorTests(SimpleTestCase): <option value="ZDŽ">Zadarska županija</option> <option value="ZGŽ">Zagrebačka županija</option> </select>''' - self.assertEqual(f.render('county', 'GZG'), out) + self.assertHTMLEqual(f.render('county', 'GZG'), out) def test_HRPhoneNumberPrefixSelect(self): f = HRPhoneNumberPrefixSelect() @@ -64,7 +64,7 @@ class HRLocalFlavorTests(SimpleTestCase): <option value="98">098</option> <option value="99">099</option> </select>''' - self.assertEqual(f.render('phone', '1'), out) + self.assertHTMLEqual(f.render('phone', '1'), out) def test_HRLicensePlatePrefixSelect(self): f = HRLicensePlatePrefixSelect() @@ -104,7 +104,7 @@ class HRLocalFlavorTests(SimpleTestCase): <option value="ZG">ZG</option> <option value="ŽU">ŽU</option> </select>''' - self.assertEqual(f.render('license', 'BJ'), out) + self.assertHTMLEqual(f.render('license', 'BJ'), out) def test_HRPhoneNumberField(self): error_invalid = [u'Enter a valid phone number'] diff --git a/tests/regressiontests/localflavor/id/tests.py b/tests/regressiontests/localflavor/id/tests.py index d3c086289f..580083d3bf 100644 --- a/tests/regressiontests/localflavor/id/tests.py +++ b/tests/regressiontests/localflavor/id/tests.py @@ -56,7 +56,7 @@ class IDLocalFlavorTests(SimpleTestCase): <option value="SMS">Sumatera Selatan</option> <option value="SMU">Sumatera Utara</option> </select>''' - self.assertEqual(f.render('provinces', 'LPG'), out) + self.assertHTMLEqual(f.render('provinces', 'LPG'), out) def test_IDLicensePlatePrefixSelect(self): f = IDLicensePlatePrefixSelect() @@ -118,7 +118,7 @@ class IDLocalFlavorTests(SimpleTestCase): <option value="W">Sidoarjo</option> <option value="Z">Garut</option> </select>''' - self.assertEqual(f.render('codes', 'BE'), out) + self.assertHTMLEqual(f.render('codes', 'BE'), out) def test_IDPhoneNumberField(self): error_invalid = [u'Enter a valid phone number'] diff --git a/tests/regressiontests/localflavor/ie/tests.py b/tests/regressiontests/localflavor/ie/tests.py index 24556f7d0d..712f492a65 100644 --- a/tests/regressiontests/localflavor/ie/tests.py +++ b/tests/regressiontests/localflavor/ie/tests.py @@ -40,4 +40,4 @@ class IELocalFlavorTests(SimpleTestCase): <option value="wexford">Wexford</option> <option value="wicklow">Wicklow</option> </select>''' - self.assertEqual(f.render('counties', 'dublin'), out) + self.assertHTMLEqual(f.render('counties', 'dublin'), out) diff --git a/tests/regressiontests/localflavor/in_/tests.py b/tests/regressiontests/localflavor/in_/tests.py index a0eb84c5c6..d079aed1f5 100644 --- a/tests/regressiontests/localflavor/in_/tests.py +++ b/tests/regressiontests/localflavor/in_/tests.py @@ -64,7 +64,7 @@ class INLocalFlavorTests(SimpleTestCase): <option value="LD">Lakshadweep</option> <option value="PY">Pondicherry</option> </select>''' - self.assertEqual(f.render('state', 'AP'), out) + self.assertHTMLEqual(f.render('state', 'AP'), out) def test_INZipCodeField(self): error_format = [u'Enter a zip code in the format XXXXXX or XXX XXX.'] diff --git a/tests/regressiontests/localflavor/is_/tests.py b/tests/regressiontests/localflavor/is_/tests.py index a252734feb..835df6a8a7 100644 --- a/tests/regressiontests/localflavor/is_/tests.py +++ b/tests/regressiontests/localflavor/is_/tests.py @@ -156,7 +156,7 @@ class ISLocalFlavorTests(SimpleTestCase): <option value="900">900 Vestmannaeyjar</option> <option value="902">902 Vestmannaeyjar</option> </select>''' - self.assertEqual(f.render('foo', 'bar'), out) + self.assertHTMLEqual(f.render('foo', 'bar'), out) def test_ISIdNumberField(self): error_atleast = [u'Ensure this value has at least 10 characters (it has 9).'] diff --git a/tests/regressiontests/localflavor/it/tests.py b/tests/regressiontests/localflavor/it/tests.py index cd2a7a3d60..b774141c2d 100644 --- a/tests/regressiontests/localflavor/it/tests.py +++ b/tests/regressiontests/localflavor/it/tests.py @@ -29,7 +29,7 @@ class ITLocalFlavorTests(SimpleTestCase): <option value="VAO">Valle d\u2019Aosta</option> <option value="VEN">Veneto</option> </select>''' - self.assertEqual(f.render('regions', 'PMN'), out) + self.assertHTMLEqual(f.render('regions', 'PMN'), out) def test_ITZipCodeField(self): error_invalid = [u'Enter a valid zip code.'] diff --git a/tests/regressiontests/localflavor/jp/tests.py b/tests/regressiontests/localflavor/jp/tests.py index d6b6d8c3eb..7f0e8be184 100644 --- a/tests/regressiontests/localflavor/jp/tests.py +++ b/tests/regressiontests/localflavor/jp/tests.py @@ -56,7 +56,7 @@ class JPLocalFlavorTests(SimpleTestCase): <option value="kagoshima">Kagoshima</option> <option value="okinawa">Okinawa</option> </select>''' - self.assertEqual(f.render('prefecture', 'kanagawa'), out) + self.assertHTMLEqual(f.render('prefecture', 'kanagawa'), out) def test_JPPostalCodeField(self): error_format = [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.'] diff --git a/tests/regressiontests/localflavor/mk/tests.py b/tests/regressiontests/localflavor/mk/tests.py index 5d37a777a5..f78dbdd440 100644 --- a/tests/regressiontests/localflavor/mk/tests.py +++ b/tests/regressiontests/localflavor/mk/tests.py @@ -180,7 +180,7 @@ class MKLocalFlavorTests(SimpleTestCase): <option value="ST">\xc5\xa0tip</option> <option value="SO">\xc5\xa0uto Orizari</option> </select>""" - self.assertEqual(str(self.form['municipality']), municipality_select_html) + self.assertHTMLEqual(str(self.form['municipality']), municipality_select_html) def test_MKIdentityCardNumberField(self): error_invalid = [u'Identity card numbers must contain either 4 to 7 ' @@ -284,7 +284,7 @@ class MKLocalFlavorTests(SimpleTestCase): <option value="ST">\u0160tip</option> <option value="SO">\u0160uto Orizari</option> </select>''' - self.assertEqual(f.render('municipality', 'DL' ), out) + self.assertHTMLEqual(f.render('municipality', 'DL' ), out) def test_UMCNField(self): error_invalid = [u'This field should contain exactly 13 digits.'] diff --git a/tests/regressiontests/localflavor/mx/tests.py b/tests/regressiontests/localflavor/mx/tests.py index b5d696a38b..1657596223 100644 --- a/tests/regressiontests/localflavor/mx/tests.py +++ b/tests/regressiontests/localflavor/mx/tests.py @@ -75,7 +75,7 @@ class MXLocalFlavorTests(SimpleTestCase): <option value="YUC">Yucatán</option> <option value="ZAC">Zacatecas</option> </select>""" - self.assertEqual(str(self.form['state']), state_select_html) + self.assertHTMLEqual(str(self.form['state']), state_select_html) def test_MXStateSelect(self): f = MXStateSelect() @@ -113,7 +113,7 @@ class MXLocalFlavorTests(SimpleTestCase): <option value="YUC">Yucatán</option> <option value="ZAC">Zacatecas</option> </select>''' - self.assertEqual(f.render('state', 'MIC'), out) + self.assertHTMLEqual(f.render('state', 'MIC'), out) def test_MXZipCodeField(self): error_format = [u'Enter a valid zip code in the format XXXXX.'] diff --git a/tests/regressiontests/localflavor/nl/tests.py b/tests/regressiontests/localflavor/nl/tests.py index 177a5562aa..ebe4cc138f 100644 --- a/tests/regressiontests/localflavor/nl/tests.py +++ b/tests/regressiontests/localflavor/nl/tests.py @@ -21,7 +21,7 @@ class NLLocalFlavorTests(SimpleTestCase): <option value="ZE">Zeeland</option> <option value="ZH">Zuid-Holland</option> </select>''' - self.assertEqual(f.render('provinces', 'OV'), out) + self.assertHTMLEqual(f.render('provinces', 'OV'), out) def test_NLPhoneNumberField(self): error_invalid = [u'Enter a valid phone number'] diff --git a/tests/regressiontests/localflavor/pl/tests.py b/tests/regressiontests/localflavor/pl/tests.py index 52154f8804..bc4d260abc 100644 --- a/tests/regressiontests/localflavor/pl/tests.py +++ b/tests/regressiontests/localflavor/pl/tests.py @@ -25,7 +25,7 @@ class PLLocalFlavorTests(SimpleTestCase): <option value="greater_poland">Greater Poland</option> <option value="west_pomerania">West Pomerania</option> </select>''' - self.assertEqual(f.render('voivodeships', 'pomerania'), out) + self.assertHTMLEqual(f.render('voivodeships', 'pomerania'), out) def test_PLCountrySelect(self): f = PLCountySelect() @@ -407,7 +407,7 @@ class PLLocalFlavorTests(SimpleTestCase): <option value="swidwinski">\u015bwidwi\u0144ski</option> <option value="walecki">wa\u0142ecki</option> </select>''' - self.assertEqual(f.render('administrativeunit', 'katowice'), out) + self.assertHTMLEqual(f.render('administrativeunit', 'katowice'), out) def test_PLPostalCodeField(self): error_format = [u'Enter a postal code in the format XX-XXX.'] diff --git a/tests/regressiontests/localflavor/py/tests.py b/tests/regressiontests/localflavor/py/tests.py index c64e84919d..772039d3ef 100644 --- a/tests/regressiontests/localflavor/py/tests.py +++ b/tests/regressiontests/localflavor/py/tests.py @@ -26,7 +26,7 @@ class PYLocalFlavorTests(SimpleTestCase): <option value="PH">Pdte. Hayes</option> <option value="SP">San Pedro</option> </select>''' - self.assertEqual(py.render('department', 'M'), out) + self.assertHTMLEqual(py.render('department', 'M'), out) def test_PyNumberedDepartmentSelect(self): py = PyNumberedDepartmentSelect() @@ -50,4 +50,4 @@ class PYLocalFlavorTests(SimpleTestCase): <option value="BQ">XVII Boquer\xf3n</option> <option value="AS">XVIII Asunci\xf3n</option> </select>''' - self.assertEqual(py.render('department', 'AM'), out) + self.assertHTMLEqual(py.render('department', 'AM'), out) diff --git a/tests/regressiontests/localflavor/ro/tests.py b/tests/regressiontests/localflavor/ro/tests.py index 731157ca69..407e614b3e 100644 --- a/tests/regressiontests/localflavor/ro/tests.py +++ b/tests/regressiontests/localflavor/ro/tests.py @@ -53,7 +53,7 @@ class ROLocalFlavorTests(SimpleTestCase): <option value="VL">V\xe2lcea</option> <option value="VN">Vrancea</option> </select>''' - self.assertEqual(f.render('county', 'CJ'), out) + self.assertHTMLEqual(f.render('county', 'CJ'), out) def test_ROCIFField(self): error_invalid = [u'Enter a valid CIF.'] diff --git a/tests/regressiontests/localflavor/ru/tests.py b/tests/regressiontests/localflavor/ru/tests.py index bc292dacc9..bb85fe8181 100644 --- a/tests/regressiontests/localflavor/ru/tests.py +++ b/tests/regressiontests/localflavor/ru/tests.py @@ -56,7 +56,7 @@ class RULocalFlavorTests(SimpleTestCase): <option value="Privolzhsky Federal County">Privolzhsky Federal County</option> <option value="North-Caucasian Federal County">North-Caucasian Federal County</option> </select>''' - self.assertEqual(f.render('county', None), out) + self.assertHTMLEqual(f.render('county', None), out) def test_RURegionSelect(self): f = RURegionSelect() @@ -145,4 +145,4 @@ class RULocalFlavorTests(SimpleTestCase): <option value="87">Chukotskiy avtonomnyy okrug</option> <option value="89">Yamalo-Neneckiy avtonomnyy okrug</option> </select>''' - self.assertEqual(f.render('region', '67'), out) + self.assertHTMLEqual(f.render('region', '67'), out) diff --git a/tests/regressiontests/localflavor/se/tests.py b/tests/regressiontests/localflavor/se/tests.py index 4ae3eaed03..ead9053ea2 100644 --- a/tests/regressiontests/localflavor/se/tests.py +++ b/tests/regressiontests/localflavor/se/tests.py @@ -47,7 +47,7 @@ class SELocalFlavorTests(SimpleTestCase): <option value="Y">V\xe4sternorrland</option> <option value="Z">J\xe4mtland</option> </select>''' - self.assertEqual(f.render('swedish_county', 'E'), out) + self.assertHTMLEqual(f.render('swedish_county', 'E'), out) def test_SEOrganizationNumberField(self): error_invalid = [u'Enter a valid Swedish organisation number.'] diff --git a/tests/regressiontests/localflavor/si/tests.py b/tests/regressiontests/localflavor/si/tests.py index b5c86cdd3c..4e8fe25c47 100644 --- a/tests/regressiontests/localflavor/si/tests.py +++ b/tests/regressiontests/localflavor/si/tests.py @@ -553,4 +553,4 @@ class SILocalFlavorTests(SimpleTestCase): <option value="4274">\u017dirovnica</option> <option value="8360">\u017du\u017eemberk</option> </select>''' - self.assertEqual(f.render('Kranj', '4000'), out) + self.assertHTMLEqual(f.render('Kranj', '4000'), out) diff --git a/tests/regressiontests/localflavor/sk/tests.py b/tests/regressiontests/localflavor/sk/tests.py index 8eeefb415f..319fd827be 100644 --- a/tests/regressiontests/localflavor/sk/tests.py +++ b/tests/regressiontests/localflavor/sk/tests.py @@ -17,7 +17,7 @@ class SKLocalFlavorTests(SimpleTestCase): <option value="TT" selected="selected">Trnava region</option> <option value="ZA">Zilina region</option> </select>''' - self.assertEqual(f.render('regions', 'TT'), out) + self.assertHTMLEqual(f.render('regions', 'TT'), out) def test_SKDistrictSelect(self): f = SKDistrictSelect() @@ -102,7 +102,7 @@ class SKLocalFlavorTests(SimpleTestCase): <option value="ZH">Ziar nad Hronom</option> <option value="ZA">Zilina</option> </select>''' - self.assertEqual(f.render('Districts', 'RK'), out) + self.assertHTMLEqual(f.render('Districts', 'RK'), out) def test_SKPostalCodeField(self): error_format = [u'Enter a postal code in the format XXXXX or XXX XX.'] diff --git a/tests/regressiontests/localflavor/us/tests.py b/tests/regressiontests/localflavor/us/tests.py index b4762bf30b..a7f84ac4ae 100644 --- a/tests/regressiontests/localflavor/us/tests.py +++ b/tests/regressiontests/localflavor/us/tests.py @@ -90,7 +90,7 @@ class USLocalFlavorTests(SimpleTestCase): <option value="WI">Wisconsin</option> <option value="WY">Wyoming</option> </select>""" - self.assertEqual(str(self.form['state']), state_select_html) + self.assertHTMLEqual(str(self.form['state']), state_select_html) def test_full_postal_code_list(self): """Test that the full USPS code field is really the full list.""" @@ -160,7 +160,7 @@ class USLocalFlavorTests(SimpleTestCase): <option value="WI">Wisconsin</option> <option value="WY">Wyoming</option> </select>""" - self.assertEqual(str(self.form['postal_code']), usps_select_html) + self.assertHTMLEqual(str(self.form['postal_code']), usps_select_html) def test_USStateSelect(self): f = USStateSelect() @@ -225,7 +225,7 @@ class USLocalFlavorTests(SimpleTestCase): <option value="WI">Wisconsin</option> <option value="WY">Wyoming</option> </select>''' - self.assertEqual(f.render('state', 'IL'), out) + self.assertHTMLEqual(f.render('state', 'IL'), out) def test_USZipCodeField(self): error_format = [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.'] diff --git a/tests/regressiontests/localflavor/uy/tests.py b/tests/regressiontests/localflavor/uy/tests.py index 6c9599fff6..eda0068d3e 100644 --- a/tests/regressiontests/localflavor/uy/tests.py +++ b/tests/regressiontests/localflavor/uy/tests.py @@ -28,7 +28,7 @@ class UYLocalFlavorTests(SimpleTestCase): <option value="R">Tacuaremb\xf3</option> <option value="D">Treinta y Tres</option> </select>''' - self.assertEqual(f.render('departamentos', 'S'), out) + self.assertHTMLEqual(f.render('departamentos', 'S'), out) def test_UYCIField(self): error_format = [u'Enter a valid CI number in X.XXX.XXX-X,XXXXXXX-X or XXXXXXXX format.'] diff --git a/tests/regressiontests/model_forms_regress/tests.py b/tests/regressiontests/model_forms_regress/tests.py index d22bcb7331..caf24d336c 100644 --- a/tests/regressiontests/model_forms_regress/tests.py +++ b/tests/regressiontests/model_forms_regress/tests.py @@ -134,7 +134,7 @@ class ManyToManyCallableInitialTests(TestCase): # Create a ModelForm, instantiate it, and check that the output is as expected ModelForm = modelform_factory(Article, formfield_callback=formfield_for_dbfield) form = ModelForm() - self.assertEqual(form.as_ul(), u"""<li><label for="id_headline">Headline:</label> <input id="id_headline" type="text" name="headline" maxlength="100" /></li> + self.assertHTMLEqual(form.as_ul(), u"""<li><label for="id_headline">Headline:</label> <input id="id_headline" type="text" name="headline" maxlength="100" /></li> <li><label for="id_publications">Publications:</label> <select multiple="multiple" name="publications" id="id_publications"> <option value="%d" selected="selected">First Book</option> <option value="%d" selected="selected">Second Book</option> diff --git a/tests/regressiontests/modeladmin/tests.py b/tests/regressiontests/modeladmin/tests.py index 9b60945041..799d4f5901 100644 --- a/tests/regressiontests/modeladmin/tests.py +++ b/tests/regressiontests/modeladmin/tests.py @@ -310,7 +310,7 @@ class ModelAdminTests(TestCase): ma = ConcertAdmin(Concert, self.site) form = ma.get_form(request)() - self.assertEqual(str(form["main_band"]), + self.assertHTMLEqual(str(form["main_band"]), '<select name="main_band" id="id_main_band">\n' '<option value="" selected="selected">---------</option>\n' '<option value="%d">The Beatles</option>\n' @@ -331,7 +331,7 @@ class ModelAdminTests(TestCase): ma = ConcertAdmin(Concert, self.site) form = ma.get_form(request)() - self.assertEqual(str(form["main_band"]), + self.assertHTMLEqual(str(form["main_band"]), '<select name="main_band" id="id_main_band">\n' '<option value="" selected="selected">---------</option>\n' '<option value="%d">The Doors</option>\n' 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('<div><p>Hello</p></div>') + self.assertEqual(len(element.children), 1) + self.assertEqual(element.children[0].name, 'p') + self.assertEqual(element.children[0].children[0], 'Hello') + + parse_html('<p>') + parse_html('<p attr>') + dom = parse_html('<p>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('<script>var a = "<p" + ">";</script>'); + parse_html(''' + <script> + var js_sha_link='<p>***</p>'; + </script> + ''') + + # script content will be parsed to text + dom = parse_html(''' + <script><p>foo</p> '</scr'+'ipt>' <span>bar</span></script> + ''') + self.assertEqual(len(dom.children), 1) + self.assertEqual(dom.children[0], "<p>foo</p> '</scr'+'ipt>' <span>bar</span>") + + 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('<p>Hello <%s> world</p>' % 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('<p>Hello <%s /> world</p>' % 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('<p></p>', '<p></p>') + self.assertHTMLEqual('<p></p>', ' <p> </p> ') + self.assertHTMLEqual( + '<div><p>Hello</p></div>', + '<div><p>Hello</p></div>') + self.assertHTMLEqual( + '<div><p>Hello</p></div>', + '<div> <p>Hello</p> </div>') + self.assertHTMLEqual( + '<div>\n<p>Hello</p></div>', + '<div><p>Hello</p></div>\n') + self.assertHTMLEqual( + '<div><p>Hello\nWorld !</p></div>', + '<div><p>Hello World\n!</p></div>') + self.assertHTMLEqual( + '<div><p>Hello\nWorld !</p></div>', + '<div><p>Hello World\n!</p></div>') + self.assertHTMLEqual( + '<p>Hello World !</p>', + '<p>Hello World\n\n!</p>') + self.assertHTMLEqual('<p> </p>', '<p></p>') + self.assertHTMLEqual('<p/>', '<p></p>') + self.assertHTMLEqual('<p />', '<p></p>') + self.assertHTMLEqual('<input checked>', '<input checked="checked">') + self.assertHTMLEqual('<p>Hello', '<p> Hello') + self.assertHTMLEqual('<p>Hello</p>World', '<p>Hello</p> World') + + def test_ignore_comments(self): + self.assertHTMLEqual( + '<div>Hello<!-- this is a comment --> World!</div>', + '<div>Hello World!</div>') + + def test_unequal_html(self): + self.assertHTMLNotEqual('<p>Hello</p>', '<p>Hello!</p>') + self.assertHTMLNotEqual('<p>foobar</p>', '<p>foo bar</p>') + self.assertHTMLNotEqual('<p>foo bar</p>', '<p>foo bar</p>') + self.assertHTMLNotEqual('<p>foo nbsp</p>', '<p>foo </p>') + self.assertHTMLNotEqual('<p>foo #20</p>', '<p>foo </p>') + self.assertHTMLNotEqual( + '<p><span>Hello</span><span>World</span></p>', + '<p><span>Hello</span>World</p>') + self.assertHTMLNotEqual( + '<p><span>Hello</span>World</p>', + '<p><span>Hello</span><span>World</span></p>') + + def test_attributes(self): + self.assertHTMLEqual( + '<input type="text" id="id_name" />', + '<input id="id_name" type="text" />') + self.assertHTMLEqual( + '''<input type='text' id="id_name" />''', + '<input id="id_name" type="text" />') + self.assertHTMLNotEqual( + '<input type="text" id="id_name" />', + '<input type="password" id="id_name" />') + + def test_complex_examples(self): + self.assertHTMLEqual( + """<tr><th><label for="id_first_name">First name:</label></th> +<td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr> +<tr><th><label for="id_last_name">Last name:</label></th> +<td><input type="text" id="id_last_name" name="last_name" value="Lennon" /></td></tr> +<tr><th><label for="id_birthday">Birthday:</label></th> +<td><input type="text" value="1940-10-9" name="birthday" id="id_birthday" /></td></tr>""", + """ + <tr><th> + <label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /> + </td></tr> + <tr><th> + <label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" value="Lennon" id="id_last_name" /> + </td></tr> + <tr><th> + <label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /> + </td></tr> + """) + + self.assertHTMLEqual( + """<!DOCTYPE html> + <html> + <head> + <link rel="stylesheet"> + <title>Document</title> + <meta attribute="value"> + </head> + <body> + <p> + This is a valid paragraph + <div> this is a div AFTER the p</div> + </body> + </html>""", """ + <html> + <head> + <link rel="stylesheet"> + <title>Document</title> + <meta attribute="value"> + </head> + <body> + <p> This is a valid paragraph + <!-- browsers would close the p tag here --> + <div> this is a div AFTER the p</div> + </p> <!-- this is invalid html parsing however it should make no + difference in most cases --> + </body> + </html>""") + + def test_html_contain(self): + from django.test.html import parse_html + # equal html contains each other + dom1 = parse_html('<p>foo') + dom2 = parse_html('<p>foo</p>') + self.assertTrue(dom1 in dom2) + self.assertTrue(dom2 in dom1) + + dom2 = parse_html('<div><p>foo</p></div>') + self.assertTrue(dom1 in dom2) + self.assertTrue(dom2 not in dom1) + + self.assertFalse('<p>foo</p>' in dom2) + self.assertTrue('foo' in dom2) + + # when a root element is used ... + dom1 = parse_html('<p>foo</p><p>bar</p>') + dom2 = parse_html('<p>foo</p><p>bar</p>') + self.assertTrue(dom1 in dom2) + dom1 = parse_html('<p>foo</p>') + self.assertTrue(dom1 in dom2) + dom1 = parse_html('<p>bar</p>') + 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('<p>foo') + dom2 = parse_html('<p>foo</p>') + self.assertEqual(dom1.count(dom2), 1) + self.assertEqual(dom2.count(dom1), 1) + + dom2 = parse_html('<p>foo</p><p>bar</p>') + self.assertEqual(dom2.count(dom1), 1) + + dom2 = parse_html('<p>foo foo</p><p>foo</p>') + self.assertEqual(dom2.count('foo'), 3) + + dom2 = parse_html('<p class="bar">foo</p>') + 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('<p>foo</p><p>foo</p>') + self.assertEqual(dom2.count(dom1), 2) + + dom2 = parse_html('<div><p>foo<input type=""></p><p>foo</p></div>') + self.assertEqual(dom2.count(dom1), 1) + + dom2 = parse_html('<div><div><p>foo</p></div></div>') + self.assertEqual(dom2.count(dom1), 1) + + dom2 = parse_html('<p>foo<p>foo</p></p>') + self.assertEqual(dom2.count(dom1), 1) + + dom2 = parse_html('<p>foo<p>bar</p></p>') + 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('<p>', '') + with self.assertRaises(AssertionError): + self.assertHTMLEqual('', '<p>') + with self.assertRaises(HTMLParseError): + parse_html('</p>') + with self.assertRaises(HTMLParseError): + parse_html('<!--') + + def test_contains_html(self): + response = HttpResponse('''<body> + This is a form: <form action="" method="get"> + <input type="text" name="Hello" /> + </form></body>''') + + self.assertNotContains(response, "<input name='Hello' type='text'>") + self.assertContains(response, '<form action="" method="get">') + + self.assertContains(response, "<input name='Hello' type='text'>", html=True) + self.assertNotContains(response, '<form action="" method="get">', html=True) + + invalid_response = HttpResponse('''<body <bad>>''') + + with self.assertRaises(AssertionError): + self.assertContains(invalid_response, '<p></p>') + + with self.assertRaises(AssertionError): + self.assertContains(response, '<p "whats" that>') + + def test_unicode_handling(self): + from django.http import HttpResponse + response = HttpResponse('<p class="help">Some help text for the title (with unicode ŠĐĆŽćžšđ)</p>') + self.assertContains(response, '<p class="help">Some help text for the title (with unicode ŠĐĆŽćžšđ)</p>', html=True) + + class SkippingExtraTests(TestCase): fixtures = ['should_not_be_loaded.json'] diff --git a/tests/regressiontests/views/tests/generic/create_update.py b/tests/regressiontests/views/tests/generic/create_update.py index 902ba667da..2abcfb41f0 100644 --- a/tests/regressiontests/views/tests/generic/create_update.py +++ b/tests/regressiontests/views/tests/generic/create_update.py @@ -92,7 +92,7 @@ class UpdateDeleteObjectTest(TestCase): """ response = self.client.get('/create_update/update/article/old_article/') self.assertTemplateUsed(response, 'views/article_form.html') - self.assertEqual(unicode(response.context['form']['title']), + self.assertHTMLEqual(unicode(response.context['form']['title']), u'<input id="id_title" type="text" name="title" value="Old Article" maxlength="100" />') def test_update_object(self): |
