summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/regressiontests/admin_widgets/tests.py7
-rw-r--r--tests/regressiontests/forms/tests/extra.py21
-rw-r--r--tests/regressiontests/forms/tests/fields.py90
-rw-r--r--tests/regressiontests/forms/tests/widgets.py97
4 files changed, 109 insertions, 106 deletions
diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py
index 76aa9f448f..452387078d 100644
--- a/tests/regressiontests/admin_widgets/tests.py
+++ b/tests/regressiontests/admin_widgets/tests.py
@@ -425,13 +425,6 @@ class ManyToManyRawIdWidgetTest(DjangoTestCase):
'<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_STATIC_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % dict(admin_static_prefix(), m1pk=m1.pk)
)
- self.assertEqual(w._has_changed(None, None), False)
- self.assertEqual(w._has_changed([], None), False)
- self.assertEqual(w._has_changed(None, ['1']), True)
- self.assertEqual(w._has_changed([1, 2], ['1', '2']), False)
- self.assertEqual(w._has_changed([1, 2], ['1']), True)
- self.assertEqual(w._has_changed([1, 2], ['1', '3']), True)
-
def test_m2m_related_model_not_in_admin(self):
# M2M relationship with model not registered with admin site. Raw ID
# widget should have no magnifying glass link. See #16542
diff --git a/tests/regressiontests/forms/tests/extra.py b/tests/regressiontests/forms/tests/extra.py
index 07acb29741..762b774a93 100644
--- a/tests/regressiontests/forms/tests/extra.py
+++ b/tests/regressiontests/forms/tests/extra.py
@@ -428,6 +428,23 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
# If insufficient data is provided, None is substituted
self.assertFormErrors(['This field is required.'], f.clean, ['some text',['JP']])
+ # test with no initial data
+ self.assertTrue(f._has_changed(None, ['some text', ['J','P'], ['2007-04-25','6:24:00']]))
+
+ # test when the data is the same as initial
+ self.assertFalse(f._has_changed('some text,JP,2007-04-25 06:24:00',
+ ['some text', ['J','P'], ['2007-04-25','6:24:00']]))
+
+ # test when the first widget's data has changed
+ self.assertTrue(f._has_changed('some text,JP,2007-04-25 06:24:00',
+ ['other text', ['J','P'], ['2007-04-25','6:24:00']]))
+
+ # test when the last widget's data has changed. this ensures that it is not
+ # short circuiting while testing the widgets.
+ self.assertTrue(f._has_changed('some text,JP,2007-04-25 06:24:00',
+ ['some text', ['J','P'], ['2009-04-25','11:44:00']]))
+
+
class ComplexFieldForm(Form):
field1 = ComplexField(widget=w)
@@ -725,8 +742,8 @@ class FormsExtraL10NTestCase(TestCase):
def test_l10n_date_changed(self):
"""
- Ensure that SelectDateWidget._has_changed() works correctly with a
- localized date format.
+ Ensure that DateField._has_changed() with SelectDateWidget works
+ correctly with a localized date format.
Refs #17165.
"""
# With Field.show_hidden_initial=False -----------------------
diff --git a/tests/regressiontests/forms/tests/fields.py b/tests/regressiontests/forms/tests/fields.py
index e17d976fcf..7deb345a33 100644
--- a/tests/regressiontests/forms/tests/fields.py
+++ b/tests/regressiontests/forms/tests/fields.py
@@ -35,6 +35,7 @@ from decimal import Decimal
from django.core.files.uploadedfile import SimpleUploadedFile
from django.forms import *
from django.test import SimpleTestCase
+from django.utils import formats
from django.utils import six
from django.utils._os import upath
@@ -362,6 +363,13 @@ class FieldsTests(SimpleTestCase):
f = DateField()
self.assertRaisesMessage(ValidationError, "'Enter a valid date.'", f.clean, 'a\x00b')
+ def test_datefield_changed(self):
+ format = '%d/%m/%Y'
+ f = DateField(input_formats=[format])
+ d = datetime.date(2007, 9, 17)
+ self.assertFalse(f._has_changed(d, '17/09/2007'))
+ self.assertFalse(f._has_changed(d.strftime(format), '17/09/2007'))
+
# TimeField ###################################################################
def test_timefield_1(self):
@@ -388,6 +396,18 @@ class FieldsTests(SimpleTestCase):
self.assertEqual(datetime.time(14, 25, 59), f.clean(' 14:25:59 '))
self.assertRaisesMessage(ValidationError, "'Enter a valid time.'", f.clean, ' ')
+ def test_timefield_changed(self):
+ t1 = datetime.time(12, 51, 34, 482548)
+ t2 = datetime.time(12, 51)
+ format = '%H:%M'
+ f = TimeField(input_formats=[format])
+ self.assertTrue(f._has_changed(t1, '12:51'))
+ self.assertFalse(f._has_changed(t2, '12:51'))
+
+ format = '%I:%M %p'
+ f = TimeField(input_formats=[format])
+ self.assertFalse(f._has_changed(t2.strftime(format), '12:51 PM'))
+
# DateTimeField ###############################################################
def test_datetimefield_1(self):
@@ -446,6 +466,15 @@ class FieldsTests(SimpleTestCase):
def test_datetimefield_5(self):
f = DateTimeField(input_formats=['%Y.%m.%d %H:%M:%S.%f'])
self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45, 200), f.clean('2006.10.25 14:30:45.0002'))
+
+ def test_datetimefield_changed(self):
+ format = '%Y %m %d %I:%M %p'
+ f = DateTimeField(input_formats=[format])
+ d = datetime.datetime(2006, 9, 17, 14, 30, 0)
+ self.assertFalse(f._has_changed(d, '2006 09 17 2:30 PM'))
+ # Initial value may be a string from a hidden input
+ self.assertFalse(f._has_changed(d.strftime(format), '2006 09 17 2:30 PM'))
+
# RegexField ##################################################################
def test_regexfield_1(self):
@@ -566,6 +595,29 @@ class FieldsTests(SimpleTestCase):
self.assertEqual(SimpleUploadedFile,
type(f.clean(SimpleUploadedFile('name', b''))))
+ def test_filefield_changed(self):
+ '''
+ Test for the behavior of _has_changed for FileField. The value of data will
+ more than likely come from request.FILES. The value of initial data will
+ likely be a filename stored in the database. Since its value is of no use to
+ a FileField it is ignored.
+ '''
+ f = FileField()
+
+ # No file was uploaded and no initial data.
+ self.assertFalse(f._has_changed('', None))
+
+ # A file was uploaded and no initial data.
+ self.assertTrue(f._has_changed('', {'filename': 'resume.txt', 'content': 'My resume'}))
+
+ # A file was not uploaded, but there is initial data
+ self.assertFalse(f._has_changed('resume.txt', None))
+
+ # A file was uploaded and there is initial data (file identity is not dealt
+ # with here)
+ self.assertTrue(f._has_changed('resume.txt', {'filename': 'resume.txt', 'content': 'My resume'}))
+
+
# URLField ##################################################################
def test_urlfield_1(self):
@@ -709,6 +761,18 @@ class FieldsTests(SimpleTestCase):
def test_boolean_picklable(self):
self.assertIsInstance(pickle.loads(pickle.dumps(BooleanField())), BooleanField)
+ def test_booleanfield_changed(self):
+ f = BooleanField()
+ self.assertFalse(f._has_changed(None, None))
+ self.assertFalse(f._has_changed(None, ''))
+ self.assertFalse(f._has_changed('', None))
+ self.assertFalse(f._has_changed('', ''))
+ self.assertTrue(f._has_changed(False, 'on'))
+ self.assertFalse(f._has_changed(True, 'on'))
+ self.assertTrue(f._has_changed(True, ''))
+ # Initial value may have mutated to a string due to show_hidden_initial (#19537)
+ self.assertTrue(f._has_changed('False', 'on'))
+
# ChoiceField #################################################################
def test_choicefield_1(self):
@@ -825,6 +889,16 @@ class FieldsTests(SimpleTestCase):
self.assertEqual(False, f.cleaned_data['nullbool1'])
self.assertEqual(None, f.cleaned_data['nullbool2'])
+ def test_nullbooleanfield_changed(self):
+ f = NullBooleanField()
+ self.assertTrue(f._has_changed(False, None))
+ self.assertTrue(f._has_changed(None, False))
+ self.assertFalse(f._has_changed(None, None))
+ self.assertFalse(f._has_changed(False, False))
+ self.assertTrue(f._has_changed(True, False))
+ self.assertTrue(f._has_changed(True, None))
+ self.assertTrue(f._has_changed(True, False))
+
# MultipleChoiceField #########################################################
def test_multiplechoicefield_1(self):
@@ -866,6 +940,16 @@ class FieldsTests(SimpleTestCase):
self.assertRaisesMessage(ValidationError, "'Select a valid choice. 6 is not one of the available choices.'", f.clean, ['6'])
self.assertRaisesMessage(ValidationError, "'Select a valid choice. 6 is not one of the available choices.'", f.clean, ['1','6'])
+ def test_multiplechoicefield_changed(self):
+ f = MultipleChoiceField(choices=[('1', 'One'), ('2', 'Two'), ('3', 'Three')])
+ self.assertFalse(f._has_changed(None, None))
+ self.assertFalse(f._has_changed([], None))
+ self.assertTrue(f._has_changed(None, ['1']))
+ self.assertFalse(f._has_changed([1, 2], ['1', '2']))
+ self.assertFalse(f._has_changed([2, 1], ['1', '2']))
+ self.assertTrue(f._has_changed([1, 2], ['1']))
+ self.assertTrue(f._has_changed([1, 2], ['1', '3']))
+
# TypedMultipleChoiceField ############################################################
# TypedMultipleChoiceField is just like MultipleChoiceField, except that coerced types
# will be returned:
@@ -1048,3 +1132,9 @@ class FieldsTests(SimpleTestCase):
self.assertRaisesMessage(ValidationError, "'Enter a valid time.'", f.clean, ['2006-01-10', ''])
self.assertRaisesMessage(ValidationError, "'Enter a valid time.'", f.clean, ['2006-01-10'])
self.assertRaisesMessage(ValidationError, "'Enter a valid date.'", f.clean, ['', '07:30'])
+
+ def test_splitdatetimefield_changed(self):
+ f = SplitDateTimeField(input_date_formats=['%d/%m/%Y'])
+ self.assertTrue(f._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['2008-05-06', '12:40:00']))
+ self.assertFalse(f._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['06/05/2008', '12:40']))
+ self.assertTrue(f._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['06/05/2008', '12:41']))
diff --git a/tests/regressiontests/forms/tests/widgets.py b/tests/regressiontests/forms/tests/widgets.py
index 7a2961358a..6aa56ec8b0 100644
--- a/tests/regressiontests/forms/tests/widgets.py
+++ b/tests/regressiontests/forms/tests/widgets.py
@@ -148,25 +148,6 @@ class FormsWidgetTestCase(TestCase):
self.assertHTMLEqual(w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}), '<input type="file" class="fun" name="email" />')
- # Test for the behavior of _has_changed for FileInput. The value of data will
- # more than likely come from request.FILES. The value of initial data will
- # likely be a filename stored in the database. Since its value is of no use to
- # a FileInput it is ignored.
- w = FileInput()
-
- # No file was uploaded and no initial data.
- self.assertFalse(w._has_changed('', None))
-
- # A file was uploaded and no initial data.
- self.assertTrue(w._has_changed('', {'filename': 'resume.txt', 'content': 'My resume'}))
-
- # A file was not uploaded, but there is initial data
- self.assertFalse(w._has_changed('resume.txt', None))
-
- # A file was uploaded and there is initial data (file identity is not dealt
- # with here)
- self.assertTrue(w._has_changed('resume.txt', {'filename': 'resume.txt', 'content': 'My resume'}))
-
def test_textarea(self):
w = Textarea()
self.assertHTMLEqual(w.render('msg', ''), '<textarea rows="10" cols="40" name="msg"></textarea>')
@@ -233,16 +214,6 @@ class FormsWidgetTestCase(TestCase):
self.assertIsInstance(value, bool)
self.assertTrue(value)
- self.assertFalse(w._has_changed(None, None))
- self.assertFalse(w._has_changed(None, ''))
- self.assertFalse(w._has_changed('', None))
- self.assertFalse(w._has_changed('', ''))
- self.assertTrue(w._has_changed(False, 'on'))
- self.assertFalse(w._has_changed(True, 'on'))
- self.assertTrue(w._has_changed(True, ''))
- # Initial value may have mutated to a string due to show_hidden_initial (#19537)
- self.assertTrue(w._has_changed('False', 'on'))
-
def test_select(self):
w = Select()
self.assertHTMLEqual(w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))), """<select name="beatle">
@@ -415,13 +386,6 @@ class FormsWidgetTestCase(TestCase):
<option value="2">Yes</option>
<option value="3" selected="selected">No</option>
</select>""")
- self.assertTrue(w._has_changed(False, None))
- self.assertTrue(w._has_changed(None, False))
- self.assertFalse(w._has_changed(None, None))
- self.assertFalse(w._has_changed(False, False))
- self.assertTrue(w._has_changed(True, False))
- self.assertTrue(w._has_changed(True, None))
- self.assertTrue(w._has_changed(True, False))
def test_selectmultiple(self):
w = SelectMultiple()
@@ -535,14 +499,6 @@ class FormsWidgetTestCase(TestCase):
# Unicode choices are correctly rendered as HTML
self.assertHTMLEqual(w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]), '<select multiple="multiple" name="nums">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>')
- # Test the usage of _has_changed
- self.assertFalse(w._has_changed(None, None))
- self.assertFalse(w._has_changed([], None))
- self.assertTrue(w._has_changed(None, ['1']))
- self.assertFalse(w._has_changed([1, 2], ['1', '2']))
- self.assertTrue(w._has_changed([1, 2], ['1']))
- self.assertTrue(w._has_changed([1, 2], ['1', '3']))
-
# Choices can be nested one level in order to create HTML optgroups:
w.choices = (('outer1', 'Outer 1'), ('Group "1"', (('inner1', 'Inner 1'), ('inner2', 'Inner 2'))))
self.assertHTMLEqual(w.render('nestchoice', None), """<select multiple="multiple" name="nestchoice">
@@ -844,15 +800,6 @@ beatle J R Ringo False""")
<li><label><input type="checkbox" name="escape" value="good" /> you &gt; me</label></li>
</ul>""")
- # Test the usage of _has_changed
- self.assertFalse(w._has_changed(None, None))
- self.assertFalse(w._has_changed([], None))
- self.assertTrue(w._has_changed(None, ['1']))
- self.assertFalse(w._has_changed([1, 2], ['1', '2']))
- self.assertTrue(w._has_changed([1, 2], ['1']))
- self.assertTrue(w._has_changed([1, 2], ['1', '3']))
- self.assertFalse(w._has_changed([2, 1], ['1', '2']))
-
# Unicode choices are correctly rendered as HTML
self.assertHTMLEqual(w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]), '<ul>\n<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>\n<li><label><input type="checkbox" name="nums" value="2" /> 2</label></li>\n<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>\n<li><label><input checked="checked" type="checkbox" name="nums" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="checkbox" name="nums" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>')
@@ -886,21 +833,6 @@ beatle J R Ringo False""")
w = MyMultiWidget(widgets=(TextInput(attrs={'class': 'big'}), TextInput(attrs={'class': 'small'})), attrs={'id': 'bar'})
self.assertHTMLEqual(w.render('name', ['john', 'lennon']), '<input id="bar_0" type="text" class="big" value="john" name="name_0" /><br /><input id="bar_1" type="text" class="small" value="lennon" name="name_1" />')
- w = MyMultiWidget(widgets=(TextInput(), TextInput()))
-
- # test with no initial data
- self.assertTrue(w._has_changed(None, ['john', 'lennon']))
-
- # test when the data is the same as initial
- self.assertFalse(w._has_changed('john__lennon', ['john', 'lennon']))
-
- # test when the first widget's data has changed
- self.assertTrue(w._has_changed('john__lennon', ['alfred', 'lennon']))
-
- # test when the last widget's data has changed. this ensures that it is not
- # short circuiting while testing the widgets.
- self.assertTrue(w._has_changed('john__lennon', ['john', 'denver']))
-
def test_splitdatetime(self):
w = SplitDateTimeWidget()
self.assertHTMLEqual(w.render('date', ''), '<input type="text" name="date_0" /><input type="text" name="date_1" />')
@@ -916,10 +848,6 @@ beatle J R Ringo False""")
w = SplitDateTimeWidget(date_format='%d/%m/%Y', time_format='%H:%M')
self.assertHTMLEqual(w.render('date', datetime.datetime(2006, 1, 10, 7, 30)), '<input type="text" name="date_0" value="10/01/2006" /><input type="text" name="date_1" value="07:30" />')
- self.assertTrue(w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['2008-05-06', '12:40:00']))
- self.assertFalse(w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['06/05/2008', '12:40']))
- self.assertTrue(w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['06/05/2008', '12:41']))
-
def test_datetimeinput(self):
w = DateTimeInput()
self.assertHTMLEqual(w.render('date', None), '<input type="text" name="date" />')
@@ -934,13 +862,6 @@ beatle J R Ringo False""")
# Use 'format' to change the way a value is displayed.
w = DateTimeInput(format='%d/%m/%Y %H:%M', attrs={'type': 'datetime'})
self.assertHTMLEqual(w.render('date', d), '<input type="datetime" name="date" value="17/09/2007 12:51" />')
- self.assertFalse(w._has_changed(d, '17/09/2007 12:51'))
-
- # Make sure a custom format works with _has_changed. The hidden input will use
- data = datetime.datetime(2010, 3, 6, 12, 0, 0)
- custom_format = '%d.%m.%Y %H:%M'
- w = DateTimeInput(format=custom_format)
- self.assertFalse(w._has_changed(formats.localize_input(data), data.strftime(custom_format)))
def test_dateinput(self):
w = DateInput()
@@ -957,13 +878,6 @@ beatle J R Ringo False""")
# Use 'format' to change the way a value is displayed.
w = DateInput(format='%d/%m/%Y', attrs={'type': 'date'})
self.assertHTMLEqual(w.render('date', d), '<input type="date" name="date" value="17/09/2007" />')
- self.assertFalse(w._has_changed(d, '17/09/2007'))
-
- # Make sure a custom format works with _has_changed. The hidden input will use
- data = datetime.date(2010, 3, 6)
- custom_format = '%d.%m.%Y'
- w = DateInput(format=custom_format)
- self.assertFalse(w._has_changed(formats.localize_input(data), data.strftime(custom_format)))
def test_timeinput(self):
w = TimeInput()
@@ -982,13 +896,6 @@ beatle J R Ringo False""")
# Use 'format' to change the way a value is displayed.
w = TimeInput(format='%H:%M', attrs={'type': 'time'})
self.assertHTMLEqual(w.render('time', t), '<input type="time" name="time" value="12:51" />')
- self.assertFalse(w._has_changed(t, '12:51'))
-
- # Make sure a custom format works with _has_changed. The hidden input will use
- data = datetime.time(13, 0)
- custom_format = '%I:%M %p'
- w = TimeInput(format=custom_format)
- self.assertFalse(w._has_changed(formats.localize_input(data), data.strftime(custom_format)))
def test_splithiddendatetime(self):
from django.forms.widgets import SplitHiddenDateTimeWidget
@@ -1016,10 +923,6 @@ class FormsI18NWidgetsTestCase(TestCase):
deactivate()
super(FormsI18NWidgetsTestCase, self).tearDown()
- def test_splitdatetime(self):
- w = SplitDateTimeWidget(date_format='%d/%m/%Y', time_format='%H:%M')
- self.assertTrue(w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['06.05.2008', '12:41']))
-
def test_datetimeinput(self):
w = DateTimeInput()
d = datetime.datetime(2007, 9, 17, 12, 51, 34, 482548)