from django.forms import SelectMultiple
from .base import WidgetTest
class SelectMultipleTest(WidgetTest):
widget = SelectMultiple
numeric_choices = (("0", "0"), ("1", "1"), ("2", "2"), ("3", "3"), ("0", "extra"))
def test_format_value(self):
widget = self.widget(choices=self.numeric_choices)
self.assertEqual(widget.format_value(None), [])
self.assertEqual(widget.format_value(""), [""])
self.assertEqual(widget.format_value([3, 0, 1]), ["3", "0", "1"])
def test_render_selected(self):
self.check_html(
self.widget(choices=self.beatles),
"beatles",
["J"],
html=(
""""""
),
)
def test_render_multiple_selected(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_render_value_label(self):
"""
If the value corresponds to a label (but not to an option value), none
of the options are selected.
"""
self.check_html(
self.widget(choices=self.beatles),
"beatles",
["John"],
html=(
""""""
),
)
def test_multiple_options_same_value(self):
"""
Multiple options with the same value can be selected (#8103).
"""
self.check_html(
self.widget(choices=self.numeric_choices),
"choices",
["0"],
html=(
""""""
),
)
def test_multiple_values_invalid(self):
"""
If multiple values are given, but some of them are not valid, the valid
ones are selected.
"""
self.check_html(
self.widget(choices=self.beatles),
"beatles",
["J", "G", "foo"],
html=(
""""""
),
)
def test_compare_string(self):
choices = [("1", "1"), ("2", "2"), ("3", "3")]
self.check_html(
self.widget(choices=choices),
"nums",
[2],
html=(
""""""
),
)
self.check_html(
self.widget(choices=choices),
"nums",
["2"],
html=(
""""""
),
)
self.check_html(
self.widget(choices=choices),
"nums",
[2],
html=(
""""""
),
)
def test_optgroup_select_multiple(self):
widget = SelectMultiple(
choices=(
("outer1", "Outer 1"),
('Group "1"', (("inner1", "Inner 1"), ("inner2", "Inner 2"))),
)
)
self.check_html(
widget,
"nestchoice",
["outer1", "inner2"],
html=(
""""""
),
)
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
)