Skip to content

Commit f8a59de

Browse files
committed
tests
1 parent 4abf5aa commit f8a59de

File tree

2 files changed

+76
-15
lines changed

2 files changed

+76
-15
lines changed

src/sentry/tasks/seer/context_engine_index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ def index_repos(organization_id: int, *args, **kwargs) -> None:
259259
preferences_by_id = bulk_get_project_preferences(organization_id, list(project_map.keys()))
260260

261261
for project_id, project in project_map.items():
262-
existing_pref = preferences_by_id.get(str(project_id))
262+
existing_pref = preferences_by_id.get(str(project_id), {})
263263
project_pref_repos = existing_pref.get("repositories") or []
264264
autofix_repos = get_autofix_repos_from_project_code_mappings(project_map[project_id])
265265

tests/sentry/tasks/seer/test_context_engine_index.py

Lines changed: 75 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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
332393
class TestScheduleContextEngineIndexingTasks(TestCase):

0 commit comments

Comments
 (0)