From d53ff3f391120aba893e301b95bf6d148208cbb6 Mon Sep 17 00:00:00 2001 From: Peter Coles Date: Sun, 5 Apr 2015 16:59:07 -0400 Subject: [PATCH 1/2] unit test for required false nested serializers --- tests/test_serializer_nested.py | 67 +++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/tests/test_serializer_nested.py b/tests/test_serializer_nested.py index f5e4b26ad..103f2588d 100644 --- a/tests/test_serializer_nested.py +++ b/tests/test_serializer_nested.py @@ -38,3 +38,70 @@ class TestNestedSerializer: } serializer = self.Serializer() assert serializer.data == expected_data + + +class TestRequiredFalseNestedSerializer: + def setup(self): + class NestedSerializer(serializers.Serializer): + one = serializers.IntegerField(max_value=10) + + class TestSerializer(serializers.Serializer): + nested = NestedSerializer(required=False) + + self.Serializer = TestSerializer + + class FakeMultiDict(dict): + """ + Use this to fake a `format="multipart"` request, because + `utils.is_html_input()` returns `True` when the dict object has + an attribute of "getlist". + """ + def getlist(self, value, default=None): + if value in self: + return [self[value]] + else: + return [] if default is None else default + + self.FakeMultiDict = FakeMultiDict + + def test_nested_json_validate(self): + input_data = { + 'nested': { + 'one': '1', + }, + } + expected_data = { + 'nested': { + 'one': 1, + }, + } + serializer = self.Serializer(data=input_data) + assert serializer.is_valid() + assert serializer.validated_data == expected_data + + def test_missing_nested_json_validate(self): + input_data = {} + expected_data = {} + serializer = self.Serializer(data=input_data) + assert serializer.is_valid() + assert serializer.validated_data == expected_data + + def test_nested_multipart_validate(self): + input_data = self.FakeMultiDict(**{ + 'nested.one': '1', + }) + expected_data = { + 'nested': { + 'one': 1, + }, + } + serializer = self.Serializer(data=input_data) + assert serializer.is_valid() + assert serializer.validated_data == expected_data + + def test_missing_nested_multipart_validate(self): + input_data = self.FakeMultiDict() + expected_data = {} + serializer = self.Serializer(data=input_data) + assert serializer.is_valid() + assert serializer.validated_data == expected_data From 022224138383a0171d6a80fed59c02e55509fd2a Mon Sep 17 00:00:00 2001 From: Peter Coles Date: Sun, 5 Apr 2015 17:02:41 -0400 Subject: [PATCH 2/2] multipart required False fixes to Serializer, ListSerialier, DictField, ListField --- rest_framework/fields.py | 4 ++-- rest_framework/serializers.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index bea773001..5cadb522a 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1171,7 +1171,7 @@ class ListField(Field): # We override the default field access in order to support # lists in HTML forms. if html.is_html_input(dictionary): - return html.parse_html_list(dictionary, prefix=self.field_name) + return html.parse_html_list(dictionary, prefix=self.field_name) or empty return dictionary.get(self.field_name, empty) def to_internal_value(self, data): @@ -1208,7 +1208,7 @@ class DictField(Field): # We override the default field access in order to support # dictionaries in HTML forms. if html.is_html_input(dictionary): - return html.parse_html_dict(dictionary, prefix=self.field_name) + return html.parse_html_dict(dictionary, prefix=self.field_name) or empty return dictionary.get(self.field_name, empty) def to_internal_value(self, data): diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 2eef6eeb5..fb0885dff 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -351,7 +351,7 @@ class Serializer(BaseSerializer): # We override the default field access in order to support # nested HTML forms. if html.is_html_input(dictionary): - return html.parse_html_dict(dictionary, prefix=self.field_name) + return html.parse_html_dict(dictionary, prefix=self.field_name) or empty return dictionary.get(self.field_name, empty) def run_validation(self, data=empty): @@ -502,7 +502,7 @@ class ListSerializer(BaseSerializer): # We override the default field access in order to support # lists in HTML forms. if html.is_html_input(dictionary): - return html.parse_html_list(dictionary, prefix=self.field_name) + return html.parse_html_list(dictionary, prefix=self.field_name) or empty return dictionary.get(self.field_name, empty) def run_validation(self, data=empty):