Source code for django_elasticsearch_dsl_drf.tests.test_query_friendly_pagination

"""
Test pagination.
"""

from __future__ import absolute_import

import unittest

from django.core.management import call_command
from django.urls import reverse

from elasticsearch.connection.base import Connection

import pytest

from rest_framework import status

import factories

from .base import BaseRestFrameworkTestCase

__title__ = 'django_elasticsearch_dsl_drf.tests.test_query_friendly_pagination'
__author__ = 'Artur Barseghyan <artur.barseghyan@gmail.com>'
__copyright__ = '2017-2020 Artur Barseghyan'
__license__ = 'GPL 2.0/LGPL 2.1'
__all__ = (
    'TestQueryFriendlyPagination',
)

old_log_request_success = Connection.log_request_success
es_call_count = 0


def patched_log_request_success(self, *args, **kwargs):
    global es_call_count
    es_call_count += 1
    old_log_request_success(self, *args, **kwargs)


Connection.log_request_success = patched_log_request_success


[docs]@pytest.mark.django_db class TestQueryFriendlyPagination(BaseRestFrameworkTestCase): """Test pagination.""" pytestmark = pytest.mark.django_db
[docs] @classmethod def setUpClass(cls): """Set up class.""" super(TestQueryFriendlyPagination, cls).setUpClass() cls.publishers = factories.PublisherFactory.create_batch(43) cls.books = factories.BookFactory.create_batch(43) cls.sleep() call_command('search_index', '--rebuild', '-f')
def _test_pagination(self): """Test pagination.""" invalid_page_url = self.books_url + '?page=3&page_size=30' invalid_response = self.client.get(invalid_page_url, self.data) self.assertEqual( invalid_response.status_code, status.HTTP_404_NOT_FOUND ) def _test_pagination_orphans(self): """Test pagination returning orphaned nodes""" valid_page_url = self.books_url + '?page=1&page_size=40&orphans=3' # Check if response now is valid valid_response = self.client.get(valid_page_url, self.data) self.assertEqual(valid_response.status_code, status.HTTP_200_OK) # Check totals self.assertEqual(len(valid_response.data['results']), 43) def _test_pagination_orphans_over(self): """Test pagination when orphaned nodes fall into next page""" valid_page_url = self.books_url + '?page=1&page_size=40&orphans=2' # Check if response now is valid valid_response = self.client.get(valid_page_url, self.data) self.assertEqual(valid_response.status_code, status.HTTP_200_OK) # Check totals self.assertEqual(len(valid_response.data['results']), 40) valid_page_url = self.books_url + '?page=2&page_size=40&orphans=2' valid_response = self.client.get(valid_page_url, self.data) self.assertEqual(valid_response.status_code, status.HTTP_200_OK) # Check totals self.assertEqual(len(valid_response.data['results']), 3) def _test_pagination_offset(self): """Test pagination defined by offset and limit""" valid_page_url = self.publishers_url + '?limit=5&offset=8' valid_response = self.client.get(valid_page_url, self.data) self.assertEqual(valid_response.status_code, status.HTTP_200_OK) # Check totals self.assertEqual(len(valid_response.data['results']), 5)
[docs] def test_pagination(self): """Test pagination.""" self.authenticate() self.publishers_url = reverse('publisherdocument-list', kwargs={}) self.books_url = reverse( 'bookdocument_query_friendly_pagination-list', kwargs={} ) self.data = {} last_es_call_count = es_call_count self._test_pagination() # Ensure number of ES calls is only 1 self.assertEqual(es_call_count - last_es_call_count, 1) last_es_call_count = es_call_count self._test_pagination_orphans() # Only in case of orphaned nodes, we need 1 more fallback ES call self.assertEqual(es_call_count - last_es_call_count, 2) last_es_call_count = es_call_count self._test_pagination_orphans_over() # Here are two requests self.assertEqual(es_call_count - last_es_call_count, 2) last_es_call_count = es_call_count self._test_pagination_offset() self.assertEqual(es_call_count - last_es_call_count, 1)
if __name__ == '__main__': unittest.main()