1. import datetime
    
  2. 
    
  3. from django.forms import ChoiceField, Form, MultiWidget, RadioSelect
    
  4. from django.test import override_settings
    
  5. 
    
  6. from .base import WidgetTest
    
  7. 
    
  8. 
    
  9. class RadioSelectTest(WidgetTest):
    
  10.     widget = RadioSelect
    
  11. 
    
  12.     def test_render(self):
    
  13.         choices = (("", "------"),) + self.beatles
    
  14.         self.check_html(
    
  15.             self.widget(choices=choices),
    
  16.             "beatle",
    
  17.             "J",
    
  18.             html="""
    
  19.             <div>
    
  20.             <div><label><input type="radio" name="beatle" value=""> ------</label></div>
    
  21.             <div><label>
    
  22.             <input checked type="radio" name="beatle" value="J"> John</label></div>
    
  23.             <div><label><input type="radio" name="beatle" value="P"> Paul</label></div>
    
  24.             <div><label>
    
  25.             <input type="radio" name="beatle" value="G"> George</label></div>
    
  26.             <div><label><input type="radio" name="beatle" value="R"> Ringo</label></div>
    
  27.             </div>
    
  28.         """,
    
  29.         )
    
  30. 
    
  31.     def test_nested_choices(self):
    
  32.         nested_choices = (
    
  33.             ("unknown", "Unknown"),
    
  34.             ("Audio", (("vinyl", "Vinyl"), ("cd", "CD"))),
    
  35.             ("Video", (("vhs", "VHS"), ("dvd", "DVD"))),
    
  36.         )
    
  37.         html = """
    
  38.         <div id="media">
    
  39.         <div>
    
  40.         <label for="media_0">
    
  41.         <input type="radio" name="nestchoice" value="unknown" id="media_0"> Unknown
    
  42.         </label></div>
    
  43.         <div>
    
  44.         <label>Audio</label>
    
  45.         <div>
    
  46.         <label for="media_1_0">
    
  47.         <input type="radio" name="nestchoice" value="vinyl" id="media_1_0"> Vinyl
    
  48.         </label></div>
    
  49.         <div> <label for="media_1_1">
    
  50.         <input type="radio" name="nestchoice" value="cd" id="media_1_1"> CD
    
  51.         </label></div>
    
  52.         </div><div>
    
  53.         <label>Video</label>
    
  54.         <div>
    
  55.         <label for="media_2_0">
    
  56.         <input type="radio" name="nestchoice" value="vhs" id="media_2_0"> VHS
    
  57.         </label></div>
    
  58.         <div>
    
  59.         <label for="media_2_1">
    
  60.         <input type="radio" name="nestchoice" value="dvd" id="media_2_1" checked> DVD
    
  61.         </label></div>
    
  62.         </div>
    
  63.         </div>
    
  64.         """
    
  65.         self.check_html(
    
  66.             self.widget(choices=nested_choices),
    
  67.             "nestchoice",
    
  68.             "dvd",
    
  69.             attrs={"id": "media"},
    
  70.             html=html,
    
  71.         )
    
  72. 
    
  73.     def test_constructor_attrs(self):
    
  74.         """
    
  75.         Attributes provided at instantiation are passed to the constituent
    
  76.         inputs.
    
  77.         """
    
  78.         widget = RadioSelect(attrs={"id": "foo"}, choices=self.beatles)
    
  79.         html = """
    
  80.         <div id="foo">
    
  81.         <div>
    
  82.         <label for="foo_0">
    
  83.         <input checked type="radio" id="foo_0" value="J" name="beatle"> John</label>
    
  84.         </div>
    
  85.         <div><label for="foo_1">
    
  86.         <input type="radio" id="foo_1" value="P" name="beatle"> Paul</label></div>
    
  87.         <div><label for="foo_2">
    
  88.         <input type="radio" id="foo_2" value="G" name="beatle"> George</label></div>
    
  89.         <div><label for="foo_3">
    
  90.         <input type="radio" id="foo_3" value="R" name="beatle"> Ringo</label></div>
    
  91.         </div>
    
  92.         """
    
  93.         self.check_html(widget, "beatle", "J", html=html)
    
  94. 
    
  95.     def test_render_attrs(self):
    
  96.         """
    
  97.         Attributes provided at render-time are passed to the constituent
    
  98.         inputs.
    
  99.         """
    
  100.         html = """
    
  101.         <div id="bar">
    
  102.         <div>
    
  103.         <label for="bar_0">
    
  104.         <input checked type="radio" id="bar_0" value="J" name="beatle"> John</label>
    
  105.         </div>
    
  106.         <div><label for="bar_1">
    
  107.         <input type="radio" id="bar_1" value="P" name="beatle"> Paul</label></div>
    
  108.         <div><label for="bar_2">
    
  109.         <input type="radio" id="bar_2" value="G" name="beatle"> George</label></div>
    
  110.         <div><label for="bar_3">
    
  111.         <input type="radio" id="bar_3" value="R" name="beatle"> Ringo</label></div>
    
  112.         </div>
    
  113.         """
    
  114.         self.check_html(
    
  115.             self.widget(choices=self.beatles),
    
  116.             "beatle",
    
  117.             "J",
    
  118.             attrs={"id": "bar"},
    
  119.             html=html,
    
  120.         )
    
  121. 
    
  122.     def test_class_attrs(self):
    
  123.         """
    
  124.         The <div> in the multiple_input.html widget template include the class
    
  125.         attribute.
    
  126.         """
    
  127.         html = """
    
  128.         <div class="bar">
    
  129.         <div><label>
    
  130.         <input checked type="radio" class="bar" value="J" name="beatle"> John</label>
    
  131.         </div>
    
  132.         <div><label>
    
  133.         <input type="radio" class="bar" value="P" name="beatle"> Paul</label></div>
    
  134.         <div><label>
    
  135.         <input type="radio" class="bar" value="G" name="beatle"> George</label></div>
    
  136.         <div><label>
    
  137.         <input type="radio" class="bar" value="R" name="beatle"> Ringo</label></div>
    
  138.         </div>
    
  139.         """
    
  140.         self.check_html(
    
  141.             self.widget(choices=self.beatles),
    
  142.             "beatle",
    
  143.             "J",
    
  144.             attrs={"class": "bar"},
    
  145.             html=html,
    
  146.         )
    
  147. 
    
  148.     @override_settings(USE_THOUSAND_SEPARATOR=True)
    
  149.     def test_doesnt_localize_input_value(self):
    
  150.         choices = [
    
  151.             (1, "One"),
    
  152.             (1000, "One thousand"),
    
  153.             (1000000, "One million"),
    
  154.         ]
    
  155.         html = """
    
  156.         <div>
    
  157.         <div><label><input type="radio" name="number" value="1"> One</label></div>
    
  158.         <div><label>
    
  159.         <input type="radio" name="number" value="1000"> One thousand</label></div>
    
  160.         <div><label>
    
  161.         <input type="radio" name="number" value="1000000"> One million</label></div>
    
  162.         </div>
    
  163.         """
    
  164.         self.check_html(self.widget(choices=choices), "number", None, html=html)
    
  165. 
    
  166.         choices = [
    
  167.             (datetime.time(0, 0), "midnight"),
    
  168.             (datetime.time(12, 0), "noon"),
    
  169.         ]
    
  170.         html = """
    
  171.         <div>
    
  172.         <div><label>
    
  173.         <input type="radio" name="time" value="00:00:00"> midnight</label></div>
    
  174.         <div><label>
    
  175.         <input type="radio" name="time" value="12:00:00"> noon</label></div>
    
  176.         </div>
    
  177.         """
    
  178.         self.check_html(self.widget(choices=choices), "time", None, html=html)
    
  179. 
    
  180.     def test_render_as_subwidget(self):
    
  181.         """A RadioSelect as a subwidget of MultiWidget."""
    
  182.         choices = (("", "------"),) + self.beatles
    
  183.         self.check_html(
    
  184.             MultiWidget([self.widget(choices=choices)]),
    
  185.             "beatle",
    
  186.             ["J"],
    
  187.             html="""
    
  188.             <div>
    
  189.             <div><label>
    
  190.             <input type="radio" name="beatle_0" value=""> ------</label></div>
    
  191.             <div><label>
    
  192.             <input checked type="radio" name="beatle_0" value="J"> John</label></div>
    
  193.             <div><label>
    
  194.             <input type="radio" name="beatle_0" value="P"> Paul</label></div>
    
  195.             <div><label>
    
  196.             <input type="radio" name="beatle_0" value="G"> George</label></div>
    
  197.             <div><label>
    
  198.             <input type="radio" name="beatle_0" value="R"> Ringo</label></div>
    
  199.             </div>
    
  200.         """,
    
  201.         )
    
  202. 
    
  203.     def test_fieldset(self):
    
  204.         class TestForm(Form):
    
  205.             template_name = "forms_tests/use_fieldset.html"
    
  206.             field = ChoiceField(
    
  207.                 widget=self.widget, choices=self.beatles, required=False
    
  208.             )
    
  209. 
    
  210.         form = TestForm()
    
  211.         self.assertIs(self.widget.use_fieldset, True)
    
  212.         self.assertHTMLEqual(
    
  213.             '<div><fieldset><legend>Field:</legend><div id="id_field">'
    
  214.             '<div><label for="id_field_0">'
    
  215.             '<input type="radio" name="field" value="J" id="id_field_0"> John'
    
  216.             '</label></div><div><label for="id_field_1">'
    
  217.             '<input type="radio" name="field" value="P" id="id_field_1">Paul'
    
  218.             '</label></div><div><label for="id_field_2"><input type="radio" '
    
  219.             'name="field" value="G" id="id_field_2"> George</label></div>'
    
  220.             '<div><label for="id_field_3"><input type="radio" name="field" '
    
  221.             'value="R" id="id_field_3">Ringo</label></div></div></fieldset>'
    
  222.             "</div>",
    
  223.             form.render(),
    
  224.         )