From 3baf92cf8230ad3a932986170fd07c8feae7ff2f Mon Sep 17 00:00:00 2001 From: Baptiste Mispelon Date: Wed, 4 Mar 2020 13:33:12 +0100 Subject: Fixed #31340 -- Allowed query expressions in SearchQuery.value and __search lookup. --- tests/postgres_tests/migrations/0002_create_test_models.py | 11 +++++++++++ tests/postgres_tests/models.py | 5 +++++ tests/postgres_tests/test_search.py | 14 +++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) (limited to 'tests/postgres_tests') diff --git a/tests/postgres_tests/migrations/0002_create_test_models.py b/tests/postgres_tests/migrations/0002_create_test_models.py index 12d94e348a..ee1463e1eb 100644 --- a/tests/postgres_tests/migrations/0002_create_test_models.py +++ b/tests/postgres_tests/migrations/0002_create_test_models.py @@ -185,6 +185,17 @@ class Migration(migrations.Migration): }, bases=None, ), + migrations.CreateModel( + name='LineSavedSearch', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('line', models.ForeignKey('postgres_tests.Line', on_delete=models.CASCADE)), + ('query', models.CharField(max_length=100)), + ], + options={ + 'required_db_vendor': 'postgresql', + }, + ), migrations.CreateModel( name='AggregateTestModel', fields=[ diff --git a/tests/postgres_tests/models.py b/tests/postgres_tests/models.py index 8528c59da1..e803c989e0 100644 --- a/tests/postgres_tests/models.py +++ b/tests/postgres_tests/models.py @@ -139,6 +139,11 @@ class Line(PostgreSQLModel): return self.dialogue or '' +class LineSavedSearch(PostgreSQLModel): + line = models.ForeignKey('Line', models.CASCADE) + query = models.CharField(max_length=100) + + class RangesModel(PostgreSQLModel): ints = IntegerRangeField(blank=True, null=True) bigints = BigIntegerRangeField(blank=True, null=True) diff --git a/tests/postgres_tests/test_search.py b/tests/postgres_tests/test_search.py index 0e836e896b..b40d672920 100644 --- a/tests/postgres_tests/test_search.py +++ b/tests/postgres_tests/test_search.py @@ -10,7 +10,7 @@ from django.db.models import F from django.test import modify_settings, skipUnlessDBFeature from . import PostgreSQLSimpleTestCase, PostgreSQLTestCase -from .models import Character, Line, Scene +from .models import Character, Line, LineSavedSearch, Scene try: from django.contrib.postgres.search import ( @@ -110,6 +110,18 @@ class SimpleSearchTest(GrailTestData, PostgreSQLTestCase): ) self.assertSequenceEqual(searched, [self.verse2]) + def test_search_with_F_expression(self): + # Non-matching query. + LineSavedSearch.objects.create(line=self.verse1, query='hearts') + # Matching query. + match = LineSavedSearch.objects.create(line=self.verse1, query='elbows') + for query_expression in [F('query'), SearchQuery(F('query'))]: + with self.subTest(query_expression): + searched = LineSavedSearch.objects.filter( + line__dialogue__search=query_expression, + ) + self.assertSequenceEqual(searched, [match]) + @modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'}) class SearchVectorFieldTest(GrailTestData, PostgreSQLTestCase): -- cgit v1.3