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_selectmultiple.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_selectmultiple.py')
| -rw-r--r-- | tests/forms_tests/widget_tests/test_selectmultiple.py | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/tests/forms_tests/widget_tests/test_selectmultiple.py b/tests/forms_tests/widget_tests/test_selectmultiple.py new file mode 100644 index 0000000000..502aba3bf4 --- /dev/null +++ b/tests/forms_tests/widget_tests/test_selectmultiple.py @@ -0,0 +1,125 @@ +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_render_selected(self): + self.check_html(self.widget, 'beatles', ['J'], choices=self.beatles, html=( + """<select multiple="multiple" name="beatles"> + <option value="J" selected="selected">John</option> + <option value="P">Paul</option> + <option value="G">George</option> + <option value="R">Ringo</option> + </select>""" + )) + + def test_render_multiple_selected(self): + self.check_html(self.widget, 'beatles', ['J', 'P'], choices=self.beatles, html=( + """<select multiple="multiple" name="beatles"> + <option value="J" selected="selected">John</option> + <option value="P" selected="selected">Paul</option> + <option value="G">George</option> + <option value="R">Ringo</option> + </select>""" + )) + + def test_render_none(self): + """ + If the value is None, none of the options are selected. + """ + self.check_html(self.widget, 'beatles', None, choices=self.beatles, html=( + """<select multiple="multiple" name="beatles"> + <option value="J">John</option> + <option value="P">Paul</option> + <option value="G">George</option> + <option value="R">Ringo</option> + </select>""" + )) + + 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, 'beatles', ['John'], choices=self.beatles, html=( + """<select multiple="multiple" name="beatles"> + <option value="J">John</option> + <option value="P">Paul</option> + <option value="G">George</option> + <option value="R">Ringo</option> + </select>""" + )) + + def test_multiple_options_same_value(self): + """ + Multiple options with the same value can be selected (#8103). + """ + self.check_html(self.widget, 'choices', ['0'], choices=self.numeric_choices, html=( + """<select multiple="multiple" name="choices"> + <option value="0" selected="selected">0</option> + <option value="1">1</option> + <option value="2">2</option> + <option value="3">3</option> + <option value="0" selected="selected">extra</option> + </select>""" + )) + + 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, 'beatles', ['J', 'G', 'foo'], choices=self.beatles, html=( + """<select multiple="multiple" name="beatles"> + <option value="J" selected="selected">John</option> + <option value="P">Paul</option> + <option value="G" selected="selected">George</option> + <option value="R">Ringo</option> + </select>""" + )) + + def test_compare_string(self): + choices = [('1', '1'), ('2', '2'), ('3', '3')] + + self.check_html(self.widget, 'nums', [2], choices=choices, html=( + """<select multiple="multiple" name="nums"> + <option value="1">1</option> + <option value="2" selected="selected">2</option> + <option value="3">3</option> + </select>""" + )) + + self.check_html(self.widget, 'nums', ['2'], choices=choices, html=( + """<select multiple="multiple" name="nums"> + <option value="1">1</option> + <option value="2" selected="selected">2</option> + <option value="3">3</option> + </select>""" + )) + + self.check_html(self.widget, 'nums', [2], choices=choices, html=( + """<select multiple="multiple" name="nums"> + <option value="1">1</option> + <option value="2" selected="selected">2</option> + <option value="3">3</option> + </select>""" + )) + + 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=( + """<select multiple="multiple" name="nestchoice"> + <option value="outer1" selected="selected">Outer 1</option> + <optgroup label="Group "1""> + <option value="inner1">Inner 1</option> + <option value="inner2" selected="selected">Inner 2</option> + </optgroup> + </select>""" + )) |
