aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/tests
diff options
context:
space:
mode:
authorTom Christie2012-11-07 21:07:24 +0000
committerTom Christie2012-11-07 21:07:24 +0000
commit47b534a13e42d498629bf9522225633122c563d5 (patch)
treefc7acddb14038fc5f159c1399dac7974a76caf4b /rest_framework/tests
parent9fd061a0b68f0cef6683bf195911a2cc7ff2fa06 (diff)
downloaddjango-rest-framework-47b534a13e42d498629bf9522225633122c563d5.tar.bz2
Make filtering optional, and pluggable.
Diffstat (limited to 'rest_framework/tests')
-rw-r--r--rest_framework/tests/filterset.py71
-rw-r--r--rest_framework/tests/pagination.py23
-rw-r--r--rest_framework/tests/response.py6
3 files changed, 51 insertions, 49 deletions
diff --git a/rest_framework/tests/filterset.py b/rest_framework/tests/filterset.py
index 5374eefc..6cdea32f 100644
--- a/rest_framework/tests/filterset.py
+++ b/rest_framework/tests/filterset.py
@@ -2,44 +2,45 @@ import datetime
from decimal import Decimal
from django.test import TestCase
from django.test.client import RequestFactory
+from django.utils import unittest
from rest_framework import generics, status
+from rest_framework.compat import django_filters
from rest_framework.tests.models import FilterableItem, BasicModel
-import django_filters
factory = RequestFactory()
-# Basic filter on a list view.
-class FilterFieldsRootView(generics.ListCreateAPIView):
- model = FilterableItem
- filter_fields = ['decimal', 'date']
-
-# These class are used to test a filter class.
-class SeveralFieldsFilter(django_filters.FilterSet):
- text = django_filters.CharFilter(lookup_type='icontains')
- decimal = django_filters.NumberFilter(lookup_type='lt')
- date = django_filters.DateFilter(lookup_type='gt')
- class Meta:
+if django_filters:
+ # Basic filter on a list view.
+ class FilterFieldsRootView(generics.ListCreateAPIView):
model = FilterableItem
- fields = ['text', 'decimal', 'date']
+ filter_fields = ['decimal', 'date']
+ # These class are used to test a filter class.
+ class SeveralFieldsFilter(django_filters.FilterSet):
+ text = django_filters.CharFilter(lookup_type='icontains')
+ decimal = django_filters.NumberFilter(lookup_type='lt')
+ date = django_filters.DateFilter(lookup_type='gt')
-class FilterClassRootView(generics.ListCreateAPIView):
- model = FilterableItem
- filter_class = SeveralFieldsFilter
+ class Meta:
+ model = FilterableItem
+ fields = ['text', 'decimal', 'date']
+ class FilterClassRootView(generics.ListCreateAPIView):
+ model = FilterableItem
+ filter_class = SeveralFieldsFilter
-# These classes are used to test a misconfigured filter class.
-class MisconfiguredFilter(django_filters.FilterSet):
- text = django_filters.CharFilter(lookup_type='icontains')
- class Meta:
- model = BasicModel
- fields = ['text']
+ # These classes are used to test a misconfigured filter class.
+ class MisconfiguredFilter(django_filters.FilterSet):
+ text = django_filters.CharFilter(lookup_type='icontains')
+ class Meta:
+ model = BasicModel
+ fields = ['text']
-class IncorrectlyConfiguredRootView(generics.ListCreateAPIView):
- model = FilterableItem
- filter_class = MisconfiguredFilter
+ class IncorrectlyConfiguredRootView(generics.ListCreateAPIView):
+ model = FilterableItem
+ filter_class = MisconfiguredFilter
class IntegrationTestFiltering(TestCase):
@@ -64,6 +65,7 @@ class IntegrationTestFiltering(TestCase):
for obj in self.objects.all()
]
+ @unittest.skipUnless(django_filters, 'django-filters not installed')
def test_get_filtered_fields_root_view(self):
"""
GET requests to paginated ListCreateAPIView should return paginated results.
@@ -81,7 +83,7 @@ class IntegrationTestFiltering(TestCase):
request = factory.get('/?decimal=%s' % search_decimal)
response = view(request).render()
self.assertEquals(response.status_code, status.HTTP_200_OK)
- expected_data = [ f for f in self.data if f['decimal'] == search_decimal ]
+ expected_data = [f for f in self.data if f['decimal'] == search_decimal]
self.assertEquals(response.data, expected_data)
# Tests that the date filter works.
@@ -89,9 +91,10 @@ class IntegrationTestFiltering(TestCase):
request = factory.get('/?date=%s' % search_date) # search_date str: '2012-09-22'
response = view(request).render()
self.assertEquals(response.status_code, status.HTTP_200_OK)
- expected_data = [ f for f in self.data if f['date'] == search_date ]
+ expected_data = [f for f in self.data if f['date'] == search_date]
self.assertEquals(response.data, expected_data)
+ @unittest.skipUnless(django_filters, 'django-filters not installed')
def test_get_filtered_class_root_view(self):
"""
GET requests to filtered ListCreateAPIView that have a filter_class set
@@ -110,7 +113,7 @@ class IntegrationTestFiltering(TestCase):
request = factory.get('/?decimal=%s' % search_decimal)
response = view(request).render()
self.assertEquals(response.status_code, status.HTTP_200_OK)
- expected_data = [ f for f in self.data if f['decimal'] < search_decimal ]
+ expected_data = [f for f in self.data if f['decimal'] < search_decimal]
self.assertEquals(response.data, expected_data)
# Tests that the date filter set with 'gt' in the filter class works.
@@ -118,7 +121,7 @@ class IntegrationTestFiltering(TestCase):
request = factory.get('/?date=%s' % search_date) # search_date str: '2012-10-02'
response = view(request).render()
self.assertEquals(response.status_code, status.HTTP_200_OK)
- expected_data = [ f for f in self.data if f['date'] > search_date ]
+ expected_data = [f for f in self.data if f['date'] > search_date]
self.assertEquals(response.data, expected_data)
# Tests that the text filter set with 'icontains' in the filter class works.
@@ -126,7 +129,7 @@ class IntegrationTestFiltering(TestCase):
request = factory.get('/?text=%s' % search_text)
response = view(request).render()
self.assertEquals(response.status_code, status.HTTP_200_OK)
- expected_data = [ f for f in self.data if search_text in f['text'].lower() ]
+ expected_data = [f for f in self.data if search_text in f['text'].lower()]
self.assertEquals(response.data, expected_data)
# Tests that multiple filters works.
@@ -135,10 +138,11 @@ class IntegrationTestFiltering(TestCase):
request = factory.get('/?decimal=%s&date=%s' % (search_decimal, search_date))
response = view(request).render()
self.assertEquals(response.status_code, status.HTTP_200_OK)
- expected_data = [ f for f in self.data if f['date'] > search_date and
- f['decimal'] < search_decimal ]
+ expected_data = [f for f in self.data if f['date'] > search_date and
+ f['decimal'] < search_decimal]
self.assertEquals(response.data, expected_data)
+ @unittest.skipUnless(django_filters, 'django-filters not installed')
def test_incorrectly_configured_filter(self):
"""
An error should be displayed when the filter class is misconfigured.
@@ -148,6 +152,7 @@ class IntegrationTestFiltering(TestCase):
request = factory.get('/')
self.assertRaises(AssertionError, view, request)
+ @unittest.skipUnless(django_filters, 'django-filters not installed')
def test_unknown_filter(self):
"""
GET requests with filters that aren't configured should return 200.
@@ -157,4 +162,4 @@ class IntegrationTestFiltering(TestCase):
search_integer = 10
request = factory.get('/?integer=%s' % search_integer)
response = view(request).render()
- self.assertEquals(response.status_code, status.HTTP_200_OK) \ No newline at end of file
+ self.assertEquals(response.status_code, status.HTTP_200_OK)
diff --git a/rest_framework/tests/pagination.py b/rest_framework/tests/pagination.py
index 7a2134e0..7f8cd524 100644
--- a/rest_framework/tests/pagination.py
+++ b/rest_framework/tests/pagination.py
@@ -3,9 +3,10 @@ from decimal import Decimal
from django.core.paginator import Paginator
from django.test import TestCase
from django.test.client import RequestFactory
+from django.utils import unittest
from rest_framework import generics, status, pagination
+from rest_framework.compat import django_filters
from rest_framework.tests.models import BasicModel, FilterableItem
-import django_filters
factory = RequestFactory()
@@ -18,17 +19,18 @@ class RootView(generics.ListCreateAPIView):
paginate_by = 10
-class DecimalFilter(django_filters.FilterSet):
- decimal = django_filters.NumberFilter(lookup_type='lt')
- class Meta:
- model = FilterableItem
- fields = ['text', 'decimal', 'date']
+if django_filters:
+ class DecimalFilter(django_filters.FilterSet):
+ decimal = django_filters.NumberFilter(lookup_type='lt')
+ class Meta:
+ model = FilterableItem
+ fields = ['text', 'decimal', 'date']
-class FilterFieldsRootView(generics.ListCreateAPIView):
- model = FilterableItem
- paginate_by = 10
- filter_class = DecimalFilter
+ class FilterFieldsRootView(generics.ListCreateAPIView):
+ model = FilterableItem
+ paginate_by = 10
+ filter_class = DecimalFilter
class IntegrationTestPagination(TestCase):
@@ -98,6 +100,7 @@ class IntegrationTestPaginationAndFiltering(TestCase):
]
self.view = FilterFieldsRootView.as_view()
+ @unittest.skipUnless(django_filters, 'django-filters not installed')
def test_get_paginated_filtered_root_view(self):
"""
GET requests to paginated filtered ListCreateAPIView should return
diff --git a/rest_framework/tests/response.py b/rest_framework/tests/response.py
index 18b6af39..d7b75450 100644
--- a/rest_framework/tests/response.py
+++ b/rest_framework/tests/response.py
@@ -131,12 +131,6 @@ class RendererIntegrationTests(TestCase):
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEquals(resp.status_code, DUMMYSTATUS)
- @unittest.skip('can\'t pass because view is a simple Django view and response is an ImmediateResponse')
- def test_unsatisfiable_accept_header_on_request_returns_406_status(self):
- """If the Accept header is unsatisfiable we should return a 406 Not Acceptable response."""
- resp = self.client.get('/', HTTP_ACCEPT='foo/bar')
- self.assertEquals(resp.status_code, status.HTTP_406_NOT_ACCEPTABLE)
-
def test_specified_renderer_serializes_content_on_format_query(self):
"""If a 'format' query is specified, the renderer with the matching
format attribute should serialize the response."""