import datetime from django import forms from django.forms import CheckboxSelectMultiple from django.test import override_settings from .base import WidgetTest class CheckboxSelectMultipleTest(WidgetTest): widget = CheckboxSelectMultiple def test_render_value(self): self.check_html( self.widget(choices=self.beatles), "beatles", ["J"], html="""
""", ) def test_render_value_multiple(self): self.check_html( self.widget(choices=self.beatles), "beatles", ["J", "P"], html="""
""", ) def test_render_none(self): """ If the value is None, none of the options are selected, even if the choices have an empty option. """ self.check_html( self.widget(choices=(("", "Unknown"),) + self.beatles), "beatles", None, html="""
""", ) def test_nested_choices(self): nested_choices = ( ("unknown", "Unknown"), ("Audio", (("vinyl", "Vinyl"), ("cd", "CD"))), ("Video", (("vhs", "VHS"), ("dvd", "DVD"))), ) html = """
""" self.check_html( self.widget(choices=nested_choices), "nestchoice", ("vinyl", "dvd"), attrs={"id": "media"}, html=html, ) def test_nested_choices_without_id(self): nested_choices = ( ("unknown", "Unknown"), ("Audio", (("vinyl", "Vinyl"), ("cd", "CD"))), ("Video", (("vhs", "VHS"), ("dvd", "DVD"))), ) html = """
""" self.check_html( self.widget(choices=nested_choices), "nestchoice", ("vinyl", "dvd"), html=html, ) def test_separate_ids(self): """ Each input gets a separate ID. """ choices = [("a", "A"), ("b", "B"), ("c", "C")] html = """
""" self.check_html( self.widget(choices=choices), "letters", ["a", "c"], attrs={"id": "abc"}, html=html, ) def test_separate_ids_constructor(self): """ Each input gets a separate ID when the ID is passed to the constructor. """ widget = CheckboxSelectMultiple( attrs={"id": "abc"}, choices=[("a", "A"), ("b", "B"), ("c", "C")] ) html = """
""" self.check_html(widget, "letters", ["a", "c"], html=html) @override_settings(USE_THOUSAND_SEPARATOR=True) def test_doesnt_localize_input_value(self): choices = [ (1, "One"), (1000, "One thousand"), (1000000, "One million"), ] html = """
""" self.check_html(self.widget(choices=choices), "numbers", None, html=html) choices = [ (datetime.time(0, 0), "midnight"), (datetime.time(12, 0), "noon"), ] html = """
""" self.check_html(self.widget(choices=choices), "times", None, html=html) def test_use_required_attribute(self): widget = self.widget(choices=self.beatles) # Always False because browser validation would require all checkboxes # to be checked instead of at least one. self.assertIs(widget.use_required_attribute(None), False) self.assertIs(widget.use_required_attribute([]), False) self.assertIs(widget.use_required_attribute(["J", "P"]), False) def test_value_omitted_from_data(self): widget = self.widget(choices=self.beatles) self.assertIs(widget.value_omitted_from_data({}, {}, "field"), False) self.assertIs( widget.value_omitted_from_data({"field": "value"}, {}, "field"), False ) def test_label(self): """ CheckboxSelectMultiple doesn't contain 'for="field_0"' in the