@@ -287,7 +287,30 @@ def test_returns_early_when_no_projects(
287287 def test_calls_seer_with_correct_org_and_repos (
288288 self , mock_mock_make_org_repo_knowledge_index_request , mock_bulk_get_project_preferences
289289 ) -> None :
290- mock_bulk_get_project_preferences .return_value = {}
290+ mock_bulk_get_project_preferences .return_value = {
291+ str (self .project1 .id ): {
292+ "repositories" : [
293+ {
294+ "name" : "sentry" ,
295+ "owner" : "getsentry" ,
296+ "provider" : "integrations:github" ,
297+ "external_id" : "123" ,
298+ "integration_id" : str (self .integration .id ),
299+ }
300+ ],
301+ },
302+ str (self .project2 .id ): {
303+ "repositories" : [
304+ {
305+ "name" : "relay" ,
306+ "owner" : "getsentry" ,
307+ "provider" : "integrations:github" ,
308+ "external_id" : "456" ,
309+ "integration_id" : str (self .integration .id ),
310+ }
311+ ],
312+ },
313+ }
291314 mock_mock_make_org_repo_knowledge_index_request .return_value .status = 200
292315 with override_options ({"explorer.context_engine_indexing.enable" : True }):
293316 with self .feature ({"organizations:context-engine-experiments" : True }):
@@ -321,7 +344,30 @@ def test_calls_seer_with_correct_org_and_repos(
321344 def test_deduplicates_repos_across_projects (
322345 self , mock_mock_make_org_repo_knowledge_index_request , mock_bulk_get_project_preferences
323346 ) -> None :
324- mock_bulk_get_project_preferences .return_value = {}
347+ mock_bulk_get_project_preferences .return_value = {
348+ str (self .project1 .id ): {
349+ "repositories" : [
350+ {
351+ "name" : "sentry" ,
352+ "owner" : "getsentry" ,
353+ "provider" : "integrations:github" ,
354+ "external_id" : "123" ,
355+ "integration_id" : str (self .integration .id ),
356+ }
357+ ],
358+ },
359+ str (self .project2 .id ): {
360+ "repositories" : [
361+ {
362+ "name" : "sentry" ,
363+ "owner" : "getsentry" ,
364+ "provider" : "integrations:github" ,
365+ "external_id" : "123" ,
366+ "integration_id" : str (self .integration .id ),
367+ }
368+ ],
369+ },
370+ }
325371 mock_mock_make_org_repo_knowledge_index_request .return_value .status = 200
326372 # Map project2 to the same repo as project1
327373 self .create_code_mapping (
@@ -385,9 +431,44 @@ def test_uses_seer_project_preferences_if_available(
385431 repos = body ["repos" ]
386432 repos_by_name = {r ["name" ]: r for r in repos }
387433
434+ assert len (repos ) == 1
388435 sentry_repo = repos_by_name ["sentry-seer" ]
389436 assert sorted (sentry_repo ["project_ids" ]) == sorted ([self .project1 .id ])
390437
438+ @mock .patch ("sentry.tasks.seer.context_engine_index.bulk_get_project_preferences" )
439+ @mock .patch ("sentry.tasks.seer.context_engine_index.make_org_repo_knowledge_index_request" )
440+ def test_skips_projects_without_seer_preferences (
441+ self , mock_mock_make_org_repo_knowledge_index_request , mock_bulk_get_project_preferences
442+ ) -> None :
443+ mock_mock_make_org_repo_knowledge_index_request .return_value .status = 200
444+
445+ # Only project1 has preferences; project2 is absent from the map
446+ mock_bulk_get_project_preferences .return_value = {
447+ str (self .project1 .id ): {
448+ "repositories" : [
449+ {
450+ "name" : "sentry" ,
451+ "owner" : "getsentry" ,
452+ "provider" : "integrations:github" ,
453+ "external_id" : "123" ,
454+ "integration_id" : str (self .integration .id ),
455+ }
456+ ],
457+ },
458+ }
459+
460+ with override_options ({"explorer.context_engine_indexing.enable" : True }):
461+ with self .feature ({"organizations:context-engine-experiments" : True }):
462+ index_repos (self .org .id )
463+
464+ mock_mock_make_org_repo_knowledge_index_request .assert_called_once ()
465+ body = mock_mock_make_org_repo_knowledge_index_request .call_args [0 ][0 ]
466+ repos = body ["repos" ]
467+
468+ assert len (repos ) == 1
469+ assert repos [0 ]["name" ] == "sentry"
470+ assert repos [0 ]["project_ids" ] == [self .project1 .id ]
471+
391472
392473@django_db_all
393474class TestScheduleContextEngineIndexingTasks (TestCase ):
0 commit comments