@@ -362,6 +362,156 @@ class ProxiedSearchAPITest(SearchAPITest):
362362 def get (self , * args , ** kwargs ):
363363 return self .client .get (* args , HTTP_HOST = self .host , ** kwargs )
364364
365+ def test_search_project_number_of_queries (self ):
366+ # Default version
367+ with self .assertNumQueries (11 ):
368+ resp = self .get (self .url , data = {"q" : "project:project test" })
369+ assert resp .status_code == 200
370+ assert resp .data ["results" ]
371+
372+ with self .assertNumQueries (17 ):
373+ resp = self .get (
374+ self .url , data = {"q" : "project:project project:another-project test" }
375+ )
376+ assert resp .status_code == 200
377+ assert resp .data ["results" ]
378+
379+ # With explicit version
380+ with self .assertNumQueries (10 ):
381+ resp = self .get (self .url , data = {"q" : "project:project/latest test" })
382+ assert resp .status_code == 200
383+ assert resp .data ["results" ]
384+
385+ with self .assertNumQueries (16 ):
386+ resp = self .get (
387+ self .url , data = {"q" : "project:project/latest project:another-project/latest test" }
388+ )
389+ assert resp .status_code == 200
390+ assert resp .data ["results" ]
391+
392+ @mock .patch ("readthedocs.search.api.v3.views.tasks.record_search_query.delay" , new = mock .MagicMock ())
393+ def test_search_project_number_of_queries_without_search_recording (self ):
394+ # Default version
395+ with self .assertNumQueries (8 ):
396+ resp = self .get (self .url , data = {"q" : "project:project test" })
397+ assert resp .status_code == 200
398+ assert resp .data ["results" ]
399+
400+ with self .assertNumQueries (12 ):
401+ resp = self .get (
402+ self .url , data = {"q" : "project:project project:another-project test" }
403+ )
404+ assert resp .status_code == 200
405+ assert resp .data ["results" ]
406+
407+ # With explicit version
408+ with self .assertNumQueries (8 ):
409+ resp = self .get (self .url , data = {"q" : "project:project/latest test" })
410+ assert resp .status_code == 200
411+ assert resp .data ["results" ]
412+
413+ with self .assertNumQueries (12 ):
414+ resp = self .get (
415+ self .url , data = {"q" : "project:project/latest project:another-project/latest test" }
416+ )
417+ assert resp .status_code == 200
418+ assert resp .data ["results" ]
419+
420+ def test_search_subprojects_number_of_queries (self ):
421+ subproject = get (
422+ Project ,
423+ slug = "subproject" ,
424+ users = [self .user ],
425+ privacy_level = PUBLIC ,
426+ )
427+ subproject .versions .update (built = True , active = True , privacy_level = PUBLIC )
428+ self .create_index (subproject .versions .first ())
429+ self .project .add_subproject (subproject )
430+
431+ # Search on default version.
432+ with self .assertNumQueries (16 ):
433+ resp = self .get (self .url , data = {"q" : "subprojects:project test" })
434+ assert resp .status_code == 200
435+ assert resp .data ["results" ]
436+
437+ # Search on explicit version.
438+ with self .assertNumQueries (14 ):
439+ resp = self .get (self .url , data = {"q" : "subprojects:project/latest test" })
440+ assert resp .status_code == 200
441+ assert resp .data ["results" ]
442+
443+ # Add subprojects.
444+ for i in range (3 ):
445+ subproject = get (
446+ Project ,
447+ slug = f"subproject-{ i } " ,
448+ users = [self .user ],
449+ privacy_level = PUBLIC ,
450+ )
451+ subproject .versions .update (built = True , active = True , privacy_level = PUBLIC )
452+ self .create_index (subproject .versions .first ())
453+ self .project .add_subproject (subproject )
454+
455+ # Search on default version.
456+ with self .assertNumQueries (26 ):
457+ resp = self .get (self .url , data = {"q" : "subprojects:project test" })
458+ assert resp .status_code == 200
459+ assert resp .data ["results" ]
460+
461+ # Search on explicit version.
462+ with self .assertNumQueries (23 ):
463+ resp = self .get (self .url , data = {"q" : "subprojects:project/latest test" })
464+ assert resp .status_code == 200
465+ assert resp .data ["results" ]
466+
467+ @mock .patch ("readthedocs.search.api.v3.views.tasks.record_search_query.delay" , new = mock .MagicMock ())
468+ def test_search_subprojects_number_of_queries_without_search_recording (self ):
469+ subproject = get (
470+ Project ,
471+ slug = "subproject" ,
472+ users = [self .user ],
473+ privacy_level = PUBLIC ,
474+ )
475+ subproject .versions .update (built = True , active = True , privacy_level = PUBLIC )
476+ self .create_index (subproject .versions .first ())
477+ self .project .add_subproject (subproject )
478+
479+ # Search on default version.
480+ with self .assertNumQueries (10 ):
481+ resp = self .get (self .url , data = {"q" : "subprojects:project test" })
482+ assert resp .status_code == 200
483+ assert resp .data ["results" ]
484+
485+ # Search on explicit version.
486+ with self .assertNumQueries (10 ):
487+ resp = self .get (self .url , data = {"q" : "subprojects:project/latest test" })
488+ assert resp .status_code == 200
489+ assert resp .data ["results" ]
490+
491+ # Add subprojects.
492+ for i in range (3 ):
493+ subproject = get (
494+ Project ,
495+ slug = f"subproject-{ i } " ,
496+ users = [self .user ],
497+ privacy_level = PUBLIC ,
498+ )
499+ subproject .versions .update (built = True , active = True , privacy_level = PUBLIC )
500+ self .create_index (subproject .versions .first ())
501+ self .project .add_subproject (subproject )
502+
503+ # Search on default version.
504+ with self .assertNumQueries (13 ):
505+ resp = self .get (self .url , data = {"q" : "subprojects:project test" })
506+ assert resp .status_code == 200
507+ assert resp .data ["results" ]
508+
509+ # Search on explicit version.
510+ with self .assertNumQueries (13 ):
511+ resp = self .get (self .url , data = {"q" : "subprojects:project/latest test" })
512+ assert resp .status_code == 200
513+ assert resp .data ["results" ]
514+
365515
366516@override_settings (ALLOW_PRIVATE_REPOS = True )
367517@override_settings (RTD_ALLOW_ORGANIZATIONS = True )
0 commit comments