Example #1
0
 def pagination_class(self):
     return CustomPagination(
         default_limit=len(CATEGORY_CHOICES_DICT))
Example #2
0
 def setUp(self):
     self.url = '/api/whatever'
     self.paginator = CustomPagination()
Example #3
0
 def pagination_class(self):
     return CustomPagination(
         default_limit=len(REGIONS_CHOICES_SLUG))
Example #4
0
class TestPaginatorMeta(TestCase):
    def setUp(self):
        self.url = '/api/whatever'
        self.paginator = CustomPagination()

    def get_serialized_data(self, page):
        return self.paginator.get_paginated_response(page).data['meta']

    def req(self, **kwargs):
        self.request = Request(RequestFactory().get(self.url, kwargs))

    def test_simple(self):
        data = ['a', 'b', 'c']
        per_page = 3
        self.req(limit=per_page)
        page = self.paginator.paginate_queryset(data, self.request)
        serialized = self.get_serialized_data(page)
        eq_(serialized['offset'], 0)
        eq_(serialized['next'], None)
        eq_(serialized['previous'], None)
        eq_(serialized['total_count'], len(data))
        eq_(serialized['limit'], per_page)

    def test_first_page_of_two(self):
        data = ['a', 'b', 'c', 'd', 'e']
        per_page = 3
        self.req(limit=per_page)
        page = self.paginator.paginate_queryset(data, self.request)
        serialized = self.get_serialized_data(page)
        eq_(serialized['offset'], 0)
        eq_(serialized['total_count'], len(data))
        eq_(serialized['limit'], per_page)

        eq_(serialized['previous'], None)

        next = urlparse(serialized['next'])
        eq_(next.path, self.url)
        eq_(QueryDict(next.query), QueryDict('limit=3&offset=3'))

    def test_third_page_of_four(self):
        data = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
        per_page = 2
        self.req(limit=per_page, offset=4)
        page = self.paginator.paginate_queryset(data, self.request)
        serialized = self.get_serialized_data(page)
        # Third page will begin after fourth item
        # (per_page * number of pages before) item.
        eq_(serialized['offset'], 4)
        eq_(serialized['total_count'], len(data))
        eq_(serialized['limit'], per_page)

        prev = urlparse(serialized['previous'])
        eq_(prev.path, self.url)
        eq_(QueryDict(prev.query), QueryDict('limit=2&offset=2'))

        next = urlparse(serialized['next'])
        eq_(next.path, self.url)
        eq_(QueryDict(next.query), QueryDict('limit=2&offset=6'))

    def test_fourth_page_of_four(self):
        data = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
        per_page = 2
        self.req(limit=per_page, offset=6)
        page = self.paginator.paginate_queryset(data, self.request)
        serialized = self.get_serialized_data(page)
        # Third page will begin after fourth item
        # (per_page * number of pages before) item.
        eq_(serialized['offset'], 6)
        eq_(serialized['total_count'], len(data))
        eq_(serialized['limit'], per_page)

        prev = urlparse(serialized['previous'])
        eq_(prev.path, self.url)
        eq_(QueryDict(prev.query), QueryDict('limit=2&offset=4'))

        eq_(serialized['next'], None)

    def test_with_request_path_override_existing_params(self):
        self.url = '/api/whatever/?limit=2&offset=2&extra=n&superfluous=yes'
        self.request = Request(RequestFactory().get(self.url))
        data = ['a', 'b', 'c', 'd', 'e', 'f']
        page = self.paginator.paginate_queryset(data, self.request)
        serialized = self.get_serialized_data(page)
        eq_(serialized['offset'], 2)
        eq_(serialized['total_count'], len(data))
        eq_(serialized['limit'], 2)

        prev = urlparse(serialized['previous'])
        eq_(prev.path, '/api/whatever/')
        eq_(QueryDict(prev.query),
            QueryDict('limit=2&extra=n&superfluous=yes'))

        next = urlparse(serialized['next'])
        eq_(next.path, '/api/whatever/')
        eq_(QueryDict(next.query),
            QueryDict('limit=2&offset=4&extra=n&superfluous=yes'))

    def test_urlencoded_query_string(self):
        self.url = '/api/whatever/yó'
        data = ['a', 'b', 'c', 'd', 'e', 'f']
        self.req(limit=1)
        page = self.paginator.paginate_queryset(data, self.request)
        serialized = self.get_serialized_data(page)
        assert '/y%C3%B3?' in serialized['next']