summaryrefslogtreecommitdiff
path: root/tests/postgres_tests/test_trigram.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/postgres_tests/test_trigram.py')
-rw-r--r--tests/postgres_tests/test_trigram.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/postgres_tests/test_trigram.py b/tests/postgres_tests/test_trigram.py
new file mode 100644
index 0000000000..b340b41869
--- /dev/null
+++ b/tests/postgres_tests/test_trigram.py
@@ -0,0 +1,53 @@
+from django.contrib.postgres.search import TrigramDistance, TrigramSimilarity
+from django.test import modify_settings
+
+from . import PostgreSQLTestCase
+from .models import CharFieldModel, TextFieldModel
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'})
+class TrigramTest(PostgreSQLTestCase):
+ Model = CharFieldModel
+
+ @classmethod
+ def setUpTestData(cls):
+ cls.Model.objects.bulk_create([
+ cls.Model(field='Matthew'),
+ cls.Model(field='Cat sat on mat.'),
+ cls.Model(field='Dog sat on rug.'),
+ ])
+
+ def test_trigram_search(self):
+ self.assertQuerysetEqual(
+ self.Model.objects.filter(field__trigram_similar='Mathew'),
+ ['Matthew'],
+ transform=lambda instance: instance.field,
+ )
+
+ def test_trigram_similarity(self):
+ search = 'Bat sat on cat.'
+ self.assertQuerysetEqual(
+ self.Model.objects.filter(
+ field__trigram_similar=search,
+ ).annotate(similarity=TrigramSimilarity('field', search)).order_by('-similarity'),
+ [('Cat sat on mat.', 0.625), ('Dog sat on rug.', 0.333333)],
+ transform=lambda instance: (instance.field, instance.similarity),
+ ordered=True,
+ )
+
+ def test_trigram_similarity_alternate(self):
+ self.assertQuerysetEqual(
+ self.Model.objects.annotate(
+ distance=TrigramDistance('field', 'Bat sat on cat.'),
+ ).filter(distance__lte=0.7).order_by('distance'),
+ [('Cat sat on mat.', 0.375), ('Dog sat on rug.', 0.666667)],
+ transform=lambda instance: (instance.field, instance.distance),
+ ordered=True,
+ )
+
+
+class TrigramTextFieldTest(TrigramTest):
+ """
+ TextField has the same behavior as CharField regarding trigram lookups.
+ """
+ Model = TextFieldModel