@@ -72,41 +72,39 @@ class SearchUtilsMixin(TransactionTestCase):
7272 available_apps = []
7373 models_to_clean = [Article ]
7474
75- def tearDown (self ):
76- for model in self .models_to_clean :
77- collection = self ._get_collection (model )
78- collection .delete_many ({})
79-
8075 @classmethod
8176 def setUpClass (cls ):
8277 super ().setUpClass ()
8378 # Register the cleanup to run after all tests in this class
84- cls .addClassCleanup (cls .drop_search_indexes )
79+ cls .addClassCleanup (cls .drop_search_indexes_and_data )
8580
8681 @staticmethod
8782 def _get_collection (model ):
8883 return connection .database .get_collection (model ._meta .db_table )
8984
90- def create_search_index (self , model , index_name , definition , type = "search" ):
91- collection = self ._get_collection (model )
85+ @classmethod
86+ def create_search_index (cls , model , index_name , definition , type = "search" ):
87+ collection = cls ._get_collection (model )
9288 idx = SearchIndexModel (definition = definition , name = index_name , type = type )
9389 collection .create_search_index (idx )
9490
9591 @classmethod
96- def drop_search_indexes (cls ):
92+ def drop_search_indexes_and_data (cls ):
9793 for model in cls .models_to_clean :
9894 collection = cls ._get_collection (model )
9995 for search_indexes in collection .list_search_indexes ():
10096 collection .drop_search_index (search_indexes ["name" ])
97+ collection .delete_many ({})
10198
10299 wait_for_assertion = _wait_for_assertion (timeout = 3 )
103100
104101
105102@skipUnlessDBFeature ("supports_atlas_search" )
106103class SearchEqualsTest (SearchUtilsMixin ):
107- def setUp (self ):
108- super ().setUp ()
109- self .create_search_index (
104+ @classmethod
105+ def setUpClass (cls ):
106+ super ().setUpClass ()
107+ cls .create_search_index (
110108 Article ,
111109 "equals_headline_index" ,
112110 {
@@ -116,7 +114,7 @@ def setUp(self):
116114 }
117115 },
118116 )
119- self .article = Article .objects .create (headline = "cross" , number = 1 , body = "body" )
117+ cls .article = Article .objects .create (headline = "cross" , number = 1 , body = "body" )
120118 Article .objects .create (headline = "other thing" , number = 2 , body = "body" )
121119
122120 def test_search_equals (self ):
@@ -164,9 +162,10 @@ def test_function_score(self):
164162
165163@skipUnlessDBFeature ("supports_atlas_search" )
166164class SearchAutocompleteTest (SearchUtilsMixin ):
167- def setUp (self ):
168- super ().setUp ()
169- self .create_search_index (
165+ @classmethod
166+ def setUpClass (cls ):
167+ super ().setUpClass ()
168+ cls .create_search_index (
170169 Article ,
171170 "autocomplete_headline_index" ,
172171 {
@@ -198,7 +197,7 @@ def setUp(self):
198197 }
199198 },
200199 )
201- self .article = Article .objects .create (
200+ cls .article = Article .objects .create (
202201 headline = "crossing and something" ,
203202 number = 2 ,
204203 body = "river" ,
@@ -241,14 +240,15 @@ def test_constant_score(self):
241240
242241@skipUnlessDBFeature ("supports_atlas_search" )
243242class SearchExistsTest (SearchUtilsMixin ):
244- def setUp (self ):
245- super ().setUp ()
246- self .create_search_index (
243+ @classmethod
244+ def setUpClass (cls ):
245+ super ().setUpClass ()
246+ cls .create_search_index (
247247 Article ,
248248 "exists_body_index" ,
249249 {"mappings" : {"dynamic" : False , "fields" : {"body" : {"type" : "token" }}}},
250250 )
251- self .article = Article .objects .create (headline = "ignored" , number = 3 , body = "something" )
251+ cls .article = Article .objects .create (headline = "ignored" , number = 3 , body = "something" )
252252
253253 def test_search_exists (self ):
254254 qs = Article .objects .annotate (score = SearchExists (path = "body" ))
@@ -264,14 +264,15 @@ def test_constant_score(self):
264264
265265@skipUnlessDBFeature ("supports_atlas_search" )
266266class SearchInTest (SearchUtilsMixin ):
267- def setUp (self ):
268- super ().setUp ()
269- self .create_search_index (
267+ @classmethod
268+ def setUpClass (cls ):
269+ super ().setUpClass ()
270+ cls .create_search_index (
270271 Article ,
271272 "in_headline_index" ,
272273 {"mappings" : {"dynamic" : False , "fields" : {"headline" : {"type" : "token" }}}},
273274 )
274- self .article = Article .objects .create (headline = "cross" , number = 1 , body = "a" )
275+ cls .article = Article .objects .create (headline = "cross" , number = 1 , body = "a" )
275276 Article .objects .create (headline = "road" , number = 2 , body = "b" )
276277
277278 def test_search_in (self ):
@@ -290,14 +291,15 @@ def test_constant_score(self):
290291
291292@skipUnlessDBFeature ("supports_atlas_search" )
292293class SearchPhraseTest (SearchUtilsMixin ):
293- def setUp (self ):
294- super ().setUp ()
295- self .create_search_index (
294+ @classmethod
295+ def setUpClass (cls ):
296+ super ().setUpClass ()
297+ cls .create_search_index (
296298 Article ,
297299 "phrase_body_index" ,
298300 {"mappings" : {"dynamic" : False , "fields" : {"body" : {"type" : "string" }}}},
299301 )
300- self .article = Article .objects .create (
302+ cls .article = Article .objects .create (
301303 headline = "irrelevant" , number = 1 , body = "the quick brown fox"
302304 )
303305 Article .objects .create (headline = "cheetah" , number = 2 , body = "fastest animal" )
@@ -318,15 +320,16 @@ def test_constant_score(self):
318320
319321@skipUnlessDBFeature ("supports_atlas_search" )
320322class SearchRangeTest (SearchUtilsMixin ):
321- def setUp (self ):
322- super ().setUp ()
323- self .create_search_index (
323+ @classmethod
324+ def setUpClass (cls ):
325+ super ().setUpClass ()
326+ cls .create_search_index (
324327 Article ,
325328 "range_number_index" ,
326329 {"mappings" : {"dynamic" : False , "fields" : {"number" : {"type" : "number" }}}},
327330 )
328331 Article .objects .create (headline = "x" , number = 5 , body = "z" )
329- self .number20 = Article .objects .create (headline = "y" , number = 20 , body = "z" )
332+ cls .number20 = Article .objects .create (headline = "y" , number = 20 , body = "z" )
330333
331334 def test_search_range (self ):
332335 qs = Article .objects .annotate (score = SearchRange (path = "number" , gte = 10 , lt = 30 ))
@@ -344,9 +347,10 @@ def test_constant_score(self):
344347
345348@skipUnlessDBFeature ("supports_atlas_search" )
346349class SearchRegexTest (SearchUtilsMixin ):
347- def setUp (self ):
348- super ().setUp ()
349- self .create_search_index (
350+ @classmethod
351+ def setUpClass (cls ):
352+ super ().setUpClass ()
353+ cls .create_search_index (
350354 Article ,
351355 "regex_headline_index" ,
352356 {
@@ -356,7 +360,7 @@ def setUp(self):
356360 }
357361 },
358362 )
359- self .article = Article .objects .create (headline = "hello world" , number = 1 , body = "abc" )
363+ cls .article = Article .objects .create (headline = "hello world" , number = 1 , body = "abc" )
360364 Article .objects .create (headline = "hola mundo" , number = 2 , body = "abc" )
361365
362366 def test_search_regex (self ):
@@ -379,14 +383,15 @@ def test_constant_score(self):
379383
380384@skipUnlessDBFeature ("supports_atlas_search" )
381385class SearchTextTest (SearchUtilsMixin ):
382- def setUp (self ):
383- super ().setUp ()
384- self .create_search_index (
386+ @classmethod
387+ def setUpClass (cls ):
388+ super ().setUpClass ()
389+ cls .create_search_index (
385390 Article ,
386391 "text_body_index" ,
387392 {"mappings" : {"dynamic" : False , "fields" : {"body" : {"type" : "string" }}}},
388393 )
389- self .article = Article .objects .create (
394+ cls .article = Article .objects .create (
390395 headline = "ignored" , number = 1 , body = "The lazy dog sleeps"
391396 )
392397 Article .objects .create (headline = "ignored" , number = 2 , body = "The sleepy bear" )
@@ -425,9 +430,10 @@ def test_constant_score(self):
425430
426431@skipUnlessDBFeature ("supports_atlas_search" )
427432class SearchWildcardTest (SearchUtilsMixin ):
428- def setUp (self ):
429- super ().setUp ()
430- self .create_search_index (
433+ @classmethod
434+ def setUpClass (cls ):
435+ super ().setUpClass ()
436+ cls .create_search_index (
431437 Article ,
432438 "wildcard_headline_index" ,
433439 {
@@ -437,7 +443,7 @@ def setUp(self):
437443 }
438444 },
439445 )
440- self .article = Article .objects .create (headline = "dark-knight" , number = 1 , body = "" )
446+ cls .article = Article .objects .create (headline = "dark-knight" , number = 1 , body = "" )
441447 Article .objects .create (headline = "batman" , number = 2 , body = "" )
442448
443449 def test_search_wildcard (self ):
@@ -456,9 +462,10 @@ def test_constant_score(self):
456462
457463@skipUnlessDBFeature ("supports_atlas_search" )
458464class SearchGeoShapeTest (SearchUtilsMixin ):
459- def setUp (self ):
460- super ().setUp ()
461- self .create_search_index (
465+ @classmethod
466+ def setUpClass (cls ):
467+ super ().setUpClass ()
468+ cls .create_search_index (
462469 Article ,
463470 "geoshape_location_index" ,
464471 {
@@ -468,7 +475,7 @@ def setUp(self):
468475 }
469476 },
470477 )
471- self .article = Article .objects .create (
478+ cls .article = Article .objects .create (
472479 headline = "any" , number = 1 , body = "" , location = {"type" : "Point" , "coordinates" : [40 , 5 ]}
473480 )
474481 Article .objects .create (
@@ -503,14 +510,15 @@ def test_constant_score(self):
503510
504511@skipUnlessDBFeature ("supports_atlas_search" )
505512class SearchGeoWithinTest (SearchUtilsMixin ):
506- def setUp (self ):
507- super ().setUp ()
508- self .create_search_index (
513+ @classmethod
514+ def setUpClass (cls ):
515+ super ().setUpClass ()
516+ cls .create_search_index (
509517 Article ,
510518 "geowithin_location_index" ,
511519 {"mappings" : {"dynamic" : False , "fields" : {"location" : {"type" : "geo" }}}},
512520 )
513- self .article = Article .objects .create (
521+ cls .article = Article .objects .create (
514522 headline = "geo" , number = 2 , body = "" , location = {"type" : "Point" , "coordinates" : [40 , 5 ]}
515523 )
516524 Article .objects .create (
@@ -553,9 +561,10 @@ def test_constant_score(self):
553561@skipUnlessDBFeature ("supports_atlas_search" )
554562@unittest .expectedFailure
555563class SearchMoreLikeThisTest (SearchUtilsMixin ):
556- def setUp (self ):
557- super ().setUp ()
558- self .create_search_index (
564+ @classmethod
565+ def setUpClass (cls ):
566+ super ().setUpClass ()
567+ cls .create_search_index (
559568 Article ,
560569 "mlt_index" ,
561570 {
@@ -565,10 +574,10 @@ def setUp(self):
565574 }
566575 },
567576 )
568- self .article1 = Article .objects .create (
577+ cls .article1 = Article .objects .create (
569578 headline = "Space exploration" , number = 1 , body = "Webb telescope"
570579 )
571- self .article2 = Article .objects .create (
580+ cls .article2 = Article .objects .create (
572581 headline = "The commodities fall" ,
573582 number = 2 ,
574583 body = "Commodities dropped sharply due to inflation concerns" ,
@@ -597,9 +606,10 @@ def test_search_more_like_this(self):
597606
598607@skipUnlessDBFeature ("supports_atlas_search" )
599608class CompoundSearchTest (SearchUtilsMixin ):
600- def setUp (self ):
601- super ().setUp ()
602- self .create_search_index (
609+ @classmethod
610+ def setUpClass (cls ):
611+ super ().setUpClass ()
612+ cls .create_search_index (
603613 Article ,
604614 "compound_index" ,
605615 {
@@ -613,25 +623,25 @@ def setUp(self):
613623 }
614624 },
615625 )
616- self .mars_mission = Article .objects .create (
626+ cls .mars_mission = Article .objects .create (
617627 number = 1 ,
618628 headline = "space exploration" ,
619629 body = "NASA launches a new mission to Mars, aiming to study surface geology" ,
620630 )
621631
622- self .exoplanet = Article .objects .create (
632+ cls .exoplanet = Article .objects .create (
623633 number = 2 ,
624634 headline = "space exploration" ,
625635 body = "Astronomers discover exoplanets orbiting distant stars using Webb telescope" ,
626636 )
627637
628- self .icy_moons = Article .objects .create (
638+ cls .icy_moons = Article .objects .create (
629639 number = 3 ,
630640 headline = "space exploration" ,
631641 body = "ESA prepares a robotic expedition to explore the icy moons of Jupiter" ,
632642 )
633643
634- self .comodities_drop = Article .objects .create (
644+ cls .comodities_drop = Article .objects .create (
635645 number = 4 ,
636646 headline = "astronomy news" ,
637647 body = "Commodities dropped sharply due to inflation concerns" ,
@@ -765,9 +775,10 @@ def test_search_and_filter(self):
765775
766776@skipUnlessDBFeature ("supports_atlas_search" )
767777class SearchVectorTest (SearchUtilsMixin ):
768- def setUp (self ):
769- super ().setUp ()
770- self .create_search_index (
778+ @classmethod
779+ def setUpClass (cls ):
780+ super ().setUpClass ()
781+ cls .create_search_index (
771782 Article ,
772783 "vector_index" ,
773784 {
@@ -784,13 +795,13 @@ def setUp(self):
784795 type = "vectorSearch" ,
785796 )
786797
787- self .mars = Article .objects .create (
798+ cls .mars = Article .objects .create (
788799 headline = "Mars landing" ,
789800 number = 1 ,
790801 body = "The rover has landed on Mars" ,
791802 plot_embedding = [0.1 , 0.2 , 0.3 ],
792803 )
793- self .cooking = Article .objects .create (
804+ cls .cooking = Article .objects .create (
794805 headline = "Cooking tips" ,
795806 number = 2 ,
796807 body = "This article is about pasta" ,
0 commit comments