Source code for django_elasticsearch_dsl_drf.tests.test_more_like_this

# coding: utf-8
"""
Test more-like-this functionality.
"""

from __future__ import absolute_import, unicode_literals

import unittest
import logging

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_suggesters'
__author__ = 'Artur Barseghyan <artur.barseghyan@gmail.com>'
__copyright__ = '2017-2020 Artur Barseghyan'
__license__ = 'GPL 2.0/LGPL 2.1'
__all__ = (
    'TestMoreLikeThis',
)

LOGGER = logging.getLogger(__name__)


[docs]@pytest.mark.django_db class TestMoreLikeThis(BaseRestFrameworkTestCase): """Test suggesters.""" pytestmark = pytest.mark.django_db
[docs] @classmethod def setUpClass(cls): """Set up class.""" super(TestMoreLikeThis, cls).setUpClass() cls.lorem_books = factories.BookFactory.create_batch(200) cls.books = [] cls.alice_books = [] for book_data in factories.constants.NON_FAKER_BOOK_CONTENT: cls.alice_books.append( factories.BookChapterFactory( title=book_data['title'], summary=book_data['summary'], description=book_data['description'], ) ) cls.alice_books_ids = [__obj.id for __obj in cls.alice_books] cls.sheckley_books = [] for book_data in factories.constants.NON_FAKER_BOOK_CONTENT_OTHER: cls.sheckley_books.append( factories.BookNovelFactory( title=book_data['title'], summary=book_data['summary'], description=book_data['description'], ) ) cls.sheckley_books_ids = [__obj.id for __obj in cls.sheckley_books] cls.books = [] cls.books.extend(cls.alice_books) cls.books.extend(cls.sheckley_books) # Alice book cls.books_url_1 = reverse( 'bookdocument_more_like_this-more-like-this', kwargs={'id': cls.books[0].id} ) # Sheckley book cls.books_url_2 = reverse( 'bookdocument_more_like_this-more-like-this', kwargs={'id': cls.books[-1].id} ) # Alice book cls.books_url_1_no_options = reverse( 'bookdocument_more_like_this_no_options-more-like-this', kwargs={'id': cls.books[0].id} ) # Sheckley book cls.books_url_2_no_options = reverse( 'bookdocument_more_like_this_no_options-more-like-this', kwargs={'id': cls.books[-1].id} ) cls.sleep() call_command('search_index', '--rebuild', '-f')
def _test_more_like_this(self, test_data_ids, url, strict=True): """Test more-like-this. We can't really predict which result would it show as most relevant, however we can for sure assume that no strange data shall appear in between. """ self.authenticate() data = {} response = self.client.get( url, data ) self.assertEqual(response.status_code, status.HTTP_200_OK) if strict: response_ids = [int(__r['id']) for __r in response.data['results']] self.assertFalse( bool( set(response_ids) - set(test_data_ids) ) )
[docs] def test_more_like_this(self): """Test more-like-this.""" # Testing publishers test_data_ids = [] test_data_ids.extend(self.alice_books_ids) test_data_ids.extend(self.sheckley_books_ids) self._test_more_like_this( test_data_ids, self.books_url_1, strict=True ) self._test_more_like_this( test_data_ids, self.books_url_1_no_options, strict=False ) self._test_more_like_this( test_data_ids, self.books_url_2, strict=True ) self._test_more_like_this( test_data_ids, self.books_url_2_no_options, strict=False )
if __name__ == '__main__': unittest.main()