diff options
| author | Preston Timmons <prestontimmons@gmail.com> | 2015-08-30 21:13:42 -0500 |
|---|---|---|
| committer | Preston Timmons <prestontimmons@gmail.com> | 2015-08-31 23:03:55 -0500 |
| commit | 4c30fa905d9d47b3a2ee82095b1fe56cc2ec2ab5 (patch) | |
| tree | 2bb04d4ecef539e4ebefbd6d750dfd240ddd7f0c /tests/forms_tests/widget_tests/test_checkboxinput.py | |
| parent | 5153a3bfdcec82324d67ff79862384288cf6afe6 (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.py | 87 |
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 & 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) |
