Skip to content

Commit ebc5e4f

Browse files
committed
Tests for blog, create, update and delete
1 parent 71b6d77 commit ebc5e4f

File tree

4 files changed

+94
-34
lines changed

4 files changed

+94
-34
lines changed

example/serializers.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,9 @@ def get_root_meta(self, resource, many):
7777

7878
class Meta:
7979
model = Blog
80-
fields = ('name', 'url', 'tags')
80+
fields = ('name', 'url', 'tags', 'copyright')
8181
read_only_fields = ('tags',)
82+
meta_fields = ('copyright',)
8283

8384

8485
class EntrySerializer(serializers.ModelSerializer):

example/tests/unit/test_default_drf_serializers.py

+89-26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import pytest
2-
import factory
32

43
import json
54

@@ -9,7 +8,7 @@
98

109
from rest_framework_json_api.renderers import JSONRenderer
1110

12-
from example.models import Comment, Entry
11+
from example.models import Comment, Entry, Blog
1312

1413

1514
# serializers
@@ -80,10 +79,51 @@ def test_render_format_keys(settings):
8079
assert result['data']['attributes']['json-field'] == {'json-key': 'JsonValue'}
8180

8281

82+
@pytest.mark.django_db
83+
def test_blog_create(client):
84+
85+
url = reverse('drf-entry-blog-list')
86+
name = "Dummy Name"
87+
88+
request_data = {
89+
'data': {
90+
'attributes': {'name': name},
91+
'type': 'blogs'
92+
},
93+
}
94+
95+
resp = client.post(url, request_data)
96+
97+
# look for created blog in database
98+
blog = Blog.objects.filter(name=name)
99+
100+
# check if blog exists in database
101+
assert blog.exists()
102+
assert blog.count() == 1
103+
104+
# get created blog from database
105+
blog = blog[0]
106+
107+
expected = {
108+
'data': {
109+
'attributes': {'name': blog.name},
110+
'id': '{}'.format(blog.id),
111+
'links': {'self': 'http://testserver/blogs/{}'.format(blog.id)},
112+
'meta': {'copyright': 2018},
113+
'relationships': {'tags': {'data': []}},
114+
'type': 'blogs'
115+
},
116+
'meta': {'apiDocs': '/docs/api/blogs'}
117+
}
118+
119+
assert resp.status_code == 201
120+
assert resp.json() == expected
121+
122+
83123
@pytest.mark.django_db
84124
def test_get_object_gives_correct_blog(client, blog, entry):
85125

86-
url = reverse('drf-entry-blog', kwargs={'entry_pk': entry.id})
126+
url = reverse('drf-entry-blog-detail', kwargs={'entry_pk': entry.id})
87127
resp = client.get(url)
88128
expected = {
89129
'data': {
@@ -100,26 +140,49 @@ def test_get_object_gives_correct_blog(client, blog, entry):
100140
assert got == expected
101141

102142

103-
# @pytest.mark.django_db
104-
# def test_get_object_updates_correct_blog(client, blog, entry):
105-
#
106-
# url = reverse('drf-entry-blog', kwargs={'entry_pk': entry.id})
107-
# new_name = blog.name + " update"
108-
# assert not new_name == blog.name
109-
#
110-
# resp = client.patch(url, {"name": new_name})
111-
# print(resp)
112-
#
113-
# expected = {
114-
# 'data': {
115-
# 'attributes': {'name': new_name},
116-
# 'id': '{}'.format(blog.id),
117-
# 'links': {'self': 'http://testserver/blogs/{}'.format(blog.id)},
118-
# 'meta': {'copyright': 2018},
119-
# 'relationships': {'tags': {'data': []}},
120-
# 'type': 'blogs'
121-
# },
122-
# 'meta': {'apiDocs': '/docs/api/blogs'}
123-
# }
124-
# got = resp.json()
125-
# assert got == expected
143+
@pytest.mark.django_db
144+
def test_get_object_patches_correct_blog(client, blog, entry):
145+
146+
url = reverse('drf-entry-blog-detail', kwargs={'entry_pk': entry.id})
147+
new_name = blog.name + " update"
148+
assert not new_name == blog.name
149+
150+
request_data = {
151+
'data': {
152+
'attributes': {'name': new_name},
153+
'id': '{}'.format(blog.id),
154+
'links': {'self': 'http://testserver/blogs/{}'.format(blog.id)},
155+
'meta': {'copyright': 2018},
156+
'relationships': {'tags': {'data': []}},
157+
'type': 'blogs'
158+
},
159+
'meta': {'apiDocs': '/docs/api/blogs'}
160+
}
161+
162+
resp = client.patch(url, data=request_data)
163+
164+
assert resp.status_code == 200
165+
166+
expected = {
167+
'data': {
168+
'attributes': {'name': new_name},
169+
'id': '{}'.format(blog.id),
170+
'links': {'self': 'http://testserver/blogs/{}'.format(blog.id)},
171+
'meta': {'copyright': 2018},
172+
'relationships': {'tags': {'data': []}},
173+
'type': 'blogs'
174+
},
175+
'meta': {'apiDocs': '/docs/api/blogs'}
176+
}
177+
got = resp.json()
178+
assert got == expected
179+
180+
181+
@pytest.mark.django_db
182+
def test_get_object_deletes_correct_blog(client, blog, entry):
183+
184+
url = reverse('drf-entry-blog-detail', kwargs={'entry_pk': entry.id})
185+
186+
resp = client.delete(url)
187+
188+
assert resp.status_code == 204

example/urls_test.py

+1-6
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
router.register(r'blogs', BlogViewSet)
2525
# router to test default DRF functionalities
26-
router.register(r'blogs', DRFBlogViewSet)
26+
router.register(r'drf-blogs', DRFBlogViewSet, 'drf-entry-blog')
2727
router.register(r'entries', EntryViewSet)
2828
# these "flavors" of entries are used for various tests:
2929
router.register(r'nopage-entries', NonPaginatedEntryViewSet, 'nopage-entry')
@@ -50,11 +50,6 @@
5050
BlogViewSet.as_view({'get': 'retrieve'}),
5151
name='entry-blog'
5252
),
53-
# get/patch url to test default DRF functionalities
54-
url(r'^entries/(?P<entry_pk>[^/.]+)/blog',
55-
DRFBlogViewSet.as_view({'get': 'retrieve'}),
56-
name='drf-entry-blog'
57-
),
5853
url(r'^entries/(?P<entry_pk>[^/.]+)/comments',
5954
CommentViewSet.as_view({'get': 'list'}),
6055
name='entry-comments'

example/views.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ def get_object(self):
4343
class DRFBlogViewSet(viewsets.ModelViewSet):
4444
queryset = Blog.objects.all()
4545
serializer_class = BlogDRFSerializer
46+
lookup_url_kwarg = 'entry_pk'
4647

4748
def get_object(self):
48-
entry_pk = self.kwargs.get('entry_pk', None)
49+
entry_pk = self.kwargs.get(self.lookup_url_kwarg, None)
4950
if entry_pk is not None:
5051
return Entry.objects.get(id=entry_pk).blog
5152

0 commit comments

Comments
 (0)