summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorHannes Ljungberg <hannes@5monkeys.se>2019-11-19 14:59:06 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-03-03 15:39:52 +0100
commit65ab4f9f03e70733df6afd9d8454ec3700155111 (patch)
tree4c296df9faab1f796ca22ea10a892d93baa27774 /tests
parentaee0bebc2faf9c6de8211b05d5f1281dc016084f (diff)
Fixed #31147 -- Added SearchHeadline to django.contrib.postgres.
Diffstat (limited to 'tests')
-rw-r--r--tests/postgres_tests/test_search.py129
-rw-r--r--tests/postgres_tests/test_trigram.py6
2 files changed, 129 insertions, 6 deletions
diff --git a/tests/postgres_tests/test_search.py b/tests/postgres_tests/test_search.py
index 765b846fb3..298932ba2e 100644
--- a/tests/postgres_tests/test_search.py
+++ b/tests/postgres_tests/test_search.py
@@ -5,16 +5,20 @@ These tests use dialogue from the 1975 film Monty Python and the Holy Grail.
All text copyright Python (Monty) Pictures. Thanks to sacred-texts.com for the
transcript.
"""
-from django.contrib.postgres.search import (
- SearchConfig, SearchQuery, SearchRank, SearchVector,
-)
from django.db import connection
from django.db.models import F
-from django.test import SimpleTestCase, modify_settings, skipUnlessDBFeature
+from django.test import modify_settings, skipUnlessDBFeature
from . import PostgreSQLSimpleTestCase, PostgreSQLTestCase
from .models import Character, Line, Scene
+try:
+ from django.contrib.postgres.search import (
+ SearchConfig, SearchHeadline, SearchQuery, SearchRank, SearchVector,
+ )
+except ImportError:
+ pass
+
class GrailTestData:
@@ -436,7 +440,7 @@ class SearchVectorIndexTests(PostgreSQLTestCase):
)
-class SearchQueryTests(SimpleTestCase):
+class SearchQueryTests(PostgreSQLSimpleTestCase):
def test_str(self):
tests = (
(~SearchQuery('a'), '~SearchQuery(a)'),
@@ -460,3 +464,118 @@ class SearchQueryTests(SimpleTestCase):
for query, expected_str in tests:
with self.subTest(query=query):
self.assertEqual(str(query), expected_str)
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'})
+class SearchHeadlineTests(GrailTestData, PostgreSQLTestCase):
+ def test_headline(self):
+ searched = Line.objects.annotate(
+ headline=SearchHeadline(
+ F('dialogue'),
+ SearchQuery('brave sir robin'),
+ config=SearchConfig('english'),
+ ),
+ ).get(pk=self.verse0.pk)
+ self.assertEqual(
+ searched.headline,
+ '<b>Robin</b>. He was not at all afraid to be killed in nasty '
+ 'ways. <b>Brave</b>, <b>brave</b>, <b>brave</b>, <b>brave</b> '
+ '<b>Sir</b> <b>Robin</b>',
+ )
+
+ def test_headline_untyped_args(self):
+ searched = Line.objects.annotate(
+ headline=SearchHeadline('dialogue', 'killed', config='english'),
+ ).get(pk=self.verse0.pk)
+ self.assertEqual(
+ searched.headline,
+ 'Robin. He was not at all afraid to be <b>killed</b> in nasty '
+ 'ways. Brave, brave, brave, brave Sir Robin!',
+ )
+
+ def test_headline_with_config(self):
+ searched = Line.objects.annotate(
+ headline=SearchHeadline(
+ 'dialogue',
+ SearchQuery('cadeaux', config='french'),
+ config='french',
+ ),
+ ).get(pk=self.french.pk)
+ self.assertEqual(
+ searched.headline,
+ 'Oh. Un beau <b>cadeau</b>. Oui oui.',
+ )
+
+ def test_headline_with_config_from_field(self):
+ searched = Line.objects.annotate(
+ headline=SearchHeadline(
+ 'dialogue',
+ SearchQuery('cadeaux', config=F('dialogue_config')),
+ config=F('dialogue_config'),
+ ),
+ ).get(pk=self.french.pk)
+ self.assertEqual(
+ searched.headline,
+ 'Oh. Un beau <b>cadeau</b>. Oui oui.',
+ )
+
+ def test_headline_separator_options(self):
+ searched = Line.objects.annotate(
+ headline=SearchHeadline(
+ 'dialogue',
+ 'brave sir robin',
+ start_sel='<span>',
+ stop_sel='</span>',
+ ),
+ ).get(pk=self.verse0.pk)
+ self.assertEqual(
+ searched.headline,
+ '<span>Robin</span>. He was not at all afraid to be killed in '
+ 'nasty ways. <span>Brave</span>, <span>brave</span>, <span>brave'
+ '</span>, <span>brave</span> <span>Sir</span> <span>Robin</span>',
+ )
+
+ def test_headline_highlight_all_option(self):
+ searched = Line.objects.annotate(
+ headline=SearchHeadline(
+ 'dialogue',
+ SearchQuery('brave sir robin', config='english'),
+ highlight_all=True,
+ ),
+ ).get(pk=self.verse0.pk)
+ self.assertIn(
+ '<b>Bravely</b> bold <b>Sir</b> <b>Robin</b>, rode forth from '
+ 'Camelot. He was not afraid to die, o ',
+ searched.headline,
+ )
+
+ def test_headline_short_word_option(self):
+ searched = Line.objects.annotate(
+ headline=SearchHeadline(
+ 'dialogue',
+ SearchQuery('brave sir robin', config='english'),
+ short_word=6,
+ ),
+ ).get(pk=self.verse0.pk)
+ self.assertIs(searched.headline.endswith(
+ '<b>Brave</b>, <b>brave</b>, <b>brave</b>, <b>brave</b> <b>Sir</b>'
+ ), True)
+
+ def test_headline_fragments_words_options(self):
+ searched = Line.objects.annotate(
+ headline=SearchHeadline(
+ 'dialogue',
+ SearchQuery('brave sir robin', config='english'),
+ fragment_delimiter='...<br>',
+ max_fragments=4,
+ max_words=3,
+ min_words=1,
+ ),
+ ).get(pk=self.verse0.pk)
+ self.assertEqual(
+ searched.headline,
+ '<b>Sir</b> <b>Robin</b>, rode...<br>'
+ '<b>Brave</b> <b>Sir</b> <b>Robin</b>...<br>'
+ '<b>Brave</b>, <b>brave</b>, <b>brave</b>...<br>'
+ '<b>brave</b> <b>Sir</b> <b>Robin</b>',
+ )
diff --git a/tests/postgres_tests/test_trigram.py b/tests/postgres_tests/test_trigram.py
index 2a123faa5e..19ac4cee31 100644
--- a/tests/postgres_tests/test_trigram.py
+++ b/tests/postgres_tests/test_trigram.py
@@ -1,9 +1,13 @@
-from django.contrib.postgres.search import TrigramDistance, TrigramSimilarity
from django.test import modify_settings
from . import PostgreSQLTestCase
from .models import CharFieldModel, TextFieldModel
+try:
+ from django.contrib.postgres.search import TrigramDistance, TrigramSimilarity
+except ImportError:
+ pass
+
@modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'})
class TrigramTest(PostgreSQLTestCase):