Skip Elasticsearch backend tests unless the appropriate version of elasticsearch-py is available

These tests seem to have been written with the intent of testing query construction independently of actually running the queries; to do this, they mock the relevant bits of elasticsearch-py so that no actual server needs to be running. However, this is a bit of a bodge job - it still instantiates the Elasticsearch object when initialising the backend, so *some* version of elasticsearch-py must be installed to run Wagtail's test suite; and furthermore, that installed version must be able to handle EVERY backend's variant of the `Elasticsearch(...)` constructor, regardless of whether it was written for a completely different version.

This breaks down with Elasticsearch 8, which makes backward-incompatible changes to the constructor. Since the CI suite as a whole will test each backend with its corresponding correct version of elasticsearch-py at some point, it's redundant (and a waste of CPU cycles) to repeat those tests in environments with a different ES version (or none at all).
pull/10477/head
Matt Westcott 2023-07-14 19:10:53 +01:00
rodzic 13c35a8780
commit 06df4a66e1
5 zmienionych plików z 74 dodań i 19 usunięć

Wyświetl plik

@ -43,7 +43,6 @@ testing_extras = [
# Required for running the tests
"python-dateutil>=2.7",
"pytz>=2014.7",
"elasticsearch>=5.0,<6.0",
"Jinja2>=3.0,<3.2",
"boto3>=1.16,<1.17",
"freezegun>=0.3.8",

Wyświetl plik

@ -1,22 +1,31 @@
import datetime
import json
import unittest
from unittest import mock
from django.db.models import Q
from django.test import TestCase
from elasticsearch.serializer import JSONSerializer
from wagtail.search.backends.elasticsearch5 import Elasticsearch5SearchBackend
from wagtail.search.query import MATCH_ALL, Fuzzy, Phrase
from wagtail.test.search import models
from .elasticsearch_common_tests import ElasticsearchCommonSearchBackendTests
try:
from elasticsearch import VERSION as ELASTICSEARCH_VERSION
from elasticsearch.serializer import JSONSerializer
from wagtail.search.backends.elasticsearch5 import Elasticsearch5SearchBackend
except ImportError:
ELASTICSEARCH_VERSION = (0, 0, 0)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 5, "Elasticsearch 5 required")
class TestElasticsearch5SearchBackend(ElasticsearchCommonSearchBackendTests, TestCase):
backend_path = "wagtail.search.backends.elasticsearch5"
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 5, "Elasticsearch 5 required")
class TestElasticsearch5SearchQuery(TestCase):
def assertDictEqual(self, a, b):
default = JSONSerializer().default
@ -25,10 +34,13 @@ class TestElasticsearch5SearchQuery(TestCase):
json.dumps(b, sort_keys=True, default=default),
)
query_compiler_class = Elasticsearch5SearchBackend.query_compiler_class
autocomplete_query_compiler_class = (
Elasticsearch5SearchBackend.autocomplete_query_compiler_class
)
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.query_compiler_class = Elasticsearch5SearchBackend.query_compiler_class
cls.autocomplete_query_compiler_class = (
Elasticsearch5SearchBackend.autocomplete_query_compiler_class
)
def test_simple(self):
# Create a query
@ -622,6 +634,7 @@ class TestElasticsearch5SearchQuery(TestCase):
self.assertDictEqual(query_compiler.get_query(), expected_result)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 5, "Elasticsearch 5 required")
class TestElasticsearch5SearchResults(TestCase):
fixtures = ["search"]
@ -797,6 +810,7 @@ class TestElasticsearch5SearchResults(TestCase):
self.assertEqual(results[2], models.Book.objects.get(id=1))
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 5, "Elasticsearch 5 required")
class TestElasticsearch5Mapping(TestCase):
fixtures = ["search"]
@ -926,6 +940,7 @@ class TestElasticsearch5Mapping(TestCase):
self.assertDictEqual(document, expected_result)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 5, "Elasticsearch 5 required")
class TestElasticsearch5MappingInheritance(TestCase):
fixtures = ["search"]
@ -1119,6 +1134,7 @@ class TestElasticsearch5MappingInheritance(TestCase):
self.assertDictEqual(document, expected_result)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 5, "Elasticsearch 5 required")
@mock.patch("wagtail.search.backends.elasticsearch5.Elasticsearch")
class TestBackendConfiguration(TestCase):
def test_default_settings(self, Elasticsearch):

Wyświetl plik

