summaryrefslogtreecommitdiff
path: root/tests/forms_tests/field_tests
diff options
context:
space:
mode:
authordjango-bot <ops@djangoproject.com>2022-02-03 20:24:19 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-02-07 20:37:05 +0100
commit9c19aff7c7561e3a82978a272ecdaad40dda5c00 (patch)
treef0506b668a013d0063e5fba3dbf4863b466713ba /tests/forms_tests/field_tests
parentf68fa8b45dfac545cfc4111d4e52804c86db68d3 (diff)
Refs #33476 -- Reformatted code with Black.
Diffstat (limited to 'tests/forms_tests/field_tests')
-rw-r--r--tests/forms_tests/field_tests/__init__.py4
-rw-r--r--tests/forms_tests/field_tests/test_base.py13
-rw-r--r--tests/forms_tests/field_tests/test_booleanfield.py47
-rw-r--r--tests/forms_tests/field_tests/test_charfield.py100
-rw-r--r--tests/forms_tests/field_tests/test_choicefield.py73
-rw-r--r--tests/forms_tests/field_tests/test_combofield.py37
-rw-r--r--tests/forms_tests/field_tests/test_datefield.py183
-rw-r--r--tests/forms_tests/field_tests/test_datetimefield.py125
-rw-r--r--tests/forms_tests/field_tests/test_decimalfield.py193
-rw-r--r--tests/forms_tests/field_tests/test_durationfield.py37
-rw-r--r--tests/forms_tests/field_tests/test_emailfield.py55
-rw-r--r--tests/forms_tests/field_tests/test_filefield.py88
-rw-r--r--tests/forms_tests/field_tests/test_filepathfield.py105
-rw-r--r--tests/forms_tests/field_tests/test_floatfield.py85
-rw-r--r--tests/forms_tests/field_tests/test_genericipaddressfield.py219
-rw-r--r--tests/forms_tests/field_tests/test_imagefield.py74
-rw-r--r--tests/forms_tests/field_tests/test_integerfield.py112
-rw-r--r--tests/forms_tests/field_tests/test_jsonfield.py71
-rw-r--r--tests/forms_tests/field_tests/test_multiplechoicefield.py75
-rw-r--r--tests/forms_tests/field_tests/test_multivaluefield.py115
-rw-r--r--tests/forms_tests/field_tests/test_nullbooleanfield.py52
-rw-r--r--tests/forms_tests/field_tests/test_regexfield.py92
-rw-r--r--tests/forms_tests/field_tests/test_slugfield.py23
-rw-r--r--tests/forms_tests/field_tests/test_splitdatetimefield.py75
-rw-r--r--tests/forms_tests/field_tests/test_timefield.py31
-rw-r--r--tests/forms_tests/field_tests/test_typedchoicefield.py62
-rw-r--r--tests/forms_tests/field_tests/test_typedmultiplechoicefield.py44
-rw-r--r--tests/forms_tests/field_tests/test_urlfield.py116
-rw-r--r--tests/forms_tests/field_tests/test_uuidfield.py19
29 files changed, 1320 insertions, 1005 deletions
diff --git a/tests/forms_tests/field_tests/__init__.py b/tests/forms_tests/field_tests/__init__.py
index 4aae30282b..94b2a91242 100644
--- a/tests/forms_tests/field_tests/__init__.py
+++ b/tests/forms_tests/field_tests/__init__.py
@@ -2,8 +2,8 @@ from django import forms
class FormFieldAssertionsMixin:
-
def assertWidgetRendersTo(self, field, to):
class Form(forms.Form):
f = field
- self.assertHTMLEqual(str(Form()['f']), to)
+
+ self.assertHTMLEqual(str(Form()["f"]), to)
diff --git a/tests/forms_tests/field_tests/test_base.py b/tests/forms_tests/field_tests/test_base.py
index 4ddbea3414..201e05e47e 100644
--- a/tests/forms_tests/field_tests/test_base.py
+++ b/tests/forms_tests/field_tests/test_base.py
@@ -3,7 +3,6 @@ from django.test import SimpleTestCase
class BasicFieldsTests(SimpleTestCase):
-
def test_field_sets_widget_is_required(self):
self.assertTrue(Field(required=True).widget.is_required)
self.assertFalse(Field(required=False).widget.is_required)
@@ -23,20 +22,20 @@ class BasicFieldsTests(SimpleTestCase):
def test_field_deepcopies_widget_instance(self):
class CustomChoiceField(ChoiceField):
- widget = Select(attrs={'class': 'my-custom-class'})
+ widget = Select(attrs={"class": "my-custom-class"})
class TestForm(Form):
field1 = CustomChoiceField(choices=[])
field2 = CustomChoiceField(choices=[])
f = TestForm()
- f.fields['field1'].choices = [('1', '1')]
- f.fields['field2'].choices = [('2', '2')]
- self.assertEqual(f.fields['field1'].widget.choices, [('1', '1')])
- self.assertEqual(f.fields['field2'].widget.choices, [('2', '2')])
+ f.fields["field1"].choices = [("1", "1")]
+ f.fields["field2"].choices = [("2", "2")]
+ self.assertEqual(f.fields["field1"].widget.choices, [("1", "1")])
+ self.assertEqual(f.fields["field2"].widget.choices, [("2", "2")])
class DisabledFieldTests(SimpleTestCase):
def test_disabled_field_has_changed_always_false(self):
disabled_field = Field(disabled=True)
- self.assertFalse(disabled_field.has_changed('x', 'y'))
+ self.assertFalse(disabled_field.has_changed("x", "y"))
diff --git a/tests/forms_tests/field_tests/test_booleanfield.py b/tests/forms_tests/field_tests/test_booleanfield.py
index b0153e9e0b..560a0f473b 100644
--- a/tests/forms_tests/field_tests/test_booleanfield.py
+++ b/tests/forms_tests/field_tests/test_booleanfield.py
@@ -6,11 +6,10 @@ from django.test import SimpleTestCase
class BooleanFieldTest(SimpleTestCase):
-
def test_booleanfield_clean_1(self):
f = BooleanField()
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
self.assertTrue(f.clean(True))
@@ -19,25 +18,25 @@ class BooleanFieldTest(SimpleTestCase):
self.assertTrue(f.clean(1))
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(0)
- self.assertTrue(f.clean('Django rocks'))
- self.assertTrue(f.clean('True'))
+ self.assertTrue(f.clean("Django rocks"))
+ self.assertTrue(f.clean("True"))
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('False')
+ f.clean("False")
def test_booleanfield_clean_2(self):
f = BooleanField(required=False)
- self.assertIs(f.clean(''), False)
+ self.assertIs(f.clean(""), False)
self.assertIs(f.clean(None), False)
self.assertIs(f.clean(True), True)
self.assertIs(f.clean(False), False)
self.assertIs(f.clean(1), True)
self.assertIs(f.clean(0), False)
- self.assertIs(f.clean('1'), True)
- self.assertIs(f.clean('0'), False)
- self.assertIs(f.clean('Django rocks'), True)
- self.assertIs(f.clean('False'), False)
- self.assertIs(f.clean('false'), False)
- self.assertIs(f.clean('FaLsE'), False)
+ self.assertIs(f.clean("1"), True)
+ self.assertIs(f.clean("0"), False)
+ self.assertIs(f.clean("Django rocks"), True)
+ self.assertIs(f.clean("False"), False)
+ self.assertIs(f.clean("false"), False)
+ self.assertIs(f.clean("FaLsE"), False)
def test_boolean_picklable(self):
self.assertIsInstance(pickle.loads(pickle.dumps(BooleanField())), BooleanField)
@@ -45,20 +44,20 @@ class BooleanFieldTest(SimpleTestCase):
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, ''))
+ 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'))
+ self.assertTrue(f.has_changed("False", "on"))
# HiddenInput widget sends string values for boolean but doesn't clean them in value_from_datadict
- self.assertFalse(f.has_changed(False, 'False'))
- self.assertFalse(f.has_changed(True, 'True'))
- self.assertTrue(f.has_changed(False, 'True'))
- self.assertTrue(f.has_changed(True, 'False'))
+ self.assertFalse(f.has_changed(False, "False"))
+ self.assertFalse(f.has_changed(True, "True"))
+ self.assertTrue(f.has_changed(False, "True"))
+ self.assertTrue(f.has_changed(True, "False"))
def test_disabled_has_changed(self):
f = BooleanField(disabled=True)
- self.assertIs(f.has_changed('True', 'False'), False)
+ self.assertIs(f.has_changed("True", "False"), False)
diff --git a/tests/forms_tests/field_tests/test_charfield.py b/tests/forms_tests/field_tests/test_charfield.py
index 352761deec..2c3f9b7ebe 100644
--- a/tests/forms_tests/field_tests/test_charfield.py
+++ b/tests/forms_tests/field_tests/test_charfield.py
@@ -1,66 +1,63 @@
from django.core.exceptions import ValidationError
-from django.forms import (
- CharField, HiddenInput, PasswordInput, Textarea, TextInput,
-)
+from django.forms import CharField, HiddenInput, PasswordInput, Textarea, TextInput
from django.test import SimpleTestCase
from . import FormFieldAssertionsMixin
class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_charfield_1(self):
f = CharField()
- self.assertEqual('1', f.clean(1))
- self.assertEqual('hello', f.clean('hello'))
+ self.assertEqual("1", f.clean(1))
+ self.assertEqual("hello", f.clean("hello"))
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
- self.assertEqual('[1, 2, 3]', f.clean([1, 2, 3]))
+ f.clean("")
+ self.assertEqual("[1, 2, 3]", f.clean([1, 2, 3]))
self.assertIsNone(f.max_length)
self.assertIsNone(f.min_length)
def test_charfield_2(self):
f = CharField(required=False)
- self.assertEqual('1', f.clean(1))
- self.assertEqual('hello', f.clean('hello'))
- self.assertEqual('', f.clean(None))
- self.assertEqual('', f.clean(''))
- self.assertEqual('[1, 2, 3]', f.clean([1, 2, 3]))
+ self.assertEqual("1", f.clean(1))
+ self.assertEqual("hello", f.clean("hello"))
+ self.assertEqual("", f.clean(None))
+ self.assertEqual("", f.clean(""))
+ self.assertEqual("[1, 2, 3]", f.clean([1, 2, 3]))
self.assertIsNone(f.max_length)
self.assertIsNone(f.min_length)
def test_charfield_3(self):
f = CharField(max_length=10, required=False)
- self.assertEqual('12345', f.clean('12345'))
- self.assertEqual('1234567890', f.clean('1234567890'))
+ self.assertEqual("12345", f.clean("12345"))
+ self.assertEqual("1234567890", f.clean("1234567890"))
msg = "'Ensure this value has at most 10 characters (it has 11).'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('1234567890a')
+ f.clean("1234567890a")
self.assertEqual(f.max_length, 10)
self.assertIsNone(f.min_length)
def test_charfield_4(self):
f = CharField(min_length=10, required=False)
- self.assertEqual('', f.clean(''))
+ self.assertEqual("", f.clean(""))
msg = "'Ensure this value has at least 10 characters (it has 5).'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('12345')
- self.assertEqual('1234567890', f.clean('1234567890'))
- self.assertEqual('1234567890a', f.clean('1234567890a'))
+ f.clean("12345")
+ self.assertEqual("1234567890", f.clean("1234567890"))
+ self.assertEqual("1234567890a", f.clean("1234567890a"))
self.assertIsNone(f.max_length)
self.assertEqual(f.min_length, 10)
def test_charfield_5(self):
f = CharField(min_length=10, required=True)
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
msg = "'Ensure this value has at least 10 characters (it has 5).'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('12345')
- self.assertEqual('1234567890', f.clean('1234567890'))
- self.assertEqual('1234567890a', f.clean('1234567890a'))
+ f.clean("12345")
+ self.assertEqual("1234567890", f.clean("1234567890"))
+ self.assertEqual("1234567890a", f.clean("1234567890a"))
self.assertIsNone(f.max_length)
self.assertEqual(f.min_length, 10)
@@ -70,12 +67,12 @@ class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
raises an exception.
"""
with self.assertRaises(ValueError):
- CharField(min_length='a')
+ CharField(min_length="a")
with self.assertRaises(ValueError):
- CharField(max_length='a')
- msg = '__init__() takes 1 positional argument but 2 were given'
+ CharField(max_length="a")
+ msg = "__init__() takes 1 positional argument but 2 were given"
with self.assertRaisesMessage(TypeError, msg):
- CharField('a')
+ CharField("a")
def test_charfield_widget_attrs(self):
"""
@@ -90,22 +87,28 @@ class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
# Return a maxlength attribute equal to max_length.
f = CharField(max_length=10)
- self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10'})
- self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10'})
- self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10'})
+ self.assertEqual(f.widget_attrs(TextInput()), {"maxlength": "10"})
+ self.assertEqual(f.widget_attrs(PasswordInput()), {"maxlength": "10"})
+ self.assertEqual(f.widget_attrs(Textarea()), {"maxlength": "10"})
# Return a minlength attribute equal to min_length.
f = CharField(min_length=5)
- self.assertEqual(f.widget_attrs(TextInput()), {'minlength': '5'})
- self.assertEqual(f.widget_attrs(PasswordInput()), {'minlength': '5'})
- self.assertEqual(f.widget_attrs(Textarea()), {'minlength': '5'})
+ self.assertEqual(f.widget_attrs(TextInput()), {"minlength": "5"})
+ self.assertEqual(f.widget_attrs(PasswordInput()), {"minlength": "5"})
+ self.assertEqual(f.widget_attrs(Textarea()), {"minlength": "5"})
# Return both maxlength and minlength when both max_length and
# min_length are set.
f = CharField(max_length=10, min_length=5)
- self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10', 'minlength': '5'})
- self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10', 'minlength': '5'})
- self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10', 'minlength': '5'})
+ self.assertEqual(
+ f.widget_attrs(TextInput()), {"maxlength": "10", "minlength": "5"}
+ )
+ self.assertEqual(
+ f.widget_attrs(PasswordInput()), {"maxlength": "10", "minlength": "5"}
+ )
+ self.assertEqual(
+ f.widget_attrs(Textarea()), {"maxlength": "10", "minlength": "5"}
+ )
self.assertEqual(f.widget_attrs(HiddenInput()), {})
def test_charfield_strip(self):
@@ -113,12 +116,12 @@ class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
Values have whitespace stripped but not if strip=False.
"""
f = CharField()
- self.assertEqual(f.clean(' 1'), '1')
- self.assertEqual(f.clean('1 '), '1')
+ self.assertEqual(f.clean(" 1"), "1")
+ self.assertEqual(f.clean("1 "), "1")
f = CharField(strip=False)
- self.assertEqual(f.clean(' 1'), ' 1')
- self.assertEqual(f.clean('1 '), '1 ')
+ self.assertEqual(f.clean(" 1"), " 1")
+ self.assertEqual(f.clean("1 "), "1 ")
def test_strip_before_checking_empty(self):
"""
@@ -126,10 +129,11 @@ class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
converted to the empty value, None.
"""
f = CharField(required=False, empty_value=None)
- self.assertIsNone(f.clean(' '))
+ self.assertIsNone(f.clean(" "))
def test_clean_non_string(self):
"""CharField.clean() calls str(value) before stripping it."""
+
class StringWrapper:
def __init__(self, v):
self.v = v
@@ -137,18 +141,20 @@ class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
def __str__(self):
return self.v
- value = StringWrapper(' ')
+ value = StringWrapper(" ")
f1 = CharField(required=False, empty_value=None)
self.assertIsNone(f1.clean(value))
f2 = CharField(strip=False)
- self.assertEqual(f2.clean(value), ' ')
+ self.assertEqual(f2.clean(value), " ")
def test_charfield_disabled(self):
f = CharField(disabled=True)
- self.assertWidgetRendersTo(f, '<input type="text" name="f" id="id_f" disabled required>')
+ self.assertWidgetRendersTo(
+ f, '<input type="text" name="f" id="id_f" disabled required>'
+ )
def test_null_characters_prohibited(self):
f = CharField()
- msg = 'Null characters are not allowed.'
+ msg = "Null characters are not allowed."
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('\x00something')
+ f.clean("\x00something")
diff --git a/tests/forms_tests/field_tests/test_choicefield.py b/tests/forms_tests/field_tests/test_choicefield.py
index f25e2cedfd..bc580bbf02 100644
--- a/tests/forms_tests/field_tests/test_choicefield.py
+++ b/tests/forms_tests/field_tests/test_choicefield.py
@@ -7,52 +7,52 @@ from . import FormFieldAssertionsMixin
class ChoiceFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_choicefield_1(self):
- f = ChoiceField(choices=[('1', 'One'), ('2', 'Two')])
+ f = ChoiceField(choices=[("1", "One"), ("2", "Two")])
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- self.assertEqual('1', f.clean(1))
- self.assertEqual('1', f.clean('1'))
+ self.assertEqual("1", f.clean(1))
+ self.assertEqual("1", f.clean("1"))
msg = "'Select a valid choice. 3 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('3')
+ f.clean("3")
def test_choicefield_2(self):
- f = ChoiceField(choices=[('1', 'One'), ('2', 'Two')], required=False)
- self.assertEqual('', f.clean(''))
- self.assertEqual('', f.clean(None))
- self.assertEqual('1', f.clean(1))
- self.assertEqual('1', f.clean('1'))
+ f = ChoiceField(choices=[("1", "One"), ("2", "Two")], required=False)
+ self.assertEqual("", f.clean(""))
+ self.assertEqual("", f.clean(None))
+ self.assertEqual("1", f.clean(1))
+ self.assertEqual("1", f.clean("1"))
msg = "'Select a valid choice. 3 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('3')
+ f.clean("3")
def test_choicefield_3(self):
- f = ChoiceField(choices=[('J', 'John'), ('P', 'Paul')])
- self.assertEqual('J', f.clean('J'))
+ f = ChoiceField(choices=[("J", "John"), ("P", "Paul")])
+ self.assertEqual("J", f.clean("J"))
msg = "'Select a valid choice. John is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('John')
+ f.clean("John")
def test_choicefield_4(self):
f = ChoiceField(
choices=[
- ('Numbers', (('1', 'One'), ('2', 'Two'))),
- ('Letters', (('3', 'A'), ('4', 'B'))), ('5', 'Other'),
+ ("Numbers", (("1", "One"), ("2", "Two"))),
+ ("Letters", (("3", "A"), ("4", "B"))),
+ ("5", "Other"),
]
)
- self.assertEqual('1', f.clean(1))
- self.assertEqual('1', f.clean('1'))
- self.assertEqual('3', f.clean(3))
- self.assertEqual('3', f.clean('3'))
- self.assertEqual('5', f.clean(5))
- self.assertEqual('5', f.clean('5'))
+ self.assertEqual("1", f.clean(1))
+ self.assertEqual("1", f.clean("1"))
+ self.assertEqual("3", f.clean(3))
+ self.assertEqual("3", f.clean("3"))
+ self.assertEqual("5", f.clean(5))
+ self.assertEqual("5", f.clean("5"))
msg = "'Select a valid choice. 6 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('6')
+ f.clean("6")
def test_choicefield_choices_default(self):
f = ChoiceField()
@@ -60,9 +60,10 @@ class ChoiceFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
def test_choicefield_callable(self):
def choices():
- return [('J', 'John'), ('P', 'Paul')]
+ return [("J", "John"), ("P", "Paul")]
+
f = ChoiceField(choices=choices)
- self.assertEqual('J', f.clean('J'))
+ self.assertEqual("J", f.clean("J"))
def test_choicefield_callable_may_evaluate_to_different_values(self):
choices = []
@@ -73,29 +74,29 @@ class ChoiceFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
class ChoiceFieldForm(Form):
choicefield = ChoiceField(choices=choices_as_callable)
- choices = [('J', 'John')]
+ choices = [("J", "John")]
form = ChoiceFieldForm()
- self.assertEqual([('J', 'John')], list(form.fields['choicefield'].choices))
+ self.assertEqual([("J", "John")], list(form.fields["choicefield"].choices))
- choices = [('P', 'Paul')]
+ choices = [("P", "Paul")]
form = ChoiceFieldForm()
- self.assertEqual([('P', 'Paul')], list(form.fields['choicefield'].choices))
+ self.assertEqual([("P", "Paul")], list(form.fields["choicefield"].choices))
def test_choicefield_disabled(self):
- f = ChoiceField(choices=[('J', 'John'), ('P', 'Paul')], disabled=True)
+ f = ChoiceField(choices=[("J", "John"), ("P", "Paul")], disabled=True)
self.assertWidgetRendersTo(
f,
'<select id="id_f" name="f" disabled><option value="J">John</option>'
- '<option value="P">Paul</option></select>'
+ '<option value="P">Paul</option></select>',
)
def test_choicefield_enumeration(self):
class FirstNames(models.TextChoices):
- JOHN = 'J', 'John'
- PAUL = 'P', 'Paul'
+ JOHN = "J", "John"
+ PAUL = "P", "Paul"
f = ChoiceField(choices=FirstNames.choices)
- self.assertEqual(f.clean('J'), 'J')
+ self.assertEqual(f.clean("J"), "J")
msg = "'Select a valid choice. 3 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('3')
+ f.clean("3")
diff --git a/tests/forms_tests/field_tests/test_combofield.py b/tests/forms_tests/field_tests/test_combofield.py
index 481783fe2e..d433fdf2b3 100644
--- a/tests/forms_tests/field_tests/test_combofield.py
+++ b/tests/forms_tests/field_tests/test_combofield.py
@@ -4,25 +4,34 @@ from django.test import SimpleTestCase
class ComboFieldTest(SimpleTestCase):
-
def test_combofield_1(self):
f = ComboField(fields=[CharField(max_length=20), EmailField()])
- self.assertEqual('test@example.com', f.clean('test@example.com'))
- with self.assertRaisesMessage(ValidationError, "'Ensure this value has at most 20 characters (it has 28).'"):
- f.clean('longemailaddress@example.com')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid email address.'"):
- f.clean('not an email')
+ self.assertEqual("test@example.com", f.clean("test@example.com"))
+ with self.assertRaisesMessage(
+ ValidationError,
+ "'Ensure this value has at most 20 characters (it has 28).'",
+ ):
+ f.clean("longemailaddress@example.com")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid email address.'"
+ ):
+ f.clean("not an email")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
def test_combofield_2(self):
f = ComboField(fields=[CharField(max_length=20), EmailField()], required=False)
- self.assertEqual('test@example.com', f.clean('test@example.com'))
- with self.assertRaisesMessage(ValidationError, "'Ensure this value has at most 20 characters (it has 28).'"):
- f.clean('longemailaddress@example.com')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid email address.'"):
- f.clean('not an email')
- self.assertEqual('', f.clean(''))
- self.assertEqual('', f.clean(None))
+ self.assertEqual("test@example.com", f.clean("test@example.com"))
+ with self.assertRaisesMessage(
+ ValidationError,
+ "'Ensure this value has at most 20 characters (it has 28).'",
+ ):
+ f.clean("longemailaddress@example.com")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid email address.'"
+ ):
+ f.clean("not an email")
+ self.assertEqual("", f.clean(""))
+ self.assertEqual("", f.clean(None))
diff --git a/tests/forms_tests/field_tests/test_datefield.py b/tests/forms_tests/field_tests/test_datefield.py
index 10d77bf1bb..a9f93f40ed 100644
--- a/tests/forms_tests/field_tests/test_datefield.py
+++ b/tests/forms_tests/field_tests/test_datefield.py
@@ -11,174 +11,195 @@ class GetDate(Form):
class DateFieldTest(SimpleTestCase):
-
def test_form_field(self):
- a = GetDate({'mydate_month': '4', 'mydate_day': '1', 'mydate_year': '2008'})
+ a = GetDate({"mydate_month": "4", "mydate_day": "1", "mydate_year": "2008"})
self.assertTrue(a.is_valid())
- self.assertEqual(a.cleaned_data['mydate'], date(2008, 4, 1))
+ self.assertEqual(a.cleaned_data["mydate"], date(2008, 4, 1))
# As with any widget that implements get_value_from_datadict(), we must
# accept the input from the "as_hidden" rendering as well.
self.assertHTMLEqual(
- a['mydate'].as_hidden(),
+ a["mydate"].as_hidden(),
'<input type="hidden" name="mydate" value="2008-04-01" id="id_mydate">',
)
- b = GetDate({'mydate': '2008-4-1'})
+ b = GetDate({"mydate": "2008-4-1"})
self.assertTrue(b.is_valid())
- self.assertEqual(b.cleaned_data['mydate'], date(2008, 4, 1))
+ self.assertEqual(b.cleaned_data["mydate"], date(2008, 4, 1))
# Invalid dates shouldn't be allowed
- c = GetDate({'mydate_month': '2', 'mydate_day': '31', 'mydate_year': '2010'})
+ c = GetDate({"mydate_month": "2", "mydate_day": "31", "mydate_year": "2010"})
self.assertFalse(c.is_valid())
- self.assertEqual(c.errors, {'mydate': ['Enter a valid date.']})
+ self.assertEqual(c.errors, {"mydate": ["Enter a valid date."]})
# label tag is correctly associated with month dropdown
- d = GetDate({'mydate_month': '1', 'mydate_day': '1', 'mydate_year': '2010'})
+ d = GetDate({"mydate_month": "1", "mydate_day": "1", "mydate_year": "2010"})
self.assertIn('<label for="id_mydate_month">', d.as_p())
- @translation.override('nl')
+ @translation.override("nl")
def test_l10n_date_changed(self):
"""
DateField.has_changed() with SelectDateWidget works with a localized
date format (#17165).
"""
# With Field.show_hidden_initial=False
- b = GetDate({
- 'mydate_year': '2008',
- 'mydate_month': '4',
- 'mydate_day': '1',
- }, initial={'mydate': date(2008, 4, 1)})
+ b = GetDate(
+ {
+ "mydate_year": "2008",
+ "mydate_month": "4",
+ "mydate_day": "1",
+ },
+ initial={"mydate": date(2008, 4, 1)},
+ )
self.assertFalse(b.has_changed())
- b = GetDate({
- 'mydate_year': '2008',
- 'mydate_month': '4',
- 'mydate_day': '2',
- }, initial={'mydate': date(2008, 4, 1)})
+ b = GetDate(
+ {
+ "mydate_year": "2008",
+ "mydate_month": "4",
+ "mydate_day": "2",
+ },
+ initial={"mydate": date(2008, 4, 1)},
+ )
self.assertTrue(b.has_changed())
# With Field.show_hidden_initial=True
class GetDateShowHiddenInitial(Form):
mydate = DateField(widget=SelectDateWidget, show_hidden_initial=True)
- b = GetDateShowHiddenInitial({
- 'mydate_year': '2008',
- 'mydate_month': '4',
- 'mydate_day': '1',
- 'initial-mydate': HiddenInput().format_value(date(2008, 4, 1)),
- }, initial={'mydate': date(2008, 4, 1)})
+ b = GetDateShowHiddenInitial(
+ {
+ "mydate_year": "2008",
+ "mydate_month": "4",
+ "mydate_day": "1",
+ "initial-mydate": HiddenInput().format_value(date(2008, 4, 1)),
+ },
+ initial={"mydate": date(2008, 4, 1)},
+ )
self.assertFalse(b.has_changed())
- b = GetDateShowHiddenInitial({
- 'mydate_year': '2008',
- 'mydate_month': '4',
- 'mydate_day': '22',
- 'initial-mydate': HiddenInput().format_value(date(2008, 4, 1)),
- }, initial={'mydate': date(2008, 4, 1)})
+ b = GetDateShowHiddenInitial(
+ {
+ "mydate_year": "2008",
+ "mydate_month": "4",
+ "mydate_day": "22",
+ "initial-mydate": HiddenInput().format_value(date(2008, 4, 1)),
+ },
+ initial={"mydate": date(2008, 4, 1)},
+ )
self.assertTrue(b.has_changed())
- b = GetDateShowHiddenInitial({
- 'mydate_year': '2008',
- 'mydate_month': '4',
- 'mydate_day': '22',
- 'initial-mydate': HiddenInput().format_value(date(2008, 4, 1)),
- }, initial={'mydate': date(2008, 4, 22)})
+ b = GetDateShowHiddenInitial(
+ {
+ "mydate_year": "2008",
+ "mydate_month": "4",
+ "mydate_day": "22",
+ "initial-mydate": HiddenInput().format_value(date(2008, 4, 1)),
+ },
+ initial={"mydate": date(2008, 4, 22)},
+ )
self.assertTrue(b.has_changed())
- b = GetDateShowHiddenInitial({
- 'mydate_year': '2008',
- 'mydate_month': '4',
- 'mydate_day': '22',
- 'initial-mydate': HiddenInput().format_value(date(2008, 4, 22)),
- }, initial={'mydate': date(2008, 4, 1)})
+ b = GetDateShowHiddenInitial(
+ {
+ "mydate_year": "2008",
+ "mydate_month": "4",
+ "mydate_day": "22",
+ "initial-mydate": HiddenInput().format_value(date(2008, 4, 22)),
+ },
+ initial={"mydate": date(2008, 4, 1)},
+ )
self.assertFalse(b.has_changed())
- @translation.override('nl')
+ @translation.override("nl")
def test_l10n_invalid_date_in(self):
# Invalid dates shouldn't be allowed
- a = GetDate({'mydate_month': '2', 'mydate_day': '31', 'mydate_year': '2010'})
+ a = GetDate({"mydate_month": "2", "mydate_day": "31", "mydate_year": "2010"})
self.assertFalse(a.is_valid())
# 'Geef een geldige datum op.' = 'Enter a valid date.'
- self.assertEqual(a.errors, {'mydate': ['Voer een geldige datum in.']})
+ self.assertEqual(a.errors, {"mydate": ["Voer een geldige datum in."]})
- @translation.override('nl')
+ @translation.override("nl")
def test_form_label_association(self):
# label tag is correctly associated with first rendered dropdown
- a = GetDate({'mydate_month': '1', 'mydate_day': '1', 'mydate_year': '2010'})
+ a = GetDate({"mydate_month": "1", "mydate_day": "1", "mydate_year": "2010"})
self.assertIn('<label for="id_mydate_day">', a.as_p())
def test_datefield_1(self):
f = DateField()
self.assertEqual(date(2006, 10, 25), f.clean(date(2006, 10, 25)))
self.assertEqual(date(2006, 10, 25), f.clean(datetime(2006, 10, 25, 14, 30)))
- self.assertEqual(date(2006, 10, 25), f.clean(datetime(2006, 10, 25, 14, 30, 59)))
- self.assertEqual(date(2006, 10, 25), f.clean(datetime(2006, 10, 25, 14, 30, 59, 200)))
- self.assertEqual(date(2006, 10, 25), f.clean('2006-10-25'))
- self.assertEqual(date(2006, 10, 25), f.clean('10/25/2006'))
- self.assertEqual(date(2006, 10, 25), f.clean('10/25/06'))
- self.assertEqual(date(2006, 10, 25), f.clean('Oct 25 2006'))
- self.assertEqual(date(2006, 10, 25), f.clean('October 25 2006'))
- self.assertEqual(date(2006, 10, 25), f.clean('October 25, 2006'))
- self.assertEqual(date(2006, 10, 25), f.clean('25 October 2006'))
- self.assertEqual(date(2006, 10, 25), f.clean('25 October, 2006'))
+ self.assertEqual(
+ date(2006, 10, 25), f.clean(datetime(2006, 10, 25, 14, 30, 59))
+ )
+ self.assertEqual(
+ date(2006, 10, 25), f.clean(datetime(2006, 10, 25, 14, 30, 59, 200))
+ )
+ self.assertEqual(date(2006, 10, 25), f.clean("2006-10-25"))
+ self.assertEqual(date(2006, 10, 25), f.clean("10/25/2006"))
+ self.assertEqual(date(2006, 10, 25), f.clean("10/25/06"))
+ self.assertEqual(date(2006, 10, 25), f.clean("Oct 25 2006"))
+ self.assertEqual(date(2006, 10, 25), f.clean("October 25 2006"))
+ self.assertEqual(date(2006, 10, 25), f.clean("October 25, 2006"))
+ self.assertEqual(date(2006, 10, 25), f.clean("25 October 2006"))
+ self.assertEqual(date(2006, 10, 25), f.clean("25 October, 2006"))
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean('2006-4-31')
+ f.clean("2006-4-31")
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean('200a-10-25')
+ f.clean("200a-10-25")
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean('25/10/06')
+ f.clean("25/10/06")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
def test_datefield_2(self):
f = DateField(required=False)
self.assertIsNone(f.clean(None))
- self.assertEqual('None', repr(f.clean(None)))
- self.assertIsNone(f.clean(''))
- self.assertEqual('None', repr(f.clean('')))
+ self.assertEqual("None", repr(f.clean(None)))
+ self.assertIsNone(f.clean(""))
+ self.assertEqual("None", repr(f.clean("")))
def test_datefield_3(self):
- f = DateField(input_formats=['%Y %m %d'])
+ f = DateField(input_formats=["%Y %m %d"])
self.assertEqual(date(2006, 10, 25), f.clean(date(2006, 10, 25)))
self.assertEqual(date(2006, 10, 25), f.clean(datetime(2006, 10, 25, 14, 30)))
- self.assertEqual(date(2006, 10, 25), f.clean('2006 10 25'))
+ self.assertEqual(date(2006, 10, 25), f.clean("2006 10 25"))
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean('2006-10-25')
+ f.clean("2006-10-25")
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean('10/25/2006')
+ f.clean("10/25/2006")
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean('10/25/06')
+ f.clean("10/25/06")
def test_datefield_4(self):
# Test whitespace stripping behavior (#5714)
f = DateField()
- self.assertEqual(date(2006, 10, 25), f.clean(' 10/25/2006 '))
- self.assertEqual(date(2006, 10, 25), f.clean(' 10/25/06 '))
- self.assertEqual(date(2006, 10, 25), f.clean(' Oct 25 2006 '))
- self.assertEqual(date(2006, 10, 25), f.clean(' October 25 2006 '))
- self.assertEqual(date(2006, 10, 25), f.clean(' October 25, 2006 '))
- self.assertEqual(date(2006, 10, 25), f.clean(' 25 October 2006 '))
+ self.assertEqual(date(2006, 10, 25), f.clean(" 10/25/2006 "))
+ self.assertEqual(date(2006, 10, 25), f.clean(" 10/25/06 "))
+ self.assertEqual(date(2006, 10, 25), f.clean(" Oct 25 2006 "))
+ self.assertEqual(date(2006, 10, 25), f.clean(" October 25 2006 "))
+ self.assertEqual(date(2006, 10, 25), f.clean(" October 25, 2006 "))
+ self.assertEqual(date(2006, 10, 25), f.clean(" 25 October 2006 "))
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean(' ')
+ f.clean(" ")
def test_datefield_5(self):
# Test null bytes (#18982)
f = DateField()
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean('a\x00b')
+ f.clean("a\x00b")
def test_datefield_changed(self):
- format = '%d/%m/%Y'
+ format = "%d/%m/%Y"
f = DateField(input_formats=[format])
d = date(2007, 9, 17)
- self.assertFalse(f.has_changed(d, '17/09/2007'))
+ self.assertFalse(f.has_changed(d, "17/09/2007"))
def test_datefield_strptime(self):
"""field.strptime() doesn't raise a UnicodeEncodeError (#16123)"""
f = DateField()
try:
- f.strptime('31 мая 2011', '%d-%b-%y')
+ f.strptime("31 мая 2011", "%d-%b-%y")
except Exception as e:
# assertIsInstance or assertRaises cannot be used because UnicodeEncodeError
# is a subclass of ValueError
diff --git a/tests/forms_tests/field_tests/test_datetimefield.py b/tests/forms_tests/field_tests/test_datetimefield.py
index 5d118cfdd2..3d266da6b7 100644
--- a/tests/forms_tests/field_tests/test_datetimefield.py
+++ b/tests/forms_tests/field_tests/test_datetimefield.py
@@ -7,7 +7,6 @@ from django.utils.timezone import get_fixed_timezone, utc
class DateTimeFieldTest(SimpleTestCase):
-
def test_datetimefield_clean(self):
tests = [
(date(2006, 10, 25), datetime(2006, 10, 25, 0, 0)),
@@ -17,48 +16,48 @@ class DateTimeFieldTest(SimpleTestCase):
datetime(2006, 10, 25, 14, 30, 59, 200),
datetime(2006, 10, 25, 14, 30, 59, 200),
),
- ('2006-10-25 14:30:45.000200', datetime(2006, 10, 25, 14, 30, 45, 200)),
- ('2006-10-25 14:30:45.0002', datetime(2006, 10, 25, 14, 30, 45, 200)),
- ('2006-10-25 14:30:45', datetime(2006, 10, 25, 14, 30, 45)),
- ('2006-10-25 14:30:00', datetime(2006, 10, 25, 14, 30)),
- ('2006-10-25 14:30', datetime(2006, 10, 25, 14, 30)),
- ('2006-10-25', datetime(2006, 10, 25, 0, 0)),
- ('10/25/2006 14:30:45.000200', datetime(2006, 10, 25, 14, 30, 45, 200)),
- ('10/25/2006 14:30:45', datetime(2006, 10, 25, 14, 30, 45)),
- ('10/25/2006 14:30:00', datetime(2006, 10, 25, 14, 30)),
- ('10/25/2006 14:30', datetime(2006, 10, 25, 14, 30)),
- ('10/25/2006', datetime(2006, 10, 25, 0, 0)),
- ('10/25/06 14:30:45.000200', datetime(2006, 10, 25, 14, 30, 45, 200)),
- ('10/25/06 14:30:45', datetime(2006, 10, 25, 14, 30, 45)),
- ('10/25/06 14:30:00', datetime(2006, 10, 25, 14, 30)),
- ('10/25/06 14:30', datetime(2006, 10, 25, 14, 30)),
- ('10/25/06', datetime(2006, 10, 25, 0, 0)),
+ ("2006-10-25 14:30:45.000200", datetime(2006, 10, 25, 14, 30, 45, 200)),
+ ("2006-10-25 14:30:45.0002", datetime(2006, 10, 25, 14, 30, 45, 200)),
+ ("2006-10-25 14:30:45", datetime(2006, 10, 25, 14, 30, 45)),
+ ("2006-10-25 14:30:00", datetime(2006, 10, 25, 14, 30)),
+ ("2006-10-25 14:30", datetime(2006, 10, 25, 14, 30)),
+ ("2006-10-25", datetime(2006, 10, 25, 0, 0)),
+ ("10/25/2006 14:30:45.000200", datetime(2006, 10, 25, 14, 30, 45, 200)),
+ ("10/25/2006 14:30:45", datetime(2006, 10, 25, 14, 30, 45)),
+ ("10/25/2006 14:30:00", datetime(2006, 10, 25, 14, 30)),
+ ("10/25/2006 14:30", datetime(2006, 10, 25, 14, 30)),
+ ("10/25/2006", datetime(2006, 10, 25, 0, 0)),
+ ("10/25/06 14:30:45.000200", datetime(2006, 10, 25, 14, 30, 45, 200)),
+ ("10/25/06 14:30:45", datetime(2006, 10, 25, 14, 30, 45)),
+ ("10/25/06 14:30:00", datetime(2006, 10, 25, 14, 30)),
+ ("10/25/06 14:30", datetime(2006, 10, 25, 14, 30)),
+ ("10/25/06", datetime(2006, 10, 25, 0, 0)),
# ISO 8601 formats.
(
- '2014-09-23T22:34:41.614804',
+ "2014-09-23T22:34:41.614804",
datetime(2014, 9, 23, 22, 34, 41, 614804),
),
- ('2014-09-23T22:34:41', datetime(2014, 9, 23, 22, 34, 41)),
- ('2014-09-23T22:34', datetime(2014, 9, 23, 22, 34)),
- ('2014-09-23', datetime(2014, 9, 23, 0, 0)),
- ('2014-09-23T22:34Z', datetime(2014, 9, 23, 22, 34, tzinfo=utc)),
+ ("2014-09-23T22:34:41", datetime(2014, 9, 23, 22, 34, 41)),
+ ("2014-09-23T22:34", datetime(2014, 9, 23, 22, 34)),
+ ("2014-09-23", datetime(2014, 9, 23, 0, 0)),
+ ("2014-09-23T22:34Z", datetime(2014, 9, 23, 22, 34, tzinfo=utc)),
(
- '2014-09-23T22:34+07:00',
+ "2014-09-23T22:34+07:00",
datetime(2014, 9, 23, 22, 34, tzinfo=get_fixed_timezone(420)),
),
# Whitespace stripping.
- (' 2006-10-25 14:30:45 ', datetime(2006, 10, 25, 14, 30, 45)),
- (' 2006-10-25 ', datetime(2006, 10, 25, 0, 0)),
- (' 10/25/2006 14:30:45 ', datetime(2006, 10, 25, 14, 30, 45)),
- (' 10/25/2006 14:30 ', datetime(2006, 10, 25, 14, 30)),
- (' 10/25/2006 ', datetime(2006, 10, 25, 0, 0)),
- (' 10/25/06 14:30:45 ', datetime(2006, 10, 25, 14, 30, 45)),
- (' 10/25/06 ', datetime(2006, 10, 25, 0, 0)),
+ (" 2006-10-25 14:30:45 ", datetime(2006, 10, 25, 14, 30, 45)),
+ (" 2006-10-25 ", datetime(2006, 10, 25, 0, 0)),
+ (" 10/25/2006 14:30:45 ", datetime(2006, 10, 25, 14, 30, 45)),
+ (" 10/25/2006 14:30 ", datetime(2006, 10, 25, 14, 30)),
+ (" 10/25/2006 ", datetime(2006, 10, 25, 0, 0)),
+ (" 10/25/06 14:30:45 ", datetime(2006, 10, 25, 14, 30, 45)),
+ (" 10/25/06 ", datetime(2006, 10, 25, 0, 0)),
(
- ' 2014-09-23T22:34:41.614804 ',
+ " 2014-09-23T22:34:41.614804 ",
datetime(2014, 9, 23, 22, 34, 41, 614804),
),
- (' 2014-09-23T22:34Z ', datetime(2014, 9, 23, 22, 34, tzinfo=utc)),
+ (" 2014-09-23T22:34Z ", datetime(2014, 9, 23, 22, 34, tzinfo=utc)),
]
f = DateTimeField()
for value, expected_datetime in tests:
@@ -69,40 +68,46 @@ class DateTimeFieldTest(SimpleTestCase):
f = DateTimeField()
msg = "'Enter a valid date/time.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('hello')
+ f.clean("hello")
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('2006-10-25 4:30 p.m.')
+ f.clean("2006-10-25 4:30 p.m.")
with self.assertRaisesMessage(ValidationError, msg):
- f.clean(' ')
+ f.clean(" ")
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('2014-09-23T28:23')
- f = DateTimeField(input_formats=['%Y %m %d %I:%M %p'])
+ f.clean("2014-09-23T28:23")
+ f = DateTimeField(input_formats=["%Y %m %d %I:%M %p"])
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('2006.10.25 14:30:45')
+ f.clean("2006.10.25 14:30:45")
def test_datetimefield_clean_input_formats(self):
tests = [
- ('%Y %m %d %I:%M %p', (
- (date(2006, 10, 25), datetime(2006, 10, 25, 0, 0)),
- (datetime(2006, 10, 25, 14, 30), datetime(2006, 10, 25, 14, 30)),
- (
- datetime(2006, 10, 25, 14, 30, 59),
- datetime(2006, 10, 25, 14, 30, 59),
- ),
+ (
+ "%Y %m %d %I:%M %p",
(
- datetime(2006, 10, 25, 14, 30, 59, 200),
- datetime(2006, 10, 25, 14, 30, 59, 200),
+ (date(2006, 10, 25), datetime(2006, 10, 25, 0, 0)),
+ (datetime(2006, 10, 25, 14, 30), datetime(2006, 10, 25, 14, 30)),
+ (
+ datetime(2006, 10, 25, 14, 30, 59),
+ datetime(2006, 10, 25, 14, 30, 59),
+ ),
+ (
+ datetime(2006, 10, 25, 14, 30, 59, 200),
+ datetime(2006, 10, 25, 14, 30, 59, 200),
+ ),
+ ("2006 10 25 2:30 PM", datetime(2006, 10, 25, 14, 30)),
+ # ISO-like formats are always accepted.
+ ("2006-10-25 14:30:45", datetime(2006, 10, 25, 14, 30, 45)),
),
- ('2006 10 25 2:30 PM', datetime(2006, 10, 25, 14, 30)),
- # ISO-like formats are always accepted.
- ('2006-10-25 14:30:45', datetime(2006, 10, 25, 14, 30, 45)),
- )),
- ('%Y.%m.%d %H:%M:%S.%f', (
+ ),
+ (
+ "%Y.%m.%d %H:%M:%S.%f",
(
- '2006.10.25 14:30:45.0002',
- datetime(2006, 10, 25, 14, 30, 45, 200),
+ (
+ "2006.10.25 14:30:45.0002",
+ datetime(2006, 10, 25, 14, 30, 45, 200),
+ ),
),
- )),
+ ),
]
for input_format, values in tests:
f = DateTimeField(input_formats=[input_format])
@@ -113,11 +118,11 @@ class DateTimeFieldTest(SimpleTestCase):
def test_datetimefield_not_required(self):
f = DateTimeField(required=False)
self.assertIsNone(f.clean(None))
- self.assertEqual('None', repr(f.clean(None)))
- self.assertIsNone(f.clean(''))
- self.assertEqual('None', repr(f.clean('')))
+ self.assertEqual("None", repr(f.clean(None)))
+ self.assertIsNone(f.clean(""))
+ self.assertEqual("None", repr(f.clean("")))
def test_datetimefield_changed(self):
- f = DateTimeField(input_formats=['%Y %m %d %I:%M %p'])
+ f = DateTimeField(input_formats=["%Y %m %d %I:%M %p"])
d = datetime(2006, 9, 17, 14, 30, 0)
- self.assertFalse(f.has_changed(d, '2006 09 17 2:30 PM'))
+ self.assertFalse(f.has_changed(d, "2006 09 17 2:30 PM"))
diff --git a/tests/forms_tests/field_tests/test_decimalfield.py b/tests/forms_tests/field_tests/test_decimalfield.py
index 1dd0984ac7..6e49a41341 100644
--- a/tests/forms_tests/field_tests/test_decimalfield.py
+++ b/tests/forms_tests/field_tests/test_decimalfield.py
@@ -10,40 +10,51 @@ from . import FormFieldAssertionsMixin
class DecimalFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_decimalfield_1(self):
f = DecimalField(max_digits=4, decimal_places=2)
- self.assertWidgetRendersTo(f, '<input id="id_f" step="0.01" type="number" name="f" required>')
+ self.assertWidgetRendersTo(
+ f, '<input id="id_f" step="0.01" type="number" name="f" required>'
+ )
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- self.assertEqual(f.clean('1'), decimal.Decimal("1"))
- self.assertIsInstance(f.clean('1'), decimal.Decimal)
- self.assertEqual(f.clean('23'), decimal.Decimal("23"))
- self.assertEqual(f.clean('3.14'), decimal.Decimal("3.14"))
+ self.assertEqual(f.clean("1"), decimal.Decimal("1"))
+ self.assertIsInstance(f.clean("1"), decimal.Decimal)
+ self.assertEqual(f.clean("23"), decimal.Decimal("23"))
+ self.assertEqual(f.clean("3.14"), decimal.Decimal("3.14"))
self.assertEqual(f.clean(3.14), decimal.Decimal("3.14"))
- self.assertEqual(f.clean(decimal.Decimal('3.14')), decimal.Decimal("3.14"))
- self.assertEqual(f.clean('1.0 '), decimal.Decimal("1.0"))
- self.assertEqual(f.clean(' 1.0'), decimal.Decimal("1.0"))
- self.assertEqual(f.clean(' 1.0 '), decimal.Decimal("1.0"))
- with self.assertRaisesMessage(ValidationError, "'Ensure that there are no more than 4 digits in total.'"):
- f.clean('123.45')
- with self.assertRaisesMessage(ValidationError, "'Ensure that there are no more than 2 decimal places.'"):
- f.clean('1.234')
+ self.assertEqual(f.clean(decimal.Decimal("3.14")), decimal.Decimal("3.14"))
+ self.assertEqual(f.clean("1.0 "), decimal.Decimal("1.0"))
+ self.assertEqual(f.clean(" 1.0"), decimal.Decimal("1.0"))
+ self.assertEqual(f.clean(" 1.0 "), decimal.Decimal("1.0"))
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure that there are no more than 4 digits in total.'"
+ ):
+ f.clean("123.45")
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure that there are no more than 2 decimal places.'"
+ ):
+ f.clean("1.234")
msg = "'Ensure that there are no more than 2 digits before the decimal point.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('123.4')
- self.assertEqual(f.clean('-12.34'), decimal.Decimal("-12.34"))
- with self.assertRaisesMessage(ValidationError, "'Ensure that there are no more than 4 digits in total.'"):
- f.clean('-123.45')
- self.assertEqual(f.clean('-.12'), decimal.Decimal("-0.12"))
- self.assertEqual(f.clean('-00.12'), decimal.Decimal("-0.12"))
- self.assertEqual(f.clean('-000.12'), decimal.Decimal("-0.12"))
- with self.assertRaisesMessage(ValidationError, "'Ensure that there are no more than 2 decimal places.'"):
- f.clean('-000.123')
- with self.assertRaisesMessage(ValidationError, "'Ensure that there are no more than 4 digits in total.'"):
- f.clean('-000.12345')
+ f.clean("123.4")
+ self.assertEqual(f.clean("-12.34"), decimal.Decimal("-12.34"))
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure that there are no more than 4 digits in total.'"
+ ):
+ f.clean("-123.45")
+ self.assertEqual(f.clean("-.12"), decimal.Decimal("-0.12"))
+ self.assertEqual(f.clean("-00.12"), decimal.Decimal("-0.12"))
+ self.assertEqual(f.clean("-000.12"), decimal.Decimal("-0.12"))
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure that there are no more than 2 decimal places.'"
+ ):
+ f.clean("-000.123")
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure that there are no more than 4 digits in total.'"
+ ):
+ f.clean("-000.12345")
self.assertEqual(f.max_digits, 4)
self.assertEqual(f.decimal_places, 2)
self.assertIsNone(f.max_value)
@@ -52,21 +63,34 @@ class DecimalFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
def test_enter_a_number_error(self):
f = DecimalField(max_value=1, max_digits=4, decimal_places=2)
values = (
- '-NaN', 'NaN', '+NaN',
- '-sNaN', 'sNaN', '+sNaN',
- '-Inf', 'Inf', '+Inf',
- '-Infinity', 'Infinity', '+Infinity',
- 'a', 'łąść', '1.0a', '--0.12',
+ "-NaN",
+ "NaN",
+ "+NaN",
+ "-sNaN",
+ "sNaN",
+ "+sNaN",
+ "-Inf",
+ "Inf",
+ "+Inf",
+ "-Infinity",
+ "Infinity",
+ "+Infinity",
+ "a",
+ "łąść",
+ "1.0a",
+ "--0.12",
)
for value in values:
- with self.subTest(value=value), self.assertRaisesMessage(ValidationError, "'Enter a number.'"):
+ with self.subTest(value=value), self.assertRaisesMessage(
+ ValidationError, "'Enter a number.'"
+ ):
f.clean(value)
def test_decimalfield_2(self):
f = DecimalField(max_digits=4, decimal_places=2, required=False)
- self.assertIsNone(f.clean(''))
+ self.assertIsNone(f.clean(""))
self.assertIsNone(f.clean(None))
- self.assertEqual(f.clean('1'), decimal.Decimal("1"))
+ self.assertEqual(f.clean("1"), decimal.Decimal("1"))
self.assertEqual(f.max_digits, 4)
self.assertEqual(f.decimal_places, 2)
self.assertIsNone(f.max_value)
@@ -74,71 +98,82 @@ class DecimalFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
def test_decimalfield_3(self):
f = DecimalField(
- max_digits=4, decimal_places=2,
- max_value=decimal.Decimal('1.5'),
- min_value=decimal.Decimal('0.5')
+ max_digits=4,
+ decimal_places=2,
+ max_value=decimal.Decimal("1.5"),
+ min_value=decimal.Decimal("0.5"),
)
self.assertWidgetRendersTo(
f,
'<input step="0.01" name="f" min="0.5" max="1.5" type="number" id="id_f" required>',
)
- with self.assertRaisesMessage(ValidationError, "'Ensure this value is less than or equal to 1.5.'"):
- f.clean('1.6')
- with self.assertRaisesMessage(ValidationError, "'Ensure this value is greater than or equal to 0.5.'"):
- f.clean('0.4')
- self.assertEqual(f.clean('1.5'), decimal.Decimal("1.5"))
- self.assertEqual(f.clean('0.5'), decimal.Decimal("0.5"))
- self.assertEqual(f.clean('.5'), decimal.Decimal("0.5"))
- self.assertEqual(f.clean('00.50'), decimal.Decimal("0.50"))
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value is less than or equal to 1.5.'"
+ ):
+ f.clean("1.6")
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value is greater than or equal to 0.5.'"
+ ):
+ f.clean("0.4")
+ self.assertEqual(f.clean("1.5"), decimal.Decimal("1.5"))
+ self.assertEqual(f.clean("0.5"), decimal.Decimal("0.5"))
+ self.assertEqual(f.clean(".5"), decimal.Decimal("0.5"))
+ self.assertEqual(f.clean("00.50"), decimal.Decimal("0.50"))
self.assertEqual(f.max_digits, 4)
self.assertEqual(f.decimal_places, 2)
- self.assertEqual(f.max_value, decimal.Decimal('1.5'))
- self.assertEqual(f.min_value, decimal.Decimal('0.5'))
+ self.assertEqual(f.max_value, decimal.Decimal("1.5"))
+ self.assertEqual(f.min_value, decimal.Decimal("0.5"))
def test_decimalfield_4(self):
f = DecimalField(decimal_places=2)
- with self.assertRaisesMessage(ValidationError, "'Ensure that there are no more than 2 decimal places.'"):
- f.clean('0.00000001')
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure that there are no more than 2 decimal places.'"
+ ):
+ f.clean("0.00000001")
def test_decimalfield_5(self):
f = DecimalField(max_digits=3)
# Leading whole zeros "collapse" to one digit.
- self.assertEqual(f.clean('0000000.10'), decimal.Decimal("0.1"))
+ self.assertEqual(f.clean("0000000.10"), decimal.Decimal("0.1"))
# But a leading 0 before the . doesn't count toward max_digits
- self.assertEqual(f.clean('0000000.100'), decimal.Decimal("0.100"))
+ self.assertEqual(f.clean("0000000.100"), decimal.Decimal("0.100"))
# Only leading whole zeros "collapse" to one digit.
- self.assertEqual(f.clean('000000.02'), decimal.Decimal('0.02'))
- with self.assertRaisesMessage(ValidationError, "'Ensure that there are no more than 3 digits in total.'"):
- f.clean('000000.0002')
- self.assertEqual(f.clean('.002'), decimal.Decimal("0.002"))
+ self.assertEqual(f.clean("000000.02"), decimal.Decimal("0.02"))
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure that there are no more than 3 digits in total.'"
+ ):
+ f.clean("000000.0002")
+ self.assertEqual(f.clean(".002"), decimal.Decimal("0.002"))
def test_decimalfield_6(self):
f = DecimalField(max_digits=2, decimal_places=2)
- self.assertEqual(f.clean('.01'), decimal.Decimal(".01"))
+ self.assertEqual(f.clean(".01"), decimal.Decimal(".01"))
msg = "'Ensure that there are no more than 0 digits before the decimal point.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('1.1')
+ f.clean("1.1")
def test_decimalfield_scientific(self):
f = DecimalField(max_digits=4, decimal_places=2)
with self.assertRaisesMessage(ValidationError, "Ensure that there are no more"):
- f.clean('1E+2')
- self.assertEqual(f.clean('1E+1'), decimal.Decimal('10'))
- self.assertEqual(f.clean('1E-1'), decimal.Decimal('0.1'))
- self.assertEqual(f.clean('0.546e+2'), decimal.Decimal('54.6'))
+ f.clean("1E+2")
+ self.assertEqual(f.clean("1E+1"), decimal.Decimal("10"))
+ self.assertEqual(f.clean("1E-1"), decimal.Decimal("0.1"))
+ self.assertEqual(f.clean("0.546e+2"), decimal.Decimal("54.6"))
def test_decimalfield_widget_attrs(self):
f = DecimalField(max_digits=6, decimal_places=2)
self.assertEqual(f.widget_attrs(Widget()), {})
- self.assertEqual(f.widget_attrs(NumberInput()), {'step': '0.01'})
+ self.assertEqual(f.widget_attrs(NumberInput()), {"step": "0.01"})
f = DecimalField(max_digits=10, decimal_places=0)
- self.assertEqual(f.widget_attrs(NumberInput()), {'step': '1'})
+ self.assertEqual(f.widget_attrs(NumberInput()), {"step": "1"})
f = DecimalField(max_digits=19, decimal_places=19)
- self.assertEqual(f.widget_attrs(NumberInput()), {'step': '1e-19'})
+ self.assertEqual(f.widget_attrs(NumberInput()), {"step": "1e-19"})
f = DecimalField(max_digits=20)
- self.assertEqual(f.widget_attrs(NumberInput()), {'step': 'any'})
- f = DecimalField(max_digits=6, widget=NumberInput(attrs={'step': '0.01'}))
- self.assertWidgetRendersTo(f, '<input step="0.01" name="f" type="number" id="id_f" required>')
+ self.assertEqual(f.widget_attrs(NumberInput()), {"step": "any"})
+ f = DecimalField(max_digits=6, widget=NumberInput(attrs={"step": "0.01"}))
+ self.assertWidgetRendersTo(
+ f, '<input step="0.01" name="f" type="number" id="id_f" required>'
+ )
def test_decimalfield_localized(self):
"""
@@ -151,10 +186,10 @@ class DecimalFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
def test_decimalfield_changed(self):
f = DecimalField(max_digits=2, decimal_places=2)
d = decimal.Decimal("0.1")
- self.assertFalse(f.has_changed(d, '0.10'))
- self.assertTrue(f.has_changed(d, '0.101'))
+ self.assertFalse(f.has_changed(d, "0.10"))
+ self.assertTrue(f.has_changed(d, "0.101"))
- with translation.override('fr'):
+ with translation.override("fr"):
f = DecimalField(max_digits=2, decimal_places=2, localize=True)
localized_d = formats.localize_input(d) # -> '0,1' in French
self.assertFalse(f.has_changed(d, localized_d))
@@ -164,22 +199,26 @@ class DecimalFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
# format-related settings will take precedence over locale-dictated
# formats.
@ignore_warnings(category=RemovedInDjango50Warning)
- @override_settings(USE_L10N=False, DECIMAL_SEPARATOR=',')
+ @override_settings(USE_L10N=False, DECIMAL_SEPARATOR=",")
def test_decimalfield_support_decimal_separator(self):
f = DecimalField(localize=True)
- self.assertEqual(f.clean('1001,10'), decimal.Decimal("1001.10"))
- self.assertEqual(f.clean('1001.10'), decimal.Decimal("1001.10"))
+ self.assertEqual(f.clean("1001,10"), decimal.Decimal("1001.10"))
+ self.assertEqual(f.clean("1001.10"), decimal.Decimal("1001.10"))
# RemovedInDjango50Warning: When the deprecation ends, remove
# @ignore_warnings and USE_L10N=False. The test should remain because
# format-related settings will take precedence over locale-dictated
# formats.
@ignore_warnings(category=RemovedInDjango50Warning)
- @override_settings(USE_L10N=False, DECIMAL_SEPARATOR=',', USE_THOUSAND_SEPARATOR=True,
- THOUSAND_SEPARATOR='.')
+ @override_settings(
+ USE_L10N=False,
+ DECIMAL_SEPARATOR=",",
+ USE_THOUSAND_SEPARATOR=True,
+ THOUSAND_SEPARATOR=".",
+ )
def test_decimalfield_support_thousands_separator(self):
f = DecimalField(localize=True)
- self.assertEqual(f.clean('1.001,10'), decimal.Decimal("1001.10"))
+ self.assertEqual(f.clean("1.001,10"), decimal.Decimal("1001.10"))
msg = "'Enter a number.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('1,001.1')
+ f.clean("1,001.1")
diff --git a/tests/forms_tests/field_tests/test_durationfield.py b/tests/forms_tests/field_tests/test_durationfield.py
index dae139446d..834638354c 100644
--- a/tests/forms_tests/field_tests/test_durationfield.py
+++ b/tests/forms_tests/field_tests/test_durationfield.py
@@ -10,32 +10,35 @@ from . import FormFieldAssertionsMixin
class DurationFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_durationfield_clean(self):
f = DurationField()
- self.assertEqual(datetime.timedelta(seconds=30), f.clean('30'))
- self.assertEqual(datetime.timedelta(minutes=15, seconds=30), f.clean('15:30'))
- self.assertEqual(datetime.timedelta(hours=1, minutes=15, seconds=30), f.clean('1:15:30'))
+ self.assertEqual(datetime.timedelta(seconds=30), f.clean("30"))
+ self.assertEqual(datetime.timedelta(minutes=15, seconds=30), f.clean("15:30"))
+ self.assertEqual(
+ datetime.timedelta(hours=1, minutes=15, seconds=30), f.clean("1:15:30")
+ )
self.assertEqual(
- datetime.timedelta(days=1, hours=1, minutes=15, seconds=30, milliseconds=300),
- f.clean('1 1:15:30.3')
+ datetime.timedelta(
+ days=1, hours=1, minutes=15, seconds=30, milliseconds=300
+ ),
+ f.clean("1 1:15:30.3"),
)
self.assertEqual(
datetime.timedelta(0, 10800),
f.clean(datetime.timedelta(0, 10800)),
)
- msg = 'This field is required.'
+ msg = "This field is required."
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('')
- msg = 'Enter a valid duration.'
+ f.clean("")
+ msg = "Enter a valid duration."
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('not_a_time')
+ f.clean("not_a_time")
with self.assertRaisesMessage(ValidationError, msg):
- DurationField().clean('P3(3D')
+ DurationField().clean("P3(3D")
def test_durationfield_clean_not_required(self):
f = DurationField(required=False)
- self.assertIsNone(f.clean(''))
+ self.assertIsNone(f.clean(""))
def test_overflow(self):
msg = "The number of days must be between {min_days} and {max_days}.".format(
@@ -44,18 +47,18 @@ class DurationFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
)
f = DurationField()
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('1000000000 00:00:00')
+ f.clean("1000000000 00:00:00")
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('-1000000000 00:00:00')
+ f.clean("-1000000000 00:00:00")
def test_overflow_translation(self):
msg = "Le nombre de jours doit être entre {min_days} et {max_days}.".format(
min_days=datetime.timedelta.min.days,
max_days=datetime.timedelta.max.days,
)
- with translation.override('fr'):
+ with translation.override("fr"):
with self.assertRaisesMessage(ValidationError, msg):
- DurationField().clean('1000000000 00:00:00')
+ DurationField().clean("1000000000 00:00:00")
def test_durationfield_render(self):
self.assertWidgetRendersTo(
@@ -71,5 +74,5 @@ class DurationFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
field = DurationField()
td = datetime.timedelta(minutes=15, seconds=30)
self.assertEqual(field.prepare_value(td), duration_string(td))
- self.assertEqual(field.prepare_value('arbitrary'), 'arbitrary')
+ self.assertEqual(field.prepare_value("arbitrary"), "arbitrary")
self.assertIsNone(field.prepare_value(None))
diff --git a/tests/forms_tests/field_tests/test_emailfield.py b/tests/forms_tests/field_tests/test_emailfield.py
index 8b85e4dcc1..d1d52dd608 100644
--- a/tests/forms_tests/field_tests/test_emailfield.py
+++ b/tests/forms_tests/field_tests/test_emailfield.py
@@ -6,37 +6,44 @@ from . import FormFieldAssertionsMixin
class EmailFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_emailfield_1(self):
f = EmailField()
- self.assertWidgetRendersTo(f, '<input type="email" name="f" id="id_f" required>')
+ self.assertWidgetRendersTo(
+ f, '<input type="email" name="f" id="id_f" required>'
+ )
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- self.assertEqual('person@example.com', f.clean('person@example.com'))
- with self.assertRaisesMessage(ValidationError, "'Enter a valid email address.'"):
- f.clean('foo')
+ self.assertEqual("person@example.com", f.clean("person@example.com"))
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid email address.'"
+ ):
+ f.clean("foo")
self.assertEqual(
- 'local@domain.with.idn.xyz\xe4\xf6\xfc\xdfabc.part.com',
- f.clean('local@domain.with.idn.xyzäöüßabc.part.com')
+ "local@domain.with.idn.xyz\xe4\xf6\xfc\xdfabc.part.com",
+ f.clean("local@domain.with.idn.xyzäöüßabc.part.com"),
)
def test_email_regexp_for_performance(self):
f = EmailField()
# Check for runaway regex security problem. This will take a long time
# if the security fix isn't in place.
- addr = 'viewx3dtextx26qx3d@yahoo.comx26latlngx3d15854521645943074058'
+ addr = "viewx3dtextx26qx3d@yahoo.comx26latlngx3d15854521645943074058"
self.assertEqual(addr, f.clean(addr))
def test_emailfield_not_required(self):
f = EmailField(required=False)
- self.assertEqual('', f.clean(''))
- self.assertEqual('', f.clean(None))
- self.assertEqual('person@example.com', f.clean('person@example.com'))
- self.assertEqual('example@example.com', f.clean(' example@example.com \t \t '))
- with self.assertRaisesMessage(ValidationError, "'Enter a valid email address.'"):
- f.clean('foo')
+ self.assertEqual("", f.clean(""))
+ self.assertEqual("", f.clean(None))
+ self.assertEqual("person@example.com", f.clean("person@example.com"))
+ self.assertEqual(
+ "example@example.com", f.clean(" example@example.com \t \t ")
+ )
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid email address.'"
+ ):
+ f.clean("foo")
def test_emailfield_min_max_length(self):
f = EmailField(min_length=10, max_length=15)
@@ -44,15 +51,21 @@ class EmailFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
f,
'<input id="id_f" type="email" name="f" maxlength="15" minlength="10" required>',
)
- with self.assertRaisesMessage(ValidationError, "'Ensure this value has at least 10 characters (it has 9).'"):
- f.clean('a@foo.com')
- self.assertEqual('alf@foo.com', f.clean('alf@foo.com'))
- with self.assertRaisesMessage(ValidationError, "'Ensure this value has at most 15 characters (it has 20).'"):
- f.clean('alf123456788@foo.com')
+ with self.assertRaisesMessage(
+ ValidationError,
+ "'Ensure this value has at least 10 characters (it has 9).'",
+ ):
+ f.clean("a@foo.com")
+ self.assertEqual("alf@foo.com", f.clean("alf@foo.com"))
+ with self.assertRaisesMessage(
+ ValidationError,
+ "'Ensure this value has at most 15 characters (it has 20).'",
+ ):
+ f.clean("alf123456788@foo.com")
def test_emailfield_strip_on_none_value(self):
f = EmailField(required=False, empty_value=None)
- self.assertIsNone(f.clean(''))
+ self.assertIsNone(f.clean(""))
self.assertIsNone(f.clean(None))
def test_emailfield_unable_to_set_strip_kwarg(self):
diff --git a/tests/forms_tests/field_tests/test_filefield.py b/tests/forms_tests/field_tests/test_filefield.py
index 2db106e4a0..56aaa311e0 100644
--- a/tests/forms_tests/field_tests/test_filefield.py
+++ b/tests/forms_tests/field_tests/test_filefield.py
@@ -7,54 +7,74 @@ from django.test import SimpleTestCase
class FileFieldTest(SimpleTestCase):
-
def test_filefield_1(self):
f = FileField()
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('', '')
- self.assertEqual('files/test1.pdf', f.clean('', 'files/test1.pdf'))
+ f.clean("", "")
+ self.assertEqual("files/test1.pdf", f.clean("", "files/test1.pdf"))
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean(None, '')
- self.assertEqual('files/test2.pdf', f.clean(None, 'files/test2.pdf'))
+ f.clean(None, "")
+ self.assertEqual("files/test2.pdf", f.clean(None, "files/test2.pdf"))
no_file_msg = "'No file was submitted. Check the encoding type on the form.'"
- file = SimpleUploadedFile(None, b'')
- file._name = ''
+ file = SimpleUploadedFile(None, b"")
+ file._name = ""
with self.assertRaisesMessage(ValidationError, no_file_msg):
f.clean(file)
with self.assertRaisesMessage(ValidationError, no_file_msg):
- f.clean(file, '')
- self.assertEqual('files/test3.pdf', f.clean(None, 'files/test3.pdf'))
+ f.clean(file, "")
+ self.assertEqual("files/test3.pdf", f.clean(None, "files/test3.pdf"))
with self.assertRaisesMessage(ValidationError, no_file_msg):
- f.clean('some content that is not a file')
- with self.assertRaisesMessage(ValidationError, "'The submitted file is empty.'"):
- f.clean(SimpleUploadedFile('name', None))
- with self.assertRaisesMessage(ValidationError, "'The submitted file is empty.'"):
- f.clean(SimpleUploadedFile('name', b''))
- self.assertEqual(SimpleUploadedFile, type(f.clean(SimpleUploadedFile('name', b'Some File Content'))))
+ f.clean("some content that is not a file")
+ with self.assertRaisesMessage(
+ ValidationError, "'The submitted file is empty.'"
+ ):
+ f.clean(SimpleUploadedFile("name", None))
+ with self.assertRaisesMessage(
+ ValidationError, "'The submitted file is empty.'"
+ ):
+ f.clean(SimpleUploadedFile("name", b""))
+ self.assertEqual(
+ SimpleUploadedFile,
+ type(f.clean(SimpleUploadedFile("name", b"Some File Content"))),
+ )
self.assertIsInstance(
- f.clean(SimpleUploadedFile('我隻氣墊船裝滿晒鱔.txt', 'मेरी मँडराने वाली नाव सर्पमीनों से भरी ह'.encode())),
- SimpleUploadedFile
+ f.clean(
+ SimpleUploadedFile(
+ "我隻氣墊船裝滿晒鱔.txt", "मेरी मँडराने वाली नाव सर्पमीनों से भरी ह".encode()
+ )
+ ),
+ SimpleUploadedFile,
)
self.assertIsInstance(
- f.clean(SimpleUploadedFile('name', b'Some File Content'), 'files/test4.pdf'),
- SimpleUploadedFile
+ f.clean(
+ SimpleUploadedFile("name", b"Some File Content"), "files/test4.pdf"
+ ),
+ SimpleUploadedFile,
)
def test_filefield_2(self):
f = FileField(max_length=5)
- with self.assertRaisesMessage(ValidationError, "'Ensure this filename has at most 5 characters (it has 18).'"):
- f.clean(SimpleUploadedFile('test_maxlength.txt', b'hello world'))
- self.assertEqual('files/test1.pdf', f.clean('', 'files/test1.pdf'))
- self.assertEqual('files/test2.pdf', f.clean(None, 'files/test2.pdf'))
- self.assertIsInstance(f.clean(SimpleUploadedFile('name', b'Some File Content')), SimpleUploadedFile)
+ with self.assertRaisesMessage(
+ ValidationError,
+ "'Ensure this filename has at most 5 characters (it has 18).'",
+ ):
+ f.clean(SimpleUploadedFile("test_maxlength.txt", b"hello world"))
+ self.assertEqual("files/test1.pdf", f.clean("", "files/test1.pdf"))
+ self.assertEqual("files/test2.pdf", f.clean(None, "files/test2.pdf"))
+ self.assertIsInstance(
+ f.clean(SimpleUploadedFile("name", b"Some File Content")),
+ SimpleUploadedFile,
+ )
def test_filefield_3(self):
f = FileField(allow_empty_file=True)
- self.assertIsInstance(f.clean(SimpleUploadedFile('name', b'')), SimpleUploadedFile)
+ self.assertIsInstance(
+ f.clean(SimpleUploadedFile("name", b"")), SimpleUploadedFile
+ )
def test_filefield_changed(self):
"""
@@ -65,21 +85,27 @@ class FileFieldTest(SimpleTestCase):
f = FileField()
# No file was uploaded and no initial data.
- self.assertFalse(f.has_changed('', None))
+ 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'}))
+ 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))
+ 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'}))
+ self.assertTrue(
+ f.has_changed(
+ "resume.txt", {"filename": "resume.txt", "content": "My resume"}
+ )
+ )
def test_disabled_has_changed(self):
f = FileField(disabled=True)
- self.assertIs(f.has_changed('x', 'y'), False)
+ self.assertIs(f.has_changed("x", "y"), False)
def test_file_picklable(self):
self.assertIsInstance(pickle.loads(pickle.dumps(FileField())), FileField)
diff --git a/tests/forms_tests/field_tests/test_filepathfield.py b/tests/forms_tests/field_tests/test_filepathfield.py
index bdd55c32a5..ca0f6f3a7a 100644
--- a/tests/forms_tests/field_tests/test_filepathfield.py
+++ b/tests/forms_tests/field_tests/test_filepathfield.py
@@ -10,8 +10,8 @@ PATH = os.path.dirname(os.path.abspath(__file__))
def fix_os_paths(x):
if isinstance(x, str):
if x.startswith(PATH):
- x = x[len(PATH):]
- return x.replace('\\', '/')
+ x = x[len(PATH) :]
+ return x.replace("\\", "/")
elif isinstance(x, tuple):
return tuple(fix_os_paths(list(x)))
elif isinstance(x, list):
@@ -22,34 +22,34 @@ def fix_os_paths(x):
class FilePathFieldTest(SimpleTestCase):
expected_choices = [
- ('/filepathfield_test_dir/__init__.py', '__init__.py'),
- ('/filepathfield_test_dir/a.py', 'a.py'),
- ('/filepathfield_test_dir/ab.py', 'ab.py'),
- ('/filepathfield_test_dir/b.py', 'b.py'),
- ('/filepathfield_test_dir/c/__init__.py', '__init__.py'),
- ('/filepathfield_test_dir/c/d.py', 'd.py'),
- ('/filepathfield_test_dir/c/e.py', 'e.py'),
- ('/filepathfield_test_dir/c/f/__init__.py', '__init__.py'),
- ('/filepathfield_test_dir/c/f/g.py', 'g.py'),
- ('/filepathfield_test_dir/h/__init__.py', '__init__.py'),
- ('/filepathfield_test_dir/j/__init__.py', '__init__.py'),
+ ("/filepathfield_test_dir/__init__.py", "__init__.py"),
+ ("/filepathfield_test_dir/a.py", "a.py"),
+ ("/filepathfield_test_dir/ab.py", "ab.py"),
+ ("/filepathfield_test_dir/b.py", "b.py"),
+ ("/filepathfield_test_dir/c/__init__.py", "__init__.py"),
+ ("/filepathfield_test_dir/c/d.py", "d.py"),
+ ("/filepathfield_test_dir/c/e.py", "e.py"),
+ ("/filepathfield_test_dir/c/f/__init__.py", "__init__.py"),
+ ("/filepathfield_test_dir/c/f/g.py", "g.py"),
+ ("/filepathfield_test_dir/h/__init__.py", "__init__.py"),
+ ("/filepathfield_test_dir/j/__init__.py", "__init__.py"),
]
- path = os.path.join(PATH, 'filepathfield_test_dir') + '/'
+ path = os.path.join(PATH, "filepathfield_test_dir") + "/"
def assertChoices(self, field, expected_choices):
self.assertEqual(fix_os_paths(field.choices), expected_choices)
def test_fix_os_paths(self):
- self.assertEqual(fix_os_paths(self.path), ('/filepathfield_test_dir/'))
+ self.assertEqual(fix_os_paths(self.path), ("/filepathfield_test_dir/"))
def test_nonexistent_path(self):
- with self.assertRaisesMessage(FileNotFoundError, 'nonexistent'):
- FilePathField(path='nonexistent')
+ with self.assertRaisesMessage(FileNotFoundError, "nonexistent"):
+ FilePathField(path="nonexistent")
def test_no_options(self):
f = FilePathField(path=self.path)
expected = [
- ('/filepathfield_test_dir/README', 'README'),
+ ("/filepathfield_test_dir/README", "README"),
] + self.expected_choices[:4]
self.assertChoices(f, expected)
@@ -57,48 +57,59 @@ class FilePathFieldTest(SimpleTestCase):
f = FilePathField(path=self.path)
msg = "'Select a valid choice. a.py is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('a.py')
- self.assertEqual(fix_os_paths(f.clean(self.path + 'a.py')), '/filepathfield_test_dir/a.py')
+ f.clean("a.py")
+ self.assertEqual(
+ fix_os_paths(f.clean(self.path + "a.py")), "/filepathfield_test_dir/a.py"
+ )
def test_match(self):
- f = FilePathField(path=self.path, match=r'^.*?\.py$')
+ f = FilePathField(path=self.path, match=r"^.*?\.py$")
self.assertChoices(f, self.expected_choices[:4])
def test_recursive(self):
- f = FilePathField(path=self.path, recursive=True, match=r'^.*?\.py$')
+ f = FilePathField(path=self.path, recursive=True, match=r"^.*?\.py$")
expected = [
- ('/filepathfield_test_dir/__init__.py', '__init__.py'),
- ('/filepathfield_test_dir/a.py', 'a.py'),
- ('/filepathfield_test_dir/ab.py', 'ab.py'),
- ('/filepathfield_test_dir/b.py', 'b.py'),
- ('/filepathfield_test_dir/c/__init__.py', 'c/__init__.py'),
- ('/filepathfield_test_dir/c/d.py', 'c/d.py'),
- ('/filepathfield_test_dir/c/e.py', 'c/e.py'),
- ('/filepathfield_test_dir/c/f/__init__.py', 'c/f/__init__.py'),
- ('/filepathfield_test_dir/c/f/g.py', 'c/f/g.py'),
- ('/filepathfield_test_dir/h/__init__.py', 'h/__init__.py'),
- ('/filepathfield_test_dir/j/__init__.py', 'j/__init__.py'),
-
+ ("/filepathfield_test_dir/__init__.py", "__init__.py"),
+ ("/filepathfield_test_dir/a.py", "a.py"),
+ ("/filepathfield_test_dir/ab.py", "ab.py"),
+ ("/filepathfield_test_dir/b.py", "b.py"),
+ ("/filepathfield_test_dir/c/__init__.py", "c/__init__.py"),
+ ("/filepathfield_test_dir/c/d.py", "c/d.py"),
+ ("/filepathfield_test_dir/c/e.py", "c/e.py"),
+ ("/filepathfield_test_dir/c/f/__init__.py", "c/f/__init__.py"),
+ ("/filepathfield_test_dir/c/f/g.py", "c/f/g.py"),
+ ("/filepathfield_test_dir/h/__init__.py", "h/__init__.py"),
+ ("/filepathfield_test_dir/j/__init__.py", "j/__init__.py"),
]
self.assertChoices(f, expected)
def test_allow_folders(self):
f = FilePathField(path=self.path, allow_folders=True, allow_files=False)
- self.assertChoices(f, [
- ('/filepathfield_test_dir/c', 'c'),
- ('/filepathfield_test_dir/h', 'h'),
- ('/filepathfield_test_dir/j', 'j'),
- ])
+ self.assertChoices(
+ f,
+ [
+ ("/filepathfield_test_dir/c", "c"),
+ ("/filepathfield_test_dir/h", "h"),
+ ("/filepathfield_test_dir/j", "j"),
+ ],
+ )
def test_recursive_no_folders_or_files(self):
- f = FilePathField(path=self.path, recursive=True, allow_folders=False, allow_files=False)
+ f = FilePathField(
+ path=self.path, recursive=True, allow_folders=False, allow_files=False
+ )
self.assertChoices(f, [])
def test_recursive_folders_without_files(self):
- f = FilePathField(path=self.path, recursive=True, allow_folders=True, allow_files=False)
- self.assertChoices(f, [
- ('/filepathfield_test_dir/c', 'c'),
- ('/filepathfield_test_dir/h', 'h'),
- ('/filepathfield_test_dir/j', 'j'),
- ('/filepathfield_test_dir/c/f', 'c/f'),
- ])
+ f = FilePathField(
+ path=self.path, recursive=True, allow_folders=True, allow_files=False
+ )
+ self.assertChoices(
+ f,
+ [
+ ("/filepathfield_test_dir/c", "c"),
+ ("/filepathfield_test_dir/h", "h"),
+ ("/filepathfield_test_dir/j", "j"),
+ ("/filepathfield_test_dir/c/f", "c/f"),
+ ],
+ )
diff --git a/tests/forms_tests/field_tests/test_floatfield.py b/tests/forms_tests/field_tests/test_floatfield.py
index 7330c33503..365684c2db 100644
--- a/tests/forms_tests/field_tests/test_floatfield.py
+++ b/tests/forms_tests/field_tests/test_floatfield.py
@@ -11,41 +11,42 @@ from . import FormFieldAssertionsMixin
class FloatFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_floatfield_1(self):
f = FloatField()
- self.assertWidgetRendersTo(f, '<input step="any" type="number" name="f" id="id_f" required>')
+ self.assertWidgetRendersTo(
+ f, '<input step="any" type="number" name="f" id="id_f" required>'
+ )
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- self.assertEqual(1.0, f.clean('1'))
- self.assertIsInstance(f.clean('1'), float)
- self.assertEqual(23.0, f.clean('23'))
- self.assertEqual(3.1400000000000001, f.clean('3.14'))
+ self.assertEqual(1.0, f.clean("1"))
+ self.assertIsInstance(f.clean("1"), float)
+ self.assertEqual(23.0, f.clean("23"))
+ self.assertEqual(3.1400000000000001, f.clean("3.14"))
self.assertEqual(3.1400000000000001, f.clean(3.14))
self.assertEqual(42.0, f.clean(42))
with self.assertRaisesMessage(ValidationError, "'Enter a number.'"):
- f.clean('a')
- self.assertEqual(1.0, f.clean('1.0 '))
- self.assertEqual(1.0, f.clean(' 1.0'))
- self.assertEqual(1.0, f.clean(' 1.0 '))
+ f.clean("a")
+ self.assertEqual(1.0, f.clean("1.0 "))
+ self.assertEqual(1.0, f.clean(" 1.0"))
+ self.assertEqual(1.0, f.clean(" 1.0 "))
with self.assertRaisesMessage(ValidationError, "'Enter a number.'"):
- f.clean('1.0a')
+ f.clean("1.0a")
self.assertIsNone(f.max_value)
self.assertIsNone(f.min_value)
with self.assertRaisesMessage(ValidationError, "'Enter a number.'"):
- f.clean('Infinity')
+ f.clean("Infinity")
with self.assertRaisesMessage(ValidationError, "'Enter a number.'"):
- f.clean('NaN')
+ f.clean("NaN")
with self.assertRaisesMessage(ValidationError, "'Enter a number.'"):
- f.clean('-Inf')
+ f.clean("-Inf")
def test_floatfield_2(self):
f = FloatField(required=False)
- self.assertIsNone(f.clean(''))
+ self.assertIsNone(f.clean(""))
self.assertIsNone(f.clean(None))
- self.assertEqual(1.0, f.clean('1'))
+ self.assertEqual(1.0, f.clean("1"))
self.assertIsNone(f.max_value)
self.assertIsNone(f.min_value)
@@ -55,17 +56,21 @@ class FloatFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
f,
'<input step="any" name="f" min="0.5" max="1.5" type="number" id="id_f" required>',
)
- with self.assertRaisesMessage(ValidationError, "'Ensure this value is less than or equal to 1.5.'"):
- f.clean('1.6')
- with self.assertRaisesMessage(ValidationError, "'Ensure this value is greater than or equal to 0.5.'"):
- f.clean('0.4')
- self.assertEqual(1.5, f.clean('1.5'))
- self.assertEqual(0.5, f.clean('0.5'))
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value is less than or equal to 1.5.'"
+ ):
+ f.clean("1.6")
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value is greater than or equal to 0.5.'"
+ ):
+ f.clean("0.4")
+ self.assertEqual(1.5, f.clean("1.5"))
+ self.assertEqual(0.5, f.clean("0.5"))
self.assertEqual(f.max_value, 1.5)
self.assertEqual(f.min_value, 0.5)
def test_floatfield_widget_attrs(self):
- f = FloatField(widget=NumberInput(attrs={'step': 0.01, 'max': 1.0, 'min': 0.0}))
+ f = FloatField(widget=NumberInput(attrs={"step": 0.01, "max": 1.0, "min": 0.0}))
self.assertWidgetRendersTo(
f,
'<input step="0.01" name="f" min="0.0" max="1.0" type="number" id="id_f" required>',
@@ -82,9 +87,9 @@ class FloatFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
def test_floatfield_changed(self):
f = FloatField()
n = 4.35
- self.assertFalse(f.has_changed(n, '4.3500'))
+ self.assertFalse(f.has_changed(n, "4.3500"))
- with translation.override('fr'):
+ with translation.override("fr"):
f = FloatField(localize=True)
localized_n = formats.localize_input(n) # -> '4,35' in French
self.assertFalse(f.has_changed(n, localized_n))
@@ -94,31 +99,35 @@ class FloatFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
# format-related settings will take precedence over locale-dictated
# formats.
@ignore_warnings(category=RemovedInDjango50Warning)
- @override_settings(USE_L10N=False, DECIMAL_SEPARATOR=',')
+ @override_settings(USE_L10N=False, DECIMAL_SEPARATOR=",")
def test_decimalfield_support_decimal_separator(self):
f = FloatField(localize=True)
- self.assertEqual(f.clean('1001,10'), 1001.10)
- self.assertEqual(f.clean('1001.10'), 1001.10)
+ self.assertEqual(f.clean("1001,10"), 1001.10)
+ self.assertEqual(f.clean("1001.10"), 1001.10)
# RemovedInDjango50Warning: When the deprecation ends, remove
# @ignore_warnings and USE_L10N=False. The test should remain because
# format-related settings will take precedence over locale-dictated
# formats.
@ignore_warnings(category=RemovedInDjango50Warning)
- @override_settings(USE_L10N=False, DECIMAL_SEPARATOR=',', USE_THOUSAND_SEPARATOR=True,
- THOUSAND_SEPARATOR='.')
+ @override_settings(
+ USE_L10N=False,
+ DECIMAL_SEPARATOR=",",
+ USE_THOUSAND_SEPARATOR=True,
+ THOUSAND_SEPARATOR=".",
+ )
def test_decimalfield_support_thousands_separator(self):
f = FloatField(localize=True)
- self.assertEqual(f.clean('1.001,10'), 1001.10)
+ self.assertEqual(f.clean("1.001,10"), 1001.10)
msg = "'Enter a number.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('1,001.1')
+ f.clean("1,001.1")
-@override_settings(ROOT_URLCONF='forms_tests.urls')
+@override_settings(ROOT_URLCONF="forms_tests.urls")
class FloatFieldHTMLTest(SeleniumTestCase):
- available_apps = ['forms_tests']
+ available_apps = ["forms_tests"]
def test_float_field_rendering_passes_client_side_validation(self):
"""
@@ -127,9 +136,9 @@ class FloatFieldHTMLTest(SeleniumTestCase):
"""
from selenium.webdriver.common.by import By
- self.selenium.get(self.live_server_url + reverse('form_view'))
- number_input = self.selenium.find_element(By.ID, 'id_number')
- number_input.send_keys('0.5')
+ self.selenium.get(self.live_server_url + reverse("form_view"))
+ number_input = self.selenium.find_element(By.ID, "id_number")
+ number_input.send_keys("0.5")
is_valid = self.selenium.execute_script(
"return document.getElementById('id_number').checkValidity()"
)
diff --git a/tests/forms_tests/field_tests/test_genericipaddressfield.py b/tests/forms_tests/field_tests/test_genericipaddressfield.py
index 92dbd71a28..80722f5c65 100644
--- a/tests/forms_tests/field_tests/test_genericipaddressfield.py
+++ b/tests/forms_tests/field_tests/test_genericipaddressfield.py
@@ -4,125 +4,186 @@ from django.test import SimpleTestCase
class GenericIPAddressFieldTest(SimpleTestCase):
-
def test_generic_ipaddress_invalid_arguments(self):
with self.assertRaises(ValueError):
- GenericIPAddressField(protocol='hamster')
+ GenericIPAddressField(protocol="hamster")
with self.assertRaises(ValueError):
- GenericIPAddressField(protocol='ipv4', unpack_ipv4=True)
+ GenericIPAddressField(protocol="ipv4", unpack_ipv4=True)
def test_generic_ipaddress_as_generic(self):
# The edge cases of the IPv6 validation code are not deeply tested
# here, they are covered in the tests for django.utils.ipv6
f = GenericIPAddressField()
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- self.assertEqual(f.clean(' 127.0.0.1 '), '127.0.0.1')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
- f.clean('foo')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
- f.clean('127.0.0.')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
- f.clean('1.2.3.4.5')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
- f.clean('256.125.1.5')
- self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a')
- self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('12345:2:3:4')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('1::2:3::4')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('foo::223:6cff:fe8a:2e8a')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('1::2:3:4:5:6:7:8')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('1:2')
+ self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
+ ):
+ f.clean("foo")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
+ ):
+ f.clean("127.0.0.")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
+ ):
+ f.clean("1.2.3.4.5")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
+ ):
+ f.clean("256.125.1.5")
+ self.assertEqual(
+ f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a"
+ )
+ self.assertEqual(
+ f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a"
+ )
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("12345:2:3:4")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("1::2:3::4")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("foo::223:6cff:fe8a:2e8a")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("1::2:3:4:5:6:7:8")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("1:2")
def test_generic_ipaddress_as_ipv4_only(self):
f = GenericIPAddressField(protocol="IPv4")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- self.assertEqual(f.clean(' 127.0.0.1 '), '127.0.0.1')
+ self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
- f.clean('foo')
+ f.clean("foo")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
- f.clean('127.0.0.')
+ f.clean("127.0.0.")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
- f.clean('1.2.3.4.5')
+ f.clean("1.2.3.4.5")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
- f.clean('256.125.1.5')
+ f.clean("256.125.1.5")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
- f.clean('fe80::223:6cff:fe8a:2e8a')
+ f.clean("fe80::223:6cff:fe8a:2e8a")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
- f.clean('2a02::223:6cff:fe8a:2e8a')
+ f.clean("2a02::223:6cff:fe8a:2e8a")
def test_generic_ipaddress_as_ipv6_only(self):
f = GenericIPAddressField(protocol="IPv6")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
- f.clean('127.0.0.1')
+ f.clean("127.0.0.1")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
- f.clean('foo')
+ f.clean("foo")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
- f.clean('127.0.0.')
+ f.clean("127.0.0.")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
- f.clean('1.2.3.4.5')
+ f.clean("1.2.3.4.5")
with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
- f.clean('256.125.1.5')
- self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a')
- self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('12345:2:3:4')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('1::2:3::4')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('foo::223:6cff:fe8a:2e8a')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('1::2:3:4:5:6:7:8')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('1:2')
+ f.clean("256.125.1.5")
+ self.assertEqual(
+ f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a"
+ )
+ self.assertEqual(
+ f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a"
+ )
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("12345:2:3:4")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("1::2:3::4")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("foo::223:6cff:fe8a:2e8a")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("1::2:3:4:5:6:7:8")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("1:2")
def test_generic_ipaddress_as_generic_not_required(self):
f = GenericIPAddressField(required=False)
- self.assertEqual(f.clean(''), '')
- self.assertEqual(f.clean(None), '')
- self.assertEqual(f.clean('127.0.0.1'), '127.0.0.1')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
- f.clean('foo')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
- f.clean('127.0.0.')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
- f.clean('1.2.3.4.5')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
- f.clean('256.125.1.5')
- self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a')
- self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('12345:2:3:4')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('1::2:3::4')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('foo::223:6cff:fe8a:2e8a')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('1::2:3:4:5:6:7:8')
- with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
- f.clean('1:2')
+ self.assertEqual(f.clean(""), "")
+ self.assertEqual(f.clean(None), "")
+ self.assertEqual(f.clean("127.0.0.1"), "127.0.0.1")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
+ ):
+ f.clean("foo")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
+ ):
+ f.clean("127.0.0.")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
+ ):
+ f.clean("1.2.3.4.5")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid IPv4 or IPv6 address.'"
+ ):
+ f.clean("256.125.1.5")
+ self.assertEqual(
+ f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a"
+ )
+ self.assertEqual(
+ f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a"
+ )
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("12345:2:3:4")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("1::2:3::4")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("foo::223:6cff:fe8a:2e8a")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("1::2:3:4:5:6:7:8")
+ with self.assertRaisesMessage(
+ ValidationError, "'This is not a valid IPv6 address.'"
+ ):
+ f.clean("1:2")
def test_generic_ipaddress_normalization(self):
# Test the normalizing code
f = GenericIPAddressField()
- self.assertEqual(f.clean(' ::ffff:0a0a:0a0a '), '::ffff:10.10.10.10')
- self.assertEqual(f.clean(' ::ffff:10.10.10.10 '), '::ffff:10.10.10.10')
- self.assertEqual(f.clean(' 2001:000:a:0000:0:fe:fe:beef '), '2001:0:a::fe:fe:beef')
- self.assertEqual(f.clean(' 2001::a:0000:0:fe:fe:beef '), '2001:0:a::fe:fe:beef')
+ self.assertEqual(f.clean(" ::ffff:0a0a:0a0a "), "::ffff:10.10.10.10")
+ self.assertEqual(f.clean(" ::ffff:10.10.10.10 "), "::ffff:10.10.10.10")
+ self.assertEqual(
+ f.clean(" 2001:000:a:0000:0:fe:fe:beef "), "2001:0:a::fe:fe:beef"
+ )
+ self.assertEqual(
+ f.clean(" 2001::a:0000:0:fe:fe:beef "), "2001:0:a::fe:fe:beef"
+ )
f = GenericIPAddressField(unpack_ipv4=True)
- self.assertEqual(f.clean(' ::ffff:0a0a:0a0a'), '10.10.10.10')
+ self.assertEqual(f.clean(" ::ffff:0a0a:0a0a"), "10.10.10.10")
diff --git a/tests/forms_tests/field_tests/test_imagefield.py b/tests/forms_tests/field_tests/test_imagefield.py
index 1cb34bf058..c138ee5c09 100644
--- a/tests/forms_tests/field_tests/test_imagefield.py
+++ b/tests/forms_tests/field_tests/test_imagefield.py
@@ -2,9 +2,7 @@ import os
import unittest
from django.core.exceptions import ValidationError
-from django.core.files.uploadedfile import (
- SimpleUploadedFile, TemporaryUploadedFile,
-)
+from django.core.files.uploadedfile import SimpleUploadedFile, TemporaryUploadedFile
from django.forms import ClearableFileInput, FileInput, ImageField, Widget
from django.test import SimpleTestCase
@@ -17,26 +15,27 @@ except ImportError:
def get_img_path(path):
- return os.path.join(os.path.abspath(os.path.join(__file__, '..', '..')), 'tests', path)
+ return os.path.join(
+ os.path.abspath(os.path.join(__file__, "..", "..")), "tests", path
+ )
@unittest.skipUnless(Image, "Pillow is required to test ImageField")
class ImageFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_imagefield_annotate_with_image_after_clean(self):
f = ImageField()
- img_path = get_img_path('filepath_test_files/1x1.png')
- with open(img_path, 'rb') as img_file:
+ img_path = get_img_path("filepath_test_files/1x1.png")
+ with open(img_path, "rb") as img_file:
img_data = img_file.read()
- img_file = SimpleUploadedFile('1x1.png', img_data)
- img_file.content_type = 'text/plain'
+ img_file = SimpleUploadedFile("1x1.png", img_data)
+ img_file.content_type = "text/plain"
uploaded_file = f.clean(img_file)
- self.assertEqual('PNG', uploaded_file.image.format)
- self.assertEqual('image/png', uploaded_file.content_type)
+ self.assertEqual("PNG", uploaded_file.image.format)
+ self.assertEqual("image/png", uploaded_file.content_type)
def test_imagefield_annotate_with_bitmap_image_after_clean(self):
"""
@@ -44,42 +43,47 @@ class ImageFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
of the image (#24948).
"""
from PIL.BmpImagePlugin import BmpImageFile
+
try:
Image.register_mime(BmpImageFile.format, None)
f = ImageField()
- img_path = get_img_path('filepath_test_files/1x1.bmp')
- with open(img_path, 'rb') as img_file:
+ img_path = get_img_path("filepath_test_files/1x1.bmp")
+ with open(img_path, "rb") as img_file:
img_data = img_file.read()
- img_file = SimpleUploadedFile('1x1.bmp', img_data)
- img_file.content_type = 'text/plain'
+ img_file = SimpleUploadedFile("1x1.bmp", img_data)
+ img_file.content_type = "text/plain"
uploaded_file = f.clean(img_file)
- self.assertEqual('BMP', uploaded_file.image.format)
+ self.assertEqual("BMP", uploaded_file.image.format)
self.assertIsNone(uploaded_file.content_type)
finally:
- Image.register_mime(BmpImageFile.format, 'image/bmp')
+ Image.register_mime(BmpImageFile.format, "image/bmp")
def test_file_extension_validation(self):
f = ImageField()
- img_path = get_img_path('filepath_test_files/1x1.png')
- with open(img_path, 'rb') as img_file:
+ img_path = get_img_path("filepath_test_files/1x1.png")
+ with open(img_path, "rb") as img_file:
img_data = img_file.read()
- img_file = SimpleUploadedFile('1x1.txt', img_data)
- with self.assertRaisesMessage(ValidationError, 'File extension “txt” is not allowed.'):
+ img_file = SimpleUploadedFile("1x1.txt", img_data)
+ with self.assertRaisesMessage(
+ ValidationError, "File extension “txt” is not allowed."
+ ):
f.clean(img_file)
def test_corrupted_image(self):
f = ImageField()
- img_file = SimpleUploadedFile('not_an_image.jpg', b'not an image')
+ img_file = SimpleUploadedFile("not_an_image.jpg", b"not an image")
msg = (
- 'Upload a valid image. The file you uploaded was either not an '
- 'image or a corrupted image.'
+ "Upload a valid image. The file you uploaded was either not an "
+ "image or a corrupted image."
)
with self.assertRaisesMessage(ValidationError, msg):
f.clean(img_file)
- with TemporaryUploadedFile('not_an_image_tmp.png', 'text/plain', 1, 'utf-8') as tmp_file:
+ with TemporaryUploadedFile(
+ "not_an_image_tmp.png", "text/plain", 1, "utf-8"
+ ) as tmp_file:
with self.assertRaisesMessage(ValidationError, msg):
f.clean(tmp_file)
@@ -87,16 +91,22 @@ class ImageFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
f = ImageField()
# Nothing added for non-FileInput widgets.
self.assertEqual(f.widget_attrs(Widget()), {})
- self.assertEqual(f.widget_attrs(FileInput()), {'accept': 'image/*'})
- self.assertEqual(f.widget_attrs(ClearableFileInput()), {'accept': 'image/*'})
- self.assertWidgetRendersTo(f, '<input type="file" name="f" accept="image/*" required id="id_f" />')
+ self.assertEqual(f.widget_attrs(FileInput()), {"accept": "image/*"})
+ self.assertEqual(f.widget_attrs(ClearableFileInput()), {"accept": "image/*"})
+ self.assertWidgetRendersTo(
+ f, '<input type="file" name="f" accept="image/*" required id="id_f" />'
+ )
def test_widget_attrs_accept_specified(self):
- f = ImageField(widget=FileInput(attrs={'accept': 'image/png'}))
+ f = ImageField(widget=FileInput(attrs={"accept": "image/png"}))
self.assertEqual(f.widget_attrs(f.widget), {})
- self.assertWidgetRendersTo(f, '<input type="file" name="f" accept="image/png" required id="id_f" />')
+ self.assertWidgetRendersTo(
+ f, '<input type="file" name="f" accept="image/png" required id="id_f" />'
+ )
def test_widget_attrs_accept_false(self):
- f = ImageField(widget=FileInput(attrs={'accept': False}))
+ f = ImageField(widget=FileInput(attrs={"accept": False}))
self.assertEqual(f.widget_attrs(f.widget), {})
- self.assertWidgetRendersTo(f, '<input type="file" name="f" required id="id_f" />')
+ self.assertWidgetRendersTo(
+ f, '<input type="file" name="f" required id="id_f" />'
+ )
diff --git a/tests/forms_tests/field_tests/test_integerfield.py b/tests/forms_tests/field_tests/test_integerfield.py
index 0dde7ff488..15314d53a4 100644
--- a/tests/forms_tests/field_tests/test_integerfield.py
+++ b/tests/forms_tests/field_tests/test_integerfield.py
@@ -6,91 +6,108 @@ from . import FormFieldAssertionsMixin
class IntegerFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_integerfield_1(self):
f = IntegerField()
- self.assertWidgetRendersTo(f, '<input type="number" name="f" id="id_f" required>')
+ self.assertWidgetRendersTo(
+ f, '<input type="number" name="f" id="id_f" required>'
+ )
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- self.assertEqual(1, f.clean('1'))
- self.assertIsInstance(f.clean('1'), int)
- self.assertEqual(23, f.clean('23'))
+ self.assertEqual(1, f.clean("1"))
+ self.assertIsInstance(f.clean("1"), int)
+ self.assertEqual(23, f.clean("23"))
with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
- f.clean('a')
+ f.clean("a")
self.assertEqual(42, f.clean(42))
with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
f.clean(3.14)
- self.assertEqual(1, f.clean('1 '))
- self.assertEqual(1, f.clean(' 1'))
- self.assertEqual(1, f.clean(' 1 '))
+ self.assertEqual(1, f.clean("1 "))
+ self.assertEqual(1, f.clean(" 1"))
+ self.assertEqual(1, f.clean(" 1 "))
with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
- f.clean('1a')
+ f.clean("1a")
self.assertIsNone(f.max_value)
self.assertIsNone(f.min_value)
def test_integerfield_2(self):
f = IntegerField(required=False)
- self.assertIsNone(f.clean(''))
- self.assertEqual('None', repr(f.clean('')))
+ self.assertIsNone(f.clean(""))
+ self.assertEqual("None", repr(f.clean("")))
self.assertIsNone(f.clean(None))
- self.assertEqual('None', repr(f.clean(None)))
- self.assertEqual(1, f.clean('1'))
- self.assertIsInstance(f.clean('1'), int)
- self.assertEqual(23, f.clean('23'))
+ self.assertEqual("None", repr(f.clean(None)))
+ self.assertEqual(1, f.clean("1"))
+ self.assertIsInstance(f.clean("1"), int)
+ self.assertEqual(23, f.clean("23"))
with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
- f.clean('a')
- self.assertEqual(1, f.clean('1 '))
- self.assertEqual(1, f.clean(' 1'))
- self.assertEqual(1, f.clean(' 1 '))
+ f.clean("a")
+ self.assertEqual(1, f.clean("1 "))
+ self.assertEqual(1, f.clean(" 1"))
+ self.assertEqual(1, f.clean(" 1 "))
with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
- f.clean('1a')
+ f.clean("1a")
self.assertIsNone(f.max_value)
self.assertIsNone(f.min_value)
def test_integerfield_3(self):
f = IntegerField(max_value=10)
- self.assertWidgetRendersTo(f, '<input max="10" type="number" name="f" id="id_f" required>')
+ self.assertWidgetRendersTo(
+ f, '<input max="10" type="number" name="f" id="id_f" required>'
+ )
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
self.assertEqual(1, f.clean(1))
self.assertEqual(10, f.clean(10))
- with self.assertRaisesMessage(ValidationError, "'Ensure this value is less than or equal to 10.'"):
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value is less than or equal to 10.'"
+ ):
f.clean(11)
- self.assertEqual(10, f.clean('10'))
- with self.assertRaisesMessage(ValidationError, "'Ensure this value is less than or equal to 10.'"):
- f.clean('11')
+ self.assertEqual(10, f.clean("10"))
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value is less than or equal to 10.'"
+ ):
+ f.clean("11")
self.assertEqual(f.max_value, 10)
self.assertIsNone(f.min_value)
def test_integerfield_4(self):
f = IntegerField(min_value=10)
- self.assertWidgetRendersTo(f, '<input id="id_f" type="number" name="f" min="10" required>')
+ self.assertWidgetRendersTo(
+ f, '<input id="id_f" type="number" name="f" min="10" required>'
+ )
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- with self.assertRaisesMessage(ValidationError, "'Ensure this value is greater than or equal to 10.'"):
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value is greater than or equal to 10.'"
+ ):
f.clean(1)
self.assertEqual(10, f.clean(10))
self.assertEqual(11, f.clean(11))
- self.assertEqual(10, f.clean('10'))
- self.assertEqual(11, f.clean('11'))
+ self.assertEqual(10, f.clean("10"))
+ self.assertEqual(11, f.clean("11"))
self.assertIsNone(f.max_value)
self.assertEqual(f.min_value, 10)
def test_integerfield_5(self):
f = IntegerField(min_value=10, max_value=20)
- self.assertWidgetRendersTo(f, '<input id="id_f" max="20" type="number" name="f" min="10" required>')
+ self.assertWidgetRendersTo(
+ f, '<input id="id_f" max="20" type="number" name="f" min="10" required>'
+ )
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- with self.assertRaisesMessage(ValidationError, "'Ensure this value is greater than or equal to 10.'"):
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value is greater than or equal to 10.'"
+ ):
f.clean(1)
self.assertEqual(10, f.clean(10))
self.assertEqual(11, f.clean(11))
- self.assertEqual(10, f.clean('10'))
- self.assertEqual(11, f.clean('11'))
+ self.assertEqual(10, f.clean("10"))
+ self.assertEqual(11, f.clean("11"))
self.assertEqual(20, f.clean(20))
- with self.assertRaisesMessage(ValidationError, "'Ensure this value is less than or equal to 20.'"):
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value is less than or equal to 20.'"
+ ):
f.clean(21)
self.assertEqual(f.max_value, 20)
self.assertEqual(f.min_value, 10)
@@ -101,34 +118,37 @@ class IntegerFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
number input specific attributes.
"""
f1 = IntegerField(localize=True)
- self.assertWidgetRendersTo(f1, '<input id="id_f" name="f" type="text" required>')
+ self.assertWidgetRendersTo(
+ f1, '<input id="id_f" name="f" type="text" required>'
+ )
def test_integerfield_float(self):
f = IntegerField()
self.assertEqual(1, f.clean(1.0))
- self.assertEqual(1, f.clean('1.0'))
- self.assertEqual(1, f.clean(' 1.0 '))
- self.assertEqual(1, f.clean('1.'))
- self.assertEqual(1, f.clean(' 1. '))
+ self.assertEqual(1, f.clean("1.0"))
+ self.assertEqual(1, f.clean(" 1.0 "))
+ self.assertEqual(1, f.clean("1."))
+ self.assertEqual(1, f.clean(" 1. "))
with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
- f.clean('1.5')
+ f.clean("1.5")
with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
- f.clean('…')
+ f.clean("…")
def test_integerfield_big_num(self):
f = IntegerField()
self.assertEqual(9223372036854775808, f.clean(9223372036854775808))
- self.assertEqual(9223372036854775808, f.clean('9223372036854775808'))
- self.assertEqual(9223372036854775808, f.clean('9223372036854775808.0'))
+ self.assertEqual(9223372036854775808, f.clean("9223372036854775808"))
+ self.assertEqual(9223372036854775808, f.clean("9223372036854775808.0"))
def test_integerfield_unicode_number(self):
f = IntegerField()
- self.assertEqual(50, f.clean('50'))
+ self.assertEqual(50, f.clean("50"))
def test_integerfield_subclass(self):
"""
Class-defined widget is not overwritten by __init__() (#22245).
"""
+
class MyIntegerField(IntegerField):
widget = Textarea
diff --git a/tests/forms_tests/field_tests/test_jsonfield.py b/tests/forms_tests/field_tests/test_jsonfield.py
index b4f3e74f6a..be2b077e64 100644
--- a/tests/forms_tests/field_tests/test_jsonfield.py
+++ b/tests/forms_tests/field_tests/test_jsonfield.py
@@ -3,7 +3,12 @@ import uuid
from django.core.serializers.json import DjangoJSONEncoder
from django.forms import (
- CharField, Form, JSONField, Textarea, TextInput, ValidationError,
+ CharField,
+ Form,
+ JSONField,
+ Textarea,
+ TextInput,
+ ValidationError,
)
from django.test import SimpleTestCase
@@ -12,25 +17,25 @@ class JSONFieldTest(SimpleTestCase):
def test_valid(self):
field = JSONField()
value = field.clean('{"a": "b"}')
- self.assertEqual(value, {'a': 'b'})
+ self.assertEqual(value, {"a": "b"})
def test_valid_empty(self):
field = JSONField(required=False)
- self.assertIsNone(field.clean(''))
+ self.assertIsNone(field.clean(""))
self.assertIsNone(field.clean(None))
def test_invalid(self):
field = JSONField()
- with self.assertRaisesMessage(ValidationError, 'Enter a valid JSON.'):
- field.clean('{some badly formed: json}')
+ with self.assertRaisesMessage(ValidationError, "Enter a valid JSON."):
+ field.clean("{some badly formed: json}")
def test_prepare_value(self):
field = JSONField()
- self.assertEqual(field.prepare_value({'a': 'b'}), '{"a": "b"}')
- self.assertEqual(field.prepare_value(None), 'null')
- self.assertEqual(field.prepare_value('foo'), '"foo"')
- self.assertEqual(field.prepare_value('你好,世界'), '"你好,世界"')
- self.assertEqual(field.prepare_value({'a': '😀🐱'}), '{"a": "😀🐱"}')
+ self.assertEqual(field.prepare_value({"a": "b"}), '{"a": "b"}')
+ self.assertEqual(field.prepare_value(None), "null")
+ self.assertEqual(field.prepare_value("foo"), '"foo"')
+ self.assertEqual(field.prepare_value("你好,世界"), '"你好,世界"')
+ self.assertEqual(field.prepare_value({"a": "😀🐱"}), '{"a": "😀🐱"}')
self.assertEqual(
field.prepare_value(["你好,世界", "jaźń"]),
'["你好,世界", "jaźń"]',
@@ -46,6 +51,7 @@ class JSONFieldTest(SimpleTestCase):
def test_custom_widget_attribute(self):
"""The widget can be overridden with an attribute."""
+
class CustomJSONField(JSONField):
widget = TextInput
@@ -57,12 +63,12 @@ class JSONFieldTest(SimpleTestCase):
tests = [
'["a", "b", "c"]',
'{"a": 1, "b": 2}',
- '1',
- '1.5',
+ "1",
+ "1.5",
'"foo"',
- 'true',
- 'false',
- 'null',
+ "true",
+ "false",
+ "null",
]
for json_string in tests:
with self.subTest(json_string=json_string):
@@ -71,8 +77,8 @@ class JSONFieldTest(SimpleTestCase):
def test_has_changed(self):
field = JSONField()
- self.assertIs(field.has_changed({'a': True}, '{"a": 1}'), True)
- self.assertIs(field.has_changed({'a': 1, 'b': 2}, '{"b": 2, "a": 1}'), False)
+ self.assertIs(field.has_changed({"a": True}, '{"a": 1}'), True)
+ self.assertIs(field.has_changed({"a": 1, "b": 2}, '{"b": 2, "a": 1}'), False)
def test_custom_encoder_decoder(self):
class CustomDecoder(json.JSONDecoder):
@@ -80,11 +86,11 @@ class JSONFieldTest(SimpleTestCase):
return super().__init__(object_hook=self.as_uuid, *args, **kwargs)
def as_uuid(self, dct):
- if 'uuid' in dct:
- dct['uuid'] = uuid.UUID(dct['uuid'])
+ if "uuid" in dct:
+ dct["uuid"] = uuid.UUID(dct["uuid"])
return dct
- value = {'uuid': uuid.UUID('{c141e152-6550-4172-a784-05448d98204b}')}
+ value = {"uuid": uuid.UUID("{c141e152-6550-4172-a784-05448d98204b}")}
encoded_value = '{"uuid": "c141e152-6550-4172-a784-05448d98204b"}'
field = JSONField(encoder=DjangoJSONEncoder, decoder=CustomDecoder)
self.assertEqual(field.prepare_value(value), encoded_value)
@@ -94,8 +100,8 @@ class JSONFieldTest(SimpleTestCase):
class JSONForm(Form):
json_field = JSONField(disabled=True)
- form = JSONForm({'json_field': '["bar"]'}, initial={'json_field': ['foo']})
- self.assertIn('[&quot;foo&quot;]</textarea>', form.as_p())
+ form = JSONForm({"json_field": '["bar"]'}, initial={"json_field": ["foo"]})
+ self.assertIn("[&quot;foo&quot;]</textarea>", form.as_p())
def test_redisplay_none_input(self):
class JSONForm(Form):
@@ -103,29 +109,30 @@ class JSONFieldTest(SimpleTestCase):
tests = [
{},
- {'json_field': None},
+ {"json_field": None},
]
for data in tests:
with self.subTest(data=data):
form = JSONForm(data)
- self.assertEqual(form['json_field'].value(), 'null')
- self.assertIn('null</textarea>', form.as_p())
- self.assertEqual(form.errors['json_field'], ['This field is required.'])
+ self.assertEqual(form["json_field"].value(), "null")
+ self.assertIn("null</textarea>", form.as_p())
+ self.assertEqual(form.errors["json_field"], ["This field is required."])
def test_redisplay_wrong_input(self):
"""
Displaying a bound form (typically due to invalid input). The form
should not overquote JSONField inputs.
"""
+
class JSONForm(Form):
name = CharField(max_length=2)
json_field = JSONField()
# JSONField input is valid, name is too long.
- form = JSONForm({'name': 'xyz', 'json_field': '["foo"]'})
- self.assertNotIn('json_field', form.errors)
- self.assertIn('[&quot;foo&quot;]</textarea>', form.as_p())
+ form = JSONForm({"name": "xyz", "json_field": '["foo"]'})
+ self.assertNotIn("json_field", form.errors)
+ self.assertIn("[&quot;foo&quot;]</textarea>", form.as_p())
# Invalid JSONField.
- form = JSONForm({'name': 'xy', 'json_field': '{"foo"}'})
- self.assertEqual(form.errors['json_field'], ['Enter a valid JSON.'])
- self.assertIn('{&quot;foo&quot;}</textarea>', form.as_p())
+ form = JSONForm({"name": "xy", "json_field": '{"foo"}'})
+ self.assertEqual(form.errors["json_field"], ["Enter a valid JSON."])
+ self.assertIn("{&quot;foo&quot;}</textarea>", form.as_p())
diff --git a/tests/forms_tests/field_tests/test_multiplechoicefield.py b/tests/forms_tests/field_tests/test_multiplechoicefield.py
index 6dbeee2685..f316e1de8e 100644
--- a/tests/forms_tests/field_tests/test_multiplechoicefield.py
+++ b/tests/forms_tests/field_tests/test_multiplechoicefield.py
@@ -4,72 +4,75 @@ from django.test import SimpleTestCase
class MultipleChoiceFieldTest(SimpleTestCase):
-
def test_multiplechoicefield_1(self):
- f = MultipleChoiceField(choices=[('1', 'One'), ('2', 'Two')])
+ f = MultipleChoiceField(choices=[("1", "One"), ("2", "Two")])
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
- self.assertEqual(['1'], f.clean([1]))
- self.assertEqual(['1'], f.clean(['1']))
- self.assertEqual(['1', '2'], f.clean(['1', '2']))
- self.assertEqual(['1', '2'], f.clean([1, '2']))
- self.assertEqual(['1', '2'], f.clean((1, '2')))
+ self.assertEqual(["1"], f.clean([1]))
+ self.assertEqual(["1"], f.clean(["1"]))
+ self.assertEqual(["1", "2"], f.clean(["1", "2"]))
+ self.assertEqual(["1", "2"], f.clean([1, "2"]))
+ self.assertEqual(["1", "2"], f.clean((1, "2")))
with self.assertRaisesMessage(ValidationError, "'Enter a list of values.'"):
- f.clean('hello')
+ f.clean("hello")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean([])
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(())
msg = "'Select a valid choice. 3 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean(['3'])
+ f.clean(["3"])
def test_multiplechoicefield_2(self):
- f = MultipleChoiceField(choices=[('1', 'One'), ('2', 'Two')], required=False)
- self.assertEqual([], f.clean(''))
+ f = MultipleChoiceField(choices=[("1", "One"), ("2", "Two")], required=False)
+ self.assertEqual([], f.clean(""))
self.assertEqual([], f.clean(None))
- self.assertEqual(['1'], f.clean([1]))
- self.assertEqual(['1'], f.clean(['1']))
- self.assertEqual(['1', '2'], f.clean(['1', '2']))
- self.assertEqual(['1', '2'], f.clean([1, '2']))
- self.assertEqual(['1', '2'], f.clean((1, '2')))
+ self.assertEqual(["1"], f.clean([1]))
+ self.assertEqual(["1"], f.clean(["1"]))
+ self.assertEqual(["1", "2"], f.clean(["1", "2"]))
+ self.assertEqual(["1", "2"], f.clean([1, "2"]))
+ self.assertEqual(["1", "2"], f.clean((1, "2")))
with self.assertRaisesMessage(ValidationError, "'Enter a list of values.'"):
- f.clean('hello')
+ f.clean("hello")
self.assertEqual([], f.clean([]))
self.assertEqual([], f.clean(()))
msg = "'Select a valid choice. 3 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean(['3'])
+ f.clean(["3"])
def test_multiplechoicefield_3(self):
f = MultipleChoiceField(
- choices=[('Numbers', (('1', 'One'), ('2', 'Two'))), ('Letters', (('3', 'A'), ('4', 'B'))), ('5', 'Other')]
+ choices=[
+ ("Numbers", (("1", "One"), ("2", "Two"))),
+ ("Letters", (("3", "A"), ("4", "B"))),
+ ("5", "Other"),
+ ]
)
- self.assertEqual(['1'], f.clean([1]))
- self.assertEqual(['1'], f.clean(['1']))
- self.assertEqual(['1', '5'], f.clean([1, 5]))
- self.assertEqual(['1', '5'], f.clean([1, '5']))
- self.assertEqual(['1', '5'], f.clean(['1', 5]))
- self.assertEqual(['1', '5'], f.clean(['1', '5']))
+ self.assertEqual(["1"], f.clean([1]))
+ self.assertEqual(["1"], f.clean(["1"]))
+ self.assertEqual(["1", "5"], f.clean([1, 5]))
+ self.assertEqual(["1", "5"], f.clean([1, "5"]))
+ self.assertEqual(["1", "5"], f.clean(["1", 5]))
+ self.assertEqual(["1", "5"], f.clean(["1", "5"]))
msg = "'Select a valid choice. 6 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean(['6'])
+ f.clean(["6"])
msg = "'Select a valid choice. 6 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean(['1', '6'])
+ f.clean(["1", "6"])
def test_multiplechoicefield_changed(self):
- f = MultipleChoiceField(choices=[('1', 'One'), ('2', 'Two'), ('3', 'Three')])
+ 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']))
+ 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"]))
def test_disabled_has_changed(self):
- f = MultipleChoiceField(choices=[('1', 'One'), ('2', 'Two')], disabled=True)
- self.assertIs(f.has_changed('x', 'y'), False)
+ f = MultipleChoiceField(choices=[("1", "One"), ("2", "Two")], disabled=True)
+ self.assertIs(f.has_changed("x", "y"), False)
diff --git a/tests/forms_tests/field_tests/test_multivaluefield.py b/tests/forms_tests/field_tests/test_multivaluefield.py
index 449bf16d19..88f7490013 100644
--- a/tests/forms_tests/field_tests/test_multivaluefield.py
+++ b/tests/forms_tests/field_tests/test_multivaluefield.py
@@ -2,17 +2,24 @@ from datetime import datetime
from django.core.exceptions import ValidationError
from django.forms import (
- CharField, Form, MultipleChoiceField, MultiValueField, MultiWidget,
- SelectMultiple, SplitDateTimeField, SplitDateTimeWidget, TextInput,
+ CharField,
+ Form,
+ MultipleChoiceField,
+ MultiValueField,
+ MultiWidget,
+ SelectMultiple,
+ SplitDateTimeField,
+ SplitDateTimeWidget,
+ TextInput,
)
from django.test import SimpleTestCase
-beatles = (('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))
+beatles = (("J", "John"), ("P", "Paul"), ("G", "George"), ("R", "Ringo"))
class PartiallyRequiredField(MultiValueField):
def compress(self, data_list):
- return ','.join(data_list) if data_list else None
+ return ",".join(data_list) if data_list else None
class PartiallyRequiredForm(Form):
@@ -35,7 +42,7 @@ class ComplexMultiWidget(MultiWidget):
def decompress(self, value):
if value:
- data = value.split(',')
+ data = value.split(",")
return [
data[0],
list(data[1]),
@@ -55,7 +62,7 @@ class ComplexField(MultiValueField):
def compress(self, data_list):
if data_list:
- return '%s,%s,%s' % (data_list[0], ''.join(data_list[1]), data_list[2])
+ return "%s,%s,%s" % (data_list[0], "".join(data_list[1]), data_list[2])
return None
@@ -64,7 +71,6 @@ class ComplexFieldForm(Form):
class MultiValueFieldTest(SimpleTestCase):
-
@classmethod
def setUpClass(cls):
cls.field = ComplexField(widget=ComplexMultiWidget())
@@ -72,8 +78,8 @@ class MultiValueFieldTest(SimpleTestCase):
def test_clean(self):
self.assertEqual(
- self.field.clean(['some text', ['J', 'P'], ['2007-04-25', '6:24:00']]),
- 'some text,JP,2007-04-25 06:24:00',
+ self.field.clean(["some text", ["J", "P"], ["2007-04-25", "6:24:00"]]),
+ "some text,JP,2007-04-25 06:24:00",
)
def test_clean_disabled_multivalue(self):
@@ -81,20 +87,20 @@ class MultiValueFieldTest(SimpleTestCase):
f = ComplexField(disabled=True, widget=ComplexMultiWidget)
inputs = (
- 'some text,JP,2007-04-25 06:24:00',
- ['some text', ['J', 'P'], ['2007-04-25', '6:24:00']],
+ "some text,JP,2007-04-25 06:24:00",
+ ["some text", ["J", "P"], ["2007-04-25", "6:24:00"]],
)
for data in inputs:
with self.subTest(data=data):
- form = ComplexFieldForm({}, initial={'f': data})
+ form = ComplexFieldForm({}, initial={"f": data})
form.full_clean()
self.assertEqual(form.errors, {})
- self.assertEqual(form.cleaned_data, {'f': inputs[0]})
+ self.assertEqual(form.cleaned_data, {"f": inputs[0]})
def test_bad_choice(self):
msg = "'Select a valid choice. X is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- self.field.clean(['some text', ['X'], ['2007-04-25', '6:24:00']])
+ self.field.clean(["some text", ["X"], ["2007-04-25", "6:24:00"]])
def test_no_value(self):
"""
@@ -102,39 +108,49 @@ class MultiValueFieldTest(SimpleTestCase):
"""
msg = "'This field is required.'"
with self.assertRaisesMessage(ValidationError, msg):
- self.field.clean(['some text', ['JP']])
+ self.field.clean(["some text", ["JP"]])
def test_has_changed_no_initial(self):
- self.assertTrue(self.field.has_changed(None, ['some text', ['J', 'P'], ['2007-04-25', '6:24:00']]))
+ self.assertTrue(
+ self.field.has_changed(
+ None, ["some text", ["J", "P"], ["2007-04-25", "6:24:00"]]
+ )
+ )
def test_has_changed_same(self):
- self.assertFalse(self.field.has_changed(
- 'some text,JP,2007-04-25 06:24:00',
- ['some text', ['J', 'P'], ['2007-04-25', '6:24:00']],
- ))
+ self.assertFalse(
+ self.field.has_changed(
+ "some text,JP,2007-04-25 06:24:00",
+ ["some text", ["J", "P"], ["2007-04-25", "6:24:00"]],
+ )
+ )
def test_has_changed_first_widget(self):
"""
Test when the first widget's data has changed.
"""
- self.assertTrue(self.field.has_changed(
- 'some text,JP,2007-04-25 06:24:00',
- ['other text', ['J', 'P'], ['2007-04-25', '6:24:00']],
- ))
+ self.assertTrue(
+ self.field.has_changed(
+ "some text,JP,2007-04-25 06:24:00",
+ ["other text", ["J", "P"], ["2007-04-25", "6:24:00"]],
+ )
+ )
def test_has_changed_last_widget(self):
"""
Test when the last widget's data has changed. This ensures that it is
not short circuiting while testing the widgets.
"""
- self.assertTrue(self.field.has_changed(
- 'some text,JP,2007-04-25 06:24:00',
- ['some text', ['J', 'P'], ['2009-04-25', '11:44:00']],
- ))
+ self.assertTrue(
+ self.field.has_changed(
+ "some text,JP,2007-04-25 06:24:00",
+ ["some text", ["J", "P"], ["2009-04-25", "11:44:00"]],
+ )
+ )
def test_disabled_has_changed(self):
f = MultiValueField(fields=(CharField(), CharField()), disabled=True)
- self.assertIs(f.has_changed(['x', 'x'], ['y', 'y']), False)
+ self.assertIs(f.has_changed(["x", "x"], ["y", "y"]), False)
def test_form_as_table(self):
form = ComplexFieldForm()
@@ -155,12 +171,14 @@ class MultiValueFieldTest(SimpleTestCase):
)
def test_form_as_table_data(self):
- form = ComplexFieldForm({
- 'field1_0': 'some text',
- 'field1_1': ['J', 'P'],
- 'field1_2_0': '2007-04-25',
- 'field1_2_1': '06:24:00',
- })
+ form = ComplexFieldForm(
+ {
+ "field1_0": "some text",
+ "field1_1": ["J", "P"],
+ "field1_2_0": "2007-04-25",
+ "field1_2_1": "06:24:00",
+ }
+ )
self.assertHTMLEqual(
form.as_table(),
"""
@@ -178,19 +196,26 @@ class MultiValueFieldTest(SimpleTestCase):
)
def test_form_cleaned_data(self):
- form = ComplexFieldForm({
- 'field1_0': 'some text',
- 'field1_1': ['J', 'P'],
- 'field1_2_0': '2007-04-25',
- 'field1_2_1': '06:24:00',
- })
+ form = ComplexFieldForm(
+ {
+ "field1_0": "some text",
+ "field1_1": ["J", "P"],
+ "field1_2_0": "2007-04-25",
+ "field1_2_1": "06:24:00",
+ }
+ )
form.is_valid()
- self.assertEqual(form.cleaned_data['field1'], 'some text,JP,2007-04-25 06:24:00')
+ self.assertEqual(
+ form.cleaned_data["field1"], "some text,JP,2007-04-25 06:24:00"
+ )
def test_render_required_attributes(self):
- form = PartiallyRequiredForm({'f_0': 'Hello', 'f_1': ''})
+ form = PartiallyRequiredForm({"f_0": "Hello", "f_1": ""})
self.assertTrue(form.is_valid())
- self.assertInHTML('<input type="text" name="f_0" value="Hello" required id="id_f_0">', form.as_p())
+ self.assertInHTML(
+ '<input type="text" name="f_0" value="Hello" required id="id_f_0">',
+ form.as_p(),
+ )
self.assertInHTML('<input type="text" name="f_1" id="id_f_1">', form.as_p())
- form = PartiallyRequiredForm({'f_0': '', 'f_1': ''})
+ form = PartiallyRequiredForm({"f_0": "", "f_1": ""})
self.assertFalse(form.is_valid())
diff --git a/tests/forms_tests/field_tests/test_nullbooleanfield.py b/tests/forms_tests/field_tests/test_nullbooleanfield.py
index 55812612c9..5b632c8de3 100644
--- a/tests/forms_tests/field_tests/test_nullbooleanfield.py
+++ b/tests/forms_tests/field_tests/test_nullbooleanfield.py
@@ -5,56 +5,60 @@ from . import FormFieldAssertionsMixin
class NullBooleanFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_nullbooleanfield_clean(self):
f = NullBooleanField()
- self.assertIsNone(f.clean(''))
+ self.assertIsNone(f.clean(""))
self.assertTrue(f.clean(True))
self.assertFalse(f.clean(False))
self.assertIsNone(f.clean(None))
- self.assertFalse(f.clean('0'))
- self.assertTrue(f.clean('1'))
- self.assertIsNone(f.clean('2'))
- self.assertIsNone(f.clean('3'))
- self.assertIsNone(f.clean('hello'))
- self.assertTrue(f.clean('true'))
- self.assertFalse(f.clean('false'))
+ self.assertFalse(f.clean("0"))
+ self.assertTrue(f.clean("1"))
+ self.assertIsNone(f.clean("2"))
+ self.assertIsNone(f.clean("3"))
+ self.assertIsNone(f.clean("hello"))
+ self.assertTrue(f.clean("true"))
+ self.assertFalse(f.clean("false"))
def test_nullbooleanfield_2(self):
# The internal value is preserved if using HiddenInput (#7753).
class HiddenNullBooleanForm(Form):
hidden_nullbool1 = NullBooleanField(widget=HiddenInput, initial=True)
hidden_nullbool2 = NullBooleanField(widget=HiddenInput, initial=False)
+
f = HiddenNullBooleanForm()
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)
+ str(f),
)
def test_nullbooleanfield_3(self):
class HiddenNullBooleanForm(Form):
hidden_nullbool1 = NullBooleanField(widget=HiddenInput, initial=True)
hidden_nullbool2 = NullBooleanField(widget=HiddenInput, initial=False)
- f = HiddenNullBooleanForm({'hidden_nullbool1': 'True', 'hidden_nullbool2': 'False'})
+
+ f = HiddenNullBooleanForm(
+ {"hidden_nullbool1": "True", "hidden_nullbool2": "False"}
+ )
self.assertIsNone(f.full_clean())
- self.assertTrue(f.cleaned_data['hidden_nullbool1'])
- self.assertFalse(f.cleaned_data['hidden_nullbool2'])
+ self.assertTrue(f.cleaned_data["hidden_nullbool1"])
+ self.assertFalse(f.cleaned_data["hidden_nullbool2"])
def test_nullbooleanfield_4(self):
# Make sure we're compatible with MySQL, which uses 0 and 1 for its
# boolean values (#9609).
- NULLBOOL_CHOICES = (('1', 'Yes'), ('0', 'No'), ('', 'Unknown'))
+ NULLBOOL_CHOICES = (("1", "Yes"), ("0", "No"), ("", "Unknown"))
class MySQLNullBooleanForm(Form):
nullbool0 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES))
nullbool1 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES))
nullbool2 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES))
- f = MySQLNullBooleanForm({'nullbool0': '1', 'nullbool1': '0', 'nullbool2': ''})
+
+ f = MySQLNullBooleanForm({"nullbool0": "1", "nullbool1": "0", "nullbool2": ""})
self.assertIsNone(f.full_clean())
- self.assertTrue(f.cleaned_data['nullbool0'])
- self.assertFalse(f.cleaned_data['nullbool1'])
- self.assertIsNone(f.cleaned_data['nullbool2'])
+ self.assertTrue(f.cleaned_data["nullbool0"])
+ self.assertFalse(f.cleaned_data["nullbool1"])
+ self.assertIsNone(f.cleaned_data["nullbool2"])
def test_nullbooleanfield_changed(self):
f = NullBooleanField()
@@ -66,9 +70,9 @@ class NullBooleanFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
self.assertTrue(f.has_changed(True, None))
self.assertTrue(f.has_changed(True, False))
# HiddenInput widget sends string values for boolean but doesn't clean them in value_from_datadict
- self.assertFalse(f.has_changed(False, 'False'))
- self.assertFalse(f.has_changed(True, 'True'))
- self.assertFalse(f.has_changed(None, ''))
- self.assertTrue(f.has_changed(False, 'True'))
- self.assertTrue(f.has_changed(True, 'False'))
- self.assertTrue(f.has_changed(None, 'False'))
+ self.assertFalse(f.has_changed(False, "False"))
+ self.assertFalse(f.has_changed(True, "True"))
+ self.assertFalse(f.has_changed(None, ""))
+ self.assertTrue(f.has_changed(False, "True"))
+ self.assertTrue(f.has_changed(True, "False"))
+ self.assertTrue(f.has_changed(None, "False"))
diff --git a/tests/forms_tests/field_tests/test_regexfield.py b/tests/forms_tests/field_tests/test_regexfield.py
index 80d0f1c7cd..9a2b1387f6 100644
--- a/tests/forms_tests/field_tests/test_regexfield.py
+++ b/tests/forms_tests/field_tests/test_regexfield.py
@@ -6,80 +6,84 @@ from django.test import SimpleTestCase
class RegexFieldTest(SimpleTestCase):
-
def test_regexfield_1(self):
- f = RegexField('^[0-9][A-F][0-9]$')
- self.assertEqual('2A2', f.clean('2A2'))
- self.assertEqual('3F3', f.clean('3F3'))
+ f = RegexField("^[0-9][A-F][0-9]$")
+ self.assertEqual("2A2", f.clean("2A2"))
+ self.assertEqual("3F3", f.clean("3F3"))
with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
- f.clean('3G3')
+ f.clean("3G3")
with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
- f.clean(' 2A2')
+ f.clean(" 2A2")
with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
- f.clean('2A2 ')
+ f.clean("2A2 ")
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
def test_regexfield_2(self):
- f = RegexField('^[0-9][A-F][0-9]$', required=False)
- self.assertEqual('2A2', f.clean('2A2'))
- self.assertEqual('3F3', f.clean('3F3'))
+ f = RegexField("^[0-9][A-F][0-9]$", required=False)
+ self.assertEqual("2A2", f.clean("2A2"))
+ self.assertEqual("3F3", f.clean("3F3"))
with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
- f.clean('3G3')
- self.assertEqual('', f.clean(''))
+ f.clean("3G3")
+ self.assertEqual("", f.clean(""))
def test_regexfield_3(self):
- f = RegexField(re.compile('^[0-9][A-F][0-9]$'))
- self.assertEqual('2A2', f.clean('2A2'))
- self.assertEqual('3F3', f.clean('3F3'))
+ f = RegexField(re.compile("^[0-9][A-F][0-9]$"))
+ self.assertEqual("2A2", f.clean("2A2"))
+ self.assertEqual("3F3", f.clean("3F3"))
with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
- f.clean('3G3')
+ f.clean("3G3")
with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
- f.clean(' 2A2')
+ f.clean(" 2A2")
with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
- f.clean('2A2 ')
+ f.clean("2A2 ")
def test_regexfield_4(self):
- f = RegexField('^[0-9]+$', min_length=5, max_length=10)
- with self.assertRaisesMessage(ValidationError, "'Ensure this value has at least 5 characters (it has 3).'"):
- f.clean('123')
+ f = RegexField("^[0-9]+$", min_length=5, max_length=10)
+ with self.assertRaisesMessage(
+ ValidationError, "'Ensure this value has at least 5 characters (it has 3).'"
+ ):
+ f.clean("123")
with self.assertRaisesMessage(
ValidationError,
"'Ensure this value has at least 5 characters (it has 3).', "
"'Enter a valid value.'",
):
- f.clean('abc')
- self.assertEqual('12345', f.clean('12345'))
- self.assertEqual('1234567890', f.clean('1234567890'))
- with self.assertRaisesMessage(ValidationError, "'Ensure this value has at most 10 characters (it has 11).'"):
- f.clean('12345678901')
+ f.clean("abc")
+ self.assertEqual("12345", f.clean("12345"))
+ self.assertEqual("1234567890", f.clean("1234567890"))
+ with self.assertRaisesMessage(
+ ValidationError,
+ "'Ensure this value has at most 10 characters (it has 11).'",
+ ):
+ f.clean("12345678901")
with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
- f.clean('12345a')
+ f.clean("12345a")
def test_regexfield_unicode_characters(self):
- f = RegexField(r'^\w+$')
- self.assertEqual('éèøçÎÎ你好', f.clean('éèøçÎÎ你好'))
+ f = RegexField(r"^\w+$")
+ self.assertEqual("éèøçÎÎ你好", f.clean("éèøçÎÎ你好"))
def test_change_regex_after_init(self):
- f = RegexField('^[a-z]+$')
- f.regex = '^[0-9]+$'
- self.assertEqual('1234', f.clean('1234'))
+ f = RegexField("^[a-z]+$")
+ f.regex = "^[0-9]+$"
+ self.assertEqual("1234", f.clean("1234"))
with self.assertRaisesMessage(ValidationError, "'Enter a valid value.'"):
- f.clean('abcd')
+ f.clean("abcd")
def test_get_regex(self):
- f = RegexField('^[a-z]+$')
- self.assertEqual(f.regex, re.compile('^[a-z]+$'))
+ f = RegexField("^[a-z]+$")
+ self.assertEqual(f.regex, re.compile("^[a-z]+$"))
def test_regexfield_strip(self):
- f = RegexField('^[a-z]+$', strip=True)
- self.assertEqual(f.clean(' a'), 'a')
- self.assertEqual(f.clean('a '), 'a')
+ f = RegexField("^[a-z]+$", strip=True)
+ self.assertEqual(f.clean(" a"), "a")
+ self.assertEqual(f.clean("a "), "a")
def test_empty_value(self):
- f = RegexField('', required=False)
- self.assertEqual(f.clean(''), '')
- self.assertEqual(f.clean(None), '')
- f = RegexField('', empty_value=None, required=False)
- self.assertIsNone(f.clean(''))
+ f = RegexField("", required=False)
+ self.assertEqual(f.clean(""), "")
+ self.assertEqual(f.clean(None), "")
+ f = RegexField("", empty_value=None, required=False)
+ self.assertIsNone(f.clean(""))
self.assertIsNone(f.clean(None))
diff --git a/tests/forms_tests/field_tests/test_slugfield.py b/tests/forms_tests/field_tests/test_slugfield.py
index 6d766e8af5..d796a2c3aa 100644
--- a/tests/forms_tests/field_tests/test_slugfield.py
+++ b/tests/forms_tests/field_tests/test_slugfield.py
@@ -3,25 +3,24 @@ from django.test import SimpleTestCase
class SlugFieldTest(SimpleTestCase):
-
def test_slugfield_normalization(self):
f = SlugField()
- self.assertEqual(f.clean(' aa-bb-cc '), 'aa-bb-cc')
+ self.assertEqual(f.clean(" aa-bb-cc "), "aa-bb-cc")
def test_slugfield_unicode_normalization(self):
f = SlugField(allow_unicode=True)
- self.assertEqual(f.clean('a'), 'a')
- self.assertEqual(f.clean('1'), '1')
- self.assertEqual(f.clean('a1'), 'a1')
- self.assertEqual(f.clean('你好'), '你好')
- self.assertEqual(f.clean(' 你-好 '), '你-好')
- self.assertEqual(f.clean('ıçğüş'), 'ıçğüş')
- self.assertEqual(f.clean('foo-ıç-bar'), 'foo-ıç-bar')
+ self.assertEqual(f.clean("a"), "a")
+ self.assertEqual(f.clean("1"), "1")
+ self.assertEqual(f.clean("a1"), "a1")
+ self.assertEqual(f.clean("你好"), "你好")
+ self.assertEqual(f.clean(" 你-好 "), "你-好")
+ self.assertEqual(f.clean("ıçğüş"), "ıçğüş")
+ self.assertEqual(f.clean("foo-ıç-bar"), "foo-ıç-bar")
def test_empty_value(self):
f = SlugField(required=False)
- self.assertEqual(f.clean(''), '')
- self.assertEqual(f.clean(None), '')
+ self.assertEqual(f.clean(""), "")
+ self.assertEqual(f.clean(None), "")
f = SlugField(required=False, empty_value=None)
- self.assertIsNone(f.clean(''))
+ self.assertIsNone(f.clean(""))
self.assertIsNone(f.clean(None))
diff --git a/tests/forms_tests/field_tests/test_splitdatetimefield.py b/tests/forms_tests/field_tests/test_splitdatetimefield.py
index bf20587682..788ca592fa 100644
--- a/tests/forms_tests/field_tests/test_splitdatetimefield.py
+++ b/tests/forms_tests/field_tests/test_splitdatetimefield.py
@@ -7,59 +7,78 @@ from django.test import SimpleTestCase
class SplitDateTimeFieldTest(SimpleTestCase):
-
def test_splitdatetimefield_1(self):
f = SplitDateTimeField()
self.assertIsInstance(f.widget, SplitDateTimeWidget)
self.assertEqual(
datetime.datetime(2006, 1, 10, 7, 30),
- f.clean([datetime.date(2006, 1, 10), datetime.time(7, 30)])
+ f.clean([datetime.date(2006, 1, 10), datetime.time(7, 30)]),
)
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean(None)
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
with self.assertRaisesMessage(ValidationError, "'Enter a list of values.'"):
- f.clean('hello')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid date.', 'Enter a valid time.'"):
- f.clean(['hello', 'there'])
+ f.clean("hello")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid date.', 'Enter a valid time.'"
+ ):
+ f.clean(["hello", "there"])
with self.assertRaisesMessage(ValidationError, "'Enter a valid time.'"):
- f.clean(['2006-01-10', 'there'])
+ f.clean(["2006-01-10", "there"])
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean(['hello', '07:30'])
+ f.clean(["hello", "07:30"])
def test_splitdatetimefield_2(self):
f = SplitDateTimeField(required=False)
self.assertEqual(
datetime.datetime(2006, 1, 10, 7, 30),
- f.clean([datetime.date(2006, 1, 10), datetime.time(7, 30)])
+ f.clean([datetime.date(2006, 1, 10), datetime.time(7, 30)]),
+ )
+ self.assertEqual(
+ datetime.datetime(2006, 1, 10, 7, 30), f.clean(["2006-01-10", "07:30"])
)
- self.assertEqual(datetime.datetime(2006, 1, 10, 7, 30), f.clean(['2006-01-10', '07:30']))
self.assertIsNone(f.clean(None))
- self.assertIsNone(f.clean(''))
- self.assertIsNone(f.clean(['']))
- self.assertIsNone(f.clean(['', '']))
+ self.assertIsNone(f.clean(""))
+ self.assertIsNone(f.clean([""]))
+ self.assertIsNone(f.clean(["", ""]))
with self.assertRaisesMessage(ValidationError, "'Enter a list of values.'"):
- f.clean('hello')
- with self.assertRaisesMessage(ValidationError, "'Enter a valid date.', 'Enter a valid time.'"):
- f.clean(['hello', 'there'])
+ f.clean("hello")
+ with self.assertRaisesMessage(
+ ValidationError, "'Enter a valid date.', 'Enter a valid time.'"
+ ):
+ f.clean(["hello", "there"])
with self.assertRaisesMessage(ValidationError, "'Enter a valid time.'"):
- f.clean(['2006-01-10', 'there'])
+ f.clean(["2006-01-10", "there"])
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean(['hello', '07:30'])
+ f.clean(["hello", "07:30"])
with self.assertRaisesMessage(ValidationError, "'Enter a valid time.'"):
- f.clean(['2006-01-10', ''])
+ f.clean(["2006-01-10", ""])
with self.assertRaisesMessage(ValidationError, "'Enter a valid time.'"):
- f.clean(['2006-01-10'])
+ f.clean(["2006-01-10"])
with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"):
- f.clean(['', '07:30'])
+ f.clean(["", "07:30"])
def test_splitdatetimefield_changed(self):
- f = SplitDateTimeField(input_date_formats=['%d/%m/%Y'])
- self.assertFalse(f.has_changed(['11/01/2012', '09:18:15'], ['11/01/2012', '09:18:15']))
- 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']))
+ f = SplitDateTimeField(input_date_formats=["%d/%m/%Y"])
+ self.assertFalse(
+ f.has_changed(["11/01/2012", "09:18:15"], ["11/01/2012", "09:18:15"])
+ )
+ 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"]
+ )
+ )
def test_form_as_table(self):
class TestForm(Form):
@@ -68,8 +87,8 @@ class SplitDateTimeFieldTest(SimpleTestCase):
f = TestForm()
self.assertHTMLEqual(
f.as_table(),
- '<tr><th><label>Datetime:</label></th><td>'
+ "<tr><th><label>Datetime:</label></th><td>"
'<input type="text" name="datetime_0" required id="id_datetime_0">'
'<input type="text" name="datetime_1" required id="id_datetime_1">'
- '</td></tr>',
+ "</td></tr>",
)
diff --git a/tests/forms_tests/field_tests/test_timefield.py b/tests/forms_tests/field_tests/test_timefield.py
index a44b10fa07..fbe6a3cf31 100644
--- a/tests/forms_tests/field_tests/test_timefield.py
+++ b/tests/forms_tests/field_tests/test_timefield.py
@@ -8,39 +8,38 @@ from . import FormFieldAssertionsMixin
class TimeFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_timefield_1(self):
f = TimeField()
self.assertEqual(datetime.time(14, 25), f.clean(datetime.time(14, 25)))
self.assertEqual(datetime.time(14, 25, 59), f.clean(datetime.time(14, 25, 59)))
- self.assertEqual(datetime.time(14, 25), f.clean('14:25'))
- self.assertEqual(datetime.time(14, 25, 59), f.clean('14:25:59'))
+ self.assertEqual(datetime.time(14, 25), f.clean("14:25"))
+ self.assertEqual(datetime.time(14, 25, 59), f.clean("14:25:59"))
with self.assertRaisesMessage(ValidationError, "'Enter a valid time.'"):
- f.clean('hello')
+ f.clean("hello")
with self.assertRaisesMessage(ValidationError, "'Enter a valid time.'"):
- f.clean('1:24 p.m.')
+ f.clean("1:24 p.m.")
def test_timefield_2(self):
- f = TimeField(input_formats=['%I:%M %p'])
+ f = TimeField(input_formats=["%I:%M %p"])
self.assertEqual(datetime.time(14, 25), f.clean(datetime.time(14, 25)))
self.assertEqual(datetime.time(14, 25, 59), f.clean(datetime.time(14, 25, 59)))
- self.assertEqual(datetime.time(4, 25), f.clean('4:25 AM'))
- self.assertEqual(datetime.time(16, 25), f.clean('4:25 PM'))
+ self.assertEqual(datetime.time(4, 25), f.clean("4:25 AM"))
+ self.assertEqual(datetime.time(16, 25), f.clean("4:25 PM"))
with self.assertRaisesMessage(ValidationError, "'Enter a valid time.'"):
- f.clean('14:30:45')
+ f.clean("14:30:45")
def test_timefield_3(self):
f = TimeField()
# Test whitespace stripping behavior (#5714)
- self.assertEqual(datetime.time(14, 25), f.clean(' 14:25 '))
- self.assertEqual(datetime.time(14, 25, 59), f.clean(' 14:25:59 '))
+ self.assertEqual(datetime.time(14, 25), f.clean(" 14:25 "))
+ self.assertEqual(datetime.time(14, 25, 59), f.clean(" 14:25:59 "))
with self.assertRaisesMessage(ValidationError, "'Enter a valid time.'"):
- f.clean(' ')
+ f.clean(" ")
def test_timefield_changed(self):
t1 = datetime.time(12, 51, 34, 482548)
t2 = datetime.time(12, 51)
- f = TimeField(input_formats=['%H:%M', '%H:%M %p'])
- self.assertTrue(f.has_changed(t1, '12:51'))
- self.assertFalse(f.has_changed(t2, '12:51'))
- self.assertFalse(f.has_changed(t2, '12:51 PM'))
+ f = TimeField(input_formats=["%H:%M", "%H:%M %p"])
+ self.assertTrue(f.has_changed(t1, "12:51"))
+ self.assertFalse(f.has_changed(t2, "12:51"))
+ self.assertFalse(f.has_changed(t2, "12:51 PM"))
diff --git a/tests/forms_tests/field_tests/test_typedchoicefield.py b/tests/forms_tests/field_tests/test_typedchoicefield.py
index 2c6cd265b5..52a83eca37 100644
--- a/tests/forms_tests/field_tests/test_typedchoicefield.py
+++ b/tests/forms_tests/field_tests/test_typedchoicefield.py
@@ -6,72 +6,84 @@ from django.test import SimpleTestCase
class TypedChoiceFieldTest(SimpleTestCase):
-
def test_typedchoicefield_1(self):
f = TypedChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int)
- self.assertEqual(1, f.clean('1'))
+ self.assertEqual(1, f.clean("1"))
msg = "'Select a valid choice. 2 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('2')
+ f.clean("2")
def test_typedchoicefield_2(self):
# Different coercion, same validation.
f = TypedChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=float)
- self.assertEqual(1.0, f.clean('1'))
+ self.assertEqual(1.0, f.clean("1"))
def test_typedchoicefield_3(self):
# This can also cause weirdness: be careful (bool(-1) == True, remember)
f = TypedChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=bool)
- self.assertTrue(f.clean('-1'))
+ self.assertTrue(f.clean("-1"))
def test_typedchoicefield_4(self):
# Even more weirdness: if you have a valid choice but your coercion function
# can't coerce, you'll still get a validation error. Don't do this!
- f = TypedChoiceField(choices=[('A', 'A'), ('B', 'B')], coerce=int)
+ f = TypedChoiceField(choices=[("A", "A"), ("B", "B")], coerce=int)
msg = "'Select a valid choice. B is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('B')
+ f.clean("B")
# Required fields require values
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
def test_typedchoicefield_5(self):
# Non-required fields aren't required
- f = TypedChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int, required=False)
- self.assertEqual('', f.clean(''))
+ f = TypedChoiceField(
+ choices=[(1, "+1"), (-1, "-1")], coerce=int, required=False
+ )
+ self.assertEqual("", f.clean(""))
# If you want cleaning an empty value to return a different type, tell the field
def test_typedchoicefield_6(self):
- f = TypedChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int, required=False, empty_value=None)
- self.assertIsNone(f.clean(''))
+ f = TypedChoiceField(
+ choices=[(1, "+1"), (-1, "-1")],
+ coerce=int,
+ required=False,
+ empty_value=None,
+ )
+ self.assertIsNone(f.clean(""))
def test_typedchoicefield_has_changed(self):
# has_changed should not trigger required validation
f = TypedChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int, required=True)
- self.assertFalse(f.has_changed(None, ''))
- self.assertFalse(f.has_changed(1, '1'))
- self.assertFalse(f.has_changed('1', '1'))
+ self.assertFalse(f.has_changed(None, ""))
+ self.assertFalse(f.has_changed(1, "1"))
+ self.assertFalse(f.has_changed("1", "1"))
f = TypedChoiceField(
- choices=[('', '---------'), ('a', "a"), ('b', "b")], coerce=str,
- required=False, initial=None, empty_value=None,
+ choices=[("", "---------"), ("a", "a"), ("b", "b")],
+ coerce=str,
+ required=False,
+ initial=None,
+ empty_value=None,
)
- self.assertFalse(f.has_changed(None, ''))
- self.assertTrue(f.has_changed('', 'a'))
- self.assertFalse(f.has_changed('a', 'a'))
+ self.assertFalse(f.has_changed(None, ""))
+ self.assertTrue(f.has_changed("", "a"))
+ self.assertFalse(f.has_changed("a", "a"))
def test_typedchoicefield_special_coerce(self):
"""
A coerce function which results in a value not present in choices
should raise an appropriate error (#21397).
"""
+
def coerce_func(val):
- return decimal.Decimal('1.%s' % val)
+ return decimal.Decimal("1.%s" % val)
- f = TypedChoiceField(choices=[(1, "1"), (2, "2")], coerce=coerce_func, required=True)
- self.assertEqual(decimal.Decimal('1.2'), f.clean('2'))
+ f = TypedChoiceField(
+ choices=[(1, "1"), (2, "2")], coerce=coerce_func, required=True
+ )
+ self.assertEqual(decimal.Decimal("1.2"), f.clean("2"))
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
- f.clean('')
+ f.clean("")
msg = "'Select a valid choice. 3 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('3')
+ f.clean("3")
diff --git a/tests/forms_tests/field_tests/test_typedmultiplechoicefield.py b/tests/forms_tests/field_tests/test_typedmultiplechoicefield.py
index 1c97676a87..6810f1ed19 100644
--- a/tests/forms_tests/field_tests/test_typedmultiplechoicefield.py
+++ b/tests/forms_tests/field_tests/test_typedmultiplechoicefield.py
@@ -6,70 +6,80 @@ from django.test import SimpleTestCase
class TypedMultipleChoiceFieldTest(SimpleTestCase):
-
def test_typedmultiplechoicefield_1(self):
f = TypedMultipleChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int)
- self.assertEqual([1], f.clean(['1']))
+ self.assertEqual([1], f.clean(["1"]))
msg = "'Select a valid choice. 2 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean(['2'])
+ f.clean(["2"])
def test_typedmultiplechoicefield_2(self):
# Different coercion, same validation.
f = TypedMultipleChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=float)
- self.assertEqual([1.0], f.clean(['1']))
+ self.assertEqual([1.0], f.clean(["1"]))
def test_typedmultiplechoicefield_3(self):
# This can also cause weirdness: be careful (bool(-1) == True, remember)
f = TypedMultipleChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=bool)
- self.assertEqual([True], f.clean(['-1']))
+ self.assertEqual([True], f.clean(["-1"]))
def test_typedmultiplechoicefield_4(self):
f = TypedMultipleChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int)
- self.assertEqual([1, -1], f.clean(['1', '-1']))
+ self.assertEqual([1, -1], f.clean(["1", "-1"]))
msg = "'Select a valid choice. 2 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean(['1', '2'])
+ f.clean(["1", "2"])
def test_typedmultiplechoicefield_5(self):
# Even more weirdness: if you have a valid choice but your coercion function
# can't coerce, you'll still get a validation error. Don't do this!
- f = TypedMultipleChoiceField(choices=[('A', 'A'), ('B', 'B')], coerce=int)
+ f = TypedMultipleChoiceField(choices=[("A", "A"), ("B", "B")], coerce=int)
msg = "'Select a valid choice. B is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean(['B'])
+ f.clean(["B"])
# Required fields require values
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean([])
def test_typedmultiplechoicefield_6(self):
# Non-required fields aren't required
- f = TypedMultipleChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int, required=False)
+ f = TypedMultipleChoiceField(
+ choices=[(1, "+1"), (-1, "-1")], coerce=int, required=False
+ )
self.assertEqual([], f.clean([]))
def test_typedmultiplechoicefield_7(self):
# If you want cleaning an empty value to return a different type, tell the field
- f = TypedMultipleChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int, required=False, empty_value=None)
+ f = TypedMultipleChoiceField(
+ choices=[(1, "+1"), (-1, "-1")],
+ coerce=int,
+ required=False,
+ empty_value=None,
+ )
self.assertIsNone(f.clean([]))
def test_typedmultiplechoicefield_has_changed(self):
# has_changed should not trigger required validation
- f = TypedMultipleChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int, required=True)
- self.assertFalse(f.has_changed(None, ''))
+ f = TypedMultipleChoiceField(
+ choices=[(1, "+1"), (-1, "-1")], coerce=int, required=True
+ )
+ self.assertFalse(f.has_changed(None, ""))
def test_typedmultiplechoicefield_special_coerce(self):
"""
A coerce function which results in a value not present in choices
should raise an appropriate error (#21397).
"""
+
def coerce_func(val):
- return decimal.Decimal('1.%s' % val)
+ return decimal.Decimal("1.%s" % val)
f = TypedMultipleChoiceField(
- choices=[(1, "1"), (2, "2")], coerce=coerce_func, required=True)
- self.assertEqual([decimal.Decimal('1.2')], f.clean(['2']))
+ choices=[(1, "1"), (2, "2")], coerce=coerce_func, required=True
+ )
+ self.assertEqual([decimal.Decimal("1.2")], f.clean(["2"]))
with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
f.clean([])
msg = "'Select a valid choice. 3 is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean(['3'])
+ f.clean(["3"])
diff --git a/tests/forms_tests/field_tests/test_urlfield.py b/tests/forms_tests/field_tests/test_urlfield.py
index 187d44a050..042a3bf586 100644
--- a/tests/forms_tests/field_tests/test_urlfield.py
+++ b/tests/forms_tests/field_tests/test_urlfield.py
@@ -6,14 +6,13 @@ from . import FormFieldAssertionsMixin
class URLFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
-
def test_urlfield_widget(self):
f = URLField()
self.assertWidgetRendersTo(f, '<input type="url" name="f" id="id_f" required>')
def test_urlfield_widget_max_min_length(self):
f = URLField(min_length=15, max_length=20)
- self.assertEqual('http://example.com', f.clean('http://example.com'))
+ self.assertEqual("http://example.com", f.clean("http://example.com"))
self.assertWidgetRendersTo(
f,
'<input id="id_f" type="url" name="f" maxlength="20" '
@@ -21,55 +20,58 @@ class URLFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
)
msg = "'Ensure this value has at least 15 characters (it has 12).'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('http://f.com')
+ f.clean("http://f.com")
msg = "'Ensure this value has at most 20 characters (it has 37).'"
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('http://abcdefghijklmnopqrstuvwxyz.com')
+ f.clean("http://abcdefghijklmnopqrstuvwxyz.com")
def test_urlfield_clean(self):
f = URLField(required=False)
tests = [
- ('http://localhost', 'http://localhost'),
- ('http://example.com', 'http://example.com'),
- ('http://example.com/test', 'http://example.com/test'),
- ('http://example.com.', 'http://example.com.'),
- ('http://www.example.com', 'http://www.example.com'),
- ('http://www.example.com:8000/test', 'http://www.example.com:8000/test'),
+ ("http://localhost", "http://localhost"),
+ ("http://example.com", "http://example.com"),
+ ("http://example.com/test", "http://example.com/test"),
+ ("http://example.com.", "http://example.com."),
+ ("http://www.example.com", "http://www.example.com"),
+ ("http://www.example.com:8000/test", "http://www.example.com:8000/test"),
(
- 'http://example.com?some_param=some_value',
- 'http://example.com?some_param=some_value',
+ "http://example.com?some_param=some_value",
+ "http://example.com?some_param=some_value",
),
- ('valid-with-hyphens.com', 'http://valid-with-hyphens.com'),
- ('subdomain.domain.com', 'http://subdomain.domain.com'),
- ('http://200.8.9.10', 'http://200.8.9.10'),
- ('http://200.8.9.10:8000/test', 'http://200.8.9.10:8000/test'),
- ('http://valid-----hyphens.com', 'http://valid-----hyphens.com'),
+ ("valid-with-hyphens.com", "http://valid-with-hyphens.com"),
+ ("subdomain.domain.com", "http://subdomain.domain.com"),
+ ("http://200.8.9.10", "http://200.8.9.10"),
+ ("http://200.8.9.10:8000/test", "http://200.8.9.10:8000/test"),
+ ("http://valid-----hyphens.com", "http://valid-----hyphens.com"),
(
- 'http://some.idn.xyzäöüßabc.domain.com:123/blah',
- 'http://some.idn.xyz\xe4\xf6\xfc\xdfabc.domain.com:123/blah',
+ "http://some.idn.xyzäöüßabc.domain.com:123/blah",
+ "http://some.idn.xyz\xe4\xf6\xfc\xdfabc.domain.com:123/blah",
),
(
- 'www.example.com/s/http://code.djangoproject.com/ticket/13804',
- 'http://www.example.com/s/http://code.djangoproject.com/ticket/13804',
+ "www.example.com/s/http://code.djangoproject.com/ticket/13804",
+ "http://www.example.com/s/http://code.djangoproject.com/ticket/13804",
),
# Normalization.
- ('http://example.com/ ', 'http://example.com/'),
+ ("http://example.com/ ", "http://example.com/"),
# Valid IDN.
- ('http://עברית.idn.icann.org/', 'http://עברית.idn.icann.org/'),
- ('http://sãopaulo.com/', 'http://sãopaulo.com/'),
- ('http://sãopaulo.com.br/', 'http://sãopaulo.com.br/'),
- ('http://пример.испытание/', 'http://пример.испытание/'),
- ('http://مثال.إختبار/', 'http://مثال.إختبار/'),
- ('http://例子.测试/', 'http://例子.测试/'),
- ('http://例子.測試/', 'http://例子.測試/'),
- ('http://उदाहरण.परीक्षा/', 'http://उदाहरण.परीक्षा/',),
- ('http://例え.テスト/', 'http://例え.テスト/'),
- ('http://مثال.آزمایشی/', 'http://مثال.آزمایشی/'),
- ('http://실례.테스트/', 'http://실례.테스트/'),
- ('http://العربية.idn.icann.org/', 'http://العربية.idn.icann.org/'),
+ ("http://עברית.idn.icann.org/", "http://עברית.idn.icann.org/"),
+ ("http://sãopaulo.com/", "http://sãopaulo.com/"),
+ ("http://sãopaulo.com.br/", "http://sãopaulo.com.br/"),
+ ("http://пример.испытание/", "http://пример.испытание/"),
+ ("http://مثال.إختبار/", "http://مثال.إختبار/"),
+ ("http://例子.测试/", "http://例子.测试/"),
+ ("http://例子.測試/", "http://例子.測試/"),
+ (
+ "http://उदाहरण.परीक्षा/",
+ "http://उदाहरण.परीक्षा/",
+ ),
+ ("http://例え.テスト/", "http://例え.テスト/"),
+ ("http://مثال.آزمایشی/", "http://مثال.آزمایشی/"),
+ ("http://실례.테스트/", "http://실례.테스트/"),
+ ("http://العربية.idn.icann.org/", "http://العربية.idn.icann.org/"),
# IPv6.
- ('http://[12:34::3a53]/', 'http://[12:34::3a53]/'),
- ('http://[a34:9238::]:8080/', 'http://[a34:9238::]:8080/'),
+ ("http://[12:34::3a53]/", "http://[12:34::3a53]/"),
+ ("http://[a34:9238::]:8080/", "http://[a34:9238::]:8080/"),
]
for url, expected in tests:
with self.subTest(url=url):
@@ -78,32 +80,32 @@ class URLFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
def test_urlfield_clean_invalid(self):
f = URLField()
tests = [
- 'foo',
- 'com.',
- '.',
- 'http://',
- 'http://example',
- 'http://example.',
- 'http://.com',
- 'http://invalid-.com',
- 'http://-invalid.com',
- 'http://inv-.alid-.com',
- 'http://inv-.-alid.com',
- '[a',
- 'http://[a',
+ "foo",
+ "com.",
+ ".",
+ "http://",
+ "http://example",
+ "http://example.",
+ "http://.com",
+ "http://invalid-.com",
+ "http://-invalid.com",
+ "http://inv-.alid-.com",
+ "http://inv-.-alid.com",
+ "[a",
+ "http://[a",
# Non-string.
23,
# Hangs "forever" before fixing a catastrophic backtracking,
# see #11198.
- 'http://%s' % ('X' * 60,),
+ "http://%s" % ("X" * 60,),
# A second example, to make sure the problem is really addressed,
# even on domains that don't fail the domain label length check in
# the regex.
- 'http://%s' % ("X" * 200,),
+ "http://%s" % ("X" * 200,),
# urlsplit() raises ValueError.
- '////]@N.AN',
+ "////]@N.AN",
# Empty hostname.
- '#@A.bO',
+ "#@A.bO",
]
msg = "'Enter a valid URL.'"
for value in tests:
@@ -117,16 +119,16 @@ class URLFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
with self.assertRaisesMessage(ValidationError, msg):
f.clean(None)
with self.assertRaisesMessage(ValidationError, msg):
- f.clean('')
+ f.clean("")
def test_urlfield_clean_not_required(self):
f = URLField(required=False)
- self.assertEqual(f.clean(None), '')
- self.assertEqual(f.clean(''), '')
+ self.assertEqual(f.clean(None), "")
+ self.assertEqual(f.clean(""), "")
def test_urlfield_strip_on_none_value(self):
f = URLField(required=False, empty_value=None)
- self.assertIsNone(f.clean(''))
+ self.assertIsNone(f.clean(""))
self.assertIsNone(f.clean(None))
def test_urlfield_unable_to_set_strip_kwarg(self):
diff --git a/tests/forms_tests/field_tests/test_uuidfield.py b/tests/forms_tests/field_tests/test_uuidfield.py
index e1c1698d02..b039c4a0c3 100644
--- a/tests/forms_tests/field_tests/test_uuidfield.py
+++ b/tests/forms_tests/field_tests/test_uuidfield.py
@@ -6,28 +6,27 @@ from django.test import SimpleTestCase
class UUIDFieldTest(SimpleTestCase):
-
def test_uuidfield_1(self):
field = UUIDField()
- value = field.clean('550e8400e29b41d4a716446655440000')
- self.assertEqual(value, uuid.UUID('550e8400e29b41d4a716446655440000'))
+ value = field.clean("550e8400e29b41d4a716446655440000")
+ self.assertEqual(value, uuid.UUID("550e8400e29b41d4a716446655440000"))
def test_clean_value_with_dashes(self):
field = UUIDField()
- value = field.clean('550e8400-e29b-41d4-a716-446655440000')
- self.assertEqual(value, uuid.UUID('550e8400e29b41d4a716446655440000'))
+ value = field.clean("550e8400-e29b-41d4-a716-446655440000")
+ self.assertEqual(value, uuid.UUID("550e8400e29b41d4a716446655440000"))
def test_uuidfield_2(self):
field = UUIDField(required=False)
- self.assertIsNone(field.clean(''))
+ self.assertIsNone(field.clean(""))
self.assertIsNone(field.clean(None))
def test_uuidfield_3(self):
field = UUIDField()
- with self.assertRaisesMessage(ValidationError, 'Enter a valid UUID.'):
- field.clean('550e8400')
+ with self.assertRaisesMessage(ValidationError, "Enter a valid UUID."):
+ field.clean("550e8400")
def test_uuidfield_4(self):
field = UUIDField()
- value = field.prepare_value(uuid.UUID('550e8400e29b41d4a716446655440000'))
- self.assertEqual(value, '550e8400-e29b-41d4-a716-446655440000')
+ value = field.prepare_value(uuid.UUID("550e8400e29b41d4a716446655440000"))
+ self.assertEqual(value, "550e8400-e29b-41d4-a716-446655440000")