diff options
Diffstat (limited to 'tests/regressiontests/forms/tests/fields.py')
| -rw-r--r-- | tests/regressiontests/forms/tests/fields.py | 90 |
1 files changed, 90 insertions, 0 deletions
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'])) |
