summaryrefslogtreecommitdiff
path: root/tests/postgres_tests
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2018-09-17 18:03:52 +0200
committerTim Graham <timograham@gmail.com>2018-09-17 12:03:52 -0400
commitf5e347a6402c1996a8f7063de4b314bae4a55683 (patch)
treec635bf758e0754f483448b2d272ee2f5bb5fd29f /tests/postgres_tests
parentc5e450ac950316068455e76d4a63b78110d7cde5 (diff)
Fixed #27899 -- Added support for phrase/raw searching in SearchQuery.
Thanks Tim Graham, Nick Pope, and Claude Paroz for contribution and review.
Diffstat (limited to 'tests/postgres_tests')
-rw-r--r--tests/postgres_tests/test_search.py44
1 files changed, 42 insertions, 2 deletions
diff --git a/tests/postgres_tests/test_search.py b/tests/postgres_tests/test_search.py
index 5ab7609cb3..d53c15116f 100644
--- a/tests/postgres_tests/test_search.py
+++ b/tests/postgres_tests/test_search.py
@@ -9,7 +9,7 @@ from django.contrib.postgres.search import (
SearchQuery, SearchRank, SearchVector,
)
from django.db.models import F
-from django.test import SimpleTestCase, modify_settings
+from django.test import SimpleTestCase, modify_settings, skipUnlessDBFeature
from . import PostgreSQLTestCase
from .models import Character, Line, Scene
@@ -75,7 +75,7 @@ class GrailTestData:
cls.french = Line.objects.create(
scene=trojan_rabbit,
character=guards,
- dialogue='Oh. Un cadeau. Oui oui.',
+ dialogue='Oh. Un beau cadeau. Oui oui.',
dialogue_config='french',
)
@@ -161,6 +161,46 @@ class MultipleFieldsTest(GrailTestData, PostgreSQLTestCase):
).filter(search=str(self.crowd.id))
self.assertSequenceEqual(searched, [self.crowd])
+ @skipUnlessDBFeature('has_phraseto_tsquery')
+ def test_phrase_search(self):
+ line_qs = Line.objects.annotate(search=SearchVector('dialogue'))
+ searched = line_qs.filter(search=SearchQuery('burned body his away', search_type='phrase'))
+ self.assertSequenceEqual(searched, [])
+ searched = line_qs.filter(search=SearchQuery('his body burned away', search_type='phrase'))
+ self.assertSequenceEqual(searched, [self.verse1])
+
+ @skipUnlessDBFeature('has_phraseto_tsquery')
+ def test_phrase_search_with_config(self):
+ line_qs = Line.objects.annotate(
+ search=SearchVector('scene__setting', 'dialogue', config='french'),
+ )
+ searched = line_qs.filter(
+ search=SearchQuery('cadeau beau un', search_type='phrase', config='french'),
+ )
+ self.assertSequenceEqual(searched, [])
+ searched = line_qs.filter(
+ search=SearchQuery('un beau cadeau', search_type='phrase', config='french'),
+ )
+ self.assertSequenceEqual(searched, [self.french])
+
+ def test_raw_search(self):
+ line_qs = Line.objects.annotate(search=SearchVector('dialogue'))
+ searched = line_qs.filter(search=SearchQuery('Robin', search_type='raw'))
+ self.assertEqual(set(searched), {self.verse0, self.verse1})
+ searched = line_qs.filter(search=SearchQuery("Robin & !'Camelot'", search_type='raw'))
+ self.assertSequenceEqual(searched, [self.verse1])
+
+ def test_raw_search_with_config(self):
+ line_qs = Line.objects.annotate(search=SearchVector('dialogue', config='french'))
+ searched = line_qs.filter(
+ search=SearchQuery("'cadeaux' & 'beaux'", search_type='raw', config='french'),
+ )
+ self.assertSequenceEqual(searched, [self.french])
+
+ def test_bad_search_type(self):
+ with self.assertRaisesMessage(ValueError, "Unknown search_type argument 'foo'."):
+ SearchQuery('kneecaps', search_type='foo')
+
def test_config_query_explicit(self):
searched = Line.objects.annotate(
search=SearchVector('scene__setting', 'dialogue', config='french'),