|
@@ -1,9 +1,9 @@
|
|
|
from __future__ import absolute_import
|
|
|
-from sentry.api.serializers.rest_framework import ListField
|
|
|
+from sentry.api.serializers.rest_framework import ListField, ValidationError
|
|
|
|
|
|
from rest_framework import serializers
|
|
|
|
|
|
-from sentry.testutils import TestCase
|
|
|
+from sentry.testutils import TestCase, APITestCase
|
|
|
|
|
|
|
|
|
class ListFieldTest(TestCase):
|
|
@@ -23,6 +23,12 @@ class ListFieldTest(TestCase):
|
|
|
serializer = DummySerializer(data={'list_field': [1, 2, 3]})
|
|
|
self.assert_success(serializer, {'list_field': [1, 2, 3]})
|
|
|
|
|
|
+ def test_simple_invalid(self):
|
|
|
+ class DummySerializer(serializers.Serializer):
|
|
|
+ list_field = ListField(child=serializers.IntegerField())
|
|
|
+ serializer = DummySerializer(data={'list_field': [1, 'q', 3]})
|
|
|
+ self.assert_unsuccessful(serializer, {'list_field': ['Enter a whole number.']})
|
|
|
+
|
|
|
def test_single_element_list(self):
|
|
|
class DummySerializer(serializers.Serializer):
|
|
|
list_field = ListField(child=serializers.IntegerField())
|
|
@@ -98,3 +104,89 @@ class ListFieldTest(TestCase):
|
|
|
list_field = ListField(child=serializers.IntegerField(), required=False)
|
|
|
serializer = DummySerializer(data={'list_field': [1, 2, 3]})
|
|
|
self.assert_success(serializer, {'list_field': [1, 2, 3]})
|
|
|
+
|
|
|
+
|
|
|
+class ListFieldMultipleValuesTest(APITestCase):
|
|
|
+ def setUp(self):
|
|
|
+ super(ListFieldMultipleValuesTest, self).setUp()
|
|
|
+
|
|
|
+ class DummyChildSerializer(serializers.Serializer):
|
|
|
+ age = serializers.IntegerField()
|
|
|
+
|
|
|
+ def validate_age(self, attrs, source):
|
|
|
+ age = attrs[source]
|
|
|
+ if age > 5:
|
|
|
+ raise ValidationError('age %d is not allowed' % age)
|
|
|
+ return attrs
|
|
|
+
|
|
|
+ class DummySerializer(serializers.Serializer):
|
|
|
+ list_field = ListField(
|
|
|
+ required=False,
|
|
|
+ child=DummyChildSerializer(required=False),
|
|
|
+ allow_null=True,
|
|
|
+ )
|
|
|
+ name = serializers.CharField()
|
|
|
+
|
|
|
+ self.serializer_class = DummySerializer
|
|
|
+
|
|
|
+ def test_simple(self):
|
|
|
+ serializer = self.serializer_class(data={
|
|
|
+ 'name': 'John',
|
|
|
+ 'list_field': [{'age': 200}]
|
|
|
+ })
|
|
|
+ assert not serializer.is_valid()
|
|
|
+
|
|
|
+ def test_incorrect_value_before_correct_value(self):
|
|
|
+ serializer = self.serializer_class(data={
|
|
|
+ 'name': 'John',
|
|
|
+ 'list_field': [
|
|
|
+ {'age': 200}, {'age': 3}
|
|
|
+ ]
|
|
|
+ })
|
|
|
+ assert not serializer.is_valid()
|
|
|
+ assert serializer._errors == {'list_field': [u'age: age 200 is not allowed']}
|
|
|
+
|
|
|
+ def test_correct_value_before_incorrect_value(self):
|
|
|
+ serializer = self.serializer_class(data={
|
|
|
+ 'name': 'John',
|
|
|
+ 'list_field': [
|
|
|
+ {'age': 3}, {'age': 200}
|
|
|
+ ]
|
|
|
+ })
|
|
|
+ assert not serializer.is_valid()
|
|
|
+ assert serializer._errors == {'list_field': [u'age: age 200 is not allowed']}
|
|
|
+
|
|
|
+ def test_mulitple_errors_in_child(self):
|
|
|
+ serializer = self.serializer_class(data={
|
|
|
+ 'name': 'John',
|
|
|
+ 'list_field': [
|
|
|
+ {'age': 3}, {'age': 200}, {'age': 5000}, {'age': 20}, {'age': 1}
|
|
|
+ ]
|
|
|
+ })
|
|
|
+ assert not serializer.is_valid()
|
|
|
+ assert serializer.fields['list_field']._child_errors == {
|
|
|
+ 'age': ['age 200 is not allowed', 'age 5000 is not allowed', 'age 20 is not allowed']}
|
|
|
+ assert serializer._errors == {'list_field': ['age: age 200 is not allowed']}
|
|
|
+
|
|
|
+ def test_clears_child_errors_between_use_empty_list(self):
|
|
|
+ serializer = self.serializer_class(data={
|
|
|
+ 'name': 'John',
|
|
|
+ 'list_field': [{'age': 200}]
|
|
|
+ })
|
|
|
+ assert not serializer.is_valid()
|
|
|
+ serializer = self.serializer_class(data={
|
|
|
+ 'name': 'John',
|
|
|
+ 'list_field': []
|
|
|
+ })
|
|
|
+ assert serializer.is_valid()
|
|
|
+
|
|
|
+ def test_clears_child_errors_between_use_not_supplied(self):
|
|
|
+ serializer = self.serializer_class(data={
|
|
|
+ 'name': 'John',
|
|
|
+ 'list_field': [{'age': 200}]
|
|
|
+ })
|
|
|
+ assert not serializer.is_valid()
|
|
|
+ serializer = self.serializer_class(data={
|
|
|
+ 'name': 'John',
|
|
|
+ })
|
|
|
+ assert serializer.is_valid()
|