aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/tests/pagination.py
diff options
context:
space:
mode:
authorBen Konrath2012-10-08 22:00:55 +0200
committerBen Konrath2012-10-11 12:01:07 +0200
commit1e9ece0f9353515265da9b6266dc4b39775a0257 (patch)
treeab71c69bc46d7e48e256a2cb31128b241e0b2e0f /rest_framework/tests/pagination.py
parent83f39b3dce4028ff6b2ebe0be55c2a00d67ede00 (diff)
downloaddjango-rest-framework-1e9ece0f9353515265da9b6266dc4b39775a0257.tar.bz2
First attempt at adding filter support.
The filter support uses django-filter to work its magic.
Diffstat (limited to 'rest_framework/tests/pagination.py')
-rw-r--r--rest_framework/tests/pagination.py69
1 files changed, 67 insertions, 2 deletions
diff --git a/rest_framework/tests/pagination.py b/rest_framework/tests/pagination.py
index a939c9ef..729bbfc2 100644
--- a/rest_framework/tests/pagination.py
+++ b/rest_framework/tests/pagination.py
@@ -1,8 +1,10 @@
+import datetime
from django.core.paginator import Paginator
from django.test import TestCase
from django.test.client import RequestFactory
from rest_framework import generics, status, pagination
-from rest_framework.tests.models import BasicModel
+from rest_framework.tests.models import BasicModel, FilterableItem
+import django_filters
factory = RequestFactory()
@@ -15,6 +17,19 @@ 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']
+
+
+class FilterFieldsRootView(generics.ListCreateAPIView):
+ model = FilterableItem
+ paginate_by = 10
+ filter_class = DecimalFilter
+
+
class IntegrationTestPagination(TestCase):
"""
Integration tests for paginated list views.
@@ -22,7 +37,7 @@ class IntegrationTestPagination(TestCase):
def setUp(self):
"""
- Create 26 BasicModel intances.
+ Create 26 BasicModel instances.
"""
for char in 'abcdefghijklmnopqrstuvwxyz':
BasicModel(text=char * 3).save()
@@ -61,6 +76,56 @@ class IntegrationTestPagination(TestCase):
self.assertEquals(response.data['next'], None)
self.assertNotEquals(response.data['previous'], None)
+class IntegrationTestPaginationAndFiltering(TestCase):
+
+ def setUp(self):
+ """
+ Create 50 FilterableItem instances.
+ """
+ base_data = ('a', 0.25, datetime.date(2012, 10, 8))
+ for i in range(26):
+ text = chr(i + ord(base_data[0])) * 3 # Produces string 'aaa', 'bbb', etc.
+ decimal = base_data[1] + i
+ date = base_data[2] - datetime.timedelta(days=i * 2)
+ FilterableItem(text=text, decimal=decimal, date=date).save()
+
+ self.objects = FilterableItem.objects
+ self.data = [
+ {'id': obj.id, 'text': obj.text, 'decimal': obj.decimal, 'date': obj.date}
+ for obj in self.objects.all()
+ ]
+ self.view = FilterFieldsRootView.as_view()
+
+ def test_get_paginated_filtered_root_view(self):
+ """
+ GET requests to paginated filtered ListCreateAPIView should return
+ paginated results. The next and previous links should preserve the
+ filtered parameters.
+ """
+ request = factory.get('/?decimal=15.20')
+ response = self.view(request).render()
+ self.assertEquals(response.status_code, status.HTTP_200_OK)
+ self.assertEquals(response.data['count'], 15)
+ self.assertEquals(response.data['results'], self.data[:10])
+ self.assertNotEquals(response.data['next'], None)
+ self.assertEquals(response.data['previous'], None)
+
+ request = factory.get(response.data['next'])
+ response = self.view(request).render()
+ self.assertEquals(response.status_code, status.HTTP_200_OK)
+ self.assertEquals(response.data['count'], 15)
+ self.assertEquals(response.data['results'], self.data[10:15])
+ self.assertEquals(response.data['next'], None)
+ self.assertNotEquals(response.data['previous'], None)
+
+ request = factory.get(response.data['previous'])
+ response = self.view(request).render()
+ self.assertEquals(response.status_code, status.HTTP_200_OK)
+ self.assertEquals(response.data['count'], 15)
+ self.assertEquals(response.data['results'], self.data[:10])
+ self.assertNotEquals(response.data['next'], None)
+ self.assertEquals(response.data['previous'], None)
+
class UnitTestPagination(TestCase):
"""