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='') def test_render_none(self): self.check_html(self.widget, 'is_cool', None, html='') def test_render_false(self): self.check_html(self.widget, 'is_cool', False, html='') def test_render_true(self): self.check_html( self.widget, 'is_cool', True, html='' ) 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='', ) def test_render_int(self): """ Integers are handled by value, not as booleans (#17114). """ self.check_html( self.widget, 'is_cool', 0, html='', ) self.check_html( self.widget, 'is_cool', 1, html='', ) 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=( '' )) self.check_html(widget, 'greeting', 'hello', html=( '' )) self.check_html(widget, 'greeting', 'hello there', html=( '' )) self.check_html(widget, 'greeting', 'hello & goodbye', html=( '' )) 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)