Source code for django_elasticsearch_dsl_drf.tests.test_ordering_common

"""
Test ordering backend.
"""

from __future__ import absolute_import

import unittest

from django.core.management import call_command

from nine.versions import DJANGO_GTE_1_10

import pytest

from rest_framework import status

import factories

from .base import BaseRestFrameworkTestCase

if DJANGO_GTE_1_10:
    from django.urls import reverse
else:
    from django.core.urlresolvers import reverse

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


@pytest.mark.django_db
[docs]class TestOrdering(BaseRestFrameworkTestCase): """Test ordering.""" pytestmark = pytest.mark.django_db @classmethod
[docs] def setUpClass(cls): """Set up class.""" cls.books = factories.BookWithUniqueTitleFactory.create_batch(20) cls.books_url = reverse('bookdocument-list', kwargs={}) cls.authors = factories.AuthorWithUniqueNameFactory.create_batch(20) cls.authors_url = reverse('authordocument-list', kwargs={}) call_command('search_index', '--rebuild', '-f')
def _order_by_field(self, field_name, url, check_ordering=True): """Order by field. For testing the ``OrderingFilterBackend``. :param field_name: :param url: :param check_ordering: :type field_name: str :type url: str :type check_ordering: bool :return: None """ self.authenticate() data = {} # Just a plan field name without ordering information __f_name = field_name __assert_func = self.assertLess if field_name.startswith('-'): __f_name = field_name[1:] __assert_func = self.assertGreater # Should contain 20 results response = self.client.get(url, data) self.assertEqual(response.status_code, status.HTTP_200_OK) # Order should be descending filtered_response = self.client.get( url + '?ordering={}'.format(field_name), data ) self.assertEqual(filtered_response.status_code, status.HTTP_200_OK) if check_ordering: item_count = len(filtered_response.data['results']) for counter, item in enumerate(filtered_response.data['results']): if (counter > 1) and (counter < item_count + 1): __assert_func( filtered_response.data['results'][counter-1][__f_name], filtered_response.data['results'][counter][__f_name] ) def _order_by_default_field(self, field_name, url, check_ordering=True): """Order by default field. For testing the ``DefaultOrderingFilterBackend``. :param field_name: :param url: :param check_ordering: :type field_name: str :type url: str :type check_ordering: bool :return: None """ self.authenticate() data = {} # Just a plan field name without ordering information __f_name = field_name __assert_func = self.assertLess if field_name.startswith('-'): __f_name = field_name[1:] __assert_func = self.assertGreater # Should contain 20 results response = self.client.get(url, data) self.assertEqual(response.status_code, status.HTTP_200_OK) if check_ordering: item_count = len(response.data['results']) for counter, item in enumerate(response.data['results']): if (counter > 1) and (counter < item_count + 1): __assert_func( response.data['results'][counter-1][__f_name], response.data['results'][counter][__f_name] )
[docs] def test_book_order_by_field_id_ascending(self): """Order by field `id` ascending.""" return self._order_by_field('id', self.books_url)
[docs] def test_book_order_by_field_id_descending(self): """Order by field `id` descending.""" return self._order_by_field('-id', self.books_url)
[docs] def test_book_order_by_field_title_ascending(self): """Order by field `title` ascending.""" return self._order_by_field('title', self.books_url)
[docs] def test_book_order_by_field_title_descending(self): """Order by field `title` descending.""" return self._order_by_field('-title', self.books_url)
[docs] def test_book_default_order_by(self): """Book order by default.""" return self._order_by_default_field('id', self.books_url)
[docs] def test_author_order_by_field_id_ascending(self): """Order by field `name` ascending.""" return self._order_by_field('id', self.authors_url)
[docs] def test_author_order_by_field_id_descending(self): """Order by field `id` descending.""" return self._order_by_field('-id', self.authors_url)
[docs] def test_author_order_by_field_name_ascending(self): """Order by field `name` ascending.""" return self._order_by_field('name', self.authors_url)
[docs] def test_author_order_by_field_name_descending(self): """Order by field `name` descending.""" return self._order_by_field('-name', self.authors_url)
[docs] def test_author_default_order_by(self): """Author order by default.""" return self._order_by_default_field('name', self.authors_url)
[docs] def test_book_order_by_non_existent_field(self): """Order by non-existent field.""" return self._order_by_field('another_non_existent_field', self.books_url, check_ordering=False)
if __name__ == '__main__': unittest.main()