#6558 test to prove readonly field default value does not exist on validated data

This commit is contained in:
Samiul Sk 2019-07-12 20:31:44 +05:30
parent 06bf10397f
commit 024e934795

View File

@ -36,7 +36,8 @@ class RelatedModel(models.Model):
class RelatedModelSerializer(serializers.ModelSerializer): class RelatedModelSerializer(serializers.ModelSerializer):
username = serializers.CharField(source='user.username', username = serializers.CharField(source='user.username',
validators=[UniqueValidator(queryset=UniquenessModel.objects.all(), lookup='iexact')]) # NOQA validators=[UniqueValidator(queryset=UniquenessModel.objects.all(),
lookup='iexact')]) # NOQA
class Meta: class Meta:
model = RelatedModel model = RelatedModel
@ -65,6 +66,14 @@ class UniquenessIntegerSerializer(serializers.Serializer):
integer = serializers.CharField(validators=[UniqueValidator(queryset=IntegerFieldModel.objects.all())]) integer = serializers.CharField(validators=[UniqueValidator(queryset=IntegerFieldModel.objects.all())])
class ReadonlyDefaultDateSerializer(serializers.Serializer):
"""
This serializer is to test if read_only field
default value passed to validated data
"""
published = serializers.DateField(read_only=True, default=datetime.date.today)
class TestUniquenessValidation(TestCase): class TestUniquenessValidation(TestCase):
def setUp(self): def setUp(self):
self.instance = UniquenessModel.objects.create(username='existing') self.instance = UniquenessModel.objects.create(username='existing')
@ -245,10 +254,12 @@ class TestUniquenessTogetherValidation(TestCase):
When model fields are not included in a serializer, then uniqueness When model fields are not included in a serializer, then uniqueness
validators should not be added for that field. validators should not be added for that field.
""" """
class ExcludedFieldSerializer(serializers.ModelSerializer): class ExcludedFieldSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = UniquenessTogetherModel model = UniquenessTogetherModel
fields = ('id', 'race_name',) fields = ('id', 'race_name',)
serializer = ExcludedFieldSerializer() serializer = ExcludedFieldSerializer()
expected = dedent(""" expected = dedent("""
ExcludedFieldSerializer(): ExcludedFieldSerializer():
@ -262,6 +273,7 @@ class TestUniquenessTogetherValidation(TestCase):
When serializer fields are read only, then uniqueness When serializer fields are read only, then uniqueness
validators should not be added for that field. validators should not be added for that field.
""" """
class ReadOnlyFieldSerializer(serializers.ModelSerializer): class ReadOnlyFieldSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = UniquenessTogetherModel model = UniquenessTogetherModel
@ -281,6 +293,7 @@ class TestUniquenessTogetherValidation(TestCase):
""" """
Special case of read_only + default DOES validate unique_together. Special case of read_only + default DOES validate unique_together.
""" """
class ReadOnlyFieldWithDefaultSerializer(serializers.ModelSerializer): class ReadOnlyFieldWithDefaultSerializer(serializers.ModelSerializer):
race_name = serializers.CharField(max_length=100, read_only=True, default='example') race_name = serializers.CharField(max_length=100, read_only=True, default='example')
@ -305,6 +318,7 @@ class TestUniquenessTogetherValidation(TestCase):
""" """
Ensure validators can be explicitly removed.. Ensure validators can be explicitly removed..
""" """
class NoValidatorsSerializer(serializers.ModelSerializer): class NoValidatorsSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = UniquenessTogetherModel model = UniquenessTogetherModel
@ -353,6 +367,7 @@ class TestUniquenessTogetherValidation(TestCase):
filter_queryset should add value from existing instance attribute filter_queryset should add value from existing instance attribute
if it is not provided in attributes dict if it is not provided in attributes dict
""" """
class MockQueryset: class MockQueryset:
def filter(self, **kwargs): def filter(self, **kwargs):
self.called_with = kwargs self.called_with = kwargs
@ -435,6 +450,7 @@ class TestUniquenessForDateValidation(TestCase):
'published': datetime.date(2000, 1, 1) 'published': datetime.date(2000, 1, 1)
} }
# Tests for `UniqueForMonthValidator` # Tests for `UniqueForMonthValidator`
# ---------------------------------- # ----------------------------------
@ -474,6 +490,7 @@ class UniqueForMonthTests(TestCase):
'published': datetime.date(2017, 2, 1) 'published': datetime.date(2017, 2, 1)
} }
# Tests for `UniqueForYearValidator` # Tests for `UniqueForYearValidator`
# ---------------------------------- # ----------------------------------
@ -555,24 +572,35 @@ class TestHiddenFieldUniquenessForDateValidation(TestCase):
assert repr(serializer) == expected assert repr(serializer) == expected
class TestReadOnlyDefaultValidation(TestCase):
# converting validated data to dict from ordered dict
def test_read_only_default_donot_exists_on_validated_data(self):
serializer = ReadonlyDefaultDateSerializer(data={})
self.assertTrue(serializer.is_valid())
self.assertDictEqual(dict(serializer.validated_data), {})
class ValidatorsTests(TestCase): class ValidatorsTests(TestCase):
def test_qs_exists_handles_type_error(self): def test_qs_exists_handles_type_error(self):
class TypeErrorQueryset: class TypeErrorQueryset:
def exists(self): def exists(self):
raise TypeError raise TypeError
assert qs_exists(TypeErrorQueryset()) is False assert qs_exists(TypeErrorQueryset()) is False
def test_qs_exists_handles_value_error(self): def test_qs_exists_handles_value_error(self):
class ValueErrorQueryset: class ValueErrorQueryset:
def exists(self): def exists(self):
raise ValueError raise ValueError
assert qs_exists(ValueErrorQueryset()) is False assert qs_exists(ValueErrorQueryset()) is False
def test_qs_exists_handles_data_error(self): def test_qs_exists_handles_data_error(self):
class DataErrorQueryset: class DataErrorQueryset:
def exists(self): def exists(self):
raise DataError raise DataError
assert qs_exists(DataErrorQueryset()) is False assert qs_exists(DataErrorQueryset()) is False
def test_validator_raises_error_if_not_all_fields_are_provided(self): def test_validator_raises_error_if_not_all_fields_are_provided(self):