diff options
| author | Tom Christie | 2014-09-29 11:23:02 +0100 | 
|---|---|---|
| committer | Tom Christie | 2014-09-29 11:23:02 +0100 | 
| commit | 9805a085fb115785f272489dc24b51ba6f8e6329 (patch) | |
| tree | a824d9908fc0050636d3a8d962d416a82fd83989 /tests/test_validators.py | |
| parent | 43fd5a873051c99600386c1fdc9fa368edeb6eda (diff) | |
| download | django-rest-framework-9805a085fb115785f272489dc24b51ba6f8e6329.tar.bz2 | |
UniqueTogetherValidator
Diffstat (limited to 'tests/test_validators.py')
| -rw-r--r-- | tests/test_validators.py | 129 | 
1 files changed, 122 insertions, 7 deletions
| diff --git a/tests/test_validators.py b/tests/test_validators.py index a1366a1a..c35ecb51 100644 --- a/tests/test_validators.py +++ b/tests/test_validators.py @@ -3,33 +3,148 @@ from django.test import TestCase  from rest_framework import serializers -class ExampleModel(models.Model): +def dedent(blocktext): +    return '\n'.join([line[12:] for line in blocktext.splitlines()[1:-1]]) + + +# Tests for `UniqueValidator` +# --------------------------- + +class UniquenessModel(models.Model):      username = models.CharField(unique=True, max_length=100) -class ExampleSerializer(serializers.ModelSerializer): +class UniquenessSerializer(serializers.ModelSerializer):      class Meta: -        model = ExampleModel +        model = UniquenessModel  class TestUniquenessValidation(TestCase):      def setUp(self): -        self.instance = ExampleModel.objects.create(username='existing') +        self.instance = UniquenessModel.objects.create(username='existing') + +    def test_repr(self): +        serializer = UniquenessSerializer() +        expected = dedent(""" +            UniquenessSerializer(): +                id = IntegerField(label='ID', read_only=True) +                username = CharField(max_length=100, validators=[<UniqueValidator(queryset=UniquenessModel.objects.all())>]) +        """) +        assert repr(serializer) == expected      def test_is_not_unique(self):          data = {'username': 'existing'} -        serializer = ExampleSerializer(data=data) +        serializer = UniquenessSerializer(data=data)          assert not serializer.is_valid()          assert serializer.errors == {'username': ['This field must be unique.']}      def test_is_unique(self):          data = {'username': 'other'} -        serializer = ExampleSerializer(data=data) +        serializer = UniquenessSerializer(data=data)          assert serializer.is_valid()          assert serializer.validated_data == {'username': 'other'}      def test_updated_instance_excluded(self):          data = {'username': 'existing'} -        serializer = ExampleSerializer(self.instance, data=data) +        serializer = UniquenessSerializer(self.instance, data=data)          assert serializer.is_valid()          assert serializer.validated_data == {'username': 'existing'} + + +# Tests for `UniqueTogetherValidator` +# ----------------------------------- + +class UniquenessTogetherModel(models.Model): +    race_name = models.CharField(max_length=100) +    position = models.IntegerField() + +    class Meta: +        unique_together = ('race_name', 'position') + + +class UniquenessTogetherSerializer(serializers.ModelSerializer): +    class Meta: +        model = UniquenessTogetherModel + + +class TestUniquenessTogetherValidation(TestCase): +    def setUp(self): +        self.instance = UniquenessTogetherModel.objects.create( +            race_name='example', +            position=1 +        ) +        UniquenessTogetherModel.objects.create( +            race_name='example', +            position=2 +        ) +        UniquenessTogetherModel.objects.create( +            race_name='other', +            position=1 +        ) + +    def test_repr(self): +        serializer = UniquenessTogetherSerializer() +        expected = dedent(""" +            UniquenessTogetherSerializer(validators=[<UniqueTogetherValidator(queryset=UniquenessTogetherModel.objects.all(), fields=('race_name', 'position'))>]): +                id = IntegerField(label='ID', read_only=True) +                race_name = CharField(max_length=100) +                position = IntegerField() +        """) +        assert repr(serializer) == expected + +    def test_is_not_unique_together(self): +        """ +        Failing unique together validation should result in non field errors. +        """ +        data = {'race_name': 'example', 'position': 2} +        serializer = UniquenessTogetherSerializer(data=data) +        print serializer.validators +        assert not serializer.is_valid() +        assert serializer.errors == { +            'non_field_errors': [ +                'The fields race_name, position must make a unique set.' +            ] +        } + +    def test_is_unique_together(self): +        """ +        In a unique together validation, one field may be non-unique +        so long as the set as a whole is unique. +        """ +        data = {'race_name': 'other', 'position': 2} +        serializer = UniquenessTogetherSerializer(data=data) +        assert serializer.is_valid() +        assert serializer.validated_data == { +            'race_name': 'other', +            'position': 2 +        } + +    def test_updated_instance_excluded_from_unique_together(self): +        """ +        When performing an update, the existing instance does not count +        as a match against uniqueness. +        """ +        data = {'race_name': 'example', 'position': 1} +        serializer = UniquenessTogetherSerializer(self.instance, data=data) +        assert serializer.is_valid() +        assert serializer.validated_data == { +            'race_name': 'example', +            'position': 1 +        } + +    def test_ignore_exlcuded_fields(self): +        """ +        When model fields are not included in a serializer, then uniqueness +        validtors should not be added for that field. +        """ +        class ExcludedFieldSerializer(serializers.ModelSerializer): +            class Meta: +                model = UniquenessTogetherModel +                fields = ('id', 'race_name',) +        serializer = ExcludedFieldSerializer() +        expected = dedent(""" +            ExcludedFieldSerializer(): +                id = IntegerField(label='ID', read_only=True) +                race_name = CharField(max_length=100) +        """) +        assert repr(serializer) == expected | 
