@@ -72,41 +72,39 @@ class SearchUtilsMixin(TransactionTestCase):
72
72
available_apps = []
73
73
models_to_clean = [Article ]
74
74
75
- def tearDown (self ):
76
- for model in self .models_to_clean :
77
- collection = self ._get_collection (model )
78
- collection .delete_many ({})
79
-
80
75
@classmethod
81
76
def setUpClass (cls ):
82
77
super ().setUpClass ()
83
78
# 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 )
85
80
86
81
@staticmethod
87
82
def _get_collection (model ):
88
83
return connection .database .get_collection (model ._meta .db_table )
89
84
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 )
92
88
idx = SearchIndexModel (definition = definition , name = index_name , type = type )
93
89
collection .create_search_index (idx )
94
90
95
91
@classmethod
96
- def drop_search_indexes (cls ):
92
+ def drop_search_indexes_and_data (cls ):
97
93
for model in cls .models_to_clean :
98
94
collection = cls ._get_collection (model )
99
95
for search_indexes in collection .list_search_indexes ():
100
96
collection .drop_search_index (search_indexes ["name" ])
97
+ collection .delete_many ({})
101
98
102
99
wait_for_assertion = _wait_for_assertion (timeout = 3 )
103
100
104
101
105
102
@skipUnlessDBFeature ("supports_atlas_search" )
106
103
class 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 (
110
108
Article ,
111
109
"equals_headline_index" ,
112
110
{
@@ -116,7 +114,7 @@ def setUp(self):
116
114
}
117
115
},
118
116
)
119
- self .article = Article .objects .create (headline = "cross" , number = 1 , body = "body" )
117
+ cls .article = Article .objects .create (headline = "cross" , number = 1 , body = "body" )
120
118
Article .objects .create (headline = "other thing" , number = 2 , body = "body" )
121
119
122
120
def test_search_equals (self ):
@@ -164,9 +162,10 @@ def test_function_score(self):
164
162
165
163
@skipUnlessDBFeature ("supports_atlas_search" )
166
164
class 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 (
170
169
Article ,
171
170
"autocomplete_headline_index" ,
172
171
{
@@ -198,7 +197,7 @@ def setUp(self):
198
197
}
199
198
},
200
199
)
201
- self .article = Article .objects .create (
200
+ cls .article = Article .objects .create (
202
201
headline = "crossing and something" ,
203
202
number = 2 ,
204
203
body = "river" ,
@@ -241,14 +240,15 @@ def test_constant_score(self):
241
240
242
241
@skipUnlessDBFeature ("supports_atlas_search" )
243
242
class 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 (
247
247
Article ,
248
248
"exists_body_index" ,
249
249
{"mappings" : {"dynamic" : False , "fields" : {"body" : {"type" : "token" }}}},
250
250
)
251
- self .article = Article .objects .create (headline = "ignored" , number = 3 , body = "something" )
251
+ cls .article = Article .objects .create (headline = "ignored" , number = 3 , body = "something" )
252
252
253
253
def test_search_exists (self ):
254
254
qs = Article .objects .annotate (score = SearchExists (path = "body" ))
@@ -264,14 +264,15 @@ def test_constant_score(self):
264
264
265
265
@skipUnlessDBFeature ("supports_atlas_search" )
266
266
class 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 (
270
271
Article ,
271
272
"in_headline_index" ,
272
273
{"mappings" : {"dynamic" : False , "fields" : {"headline" : {"type" : "token" }}}},
273
274
)
274
- self .article = Article .objects .create (headline = "cross" , number = 1 , body = "a" )
275
+ cls .article = Article .objects .create (headline = "cross" , number = 1 , body = "a" )
275
276
Article .objects .create (headline = "road" , number = 2 , body = "b" )
276
277
277
278
def test_search_in (self ):
@@ -290,14 +291,15 @@ def test_constant_score(self):
290
291
291
292
@skipUnlessDBFeature ("supports_atlas_search" )
292
293
class 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 (
296
298
Article ,
297
299
"phrase_body_index" ,
298
300
{"mappings" : {"dynamic" : False , "fields" : {"body" : {"type" : "string" }}}},
299
301
)
300
- self .article = Article .objects .create (
302
+ cls .article = Article .objects .create (
301
303
headline = "irrelevant" , number = 1 , body = "the quick brown fox"
302
304
)
303
305
Article .objects .create (headline = "cheetah" , number = 2 , body = "fastest animal" )
@@ -318,15 +320,16 @@ def test_constant_score(self):
318
320
319
321
@skipUnlessDBFeature ("supports_atlas_search" )
320
322
class 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 (
324
327
Article ,
325
328
"range_number_index" ,
326
329
{"mappings" : {"dynamic" : False , "fields" : {"number" : {"type" : "number" }}}},
327
330
)
328
331
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" )
330
333
331
334
def test_search_range (self ):
332
335
qs = Article .objects .annotate (score = SearchRange (path = "number" , gte = 10 , lt = 30 ))
@@ -344,9 +347,10 @@ def test_constant_score(self):
344
347
345
348
@skipUnlessDBFeature ("supports_atlas_search" )
346
349
class 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 (
350
354
Article ,
351
355
"regex_headline_index" ,
352
356
{
@@ -356,7 +360,7 @@ def setUp(self):
356
360
}
357
361
},
358
362
)
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" )
360
364
Article .objects .create (headline = "hola mundo" , number = 2 , body = "abc" )
361
365
362
366
def test_search_regex (self ):
@@ -379,14 +383,15 @@ def test_constant_score(self):
379
383
380
384
@skipUnlessDBFeature ("supports_atlas_search" )
381
385
class 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 (
385
390
Article ,
386
391
"text_body_index" ,
387
392
{"mappings" : {"dynamic" : False , "fields" : {"body" : {"type" : "string" }}}},
388
393
)
389
- self .article = Article .objects .create (
394
+ cls .article = Article .objects .create (
390
395
headline = "ignored" , number = 1 , body = "The lazy dog sleeps"
391
396
)
392
397
Article .objects .create (headline = "ignored" , number = 2 , body = "The sleepy bear" )
@@ -425,9 +430,10 @@ def test_constant_score(self):
425
430
426
431
@skipUnlessDBFeature ("supports_atlas_search" )
427
432
class 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 (
431
437
Article ,
432
438
"wildcard_headline_index" ,
433
439
{
@@ -437,7 +443,7 @@ def setUp(self):
437
443
}
438
444
},
439
445
)
440
- self .article = Article .objects .create (headline = "dark-knight" , number = 1 , body = "" )
446
+ cls .article = Article .objects .create (headline = "dark-knight" , number = 1 , body = "" )
441
447
Article .objects .create (headline = "batman" , number = 2 , body = "" )
442
448
443
449
def test_search_wildcard (self ):
@@ -456,9 +462,10 @@ def test_constant_score(self):
456
462
457
463
@skipUnlessDBFeature ("supports_atlas_search" )
458
464
class 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 (
462
469
Article ,
463
470
"geoshape_location_index" ,
464
471
{
@@ -468,7 +475,7 @@ def setUp(self):
468
475
}
469
476
},
470
477
)
471
- self .article = Article .objects .create (
478
+ cls .article = Article .objects .create (
472
479
headline = "any" , number = 1 , body = "" , location = {"type" : "Point" , "coordinates" : [40 , 5 ]}
473
480
)
474
481
Article .objects .create (
@@ -503,14 +510,15 @@ def test_constant_score(self):
503
510
504
511
@skipUnlessDBFeature ("supports_atlas_search" )
505
512
class 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 (
509
517
Article ,
510
518
"geowithin_location_index" ,
511
519
{"mappings" : {"dynamic" : False , "fields" : {"location" : {"type" : "geo" }}}},
512
520
)
513
- self .article = Article .objects .create (
521
+ cls .article = Article .objects .create (
514
522
headline = "geo" , number = 2 , body = "" , location = {"type" : "Point" , "coordinates" : [40 , 5 ]}
515
523
)
516
524
Article .objects .create (
@@ -553,9 +561,10 @@ def test_constant_score(self):
553
561
@skipUnlessDBFeature ("supports_atlas_search" )
554
562
@unittest .expectedFailure
555
563
class 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 (
559
568
Article ,
560
569
"mlt_index" ,
561
570
{
@@ -565,10 +574,10 @@ def setUp(self):
565
574
}
566
575
},
567
576
)
568
- self .article1 = Article .objects .create (
577
+ cls .article1 = Article .objects .create (
569
578
headline = "Space exploration" , number = 1 , body = "Webb telescope"
570
579
)
571
- self .article2 = Article .objects .create (
580
+ cls .article2 = Article .objects .create (
572
581
headline = "The commodities fall" ,
573
582
number = 2 ,
574
583
body = "Commodities dropped sharply due to inflation concerns" ,
@@ -597,9 +606,10 @@ def test_search_more_like_this(self):
597
606
598
607
@skipUnlessDBFeature ("supports_atlas_search" )
599
608
class 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 (
603
613
Article ,
604
614
"compound_index" ,
605
615
{
@@ -613,25 +623,25 @@ def setUp(self):
613
623
}
614
624
},
615
625
)
616
- self .mars_mission = Article .objects .create (
626
+ cls .mars_mission = Article .objects .create (
617
627
number = 1 ,
618
628
headline = "space exploration" ,
619
629
body = "NASA launches a new mission to Mars, aiming to study surface geology" ,
620
630
)
621
631
622
- self .exoplanet = Article .objects .create (
632
+ cls .exoplanet = Article .objects .create (
623
633
number = 2 ,
624
634
headline = "space exploration" ,
625
635
body = "Astronomers discover exoplanets orbiting distant stars using Webb telescope" ,
626
636
)
627
637
628
- self .icy_moons = Article .objects .create (
638
+ cls .icy_moons = Article .objects .create (
629
639
number = 3 ,
630
640
headline = "space exploration" ,
631
641
body = "ESA prepares a robotic expedition to explore the icy moons of Jupiter" ,
632
642
)
633
643
634
- self .comodities_drop = Article .objects .create (
644
+ cls .comodities_drop = Article .objects .create (
635
645
number = 4 ,
636
646
headline = "astronomy news" ,
637
647
body = "Commodities dropped sharply due to inflation concerns" ,
@@ -765,9 +775,10 @@ def test_search_and_filter(self):
765
775
766
776
@skipUnlessDBFeature ("supports_atlas_search" )
767
777
class 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 (
771
782
Article ,
772
783
"vector_index" ,
773
784
{
@@ -784,13 +795,13 @@ def setUp(self):
784
795
type = "vectorSearch" ,
785
796
)
786
797
787
- self .mars = Article .objects .create (
798
+ cls .mars = Article .objects .create (
788
799
headline = "Mars landing" ,
789
800
number = 1 ,
790
801
body = "The rover has landed on Mars" ,
791
802
plot_embedding = [0.1 , 0.2 , 0.3 ],
792
803
)
793
- self .cooking = Article .objects .create (
804
+ cls .cooking = Article .objects .create (
794
805
headline = "Cooking tips" ,
795
806
number = 2 ,
796
807
body = "This article is about pasta" ,
0 commit comments