@ -1,22 +1,31 @@
import datetime
import json
import unittest
from unittest import mock
from django.db.models import Q
from django.test import TestCase
from elasticsearch.serializer import JSONSerializer
from wagtail.search.backends.elasticsearch6 import Elasticsearch6SearchBackend
from wagtail.search.query import MATCH_ALL, Fuzzy, Phrase
from wagtail.test.search import models
from .elasticsearch_common_tests import ElasticsearchCommonSearchBackendTests
try:
from elasticsearch import VERSION as ELASTICSEARCH_VERSION
from elasticsearch.serializer import JSONSerializer
from wagtail.search.backends.elasticsearch6 import Elasticsearch6SearchBackend
except ImportError:
ELASTICSEARCH_VERSION = (0, 0, 0)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 6, "Elasticsearch 6 required")
class TestElasticsearch6SearchBackend(ElasticsearchCommonSearchBackendTests, TestCase):
backend_path = "wagtail.search.backends.elasticsearch6"
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 6, "Elasticsearch 6 required")
class TestElasticsearch6SearchQuery(TestCase):
def assertDictEqual(self, a, b):
default = JSONSerializer().default
@ -25,10 +34,13 @@ class TestElasticsearch6SearchQuery(TestCase):
json.dumps(b, sort_keys=True, default=default),
)
query_compiler_class = Elasticsearch6SearchBackend.query_compiler_class
autocomplete_query_compiler_class = (
Elasticsearch6SearchBackend.autocomplete_query_compiler_class
)
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.query_compiler_class = Elasticsearch6SearchBackend.query_compiler_class
cls.autocomplete_query_compiler_class = (
Elasticsearch6SearchBackend.autocomplete_query_compiler_class
)
def test_simple(self):
# Create a query
@ -854,6 +866,7 @@ class TestElasticsearch6SearchQuery(TestCase):
self.assertDictEqual(query_compiler.get_query(), expected_result)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 6, "Elasticsearch 6 required")
class TestElasticsearch6SearchResults(TestCase):
fixtures = ["search"]
@ -1029,6 +1042,7 @@ class TestElasticsearch6SearchResults(TestCase):
self.assertEqual(results[2], models.Book.objects.get(id=1))
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 6, "Elasticsearch 6 required")
class TestElasticsearch6Mapping(TestCase):
fixtures = ["search"]
@ -1144,6 +1158,7 @@ class TestElasticsearch6Mapping(TestCase):
self.assertDictEqual(document, expected_result)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 6, "Elasticsearch 6 required")
class TestElasticsearch6MappingInheritance(TestCase):
fixtures = ["search"]
@ -1314,6 +1329,7 @@ class TestElasticsearch6MappingInheritance(TestCase):
self.assertDictEqual(document, expected_result)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 6, "Elasticsearch 6 required")
@mock.patch("wagtail.search.backends.elasticsearch5.Elasticsearch")
class TestBackendConfiguration(TestCase):
def test_default_settings(self, Elasticsearch):

Wyświetl plik

@ -1,22 +1,31 @@
import datetime
import json
import unittest
from unittest import mock
from django.db.models import Q
from django.test import TestCase
from elasticsearch.serializer import JSONSerializer
from wagtail.search.backends.elasticsearch7 import Elasticsearch7SearchBackend
from wagtail.search.query import MATCH_ALL, Fuzzy, Phrase
from wagtail.test.search import models
from .elasticsearch_common_tests import ElasticsearchCommonSearchBackendTests
try:
from elasticsearch import VERSION as ELASTICSEARCH_VERSION
from elasticsearch.serializer import JSONSerializer
from wagtail.search.backends.elasticsearch7 import Elasticsearch7SearchBackend
except ImportError:
ELASTICSEARCH_VERSION = (0, 0, 0)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 7, "Elasticsearch 7 required")
class TestElasticsearch7SearchBackend(ElasticsearchCommonSearchBackendTests, TestCase):
backend_path = "wagtail.search.backends.elasticsearch7"
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 7, "Elasticsearch 7 required")
class TestElasticsearch7SearchQuery(TestCase):
maxDiff = None
@ -27,10 +36,13 @@ class TestElasticsearch7SearchQuery(TestCase):
json.dumps(b, sort_keys=True, default=default),
)
query_compiler_class = Elasticsearch7SearchBackend.query_compiler_class
autocomplete_query_compiler_class = (
Elasticsearch7SearchBackend.autocomplete_query_compiler_class
)
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.query_compiler_class = Elasticsearch7SearchBackend.query_compiler_class
cls.autocomplete_query_compiler_class = (
Elasticsearch7SearchBackend.autocomplete_query_compiler_class
)
def test_simple(self):
# Create a query
@ -856,6 +868,7 @@ class TestElasticsearch7SearchQuery(TestCase):
self.assertDictEqual(query_compiler.get_query(), expected_result)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 7, "Elasticsearch 7 required")
class TestElasticsearch7SearchResults(TestCase):
fixtures = ["search"]
@ -1031,6 +1044,7 @@ class TestElasticsearch7SearchResults(TestCase):
self.assertEqual(results[2], models.Book.objects.get(id=1))
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 7, "Elasticsearch 7 required")
class TestElasticsearch7Mapping(TestCase):
fixtures = ["search"]
@ -1146,6 +1160,7 @@ class TestElasticsearch7Mapping(TestCase):
self.assertDictEqual(document, expected_result)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 7, "Elasticsearch 7 required")
class TestElasticsearch7MappingInheritance(TestCase):
fixtures = ["search"]
maxDiff = None
@ -1315,6 +1330,7 @@ class TestElasticsearch7MappingInheritance(TestCase):
self.assertDictEqual(document, expected_result)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 7, "Elasticsearch 7 required")
@mock.patch("wagtail.search.backends.elasticsearch5.Elasticsearch")
class TestBackendConfiguration(TestCase):
def test_default_settings(self, Elasticsearch):

Wyświetl plik

@ -1,7 +1,15 @@
import unittest
from django.test import TestCase
from .elasticsearch_common_tests import ElasticsearchCommonSearchBackendTests
try:
from elasticsearch import VERSION as ELASTICSEARCH_VERSION
except ImportError:
ELASTICSEARCH_VERSION = (0, 0, 0)
@unittest.skipIf(ELASTICSEARCH_VERSION[0] != 8, "Elasticsearch 8 required")
class TestElasticsearch8SearchBackend(ElasticsearchCommonSearchBackendTests, TestCase):
backend_path = "wagtail.search.backends.elasticsearch8"