Skip to content

Commit

Permalink
Avoid deprecation warnings during tests (#527)
Browse files Browse the repository at this point in the history
Steps:
* Change to non deprecation pagination class per default
* filterwarnings per test level where a warning is actually tested
* Add some global filterwarnings for warnings which happen during import
  time. (those can be removed when tests are being restructured)

All in all when running tests it should bloat the output with unrelated
warning messages anymore.
  • Loading branch information
sliverc authored and n2ygk committed Dec 6, 2018
1 parent e5bea80 commit fd77738
Show file tree
Hide file tree
Showing 16 changed files with 60 additions and 55 deletions.
13 changes: 1 addition & 12 deletions example/api/resources/identity.py
Expand Up @@ -11,20 +11,9 @@


class Identity(mixins.MultipleIDMixin, viewsets.ModelViewSet):
queryset = auth_models.User.objects.all()
queryset = auth_models.User.objects.all().order_by('pk')
serializer_class = IdentitySerializer

@list_route()
def empty_list(self, request):
"""
This is a hack/workaround to return an empty result on a list
endpoint because the delete operation in the test_empty_pluralization
test doesn't prevent the /identities endpoint from still returning
records when called in the same test. Suggestions welcome.
"""
self.queryset = self.queryset.filter(pk=None)
return super(Identity, self).list(request)

# demonstrate sideloading data for use at app boot time
@list_route()
def posts(self, request):
Expand Down
2 changes: 1 addition & 1 deletion example/settings/dev.py
Expand Up @@ -72,7 +72,7 @@
'PAGE_SIZE': 5,
'EXCEPTION_HANDLER': 'rest_framework_json_api.exceptions.exception_handler',
'DEFAULT_PAGINATION_CLASS':
'rest_framework_json_api.pagination.PageNumberPagination',
'rest_framework_json_api.pagination.JsonApiPageNumberPagination',
'DEFAULT_PARSER_CLASSES': (
'rest_framework_json_api.parsers.JSONParser',
'rest_framework.parsers.FormParser',
Expand Down
14 changes: 4 additions & 10 deletions example/tests/integration/test_includes.py
Expand Up @@ -4,14 +4,8 @@
pytestmark = pytest.mark.django_db


def test_default_included_data_on_list(multiple_entries, client):
return test_included_data_on_list(
multiple_entries=multiple_entries, client=client, query='?page_size=5'
)


def test_included_data_on_list(multiple_entries, client, query='?include=comments&page_size=5'):
response = client.get(reverse("entry-list") + query)
def test_included_data_on_list(multiple_entries, client):
response = client.get(reverse("entry-list"), data={'include': 'comments', 'page[size]': 5})
included = response.json().get('included')

assert len(response.json()['data']) == len(multiple_entries), (
Expand Down Expand Up @@ -79,7 +73,7 @@ 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')
'comments.author.bio,comments.writer&page[size]=5')
included = response.json().get('included')

assert len(response.json()['data']) == len(multiple_entries), (
Expand Down Expand Up @@ -113,7 +107,7 @@ 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')
'comments.author.bio&page[size]=5')
included = response.json().get('included')

assert len(response.json()['data']) == len(multiple_entries), (
Expand Down
4 changes: 2 additions & 2 deletions example/tests/integration/test_meta.py
Expand Up @@ -28,8 +28,8 @@ def test_top_level_meta_for_list_view(blog, client):
},
}],
'links': {
'first': 'http://testserver/blogs?page=1',
'last': 'http://testserver/blogs?page=1',
'first': 'http://testserver/blogs?page%5Bnumber%5D=1',
'last': 'http://testserver/blogs?page%5Bnumber%5D=1',
'next': None,
'prev': None
},
Expand Down
4 changes: 2 additions & 2 deletions example/tests/integration/test_pagination.py
Expand Up @@ -87,8 +87,8 @@ def test_pagination_with_single_entry(single_entry, client):
}
}],
"links": {
"first": "http://testserver/entries?page=1",
"last": "http://testserver/entries?page=1",
'first': 'http://testserver/entries?page%5Bnumber%5D=1',
'last': 'http://testserver/entries?page%5Bnumber%5D=1',
"next": None,
"prev": None,
},
Expand Down
4 changes: 2 additions & 2 deletions example/tests/integration/test_polymorphism.py
Expand Up @@ -105,8 +105,8 @@ def test_polymorphism_on_polymorphic_model_w_included_serializers(client):
def test_polymorphic_model_without_any_instance(client):
expected = {
"links": {
"first": "http://testserver/projects?page=1",
"last": "http://testserver/projects?page=1",
'first': 'http://testserver/projects?page%5Bnumber%5D=1',
'last': 'http://testserver/projects?page%5Bnumber%5D=1',
"next": None,
"prev": None
},
Expand Down
6 changes: 3 additions & 3 deletions example/tests/test_format_keys.py
Expand Up @@ -36,9 +36,9 @@ def test_camelization(self):
}
],
'links': {
'first': 'http://testserver/identities?page=1',
'last': 'http://testserver/identities?page=2',
'next': 'http://testserver/identities?page=2',
'first': 'http://testserver/identities?page%5Bnumber%5D=1',
'last': 'http://testserver/identities?page%5Bnumber%5D=2',
'next': 'http://testserver/identities?page%5Bnumber%5D=2',
'prev': None
},
'meta': {
Expand Down
20 changes: 10 additions & 10 deletions example/tests/test_model_viewsets.py
Expand Up @@ -43,9 +43,9 @@ def test_key_in_list_result(self):
}
],
'links': {
'first': 'http://testserver/identities?page=1',
'last': 'http://testserver/identities?page=2',
'next': 'http://testserver/identities?page=2',
'first': 'http://testserver/identities?page%5Bnumber%5D=1',
'last': 'http://testserver/identities?page%5Bnumber%5D=2',
'next': 'http://testserver/identities?page%5Bnumber%5D=2',
'prev': None
},
'meta': {
Expand All @@ -63,7 +63,7 @@ def test_page_two_in_list_result(self):
"""
Ensure that the second page is reachable and is the correct data.
"""
response = self.client.get(self.list_url, {'page': 2})
response = self.client.get(self.list_url, {'page[number]': 2})
self.assertEqual(response.status_code, 200)

user = get_user_model().objects.all()[1]
Expand All @@ -80,10 +80,10 @@ def test_page_two_in_list_result(self):
}
],
'links': {
'first': 'http://testserver/identities?page=1',
'last': 'http://testserver/identities?page=2',
'first': 'http://testserver/identities?page%5Bnumber%5D=1',
'last': 'http://testserver/identities?page%5Bnumber%5D=2',
'next': None,
'prev': 'http://testserver/identities?page=1',
'prev': 'http://testserver/identities?page%5Bnumber%5D=1'
},
'meta': {
'pagination': {
Expand All @@ -102,7 +102,7 @@ def test_page_range_in_list_result(self):
tests pluralization as two objects means it converts ``user`` to
``users``.
"""
response = self.client.get(self.list_url, {'page_size': 2})
response = self.client.get(self.list_url, {'page[size]': 2})
self.assertEqual(response.status_code, 200)

users = get_user_model().objects.all()
Expand All @@ -128,8 +128,8 @@ def test_page_range_in_list_result(self):
}
],
'links': {
'first': 'http://testserver/identities?page=1&page_size=2',
'last': 'http://testserver/identities?page=1&page_size=2',
'first': 'http://testserver/identities?page%5Bnumber%5D=1&page%5Bsize%5D=2',
'last': 'http://testserver/identities?page%5Bnumber%5D=1&page%5Bsize%5D=2',
'next': None,
'prev': None
},
Expand Down
12 changes: 6 additions & 6 deletions example/tests/test_multiple_id_mixin.py
Expand Up @@ -39,9 +39,9 @@ def test_single_id_in_query_params(self):
links = json_content.get("links")
meta = json_content.get("meta").get('pagination')

self.assertEquals(expected.get('user'), json_content.get('user'))
self.assertEquals(meta.get('count', 0), 1)
self.assertEquals(links.get("next"), None)
self.assertEqual(expected.get('user'), json_content.get('user'))
self.assertEqual(meta.get('count', 0), 1)
self.assertEqual(links.get("next"), None)
self.assertEqual(meta.get("page"), 1)

def test_multiple_ids_in_query_params(self):
Expand Down Expand Up @@ -69,11 +69,11 @@ def test_multiple_ids_in_query_params(self):
links = json_content.get("links")
meta = json_content.get("meta").get('pagination')

self.assertEquals(expected.get('user'), json_content.get('user'))
self.assertEquals(meta.get('count', 0), 2)
self.assertEqual(expected.get('user'), json_content.get('user'))
self.assertEqual(meta.get('count', 0), 2)
self.assertEqual(
sorted(
'http://testserver/identities?ids%5B%5D=2&ids%5B%5D=1&page=2'
'http://testserver/identities?ids%5B%5D=2&ids%5B%5D=1&page%5Bnumber%5D=2'
.split('?')[1].split('&')
),
sorted(
Expand Down
2 changes: 2 additions & 0 deletions example/tests/test_parsers.py
@@ -1,6 +1,7 @@
import json
from io import BytesIO

import pytest
from django.test import TestCase, override_settings
from rest_framework.exceptions import ParseError

Expand Down Expand Up @@ -34,6 +35,7 @@ def __init__(self):

self.string = json.dumps(data)

@pytest.mark.filterwarnings("ignore:`format_keys` function and `JSON_API_FORMAT_KEYS`")
@override_settings(JSON_API_FORMAT_KEYS='camelize')
def test_parse_include_metadata_format_keys(self):
parser = JSONParser()
Expand Down
4 changes: 2 additions & 2 deletions example/tests/test_performance.py
Expand Up @@ -41,7 +41,7 @@ def test_query_count_no_includes(self):
2. The SELECT query for the set
"""
with self.assertNumQueries(2):
response = self.client.get('/comments?page_size=25')
response = self.client.get('/comments?page[size]=25')
self.assertEqual(len(response.data['results']), 25)

def test_query_count_include_author(self):
Expand All @@ -54,5 +54,5 @@ def test_query_count_include_author(self):
5. Entries prefetched
"""
with self.assertNumQueries(5):
response = self.client.get('/comments?include=author&page_size=25')
response = self.client.get('/comments?include=author&page[size]=25')
self.assertEqual(len(response.data['results']), 25)
5 changes: 3 additions & 2 deletions example/tests/unit/test_default_drf_serializers.py
Expand Up @@ -68,6 +68,7 @@ def test_render_format_field_names(settings):
assert result['data']['attributes']['json-field'] == {'JsonKey': 'JsonValue'}


@pytest.mark.filterwarnings("ignore:`format_keys` function and `JSON_API_FORMAT_KEYS`")
def test_render_format_keys(settings):
"""Test that json field value keys are formated."""
delattr(settings, 'JSON_API_FORMAT_FILED_NAMES')
Expand Down Expand Up @@ -195,8 +196,8 @@ def test_get_entry_list_with_blogs(client, entry):

expected = {
'links': {
'first': 'http://testserver/drf-entries/1/suggested/?page=1',
'last': 'http://testserver/drf-entries/1/suggested/?page=1',
'first': 'http://testserver/drf-entries/1/suggested/?page%5Bnumber%5D=1',
'last': 'http://testserver/drf-entries/1/suggested/?page%5Bnumber%5D=1',
'next': None,
'prev': None
},
Expand Down
3 changes: 3 additions & 0 deletions example/tests/unit/test_renderers.py
@@ -1,5 +1,7 @@
import json

import pytest

from rest_framework_json_api import serializers, views
from rest_framework_json_api.renderers import JSONRenderer

Expand Down Expand Up @@ -79,6 +81,7 @@ def test_render_format_field_names(settings):
assert result['data']['attributes']['json-field'] == {'JsonKey': 'JsonValue'}


@pytest.mark.filterwarnings("ignore:`format_keys` function and `JSON_API_FORMAT_KEYS`")
def test_render_format_keys(settings):
"""Test that json field value keys are formated."""
delattr(settings, 'JSON_API_FORMAT_FILED_NAMES')
Expand Down
1 change: 1 addition & 0 deletions example/tests/unit/test_utils.py
Expand Up @@ -62,6 +62,7 @@ def test_get_resource_name():
assert 'users' == utils.get_resource_name(context), 'derived from non-model serializer'


@pytest.mark.filterwarnings("ignore:`format_keys` function and `JSON_API_FORMAT_KEYS`")
def test_format_keys():
underscored = {
'first_name': 'a',
Expand Down
6 changes: 3 additions & 3 deletions example/views.py
Expand Up @@ -10,7 +10,7 @@
import rest_framework_json_api.renderers
from rest_framework_json_api.django_filters import DjangoFilterBackend
from rest_framework_json_api.filters import OrderingFilter, QueryParameterValidationFilter
from rest_framework_json_api.pagination import PageNumberPagination
from rest_framework_json_api.pagination import JsonApiPageNumberPagination
from rest_framework_json_api.utils import format_drf_errors
from rest_framework_json_api.views import ModelViewSet, RelationshipView

Expand Down Expand Up @@ -119,7 +119,7 @@ def get_object(self):
return super(DRFEntryViewSet, self).get_object()


class NoPagination(PageNumberPagination):
class NoPagination(JsonApiPageNumberPagination):
page_size = None


Expand Down Expand Up @@ -203,7 +203,7 @@ class CompanyViewset(ModelViewSet):


class ProjectViewset(ModelViewSet):
queryset = Project.objects.all()
queryset = Project.objects.all().order_by('pk')
serializer_class = ProjectSerializer


Expand Down
15 changes: 15 additions & 0 deletions pytest.ini
@@ -1,2 +1,17 @@
[pytest]
DJANGO_SETTINGS_MODULE=example.settings.test
filterwarnings =
error::DeprecationWarning
error::PendingDeprecationWarning
# TODO: restructure tests so this can be ignored on a test level
ignore:MarkInfo objects are deprecated as they contain merged marks which are hard to deal with correctly.
ignore:use of getfuncargvalue is deprecated, use getfixturevalue
ignore:`list_route`
ignore:`detail_route`
ignore:`FiltersetEntryViewSet.filter_fields` attribute should be renamed
ignore:`NoFiltersetEntryViewSet.filter_fields` attribute should be renamed
ignore:`NoFiltersetEntryViewSet.filter_class` attribute should be renamed `filterset_class`
ignore:MultipleIDMixin is deprecated
# can be removed once following DRF PR is released
# https://github.com/encode/django-rest-framework/pull/6268
ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated

0 comments on commit fd77738

Please sign in to comment.