@@ -317,7 +317,8 @@ def test_validate_list(self):
317
317
318
318
class TestStarredSource :
319
319
"""
320
- Tests for `source='*'` argument, which is used for nested representations.
320
+ Tests for `source='*'` argument, which is often used for complex field or
321
+ nested representations.
321
322
322
323
For example:
323
324
@@ -337,11 +338,28 @@ class NestedSerializer2(serializers.Serializer):
337
338
c = serializers .IntegerField ()
338
339
d = serializers .IntegerField ()
339
340
340
- class TestSerializer (serializers .Serializer ):
341
+ class NestedBaseSerializer (serializers .Serializer ):
341
342
nested1 = NestedSerializer1 (source = '*' )
342
343
nested2 = NestedSerializer2 (source = '*' )
343
344
344
- self .Serializer = TestSerializer
345
+ # nullable nested serializer testing
346
+ class NullableNestedSerializer (serializers .Serializer ):
347
+ nested = NestedSerializer1 (source = '*' , allow_null = True )
348
+
349
+ # nullable custom field testing
350
+ class CustomField (serializers .Field ):
351
+ def to_representation (self , instance ):
352
+ return getattr (instance , 'foo' , None )
353
+
354
+ def to_internal_value (self , data ):
355
+ return {'foo' : data }
356
+
357
+ class NullableFieldSerializer (serializers .Serializer ):
358
+ field = CustomField (source = '*' , allow_null = True )
359
+
360
+ self .Serializer = NestedBaseSerializer
361
+ self .NullableNestedSerializer = NullableNestedSerializer
362
+ self .NullableFieldSerializer = NullableFieldSerializer
345
363
346
364
def test_nested_validate (self ):
347
365
"""
@@ -356,6 +374,12 @@ def test_nested_validate(self):
356
374
'd' : 4
357
375
}
358
376
377
+ def test_nested_null_validate (self ):
378
+ serializer = self .NullableNestedSerializer (data = {'nested' : None })
379
+
380
+ # validation should fail (but not error) since nested fields are required
381
+ assert not serializer .is_valid ()
382
+
359
383
def test_nested_serialize (self ):
360
384
"""
361
385
An object can be serialized into a nested representation.
@@ -364,6 +388,20 @@ def test_nested_serialize(self):
364
388
serializer = self .Serializer (instance )
365
389
assert serializer .data == self .data
366
390
391
+ def test_field_validate (self ):
392
+ serializer = self .NullableFieldSerializer (data = {'field' : 'bar' })
393
+
394
+ # validation should pass since no internal validation
395
+ assert serializer .is_valid ()
396
+ assert serializer .validated_data == {'foo' : 'bar' }
397
+
398
+ def test_field_null_validate (self ):
399
+ serializer = self .NullableFieldSerializer (data = {'field' : None })
400
+
401
+ # validation should pass since no internal validation
402
+ assert serializer .is_valid ()
403
+ assert serializer .validated_data == {'foo' : None }
404
+
367
405
368
406
class TestIncorrectlyConfigured :
369
407
def test_incorrect_field_name (self ):
0 commit comments