1
+ import pytest
1
2
from django .http import QueryDict
2
3
3
4
from rest_framework import serializers
@@ -59,11 +60,13 @@ class ExampleSerializer(serializers.Serializer):
59
60
def test_as_form_fields (self ):
60
61
class ExampleSerializer (serializers .Serializer ):
61
62
bool_field = serializers .BooleanField ()
63
+ nullable_bool_field = serializers .BooleanField (allow_null = True )
62
64
null_field = serializers .IntegerField (allow_null = True )
63
65
64
- serializer = ExampleSerializer (data = {'bool_field' : False , 'null_field' : None })
66
+ serializer = ExampleSerializer (data = {'bool_field' : False , 'nullable_bool_field' : False , ' null_field' : None })
65
67
assert serializer .is_valid ()
66
68
assert serializer ['bool_field' ].as_form_field ().value == ''
69
+ assert serializer ['nullable_bool_field' ].as_form_field ().value is False
67
70
assert serializer ['null_field' ].as_form_field ().value == ''
68
71
69
72
def test_rendering_boolean_field (self ):
@@ -90,6 +93,55 @@ class ExampleSerializer(serializers.Serializer):
90
93
rendered_packed = '' .join (rendered .split ())
91
94
assert rendered_packed == expected_packed
92
95
96
+ @pytest .mark .parametrize ('bool_field_value' , [True , False , None ])
97
+ def test_rendering_nullable_boolean_field (self , bool_field_value ):
98
+ from rest_framework .renderers import HTMLFormRenderer
99
+
100
+ class ExampleSerializer (serializers .Serializer ):
101
+ bool_field = serializers .BooleanField (
102
+ allow_null = True ,
103
+ style = {'base_template' : 'select_boolean.html' , 'template_pack' : 'rest_framework/vertical' })
104
+
105
+ serializer = ExampleSerializer (data = {'bool_field' : bool_field_value })
106
+ assert serializer .is_valid ()
107
+ renderer = HTMLFormRenderer ()
108
+ rendered = renderer .render_field (serializer ['bool_field' ], {})
109
+ if bool_field_value is True :
110
+ expected_packed = (
111
+ '<divclass="form-group">'
112
+ '<label>Boolfield</label>'
113
+ '<selectclass="form-control"name="bool_field">'
114
+ '<optionvalue="">Unknown</option>'
115
+ '<optionvalue="True"selected>Yes</option>'
116
+ '<optionvalue="False">No</option>'
117
+ '</select>'
118
+ '</div>'
119
+ )
120
+ elif bool_field_value is False :
121
+ expected_packed = (
122
+ '<divclass="form-group">'
123
+ '<label>Boolfield</label>'
124
+ '<selectclass="form-control"name="bool_field">'
125
+ '<optionvalue="">Unknown</option>'
126
+ '<optionvalue="True">Yes</option>'
127
+ '<optionvalue="False"selected>No</option>'
128
+ '</select>'
129
+ '</div>'
130
+ )
131
+ elif bool_field_value is None :
132
+ expected_packed = (
133
+ '<divclass="form-group">'
134
+ '<label>Boolfield</label>'
135
+ '<selectclass="form-control"name="bool_field">'
136
+ '<optionvalue=""selected>Unknown</option>'
137
+ '<optionvalue="True">Yes</option>'
138
+ '<optionvalue="False">No</option>'
139
+ '</select>'
140
+ '</div>'
141
+ )
142
+ rendered_packed = '' .join (rendered .split ())
143
+ assert rendered_packed == expected_packed
144
+
93
145
94
146
class CustomJSONField (serializers .JSONField ):
95
147
pass
@@ -120,6 +172,7 @@ class ExampleSerializer(serializers.Serializer):
120
172
def test_as_form_fields (self ):
121
173
class Nested (serializers .Serializer ):
122
174
bool_field = serializers .BooleanField ()
175
+ nullable_bool_field = serializers .BooleanField (allow_null = True )
123
176
null_field = serializers .IntegerField (allow_null = True )
124
177
json_field = serializers .JSONField ()
125
178
custom_json_field = CustomJSONField ()
@@ -129,12 +182,13 @@ class ExampleSerializer(serializers.Serializer):
129
182
130
183
serializer = ExampleSerializer (
131
184
data = {'nested' : {
132
- 'bool_field' : False , 'null_field' : None ,
185
+ 'bool_field' : False , 'nullable_bool_field' : False , ' null_field' : None ,
133
186
'json_field' : {'bool_item' : True , 'number' : 1 , 'text_item' : 'text' },
134
187
'custom_json_field' : {'bool_item' : True , 'number' : 1 , 'text_item' : 'text' },
135
188
}})
136
189
assert serializer .is_valid ()
137
190
assert serializer ['nested' ]['bool_field' ].as_form_field ().value == ''
191
+ assert serializer ['nested' ]['nullable_bool_field' ].as_form_field ().value is False
138
192
assert serializer ['nested' ]['null_field' ].as_form_field ().value == ''
139
193
assert serializer ['nested' ]['json_field' ].as_form_field ().value == '''{
140
194
"bool_item": true,
0 commit comments