aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorAider Ibragimov2015-02-19 18:03:44 +0300
committerAider Ibragimov2015-02-19 18:03:44 +0300
commitfe8d95f93e11d801d07c8852b12abb4f6b21e1e6 (patch)
tree34ba73bbf5e094c4d71363c58ba29eafac79037f /tests
parent3d85473edf847ba64aa499b336ca21f6b3d3c6b8 (diff)
downloaddjango-rest-framework-fe8d95f93e11d801d07c8852b12abb4f6b21e1e6.tar.bz2
Skip validation of NULL field only if it part of unique_together
Diffstat (limited to 'tests')
-rw-r--r--tests/test_validators.py54
1 files changed, 49 insertions, 5 deletions
diff --git a/tests/test_validators.py b/tests/test_validators.py
index 185febf8..c4c60b7f 100644
--- a/tests/test_validators.py
+++ b/tests/test_validators.py
@@ -83,11 +83,37 @@ class UniquenessTogetherModel(models.Model):
unique_together = ('race_name', 'position')
+class NullUniquenessTogetherModel(models.Model):
+ """
+ Used to ensure that null values are not included when checking
+ unique_together constraints.
+
+ Ignoring items which have a null in any of the validated fields is the same
+ behavior that database backends will use when they have the
+ unique_together constraint added.
+
+ Example case: a null position could indicate a non-finisher in the race,
+ there could be many non-finishers in a race, but all non-NULL
+ values *should* be unique against the given `race_name`.
+ """
+ date_of_birth = models.DateField(null=True) # Not part of the uniqueness constraint
+ race_name = models.CharField(max_length=100)
+ position = models.IntegerField(null=True)
+
+ class Meta:
+ unique_together = ('race_name', 'position')
+
+
class UniquenessTogetherSerializer(serializers.ModelSerializer):
class Meta:
model = UniquenessTogetherModel
+class NullUniquenessTogetherSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = NullUniquenessTogetherModel
+
+
class TestUniquenessTogetherValidation(TestCase):
def setUp(self):
self.instance = UniquenessTogetherModel.objects.create(
@@ -183,15 +209,33 @@ class TestUniquenessTogetherValidation(TestCase):
assert repr(serializer) == expected
def test_ignore_validation_for_null_fields(self):
- UniquenessTogetherModel.objects.create(
- race_name=None,
+ # None values that are on fields which are part of the uniqueness
+ # constraint cause the instance to ignore uniqueness validation.
+ NullUniquenessTogetherModel.objects.create(
+ date_of_birth=datetime.date(2000, 1, 1),
+ race_name='Paris Marathon',
position=None
)
- data = {'race_name': None, 'position': None}
- serializer = UniquenessTogetherSerializer(data=data)
-
+ data = {
+ 'date': datetime.date(2000, 1, 1),
+ 'race_name': 'Paris Marathon',
+ 'position': None
+ }
+ serializer = NullUniquenessTogetherSerializer(data=data)
assert serializer.is_valid()
+ def test_do_not_ignore_validation_for_null_fields(self):
+ # None values that are not on fields part of the uniqueness constraint
+ # do not cause the instance to skip validation.
+ NullUniquenessTogetherModel.objects.create(
+ date_of_birth=datetime.date(2000, 1, 1),
+ race_name='Paris Marathon',
+ position=1
+ )
+ data = {'date': None, 'race_name': 'Paris Marathon', 'position': 1}
+ serializer = NullUniquenessTogetherSerializer(data=data)
+ assert not serializer.is_valid()
+
# Tests for `UniqueForDateValidator`
# ----------------------------------