@@ -253,35 +253,48 @@ def setUp(self) -> None:
253253 organization_integration = self .org_integration ,
254254 )
255255
256+ @mock .patch ("sentry.tasks.seer.context_engine_index.bulk_get_project_preferences" )
256257 @mock .patch ("sentry.tasks.seer.context_engine_index.make_org_repo_knowledge_index_request" )
257- def test_returns_early_when_option_disabled (self , mock_request ) -> None :
258+ def test_returns_early_when_option_disabled (
259+ self , mock_make_org_repo_knowledge_index_request , mock_bulk_get_project_preferences
260+ ) -> None :
258261 with override_options ({"explorer.context_engine_indexing.enable" : False }):
259262 index_repos (self .org .id )
260- mock_request .assert_not_called ()
263+ mock_make_org_repo_knowledge_index_request .assert_not_called ()
261264
265+ @mock .patch ("sentry.tasks.seer.context_engine_index.bulk_get_project_preferences" )
262266 @mock .patch ("sentry.tasks.seer.context_engine_index.make_org_repo_knowledge_index_request" )
263- def test_returns_early_when_feature_flag_disabled (self , mock_request ) -> None :
267+ def test_returns_early_when_feature_flag_disabled (
268+ self , mock_mock_make_org_repo_knowledge_index_request , mock_bulk_get_project_preferences
269+ ) -> None :
264270 with override_options ({"explorer.context_engine_indexing.enable" : True }):
265271 index_repos (self .org .id )
266- mock_request .assert_not_called ()
272+ mock_mock_make_org_repo_knowledge_index_request .assert_not_called ()
267273
274+ @mock .patch ("sentry.tasks.seer.context_engine_index.bulk_get_project_preferences" )
268275 @mock .patch ("sentry.tasks.seer.context_engine_index.make_org_repo_knowledge_index_request" )
269- def test_returns_early_when_no_projects (self , mock_request ) -> None :
276+ def test_returns_early_when_no_projects (
277+ self , mock_mock_make_org_repo_knowledge_index_request , mock_bulk_get_project_preferences
278+ ) -> None :
270279 org_without_projects = self .create_organization ()
271280 with override_options ({"explorer.context_engine_indexing.enable" : True }):
272281 with self .feature ({"organizations:context-engine-experiments" : True }):
273282 index_repos (org_without_projects .id )
274- mock_request .assert_not_called ()
283+ mock_mock_make_org_repo_knowledge_index_request .assert_not_called ()
275284
285+ @mock .patch ("sentry.tasks.seer.context_engine_index.bulk_get_project_preferences" )
276286 @mock .patch ("sentry.tasks.seer.context_engine_index.make_org_repo_knowledge_index_request" )
277- def test_calls_seer_with_correct_org_and_repos (self , mock_request ) -> None :
278- mock_request .return_value .status = 200
287+ def test_calls_seer_with_correct_org_and_repos (
288+ self , mock_mock_make_org_repo_knowledge_index_request , mock_bulk_get_project_preferences
289+ ) -> None :
290+ mock_bulk_get_project_preferences .return_value = {}
291+ mock_mock_make_org_repo_knowledge_index_request .return_value .status = 200
279292 with override_options ({"explorer.context_engine_indexing.enable" : True }):
280293 with self .feature ({"organizations:context-engine-experiments" : True }):
281294 index_repos (self .org .id )
282295
283- mock_request .assert_called_once ()
284- body = mock_request .call_args [0 ][0 ]
296+ mock_mock_make_org_repo_knowledge_index_request .assert_called_once ()
297+ body = mock_mock_make_org_repo_knowledge_index_request .call_args [0 ][0 ]
285298 assert body ["org_id" ] == self .org .id
286299 repos = body ["repos" ]
287300 assert len (repos ) == 2
@@ -303,9 +316,13 @@ def test_calls_seer_with_correct_org_and_repos(self, mock_request) -> None:
303316 assert relay_repo ["project_ids" ] == [self .project2 .id ]
304317 assert relay_repo ["integration_id" ] == str (self .integration .id )
305318
319+ @mock .patch ("sentry.tasks.seer.context_engine_index.bulk_get_project_preferences" )
306320 @mock .patch ("sentry.tasks.seer.context_engine_index.make_org_repo_knowledge_index_request" )
307- def test_deduplicates_repos_across_projects (self , mock_request ) -> None :
308- mock_request .return_value .status = 200
321+ def test_deduplicates_repos_across_projects (
322+ self , mock_mock_make_org_repo_knowledge_index_request , mock_bulk_get_project_preferences
323+ ) -> None :
324+ mock_bulk_get_project_preferences .return_value = {}
325+ mock_mock_make_org_repo_knowledge_index_request .return_value .status = 200
309326 # Map project2 to the same repo as project1
310327 self .create_code_mapping (
311328 project = self .project2 ,
@@ -319,14 +336,58 @@ def test_deduplicates_repos_across_projects(self, mock_request) -> None:
319336 with self .feature ({"organizations:context-engine-experiments" : True }):
320337 index_repos (self .org .id )
321338
322- mock_request .assert_called_once ()
323- body = mock_request .call_args [0 ][0 ]
339+ mock_mock_make_org_repo_knowledge_index_request .assert_called_once ()
340+ body = mock_mock_make_org_repo_knowledge_index_request .call_args [0 ][0 ]
324341 repos = body ["repos" ]
325342 repos_by_name = {r ["name" ]: r for r in repos }
326343
327344 sentry_repo = repos_by_name ["sentry" ]
328345 assert sorted (sentry_repo ["project_ids" ]) == sorted ([self .project1 .id , self .project2 .id ])
329346
347+ @mock .patch ("sentry.tasks.seer.context_engine_index.bulk_get_project_preferences" )
348+ @mock .patch ("sentry.tasks.seer.context_engine_index.make_org_repo_knowledge_index_request" )
349+ def test_uses_seer_project_preferences_if_available (
350+ self , mock_mock_make_org_repo_knowledge_index_request , mock_bulk_get_project_preferences
351+ ) -> None :
352+ mock_mock_make_org_repo_knowledge_index_request .return_value .status = 200
353+ # Map project2 to the same repo as project1
354+ self .create_code_mapping (
355+ project = self .project2 ,
356+ repo = self .repo1 ,
357+ organization_integration = self .org_integration ,
358+ stack_root = "src/" ,
359+ source_root = "src/" ,
360+ )
361+
362+ mock_bulk_get_project_preferences .return_value = {
363+ str (self .project1 .id ): {
364+ "repositories" : [
365+ {
366+ "name" : "sentry-seer" ,
367+ "owner" : "getsentry" ,
368+ "provider" : "integrations:github" ,
369+ "external_id" : "999" ,
370+ "integration_id" : "000" ,
371+ }
372+ ],
373+ },
374+ str (self .project2 .id ): {
375+ "repositories" : None ,
376+ },
377+ }
378+
379+ with override_options ({"explorer.context_engine_indexing.enable" : True }):
380+ with self .feature ({"organizations:context-engine-experiments" : True }):
381+ index_repos (self .org .id )
382+
383+ mock_mock_make_org_repo_knowledge_index_request .assert_called_once ()
384+ body = mock_mock_make_org_repo_knowledge_index_request .call_args [0 ][0 ]
385+ repos = body ["repos" ]
386+ repos_by_name = {r ["name" ]: r for r in repos }
387+
388+ sentry_repo = repos_by_name ["sentry-seer" ]
389+ assert sorted (sentry_repo ["project_ids" ]) == sorted ([self .project1 .id ])
390+
330391
331392@django_db_all
332393class TestScheduleContextEngineIndexingTasks (TestCase ):
0 commit comments