diff --git a/example/settings/dev.py b/example/settings/dev.py index 94c9628e..d8b45738 100644 --- a/example/settings/dev.py +++ b/example/settings/dev.py @@ -88,4 +88,8 @@ 'rest_framework.renderers.BrowsableAPIRenderer', ), 'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata', + 'TEST_REQUEST_RENDERER_CLASSES': ( + 'rest_framework_json_api.renderers.JSONRenderer', + ), + 'TEST_REQUEST_DEFAULT_FORMAT': 'vnd.api+json' } diff --git a/example/tests/conftest.py b/example/tests/conftest.py index 84de7732..ceaa5dcf 100644 --- a/example/tests/conftest.py +++ b/example/tests/conftest.py @@ -1,5 +1,6 @@ import pytest from pytest_factoryboy import register +from rest_framework.test import APIClient from example.factories import ( ArtProjectFactory, @@ -56,3 +57,8 @@ def single_company(art_project_factory, research_project_factory, company_factor @pytest.fixture def single_art_project(art_project_factory): return art_project_factory() + + +@pytest.fixture +def client(): + return APIClient() diff --git a/example/tests/integration/test_includes.py b/example/tests/integration/test_includes.py index a75310bc..332c7b73 100644 --- a/example/tests/integration/test_includes.py +++ b/example/tests/integration/test_includes.py @@ -1,8 +1,6 @@ import pytest from django.core.urlresolvers import reverse -from example.tests.utils import load_json - pytestmark = pytest.mark.django_db @@ -14,9 +12,9 @@ def test_default_included_data_on_list(multiple_entries, client): def test_included_data_on_list(multiple_entries, client, query='?include=comments&page_size=5'): response = client.get(reverse("entry-list") + query) - included = load_json(response.content).get('included') + included = response.json().get('included') - assert len(load_json(response.content)['data']) == len(multiple_entries), ( + assert len(response.json()['data']) == len(multiple_entries), ( 'Incorrect entry count' ) assert [x.get('type') for x in included] == ['comments', 'comments'], ( @@ -34,7 +32,7 @@ def test_default_included_data_on_detail(single_entry, client): def test_included_data_on_detail(single_entry, client, query='?include=comments'): response = client.get(reverse("entry-detail", kwargs={'pk': single_entry.pk}) + query) - included = load_json(response.content).get('included') + included = response.json().get('included') assert [x.get('type') for x in included] == ['comments'], 'Detail included types are incorrect' @@ -48,7 +46,7 @@ def test_dynamic_related_data_is_included(single_entry, entry_factory, client): response = client.get( reverse("entry-detail", kwargs={'pk': single_entry.pk}) + '?include=featured' ) - included = load_json(response.content).get('included') + included = response.json().get('included') assert [x.get('type') for x in included] == ['entries'], 'Dynamic included types are incorrect' 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 response = client.get( reverse("entry-detail", kwargs={'pk': single_entry.pk}) + '?include=suggested' ) - included = load_json(response.content).get('included') + included = response.json().get('included') assert included 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): # First author does not have a bio author = author_factory(bio=None) response = client.get(reverse('author-detail', args=[author.pk]) + '?include=bio') - data = load_json(response.content) - assert 'included' not in data + assert 'included' not in response.json() # Second author does author = author_factory() response = client.get(reverse('author-detail', args=[author.pk]) + '?include=bio') - data = load_json(response.content) + data = response.json() assert 'included' in data assert len(data['included']) == 1 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): def test_deep_included_data_on_list(multiple_entries, client): response = client.get(reverse("entry-list") + '?include=comments,comments.author,' 'comments.author.bio,comments.writer&page_size=5') - included = load_json(response.content).get('included') + included = response.json().get('included') - assert len(load_json(response.content)['data']) == len(multiple_entries), ( + assert len(response.json()['data']) == len(multiple_entries), ( 'Incorrect entry count' ) assert [x.get('type') for x in included] == [ @@ -117,9 +114,9 @@ def test_deep_included_data_on_list(multiple_entries, client): # Also include entry authors response = client.get(reverse("entry-list") + '?include=authors,comments,comments.author,' 'comments.author.bio&page_size=5') - included = load_json(response.content).get('included') + included = response.json().get('included') - assert len(load_json(response.content)['data']) == len(multiple_entries), ( + assert len(response.json()['data']) == len(multiple_entries), ( 'Incorrect entry count' ) assert [x.get('type') for x in included] == [ @@ -138,7 +135,7 @@ def test_deep_included_data_on_detail(single_entry, client): # are returned along with the leaf nodes response = client.get(reverse("entry-detail", kwargs={'pk': single_entry.pk}) + '?include=comments,comments.author.bio') - included = load_json(response.content).get('included') + included = response.json().get('included') assert [x.get('type') for x in included] == ['authorBios', 'authors', 'comments'], \ 'Detail included types are incorrect' diff --git a/example/tests/integration/test_meta.py b/example/tests/integration/test_meta.py index f41f6683..1c28996a 100644 --- a/example/tests/integration/test_meta.py +++ b/example/tests/integration/test_meta.py @@ -3,8 +3,6 @@ import pytest from django.core.urlresolvers import reverse -from example.tests.utils import load_json - pytestmark = pytest.mark.django_db @@ -42,9 +40,8 @@ def test_top_level_meta_for_list_view(blog, client): } response = client.get(reverse("blog-list")) - parsed_content = load_json(response.content) - assert expected == parsed_content + assert expected == response.json() def test_top_level_meta_for_detail_view(blog, client): @@ -74,6 +71,5 @@ def test_top_level_meta_for_detail_view(blog, client): } response = client.get(reverse("blog-detail", kwargs={'pk': blog.pk})) - parsed_content = load_json(response.content) - assert expected == parsed_content + assert expected == response.json() diff --git a/example/tests/integration/test_model_resource_name.py b/example/tests/integration/test_model_resource_name.py index 035ad449..2d30b21e 100644 --- a/example/tests/integration/test_model_resource_name.py +++ b/example/tests/integration/test_model_resource_name.py @@ -5,7 +5,6 @@ from rest_framework import status from example import models, serializers, views -from example.tests.utils import dump_json, load_json pytestmark = pytest.mark.django_db @@ -19,8 +18,8 @@ def _check_resource_and_relationship_comment_type_match(django_client): entry_response = django_client.get(reverse("entry-list")) comment_response = django_client.get(reverse("comment-list")) - comment_resource_type = load_json(comment_response.content).get('data')[0].get('type') - comment_relationship_type = load_json(entry_response.content).get( + comment_resource_type = comment_response.json().get('data')[0].get('type') + comment_relationship_type = entry_response.json().get( 'data')[0].get('relationships').get('comments').get('data')[0].get('type') assert comment_resource_type == comment_relationship_type, ( @@ -30,8 +29,8 @@ def _check_resource_and_relationship_comment_type_match(django_client): def _check_relationship_and_included_comment_type_are_the_same(django_client, url): response = django_client.get(url + "?include=comments") - data = load_json(response.content).get('data')[0] - comment = load_json(response.content).get('included')[0] + data = response.json().get('data')[0] + comment = response.json().get('included')[0] comment_relationship_type = data.get('relationships').get('comments').get('data')[0].get('type') comment_included_type = comment.get('type') @@ -65,7 +64,7 @@ class TestModelResourceName: def test_model_resource_name_on_list(self, client): models.Comment.__bases__ += (_PatchedModel,) response = client.get(reverse("comment-list")) - data = load_json(response.content)['data'][0] + data = response.json()['data'][0] # name should be super-author instead of model name RenamedAuthor assert (data.get('type') == 'resource_name_from_JSONAPIMeta'), ( 'resource_name from model incorrect on list') @@ -74,14 +73,14 @@ def test_model_resource_name_on_list(self, client): def test_resource_name_precendence(self, client, monkeypatch): # default response = client.get(reverse("comment-list")) - data = load_json(response.content)['data'][0] + data = response.json()['data'][0] assert (data.get('type') == 'comments'), ( 'resource_name from model incorrect on list') # model > default models.Comment.__bases__ += (_PatchedModel,) response = client.get(reverse("comment-list")) - data = load_json(response.content)['data'][0] + data = response.json()['data'][0] assert (data.get('type') == 'resource_name_from_JSONAPIMeta'), ( 'resource_name from model incorrect on list') @@ -93,23 +92,21 @@ def test_resource_name_precendence(self, client, monkeypatch): False ) response = client.get(reverse("comment-list")) - data = load_json(response.content)['data'][0] + data = response.json()['data'][0] assert (data.get('type') == 'resource_name_from_serializer'), ( 'resource_name from serializer incorrect on list') # view > serializer > model monkeypatch.setattr(views.CommentViewSet, 'resource_name', 'resource_name_from_view', False) response = client.get(reverse("comment-list")) - data = load_json(response.content)['data'][0] + data = response.json()['data'][0] assert (data.get('type') == 'resource_name_from_view'), ( 'resource_name from view incorrect on list') def test_model_resource_name_create(self, client): models.Comment.__bases__ += (_PatchedModel,) models.Entry.__bases__ += (_PatchedModel,) - response = client.post(reverse("comment-list"), - dump_json(self.create_data), - content_type='application/vnd.api+json') + response = client.post(reverse("comment-list"), self.create_data) assert response.status_code == status.HTTP_201_CREATED @@ -130,9 +127,7 @@ def test_serializer_resource_name_create(self, client, monkeypatch): create_data['data']['type'] = 'renamed_comments' create_data['data']['relationships']['entry']['data']['type'] = 'renamed_entries' - response = client.post(reverse("comment-list"), - dump_json(create_data), - content_type='application/vnd.api+json') + response = client.post(reverse("comment-list"), create_data) assert response.status_code == status.HTTP_201_CREATED diff --git a/example/tests/integration/test_non_paginated_responses.py b/example/tests/integration/test_non_paginated_responses.py index 2425d93b..029ba1ce 100644 --- a/example/tests/integration/test_non_paginated_responses.py +++ b/example/tests/integration/test_non_paginated_responses.py @@ -1,11 +1,6 @@ import pytest from django.core.urlresolvers import reverse -from rest_framework_json_api.pagination import PageNumberPagination - -from example.tests.utils import load_json -from example.views import EntryViewSet - try: from unittest import mock except ImportError: @@ -14,12 +9,11 @@ pytestmark = pytest.mark.django_db -# rf == request_factory @mock.patch( 'rest_framework_json_api.utils' '.get_default_included_resources_from_serializer', new=lambda s: []) -def test_multiple_entries_no_pagination(multiple_entries, rf): +def test_multiple_entries_no_pagination(multiple_entries, client): expected = { "data": [ @@ -102,18 +96,6 @@ def test_multiple_entries_no_pagination(multiple_entries, rf): ] } - class NoPagination(PageNumberPagination): - page_size = None - - class NonPaginatedEntryViewSet(EntryViewSet): - pagination_class = NoPagination - - request = rf.get( - reverse("entry-list")) - view = NonPaginatedEntryViewSet.as_view({'get': 'list'}) - response = view(request) - response.render() - - parsed_content = load_json(response.content) + response = client.get(reverse("nopage-entry-list")) - assert expected == parsed_content + assert expected == response.json() diff --git a/example/tests/integration/test_pagination.py b/example/tests/integration/test_pagination.py index 9e74f7d3..8d7a6f64 100644 --- a/example/tests/integration/test_pagination.py +++ b/example/tests/integration/test_pagination.py @@ -1,8 +1,6 @@ import pytest from django.core.urlresolvers import reverse -from example.tests.utils import load_json - try: from unittest import mock except ImportError: @@ -81,6 +79,5 @@ def test_pagination_with_single_entry(single_entry, client): } response = client.get(reverse("entry-list")) - parsed_content = load_json(response.content) - assert expected == parsed_content + assert expected == response.json() diff --git a/example/tests/integration/test_polymorphism.py b/example/tests/integration/test_polymorphism.py index 2aa2091b..6185e743 100644 --- a/example/tests/integration/test_polymorphism.py +++ b/example/tests/integration/test_polymorphism.py @@ -1,23 +1,20 @@ -import json import random import pytest from django.core.urlresolvers import reverse -from example.tests.utils import load_json - pytestmark = pytest.mark.django_db def test_polymorphism_on_detail(single_art_project, client): response = client.get(reverse("project-detail", kwargs={'pk': single_art_project.pk})) - content = load_json(response.content) + content = response.json() assert content["data"]["type"] == "artProjects" def test_polymorphism_on_detail_relations(single_company, client): response = client.get(reverse("company-detail", kwargs={'pk': single_company.pk})) - content = load_json(response.content) + content = response.json() assert content["data"]["relationships"]["currentProject"]["data"]["type"] == "artProjects" assert ( set([rel["type"] for rel in content["data"]["relationships"]["futureProjects"]["data"]]) == @@ -28,7 +25,7 @@ def test_polymorphism_on_detail_relations(single_company, client): def test_polymorphism_on_included_relations(single_company, client): response = client.get(reverse("company-detail", kwargs={'pk': single_company.pk}) + '?include=current_project,future_projects') - content = load_json(response.content) + content = response.json() assert content["data"]["relationships"]["currentProject"]["data"]["type"] == "artProjects" assert ( set([rel["type"] for rel in content["data"]["relationships"]["futureProjects"]["data"]]) == @@ -45,13 +42,13 @@ def test_polymorphism_on_included_relations(single_company, client): def test_polymorphism_on_polymorphic_model_detail_patch(single_art_project, client): url = reverse("project-detail", kwargs={'pk': single_art_project.pk}) response = client.get(url) - content = load_json(response.content) + content = response.json() test_topic = 'test-{}'.format(random.randint(0, 999999)) test_artist = 'test-{}'.format(random.randint(0, 999999)) content['data']['attributes']['topic'] = test_topic content['data']['attributes']['artist'] = test_artist - response = client.patch(url, data=json.dumps(content), content_type='application/vnd.api+json') - new_content = load_json(response.content) + response = client.patch(url, data=content) + new_content = response.json() assert new_content['data']['type'] == "artProjects" assert new_content['data']['attributes']['topic'] == test_topic assert new_content['data']['attributes']['artist'] == test_artist @@ -70,8 +67,8 @@ def test_polymorphism_on_polymorphic_model_list_post(client): } } } - response = client.post(url, data=json.dumps(data), content_type='application/vnd.api+json') - content = load_json(response.content) + response = client.post(url, data=data) + content = response.json() assert content['data']['id'] is not None assert content['data']['type'] == "artProjects" assert content['data']['attributes']['topic'] == test_topic @@ -98,7 +95,7 @@ def test_polymorphic_model_without_any_instance(client): response = client.get(reverse('project-list')) assert response.status_code == 200 - content = load_json(response.content) + content = response.json() assert expected == content @@ -115,9 +112,9 @@ def test_invalid_type_on_polymorphic_model(client): } } } - response = client.post(url, data=json.dumps(data), content_type='application/vnd.api+json') + response = client.post(url, data=data) assert response.status_code == 409 - content = load_json(response.content) + content = response.json() assert len(content["errors"]) is 1 assert content["errors"][0]["status"] == "409" try: @@ -133,7 +130,7 @@ def test_invalid_type_on_polymorphic_model(client): def test_polymorphism_relations_update(single_company, research_project_factory, client): response = client.get(reverse("company-detail", kwargs={'pk': single_company.pk})) - content = load_json(response.content) + content = response.json() assert content["data"]["relationships"]["currentProject"]["data"]["type"] == "artProjects" research_project = research_project_factory() @@ -142,9 +139,9 @@ def test_polymorphism_relations_update(single_company, research_project_factory, "id": research_project.pk } response = client.put(reverse("company-detail", kwargs={'pk': single_company.pk}), - data=json.dumps(content), content_type='application/vnd.api+json') + data=content) assert response.status_code == 200 - content = load_json(response.content) + content = response.json() assert content["data"]["relationships"]["currentProject"]["data"]["type"] == "researchProjects" assert int(content["data"]["relationships"]["currentProject"]["data"]["id"]) == \ research_project.pk @@ -152,7 +149,7 @@ def test_polymorphism_relations_update(single_company, research_project_factory, def test_invalid_type_on_polymorphic_relation(single_company, research_project_factory, client): response = client.get(reverse("company-detail", kwargs={'pk': single_company.pk})) - content = load_json(response.content) + content = response.json() assert content["data"]["relationships"]["currentProject"]["data"]["type"] == "artProjects" research_project = research_project_factory() @@ -161,9 +158,9 @@ def test_invalid_type_on_polymorphic_relation(single_company, research_project_f "id": research_project.pk } response = client.put(reverse("company-detail", kwargs={'pk': single_company.pk}), - data=json.dumps(content), content_type='application/vnd.api+json') + data=content) assert response.status_code == 409 - content = load_json(response.content) + content = response.json() assert len(content["errors"]) is 1 assert content["errors"][0]["status"] == "409" try: diff --git a/example/tests/test_format_keys.py b/example/tests/test_format_keys.py index 17993336..ca36cbb7 100644 --- a/example/tests/test_format_keys.py +++ b/example/tests/test_format_keys.py @@ -3,7 +3,6 @@ from django.utils import encoding from example.tests import TestBase -from example.tests.utils import load_json class FormatKeysSetTests(TestBase): @@ -51,6 +50,4 @@ def test_camelization(self): } } - parsed_content = load_json(response.content) - - assert expected == parsed_content + assert expected == response.json() diff --git a/example/tests/test_generic_validation.py b/example/tests/test_generic_validation.py index 8591ea28..3bc48b6a 100644 --- a/example/tests/test_generic_validation.py +++ b/example/tests/test_generic_validation.py @@ -1,7 +1,6 @@ from django.core.urlresolvers import reverse from example.tests import TestBase -from example.tests.utils import load_json class GenericValidationTest(TestBase): @@ -30,6 +29,4 @@ def test_generic_validation_error(self): }] } - parsed_content = load_json(response.content) - - assert expected == parsed_content + assert expected == response.json() diff --git a/example/tests/test_generic_viewset.py b/example/tests/test_generic_viewset.py index 14c65040..d53433d7 100644 --- a/example/tests/test_generic_viewset.py +++ b/example/tests/test_generic_viewset.py @@ -2,7 +2,6 @@ from django.core.urlresolvers import reverse from example.tests import TestBase -from example.tests.utils import load_json class GenericViewSet(TestBase): @@ -36,9 +35,7 @@ def test_default_rest_framework_behavior(self): 'email': 'miles@example.com' } - parsed_content = load_json(response.content) - - assert expected == parsed_content + assert expected == response.json() def test_ember_expected_renderer(self): """ @@ -62,9 +59,7 @@ def test_ember_expected_renderer(self): } } - parsed_content = load_json(response.content) - - assert expected == parsed_content + assert expected == response.json() def test_default_validation_exceptions(self): """ @@ -89,11 +84,15 @@ def test_default_validation_exceptions(self): ] } response = self.client.post('/identities', { - 'email': 'bar', 'first_name': 'alajflajaljalajlfjafljalj'}) - - parsed_content = load_json(response.content) + 'data': { + 'type': 'users', + 'attributes': { + 'email': 'bar', 'first_name': 'alajflajaljalajlfjafljalj' + } + } + }) - assert expected == parsed_content + assert expected == response.json() def test_custom_validation_exceptions(self): """ @@ -116,8 +115,12 @@ def test_custom_validation_exceptions(self): ] } response = self.client.post('/identities', { - 'email': 'bar', 'last_name': 'alajflajaljalajlfjafljalj'}) - - parsed_content = load_json(response.content) + 'data': { + 'type': 'users', + 'attributes': { + 'email': 'bar', 'last_name': 'alajflajaljalajlfjafljalj' + } + } + }) - assert expected == parsed_content + assert expected == response.json() diff --git a/example/tests/test_model_viewsets.py b/example/tests/test_model_viewsets.py index 36949fe1..385c45c6 100644 --- a/example/tests/test_model_viewsets.py +++ b/example/tests/test_model_viewsets.py @@ -5,7 +5,6 @@ from django.utils import encoding from example.tests import TestBase -from example.tests.utils import dump_json, load_json class ModelViewSetTests(TestBase): @@ -63,9 +62,7 @@ def test_key_in_list_result(self): } } - parsed_content = load_json(response.content) - - assert expected == parsed_content + assert expected == response.json() def test_page_two_in_list_result(self): """ @@ -102,9 +99,7 @@ def test_page_two_in_list_result(self): } } - parsed_content = load_json(response.content) - - assert expected == parsed_content + assert expected == response.json() def test_page_range_in_list_result(self): """ @@ -152,9 +147,7 @@ def test_page_range_in_list_result(self): } } - parsed_content = load_json(response.content) - - assert expected == parsed_content + assert expected == response.json() def test_key_in_detail_result(self): """ @@ -175,9 +168,7 @@ def test_key_in_detail_result(self): } } - parsed_content = load_json(response.content) - - assert expected == parsed_content + assert expected == response.json() def test_patch_requires_id(self): """ @@ -192,9 +183,7 @@ def test_patch_requires_id(self): } } - response = self.client.patch(self.detail_url, - content_type='application/vnd.api+json', - data=dump_json(data)) + response = self.client.patch(self.detail_url, data=data) self.assertEqual(response.status_code, 400) @@ -215,13 +204,9 @@ def test_key_in_post(self): } } - response = self.client.put(self.detail_url, - content_type='application/vnd.api+json', - data=dump_json(data)) - - parsed_content = load_json(response.content) + response = self.client.put(self.detail_url, data=data) - assert data == parsed_content + assert data == response.json() # is it updated? self.assertEqual( @@ -250,8 +235,6 @@ def test_patch_allow_field_type(author, author_type_factory, client): } } - response = client.patch(url, - content_type='application/vnd.api+json', - data=dump_json(data)) + response = client.patch(url, data=data) assert response.status_code == 200 diff --git a/example/tests/test_serializers.py b/example/tests/test_serializers.py index af864650..d52c42af 100644 --- a/example/tests/test_serializers.py +++ b/example/tests/test_serializers.py @@ -7,7 +7,6 @@ from rest_framework_json_api.utils import format_resource_type from example.models import Author, Blog, Entry -from example.tests.utils import load_json pytestmark = pytest.mark.django_db @@ -114,7 +113,4 @@ def test_model_serializer_with_implicit_fields(self, comment, client): response = client.get(reverse("comment-detail", kwargs={'pk': comment.pk})) assert response.status_code == 200 - - parsed_content = load_json(response.content) - - assert expected == parsed_content + assert expected == response.json() diff --git a/example/tests/test_views.py b/example/tests/test_views.py index e8c11ff8..db3a3407 100644 --- a/example/tests/test_views.py +++ b/example/tests/test_views.py @@ -76,16 +76,12 @@ def test_put_entry_relationship_blog_returns_405(self): def test_patch_invalid_entry_relationship_blog_returns_400(self): url = '/entries/{}/relationships/blog'.format(self.first_entry.id) - response = self.client.patch(url, - data=json.dumps({'data': {'invalid': ''}}), - content_type='application/vnd.api+json') + response = self.client.patch(url, data={'data': {'invalid': ''}}) assert response.status_code == 400 def test_relationship_view_errors_format(self): url = '/entries/{}/relationships/blog'.format(self.first_entry.id) - response = self.client.patch(url, - data=json.dumps({'data': {'invalid': ''}}), - content_type='application/vnd.api+json') + response = self.client.patch(url, data={'data': {'invalid': ''}}) assert response.status_code == 400 result = json.loads(response.content.decode('utf-8')) @@ -115,9 +111,7 @@ def test_patch_to_one_relationship(self): request_data = { 'data': {'type': format_resource_type('Blog'), 'id': str(self.other_blog.id)} } - response = self.client.patch( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.patch(url, data=request_data) assert response.status_code == 200, response.content.decode() assert response.data == request_data['data'] @@ -129,9 +123,7 @@ def test_patch_one_to_many_relationship(self): request_data = { 'data': [{'type': format_resource_type('Entry'), 'id': str(self.first_entry.id)}, ] } - response = self.client.patch( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.patch(url, data=request_data) assert response.status_code == 200, response.content.decode() assert response.data == request_data['data'] @@ -148,9 +140,7 @@ def test_patch_many_to_many_relationship(self): }, ] } - response = self.client.patch(url, - data=json.dumps(request_data), - content_type='application/vnd.api+json') + response = self.client.patch(url, data=request_data) assert response.status_code == 200, response.content.decode() assert response.data == request_data['data'] @@ -162,9 +152,7 @@ def test_post_to_one_relationship_should_fail(self): request_data = { 'data': {'type': format_resource_type('Blog'), 'id': str(self.other_blog.id)} } - response = self.client.post( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.post(url, data=request_data) assert response.status_code == 405, response.content.decode() def test_post_to_many_relationship_with_no_change(self): @@ -172,9 +160,7 @@ def test_post_to_many_relationship_with_no_change(self): request_data = { 'data': [{'type': format_resource_type('Comment'), 'id': str(self.first_comment.id)}, ] } - response = self.client.post( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.post(url, data=request_data) assert response.status_code == 204, response.content.decode() assert len(response.rendered_content) == 0, response.rendered_content.decode() @@ -183,9 +169,7 @@ def test_post_to_many_relationship_with_change(self): request_data = { 'data': [{'type': format_resource_type('Comment'), 'id': str(self.second_comment.id)}, ] } - response = self.client.post( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.post(url, data=request_data) assert response.status_code == 200, response.content.decode() assert request_data['data'][0] in response.data @@ -195,9 +179,7 @@ def test_delete_to_one_relationship_should_fail(self): request_data = { 'data': {'type': format_resource_type('Blog'), 'id': str(self.other_blog.id)} } - response = self.client.delete( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.delete(url, data=request_data) assert response.status_code == 405, response.content.decode() def test_delete_relationship_overriding_with_none(self): @@ -213,9 +195,7 @@ def test_delete_relationship_overriding_with_none(self): } } } - response = self.client.patch( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.patch(url, data=request_data) assert response.status_code == 200, response.content.decode() assert response.data['author'] is None @@ -224,9 +204,7 @@ def test_delete_to_many_relationship_with_no_change(self): request_data = { 'data': [{'type': format_resource_type('Comment'), 'id': str(self.second_comment.id)}, ] } - response = self.client.delete( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.delete(url, data=request_data) assert response.status_code == 204, response.content.decode() assert len(response.rendered_content) == 0, response.rendered_content.decode() @@ -235,9 +213,7 @@ def test_delete_one_to_many_relationship_with_not_null_constraint(self): request_data = { 'data': [{'type': format_resource_type('Comment'), 'id': str(self.first_comment.id)}, ] } - response = self.client.delete( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.delete(url, data=request_data) assert response.status_code == 409, response.content.decode() def test_delete_to_many_relationship_with_change(self): @@ -245,9 +221,7 @@ def test_delete_to_many_relationship_with_change(self): request_data = { 'data': [{'type': format_resource_type('Comment'), 'id': str(self.second_comment.id)}, ] } - response = self.client.delete( - url, data=json.dumps(request_data), content_type='application/vnd.api+json' - ) + response = self.client.delete(url, data=request_data) assert response.status_code == 200, response.content.decode() diff --git a/example/tests/utils.py b/example/tests/utils.py deleted file mode 100644 index 00e56e69..00000000 --- a/example/tests/utils.py +++ /dev/null @@ -1,21 +0,0 @@ -import json - -from django.utils.encoding import force_bytes, force_text - - -def load_json(data): - return json.loads(force_text(data)) - - -def dump_json(data): - ''' - Converts a Python object to a JSON formatted string. - ''' - - json_kwargs = { - 'sort_keys': True, - 'indent': 4, - 'separators': (', ', ': ') - } - - return force_bytes(json.dumps(data, **json_kwargs)) diff --git a/example/urls_test.py b/example/urls_test.py index e8ca9f31..486ce418 100644 --- a/example/urls_test.py +++ b/example/urls_test.py @@ -12,6 +12,7 @@ CompanyViewset, EntryRelationshipView, EntryViewSet, + NonPaginatedEntryViewSet, ProjectViewset ) @@ -19,6 +20,7 @@ router.register(r'blogs', BlogViewSet) router.register(r'entries', EntryViewSet) +router.register(r'nopage-entries', NonPaginatedEntryViewSet, 'nopage-entry') router.register(r'authors', AuthorViewSet) router.register(r'comments', CommentViewSet) router.register(r'companies', CompanyViewset) diff --git a/example/views.py b/example/views.py index 97ec5082..6182c6df 100644 --- a/example/views.py +++ b/example/views.py @@ -5,6 +5,7 @@ import rest_framework_json_api.metadata import rest_framework_json_api.parsers import rest_framework_json_api.renderers +from rest_framework_json_api.pagination import PageNumberPagination from rest_framework_json_api.utils import format_drf_errors from rest_framework_json_api.views import ModelViewSet, RelationshipView @@ -68,6 +69,14 @@ def get_serializer_class(self): return EntrySerializer +class NoPagination(PageNumberPagination): + page_size = None + + +class NonPaginatedEntryViewSet(EntryViewSet): + pagination_class = NoPagination + + class AuthorViewSet(ModelViewSet): queryset = Author.objects.all() serializer_class = AuthorSerializer diff --git a/rest_framework_json_api/renderers.py b/rest_framework_json_api/renderers.py index a13efc65..6360412a 100644 --- a/rest_framework_json_api/renderers.py +++ b/rest_framework_json_api/renderers.py @@ -496,6 +496,8 @@ def render_errors(self, data, accepted_media_type=None, renderer_context=None): def render(self, data, accepted_media_type=None, renderer_context=None): + renderer_context = renderer_context or {} + view = renderer_context.get("view", None) request = renderer_context.get("request", None) diff --git a/rest_framework_json_api/utils.py b/rest_framework_json_api/utils.py index 2916638f..2d991050 100644 --- a/rest_framework_json_api/utils.py +++ b/rest_framework_json_api/utils.py @@ -40,7 +40,7 @@ def get_resource_name(context, expand_polymorphic_types=False): # Sanity check to make sure we have a view. if not view: - raise APIException(_('Could not find view.')) + return None # Check to see if there is a status code and return early # with the resource_name value of `errors`.