Source code for graphene_elastic.tests.test_ordering_backend

import logging
import unittest
import factories
from .base import BaseGrapheneElasticTestCase
from ..filter_backends.queries import Direction

__all__ = (
    'OrderingBackendElasticTestCase',
)

logger = logging.getLogger(__name__)


[docs]class OrderingBackendElasticTestCase(BaseGrapheneElasticTestCase):
[docs] def setUp(self): super(OrderingBackendElasticTestCase, self).setUp() # Important thing to know about the factories. # The `PostFactory` factory has `num_views` between 0 and 1_000. # The `ManyViewsPostFactory` factory has `num_views` between # 2_000 and 10_000. self.num_elastic_posts = 4 self.elastic_posts = factories.PostFactory.create_batch( self.num_elastic_posts, category='Elastic', tags=None ) # for _post in self.elastic_posts: # _post.save() self.num_django_posts = 3 self.django_posts = factories.PostFactory.create_batch( self.num_django_posts, category='Django' ) # for _post in self.django_posts: # _post.save() self.num_python_posts = 2 self.python_posts = factories.ManyViewsPostFactory.create_batch( self.num_python_posts, category='Python', ) # for _post in self.python_posts: # _post.save() self.num_all_posts = ( self.num_elastic_posts + self.num_django_posts + self.num_python_posts ) self.all_posts = ( self.elastic_posts + self.django_posts + self.python_posts ) self.sleep()
def __test_ordering( self, field, direction, document_type_name="allPostDocuments" ): """Test ordering. :param field: :param direction: :param document_type_name: :return: """ _query = """ { %s(ordering:{%s:%s}) { edges { node { category title content numViews tags } } } } """ % (document_type_name, field, direction.name) logger.info(_query) executed = self.client.execute(_query) fields_values_sorted = [] for edge in executed['data'][document_type_name]['edges']: field_value = edge.get('node', {}).get(field, None) fields_values_sorted.append(field_value) sorted_values = sorted(fields_values_sorted) if direction == Direction.DESC: sorted_values = list(reversed(sorted_values)) self.assertEqual(sorted_values, fields_values_sorted) def __test_default_ordering( self, field, direction, document_type_name="allPostDocuments" ): """Test default ordering. :param field: :param direction: :param document_type_name: :return: """ _query = """ { %s { edges { node { category title content numViews tags } } } } """ % document_type_name logger.info(_query) executed = self.client.execute(_query) fields_values_sorted = [] for edge in executed['data'][document_type_name]['edges']: field_value = edge.get('node', {}).get(field, None) fields_values_sorted.append(field_value) sorted_values = sorted(fields_values_sorted) if direction == Direction.DESC: sorted_values = list(reversed(sorted_values)) self.assertEqual(sorted_values, fields_values_sorted) def _test_ordering(self): """"Test ordering (on fields `title` and `num_views`). :return: """ # Test ordering (on fields `title` and `num_views`). with self.subTest('Test ordering on field `title` ascending'): self.__test_ordering( 'title', Direction.ASC ) with self.subTest('Test ordering on field `title` descending'): self.__test_ordering( 'title', Direction.DESC ) with self.subTest('Test ordering on field `num_views` ascending'): self.__test_ordering( 'numViews', Direction.ASC ) with self.subTest('Test ordering on field `num_views` descending'): self.__test_ordering( 'numViews', Direction.DESC ) def _test_alternative_ordering(self): """"Test ordering (on fields `title` and `num_views`). :return: """ # Test ordering (on field `num_views`). with self.subTest('Test ordering on field `num_views` ascending'): self.__test_ordering( 'numViews', Direction.ASC, 'alternativePostDocuments' ) with self.subTest('Test ordering on field `num_views` descending'): self.__test_ordering( 'numViews', Direction.DESC, 'alternativePostDocuments' ) def _test_default_ordering(self): """Test default ordering (on field `num_views).""" with self.subTest('Test default ordering on field `num_views`'): self.__test_default_ordering( 'numViews', Direction.DESC ) def _test_alternative_default_ordering(self): """Test default ordering (on field `num_views).""" with self.subTest('Test default ordering on field `num_views`'): self.__test_default_ordering( 'numViews', Direction.DESC, 'alternativePostDocuments' )
[docs] def test_all(self): """Test all. Since we don't write in specific tests, it's more efficient to run them all from a single method in order to save on speed ups between tests. """ self._test_ordering() self._test_default_ordering() self._test_alternative_ordering() self._test_alternative_default_ordering()
if __name__ == '__main__': unittest.main()