Skip to content

Commit 9d200f2

Browse files
slivercmblayman
authored andcommitted
Allow json api renderer to be used as test request renderer class (#396)
* Allow json api renderer to be used as test request renderer class * Convert non paginated response test to use APIClient
1 parent f0641bf commit 9d200f2

19 files changed

+112
-196
lines changed

example/settings/dev.py

+4
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,8 @@
8888
'rest_framework.renderers.BrowsableAPIRenderer',
8989
),
9090
'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata',
91+
'TEST_REQUEST_RENDERER_CLASSES': (
92+
'rest_framework_json_api.renderers.JSONRenderer',
93+
),
94+
'TEST_REQUEST_DEFAULT_FORMAT': 'vnd.api+json'
9195
}

example/tests/conftest.py

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22
from pytest_factoryboy import register
3+
from rest_framework.test import APIClient
34

45
from example.factories import (
56
ArtProjectFactory,
@@ -56,3 +57,8 @@ def single_company(art_project_factory, research_project_factory, company_factor
5657
@pytest.fixture
5758
def single_art_project(art_project_factory):
5859
return art_project_factory()
60+
61+
62+
@pytest.fixture
63+
def client():
64+
return APIClient()

example/tests/integration/test_includes.py

+12-15
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import pytest
22
from django.core.urlresolvers import reverse
33

4-
from example.tests.utils import load_json
5-
64
pytestmark = pytest.mark.django_db
75

86

@@ -14,9 +12,9 @@ def test_default_included_data_on_list(multiple_entries, client):
1412

1513
def test_included_data_on_list(multiple_entries, client, query='?include=comments&page_size=5'):
1614
response = client.get(reverse("entry-list") + query)
17-
included = load_json(response.content).get('included')
15+
included = response.json().get('included')
1816

19-
assert len(load_json(response.content)['data']) == len(multiple_entries), (
17+
assert len(response.json()['data']) == len(multiple_entries), (
2018
'Incorrect entry count'
2119
)
2220
assert [x.get('type') for x in included] == ['comments', 'comments'], (
@@ -34,7 +32,7 @@ def test_default_included_data_on_detail(single_entry, client):
3432

3533
def test_included_data_on_detail(single_entry, client, query='?include=comments'):
3634
response = client.get(reverse("entry-detail", kwargs={'pk': single_entry.pk}) + query)
37-
included = load_json(response.content).get('included')
35+
included = response.json().get('included')
3836

3937
assert [x.get('type') for x in included] == ['comments'], 'Detail included types are incorrect'
4038

@@ -48,7 +46,7 @@ def test_dynamic_related_data_is_included(single_entry, entry_factory, client):
4846
response = client.get(
4947
reverse("entry-detail", kwargs={'pk': single_entry.pk}) + '?include=featured'
5048
)
51-
included = load_json(response.content).get('included')
49+
included = response.json().get('included')
5250

5351
assert [x.get('type') for x in included] == ['entries'], 'Dynamic included types are incorrect'
5452
assert len(included) == 1, 'The dynamically included blog entries are of an incorrect count'
@@ -59,7 +57,7 @@ def test_dynamic_many_related_data_is_included(single_entry, entry_factory, clie
5957
response = client.get(
6058
reverse("entry-detail", kwargs={'pk': single_entry.pk}) + '?include=suggested'
6159
)
62-
included = load_json(response.content).get('included')
60+
included = response.json().get('included')
6361

6462
assert included
6563
assert [x.get('type') for x in included] == ['entries'], 'Dynamic included types are incorrect'
@@ -69,12 +67,11 @@ def test_missing_field_not_included(author_bio_factory, author_factory, client):
6967
# First author does not have a bio
7068
author = author_factory(bio=None)
7169
response = client.get(reverse('author-detail', args=[author.pk]) + '?include=bio')
72-
data = load_json(response.content)
73-
assert 'included' not in data
70+
assert 'included' not in response.json()
7471
# Second author does
7572
author = author_factory()
7673
response = client.get(reverse('author-detail', args=[author.pk]) + '?include=bio')
77-
data = load_json(response.content)
74+
data = response.json()
7875
assert 'included' in data
7976
assert len(data['included']) == 1
8077
assert data['included'][0]['attributes']['body'] == author.bio.body
@@ -83,9 +80,9 @@ def test_missing_field_not_included(author_bio_factory, author_factory, client):
8380
def test_deep_included_data_on_list(multiple_entries, client):
8481
response = client.get(reverse("entry-list") + '?include=comments,comments.author,'
8582
'comments.author.bio,comments.writer&page_size=5')
86-
included = load_json(response.content).get('included')
83+
included = response.json().get('included')
8784

88-
assert len(load_json(response.content)['data']) == len(multiple_entries), (
85+
assert len(response.json()['data']) == len(multiple_entries), (
8986
'Incorrect entry count'
9087
)
9188
assert [x.get('type') for x in included] == [
@@ -117,9 +114,9 @@ def test_deep_included_data_on_list(multiple_entries, client):
117114
# Also include entry authors
118115
response = client.get(reverse("entry-list") + '?include=authors,comments,comments.author,'
119116
'comments.author.bio&page_size=5')
120-
included = load_json(response.content).get('included')
117+
included = response.json().get('included')
121118

122-
assert len(load_json(response.content)['data']) == len(multiple_entries), (
119+
assert len(response.json()['data']) == len(multiple_entries), (
123120
'Incorrect entry count'
124121
)
125122
assert [x.get('type') for x in included] == [
@@ -138,7 +135,7 @@ def test_deep_included_data_on_detail(single_entry, client):
138135
# are returned along with the leaf nodes
139136
response = client.get(reverse("entry-detail", kwargs={'pk': single_entry.pk}) +
140137
'?include=comments,comments.author.bio')
141-
included = load_json(response.content).get('included')
138+
included = response.json().get('included')
142139

143140
assert [x.get('type') for x in included] == ['authorBios', 'authors', 'comments'], \
144141
'Detail included types are incorrect'

example/tests/integration/test_meta.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
import pytest
44
from django.core.urlresolvers import reverse
55

6-
from example.tests.utils import load_json
7-
86
pytestmark = pytest.mark.django_db
97

108

@@ -42,9 +40,8 @@ def test_top_level_meta_for_list_view(blog, client):
4240
}
4341

4442
response = client.get(reverse("blog-list"))
45-
parsed_content = load_json(response.content)
4643

47-
assert expected == parsed_content
44+
assert expected == response.json()
4845

4946

5047
def test_top_level_meta_for_detail_view(blog, client):
@@ -74,6 +71,5 @@ def test_top_level_meta_for_detail_view(blog, client):
7471
}
7572

7673
response = client.get(reverse("blog-detail", kwargs={'pk': blog.pk}))
77-
parsed_content = load_json(response.content)
7874

79-
assert expected == parsed_content
75+
assert expected == response.json()

example/tests/integration/test_model_resource_name.py

+11-16
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from rest_framework import status
66

77
from example import models, serializers, views
8-
from example.tests.utils import dump_json, load_json
98

109
pytestmark = pytest.mark.django_db
1110

@@ -19,8 +18,8 @@ def _check_resource_and_relationship_comment_type_match(django_client):
1918
entry_response = django_client.get(reverse("entry-list"))
2019
comment_response = django_client.get(reverse("comment-list"))
2120

22-
comment_resource_type = load_json(comment_response.content).get('data')[0].get('type')
23-
comment_relationship_type = load_json(entry_response.content).get(
21+
comment_resource_type = comment_response.json().get('data')[0].get('type')
22+
comment_relationship_type = entry_response.json().get(
2423
'data')[0].get('relationships').get('comments').get('data')[0].get('type')
2524

2625
assert comment_resource_type == comment_relationship_type, (
@@ -30,8 +29,8 @@ def _check_resource_and_relationship_comment_type_match(django_client):
3029

3130
def _check_relationship_and_included_comment_type_are_the_same(django_client, url):
3231
response = django_client.get(url + "?include=comments")
33-
data = load_json(response.content).get('data')[0]
34-
comment = load_json(response.content).get('included')[0]
32+
data = response.json().get('data')[0]
33+
comment = response.json().get('included')[0]
3534

3635
comment_relationship_type = data.get('relationships').get('comments').get('data')[0].get('type')
3736
comment_included_type = comment.get('type')
@@ -65,7 +64,7 @@ class TestModelResourceName:
6564
def test_model_resource_name_on_list(self, client):
6665
models.Comment.__bases__ += (_PatchedModel,)
6766
response = client.get(reverse("comment-list"))
68-
data = load_json(response.content)['data'][0]
67+
data = response.json()['data'][0]
6968
# name should be super-author instead of model name RenamedAuthor
7069
assert (data.get('type') == 'resource_name_from_JSONAPIMeta'), (
7170
'resource_name from model incorrect on list')
@@ -74,14 +73,14 @@ def test_model_resource_name_on_list(self, client):
7473
def test_resource_name_precendence(self, client, monkeypatch):
7574
# default
7675
response = client.get(reverse("comment-list"))
77-
data = load_json(response.content)['data'][0]
76+
data = response.json()['data'][0]
7877
assert (data.get('type') == 'comments'), (
7978
'resource_name from model incorrect on list')
8079

8180
# model > default
8281
models.Comment.__bases__ += (_PatchedModel,)
8382
response = client.get(reverse("comment-list"))
84-
data = load_json(response.content)['data'][0]
83+
data = response.json()['data'][0]
8584
assert (data.get('type') == 'resource_name_from_JSONAPIMeta'), (
8685
'resource_name from model incorrect on list')
8786

@@ -93,23 +92,21 @@ def test_resource_name_precendence(self, client, monkeypatch):
9392
False
9493
)
9594
response = client.get(reverse("comment-list"))
96-
data = load_json(response.content)['data'][0]
95+
data = response.json()['data'][0]
9796
assert (data.get('type') == 'resource_name_from_serializer'), (
9897
'resource_name from serializer incorrect on list')
9998

10099
# view > serializer > model
101100
monkeypatch.setattr(views.CommentViewSet, 'resource_name', 'resource_name_from_view', False)
102101
response = client.get(reverse("comment-list"))
103-
data = load_json(response.content)['data'][0]
102+
data = response.json()['data'][0]
104103
assert (data.get('type') == 'resource_name_from_view'), (
105104
'resource_name from view incorrect on list')
106105

107106
def test_model_resource_name_create(self, client):
108107
models.Comment.__bases__ += (_PatchedModel,)
109108
models.Entry.__bases__ += (_PatchedModel,)
110-
response = client.post(reverse("comment-list"),
111-
dump_json(self.create_data),
112-
content_type='application/vnd.api+json')
109+
response = client.post(reverse("comment-list"), self.create_data)
113110

114111
assert response.status_code == status.HTTP_201_CREATED
115112

@@ -130,9 +127,7 @@ def test_serializer_resource_name_create(self, client, monkeypatch):
130127
create_data['data']['type'] = 'renamed_comments'
131128
create_data['data']['relationships']['entry']['data']['type'] = 'renamed_entries'
132129

133-
response = client.post(reverse("comment-list"),
134-
dump_json(create_data),
135-
content_type='application/vnd.api+json')
130+
response = client.post(reverse("comment-list"), create_data)
136131

137132
assert response.status_code == status.HTTP_201_CREATED
138133

example/tests/integration/test_non_paginated_responses.py

+3-21
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
import pytest
22
from django.core.urlresolvers import reverse
33

4-
from rest_framework_json_api.pagination import PageNumberPagination
5-
6-
from example.tests.utils import load_json
7-
from example.views import EntryViewSet
8-
94
try:
105
from unittest import mock
116
except ImportError:
@@ -14,12 +9,11 @@
149
pytestmark = pytest.mark.django_db
1510

1611

17-
# rf == request_factory
1812
@mock.patch(
1913
'rest_framework_json_api.utils'
2014
'.get_default_included_resources_from_serializer',
2115
new=lambda s: [])
22-
def test_multiple_entries_no_pagination(multiple_entries, rf):
16+
def test_multiple_entries_no_pagination(multiple_entries, client):
2317

2418
expected = {
2519
"data": [
@@ -102,18 +96,6 @@ def test_multiple_entries_no_pagination(multiple_entries, rf):
10296
]
10397
}
10498

105-
class NoPagination(PageNumberPagination):
106-
page_size = None
107-
108-
class NonPaginatedEntryViewSet(EntryViewSet):
109-
pagination_class = NoPagination
110-
111-
request = rf.get(
112-
reverse("entry-list"))
113-
view = NonPaginatedEntryViewSet.as_view({'get': 'list'})
114-
response = view(request)
115-
response.render()
116-
117-
parsed_content = load_json(response.content)
99+
response = client.get(reverse("nopage-entry-list"))
118100

119-
assert expected == parsed_content
101+
assert expected == response.json()

example/tests/integration/test_pagination.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import pytest
22
from django.core.urlresolvers import reverse
33

4-
from example.tests.utils import load_json
5-
64
try:
75
from unittest import mock
86
except ImportError:
@@ -81,6 +79,5 @@ def test_pagination_with_single_entry(single_entry, client):
8179
}
8280

8381
response = client.get(reverse("entry-list"))
84-
parsed_content = load_json(response.content)
8582

86-
assert expected == parsed_content
83+
assert expected == response.json()

0 commit comments

Comments
 (0)