summaryrefslogtreecommitdiff
path: root/tests/forms_tests/widget_tests/test_checkboxinput.py
diff options
context:
space:
mode:
authorPreston Timmons <prestontimmons@gmail.com>2015-08-30 21:13:42 -0500
committerPreston Timmons <prestontimmons@gmail.com>2015-08-31 23:03:55 -0500
commit4c30fa905d9d47b3a2ee82095b1fe56cc2ec2ab5 (patch)
tree2bb04d4ecef539e4ebefbd6d750dfd240ddd7f0c /tests/forms_tests/widget_tests/test_checkboxinput.py
parent5153a3bfdcec82324d67ff79862384288cf6afe6 (diff)
Rewrote form widget tests as proper unittests.
This is preparation for landing the template-based widget rendering patch and goes a long way to making these tests more useful for future development. The old doctest heritage is strong here.
Diffstat (limited to 'tests/forms_tests/widget_tests/test_checkboxinput.py')
-rw-r--r--tests/forms_tests/widget_tests/test_checkboxinput.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/tests/forms_tests/widget_tests/test_checkboxinput.py b/tests/forms_tests/widget_tests/test_checkboxinput.py
new file mode 100644
index 0000000000..45d8191f75
--- /dev/null
+++ b/tests/forms_tests/widget_tests/test_checkboxinput.py
@@ -0,0 +1,87 @@
+from django.forms import CheckboxInput
+
+from .base import WidgetTest
+
+
+class CheckboxInputTest(WidgetTest):
+ widget = CheckboxInput()
+
+ def test_render_empty(self):
+ self.check_html(self.widget, 'is_cool', '', html='<input type="checkbox" name="is_cool" />')
+
+ def test_render_none(self):
+ self.check_html(self.widget, 'is_cool', None, html='<input type="checkbox" name="is_cool" />')
+
+ def test_render_false(self):
+ self.check_html(self.widget, 'is_cool', False, html='<input type="checkbox" name="is_cool" />')
+
+ def test_render_true(self):
+ self.check_html(
+ self.widget, 'is_cool', True,
+ html='<input checked="checked" type="checkbox" name="is_cool" />'
+ )
+
+ def test_render_value(self):
+ """
+ Using any value that's not in ('', None, False, True) will check the
+ checkbox and set the 'value' attribute.
+ """
+ self.check_html(
+ self.widget, 'is_cool', 'foo',
+ html='<input checked="checked" type="checkbox" name="is_cool" value="foo" />',
+ )
+
+ def test_render_int(self):
+ """
+ Integers are handled by value, not as booleans (#17114).
+ """
+ self.check_html(
+ self.widget, 'is_cool', 0,
+ html='<input checked="checked" type="checkbox" name="is_cool" value="0" />',
+ )
+ self.check_html(
+ self.widget, 'is_cool', 1,
+ html='<input checked="checked" type="checkbox" name="is_cool" value="1" />',
+ )
+
+ def test_render_check_test(self):
+ """
+ You can pass 'check_test' to the constructor. This is a callable that
+ takes the value and returns True if the box should be checked.
+ """
+ widget = CheckboxInput(check_test=lambda value: value.startswith('hello'))
+ self.check_html(widget, 'greeting', '', html=(
+ '<input type="checkbox" name="greeting" />'
+ ))
+ self.check_html(widget, 'greeting', 'hello', html=(
+ '<input checked="checked" type="checkbox" name="greeting" value="hello" />'
+ ))
+ self.check_html(widget, 'greeting', 'hello there', html=(
+ '<input checked="checked" type="checkbox" name="greeting" value="hello there" />'
+ ))
+ self.check_html(widget, 'greeting', 'hello & goodbye', html=(
+ '<input checked="checked" type="checkbox" name="greeting" value="hello &amp; goodbye" />'
+ ))
+
+ def test_render_check_exception(self):
+ """
+ Calling check_test() shouldn't swallow exceptions (#17888).
+ """
+ widget = CheckboxInput(
+ check_test=lambda value: value.startswith('hello'),
+ )
+
+ with self.assertRaises(AttributeError):
+ widget.render('greeting', True)
+
+ def test_value_from_datadict(self):
+ """
+ The CheckboxInput widget will return False if the key is not found in
+ the data dictionary (because HTML form submission doesn't send any
+ result for unchecked checkboxes).
+ """
+ self.assertFalse(self.widget.value_from_datadict({}, {}, 'testing'))
+
+ def test_value_from_datadict_string_int(self):
+ value = self.widget.value_from_datadict({'testing': '0'}, {}, 'testing')
+ self.assertEqual(value, True)