Skip to content

Commit 72df66f

Browse files
author
Boris Pleshakov
committed
requested changes
1 parent fdc8166 commit 72df66f

File tree

4 files changed

+273
-270
lines changed

4 files changed

+273
-270
lines changed

example/tests/test_errors.py

+218
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
import pytest
2+
from django.conf.urls import url
3+
from django.test import override_settings
4+
from django.urls import reverse
5+
6+
from example.models import Blog
7+
from rest_framework_json_api import serializers
8+
from rest_framework import views
9+
10+
11+
# serializers
12+
class CommentAttachmentSerializer(serializers.Serializer):
13+
data = serializers.CharField(allow_null=False, required=True)
14+
15+
def validate_data(self, value):
16+
if value and len(value) < 10:
17+
raise serializers.ValidationError('Too short data')
18+
19+
20+
class CommentSerializer(serializers.Serializer):
21+
attachments = CommentAttachmentSerializer(many=True, required=False)
22+
attachment = CommentAttachmentSerializer(required=False)
23+
body = serializers.CharField(allow_null=False, required=True)
24+
25+
26+
class EntrySerializer(serializers.Serializer):
27+
blog = serializers.IntegerField()
28+
comments = CommentSerializer(many=True, required=False)
29+
comment = CommentSerializer(required=False)
30+
headline = serializers.CharField(allow_null=True, required=True)
31+
body_text = serializers.CharField()
32+
33+
def validate(self, attrs):
34+
body_text = attrs['body_text']
35+
if len(body_text) < 5:
36+
raise serializers.ValidationError({'body_text': 'Too short'})
37+
38+
39+
# view
40+
class DummyTestView(views.APIView):
41+
serializer_class = EntrySerializer
42+
resource_name = 'entries'
43+
44+
def post(self, request, *args, **kwargs):
45+
serializer = self.serializer_class(data=request.data)
46+
serializer.is_valid(raise_exception=True)
47+
48+
49+
urlpatterns = [
50+
url(r'^entries-nested/$', DummyTestView.as_view(),
51+
name='entries-nested-list')
52+
]
53+
54+
55+
@pytest.fixture(scope='function')
56+
def some_blog(db):
57+
return Blog.objects.create(name='Some Blog', tagline="It's a blog")
58+
59+
60+
def perform_error_test(client, data, expected_pointer):
61+
with override_settings(
62+
JSON_API_SERIALIZE_NESTED_SERIALIZERS_AS_ATTRIBUTE=True,
63+
ROOT_URLCONF=__name__
64+
):
65+
url = reverse('entries-nested-list')
66+
response = client.post(url, data=data)
67+
68+
errors = response.data
69+
70+
assert len(errors) == 1
71+
assert errors[0]['source']['pointer'] == expected_pointer
72+
73+
74+
def test_first_level_attribute_error(client, some_blog):
75+
data = {
76+
'data': {
77+
'type': 'entries',
78+
'attributes': {
79+
'blog': some_blog.pk,
80+
'body_text': 'body_text',
81+
}
82+
}
83+
}
84+
perform_error_test(client, data, '/data/attributes/headline')
85+
86+
87+
def test_first_level_custom_attribute_error(client, some_blog):
88+
data = {
89+
'data': {
90+
'type': 'entries',
91+
'attributes': {
92+
'blog': some_blog.pk,
93+
'body_text': 'body',
94+
'headline': 'headline'
95+
}
96+
}
97+
}
98+
with override_settings(JSON_API_FORMAT_FIELD_NAMES='underscore'):
99+
perform_error_test(client, data, '/data/attributes/body_text')
100+
101+
102+
def test_second_level_array_error(client, some_blog):
103+
data = {
104+
'data': {
105+
'type': 'entries',
106+
'attributes': {
107+
'blog': some_blog.pk,
108+
'body_text': 'body_text',
109+
'headline': 'headline',
110+
'comments': [
111+
{
112+
}
113+
]
114+
}
115+
}
116+
}
117+
118+
perform_error_test(client, data, '/data/attributes/comments/0/body')
119+
120+
121+
def test_second_level_dict_error(client, some_blog):
122+
data = {
123+
'data': {
124+
'type': 'entries',
125+
'attributes': {
126+
'blog': some_blog.pk,
127+
'body_text': 'body_text',
128+
'headline': 'headline',
129+
'comment': {}
130+
}
131+
}
132+
}
133+
134+
perform_error_test(client, data, '/data/attributes/comment/body')
135+
136+
137+
def test_third_level_array_error(client, some_blog):
138+
data = {
139+
'data': {
140+
'type': 'entries',
141+
'attributes': {
142+
'blog': some_blog.pk,
143+
'body_text': 'body_text',
144+
'headline': 'headline',
145+
'comments': [
146+
{
147+
'body': 'test comment',
148+
'attachments': [
149+
{
150+
}
151+
]
152+
}
153+
]
154+
}
155+
}
156+
}
157+
158+
perform_error_test(client, data, '/data/attributes/comments/0/attachments/0/data')
159+
160+
161+
def test_third_level_custom_array_error(client, some_blog):
162+
data = {
163+
'data': {
164+
'type': 'entries',
165+
'attributes': {
166+
'blog': some_blog.pk,
167+
'body_text': 'body_text',
168+
'headline': 'headline',
169+
'comments': [
170+
{
171+
'body': 'test comment',
172+
'attachments': [
173+
{
174+
'data': 'text'
175+
}
176+
]
177+
}
178+
]
179+
}
180+
}
181+
}
182+
183+
perform_error_test(client, data, '/data/attributes/comments/0/attachments/0/data')
184+
185+
186+
def test_third_level_dict_error(client, some_blog):
187+
data = {
188+
'data': {
189+
'type': 'entries',
190+
'attributes': {
191+
'blog': some_blog.pk,
192+
'body_text': 'body_text',
193+
'headline': 'headline',
194+
'comments': [
195+
{
196+
'body': 'test comment',
197+
'attachment': {}
198+
}
199+
]
200+
}
201+
}
202+
}
203+
204+
perform_error_test(client, data, '/data/attributes/comments/0/attachment/data')
205+
206+
207+
@pytest.mark.filterwarning('default::DeprecationWarning:rest_framework_json_api.serializers')
208+
def test_deprecation_warning(recwarn):
209+
class DummyNestedSerializer(serializers.Serializer):
210+
field = serializers.CharField()
211+
212+
class DummySerializer(serializers.Serializer):
213+
nested = DummyNestedSerializer(many=True)
214+
215+
assert len(recwarn) == 1
216+
warning = recwarn.pop(DeprecationWarning)
217+
assert warning
218+
assert str(warning.message).startswith('Rendering')

0 commit comments

Comments
 (0)