1. from django.forms import Form, NullBooleanField, NullBooleanSelect
    
  2. from django.utils import translation
    
  3. 
    
  4. from .base import WidgetTest
    
  5. 
    
  6. 
    
  7. class NullBooleanSelectTest(WidgetTest):
    
  8.     widget = NullBooleanSelect()
    
  9. 
    
  10.     def test_render_true(self):
    
  11.         self.check_html(
    
  12.             self.widget,
    
  13.             "is_cool",
    
  14.             True,
    
  15.             html=(
    
  16.                 """<select name="is_cool">
    
  17.             <option value="unknown">Unknown</option>
    
  18.             <option value="true" selected>Yes</option>
    
  19.             <option value="false">No</option>
    
  20.             </select>"""
    
  21.             ),
    
  22.         )
    
  23. 
    
  24.     def test_render_false(self):
    
  25.         self.check_html(
    
  26.             self.widget,
    
  27.             "is_cool",
    
  28.             False,
    
  29.             html=(
    
  30.                 """<select name="is_cool">
    
  31.             <option value="unknown">Unknown</option>
    
  32.             <option value="true">Yes</option>
    
  33.             <option value="false" selected>No</option>
    
  34.             </select>"""
    
  35.             ),
    
  36.         )
    
  37. 
    
  38.     def test_render_none(self):
    
  39.         self.check_html(
    
  40.             self.widget,
    
  41.             "is_cool",
    
  42.             None,
    
  43.             html=(
    
  44.                 """<select name="is_cool">
    
  45.             <option value="unknown" selected>Unknown</option>
    
  46.             <option value="true">Yes</option>
    
  47.             <option value="false">No</option>
    
  48.             </select>"""
    
  49.             ),
    
  50.         )
    
  51. 
    
  52.     def test_render_value_unknown(self):
    
  53.         self.check_html(
    
  54.             self.widget,
    
  55.             "is_cool",
    
  56.             "unknown",
    
  57.             html=(
    
  58.                 """<select name="is_cool">
    
  59.             <option value="unknown" selected>Unknown</option>
    
  60.             <option value="true">Yes</option>
    
  61.             <option value="false">No</option>
    
  62.             </select>"""
    
  63.             ),
    
  64.         )
    
  65. 
    
  66.     def test_render_value_true(self):
    
  67.         self.check_html(
    
  68.             self.widget,
    
  69.             "is_cool",
    
  70.             "true",
    
  71.             html=(
    
  72.                 """<select name="is_cool">
    
  73.             <option value="unknown">Unknown</option>
    
  74.             <option value="true" selected>Yes</option>
    
  75.             <option value="false">No</option>
    
  76.             </select>"""
    
  77.             ),
    
  78.         )
    
  79. 
    
  80.     def test_render_value_false(self):
    
  81.         self.check_html(
    
  82.             self.widget,
    
  83.             "is_cool",
    
  84.             "false",
    
  85.             html=(
    
  86.                 """<select name="is_cool">
    
  87.             <option value="unknown">Unknown</option>
    
  88.             <option value="true">Yes</option>
    
  89.             <option value="false" selected>No</option>
    
  90.             </select>"""
    
  91.             ),
    
  92.         )
    
  93. 
    
  94.     def test_render_value_1(self):
    
  95.         self.check_html(
    
  96.             self.widget,
    
  97.             "is_cool",
    
  98.             "1",
    
  99.             html=(
    
  100.                 """<select name="is_cool">
    
  101.             <option value="unknown" selected>Unknown</option>
    
  102.             <option value="true">Yes</option>
    
  103.             <option value="false">No</option>
    
  104.             </select>"""
    
  105.             ),
    
  106.         )
    
  107. 
    
  108.     def test_render_value_2(self):
    
  109.         self.check_html(
    
  110.             self.widget,
    
  111.             "is_cool",
    
  112.             "2",
    
  113.             html=(
    
  114.                 """<select name="is_cool">
    
  115.             <option value="unknown">Unknown</option>
    
  116.             <option value="true" selected>Yes</option>
    
  117.             <option value="false">No</option>
    
  118.             </select>"""
    
  119.             ),
    
  120.         )
    
  121. 
    
  122.     def test_render_value_3(self):
    
  123.         self.check_html(
    
  124.             self.widget,
    
  125.             "is_cool",
    
  126.             "3",
    
  127.             html=(
    
  128.                 """<select name="is_cool">
    
  129.             <option value="unknown">Unknown</option>
    
  130.             <option value="true">Yes</option>
    
  131.             <option value="false" selected>No</option>
    
  132.             </select>"""
    
  133.             ),
    
  134.         )
    
  135. 
    
  136.     def test_l10n(self):
    
  137.         """
    
  138.         The NullBooleanSelect widget's options are lazily localized (#17190).
    
  139.         """
    
  140.         widget = NullBooleanSelect()
    
  141. 
    
  142.         with translation.override("de-at"):
    
  143.             self.check_html(
    
  144.                 widget,
    
  145.                 "id_bool",
    
  146.                 True,
    
  147.                 html=(
    
  148.                     """
    
  149.                 <select name="id_bool">
    
  150.                     <option value="unknown">Unbekannt</option>
    
  151.                     <option value="true" selected>Ja</option>
    
  152.                     <option value="false">Nein</option>
    
  153.                 </select>
    
  154.                 """
    
  155.                 ),
    
  156.             )
    
  157. 
    
  158.     def test_fieldset(self):
    
  159.         class TestForm(Form):
    
  160.             template_name = "forms_tests/use_fieldset.html"
    
  161.             field = NullBooleanField(widget=self.widget)
    
  162. 
    
  163.         form = TestForm()
    
  164.         self.assertIs(self.widget.use_fieldset, False)
    
  165.         self.assertHTMLEqual(
    
  166.             '<div><label for="id_field">Field:</label>'
    
  167.             '<select name="field" id="id_field">'
    
  168.             '<option value="unknown" selected>Unknown</option>'
    
  169.             '<option value="true">Yes</option>'
    
  170.             '<option value="false">No</option></select></div>',
    
  171.             form.render(),
    
  172.         )