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
This commit is contained in:
parent
c82f1dcf95
commit
844a24bbb9
|
@ -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
|
|
@ -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=''):
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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>''')
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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}
|
||||
)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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):
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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()"
|
||||
|
|
|
@ -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],
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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>')
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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.
|
||||
|
|
|
@ -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>'
|
||||
)
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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).']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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.']
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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']
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue