diff --git a/src/sentry/api/endpoints/group_ai_autofix.py b/src/sentry/api/endpoints/group_ai_autofix.py index 778798d613581c..5ed8ea5953463c 100644 --- a/src/sentry/api/endpoints/group_ai_autofix.py +++ b/src/sentry/api/endpoints/group_ai_autofix.py @@ -66,7 +66,13 @@ def get(self, request: Request, group: Group) -> Response: if not access_check_cache_value: check_repo_access = True - autofix_state = get_autofix_state(group_id=group.id, check_repo_access=check_repo_access) + is_user_watching = request.GET.get("isUserWatching", False) + + autofix_state = get_autofix_state( + group_id=group.id, + check_repo_access=check_repo_access, + is_user_fetching=bool(is_user_watching), + ) if check_repo_access: cache.set(access_check_cache_key, True, timeout=60) # 1 minute timeout diff --git a/src/sentry/autofix/utils.py b/src/sentry/autofix/utils.py index 52795f5fbb679d..d5c4b421745107 100644 --- a/src/sentry/autofix/utils.py +++ b/src/sentry/autofix/utils.py @@ -85,7 +85,11 @@ def get_autofix_repos_from_project_code_mappings(project: Project) -> list[dict] def get_autofix_state( - *, group_id: int | None = None, run_id: int | None = None, check_repo_access: bool = False + *, + group_id: int | None = None, + run_id: int | None = None, + check_repo_access: bool = False, + is_user_fetching: bool = False, ) -> AutofixState | None: path = "/v1/automation/autofix/state" body = orjson.dumps( @@ -93,6 +97,7 @@ def get_autofix_state( "group_id": group_id, "run_id": run_id, "check_repo_access": check_repo_access, + "is_user_fetching": is_user_fetching, } ) diff --git a/tests/sentry/api/endpoints/test_group_ai_autofix.py b/tests/sentry/api/endpoints/test_group_ai_autofix.py index de3b90e885d983..e117f26ed45aaf 100644 --- a/tests/sentry/api/endpoints/test_group_ai_autofix.py +++ b/tests/sentry/api/endpoints/test_group_ai_autofix.py @@ -50,7 +50,9 @@ def test_ai_autofix_get_endpoint_with_autofix( assert "profile" not in response.data["autofix"]["request"] assert "issue_summary" not in response.data["autofix"]["request"] - mock_get_autofix_state.assert_called_once_with(group_id=group.id, check_repo_access=True) + mock_get_autofix_state.assert_called_once_with( + group_id=group.id, check_repo_access=True, is_user_fetching=False + ) @patch("sentry.api.endpoints.group_ai_autofix.get_autofix_state") def test_ai_autofix_get_endpoint_without_autofix( @@ -65,7 +67,9 @@ def test_ai_autofix_get_endpoint_without_autofix( assert response.status_code == 200 assert response.data["autofix"] is None - mock_get_autofix_state.assert_called_once_with(group_id=group.id, check_repo_access=True) + mock_get_autofix_state.assert_called_once_with( + group_id=group.id, check_repo_access=True, is_user_fetching=False + ) @patch("sentry.api.endpoints.group_ai_autofix.get_autofix_state") @patch("sentry.api.endpoints.group_ai_autofix.get_sorted_code_mapping_configs") @@ -650,7 +654,7 @@ def test_ai_autofix_get_endpoint_cache_miss( # Verify cache behavior - cache miss should trigger repo access check mock_cache.get.assert_called_once_with(f"autofix_access_check:{self.group.id}") mock_get_autofix_state.assert_called_once_with( - group_id=self.group.id, check_repo_access=True + group_id=self.group.id, check_repo_access=True, is_user_fetching=False ) # Verify the cache was set with a 60-second timeout @@ -681,7 +685,7 @@ def test_ai_autofix_get_endpoint_cache_hit( # Verify cache behavior - cache hit should skip repo access check mock_cache.get.assert_called_once_with(f"autofix_access_check:{self.group.id}") mock_get_autofix_state.assert_called_once_with( - group_id=self.group.id, check_repo_access=False + group_id=self.group.id, check_repo_access=False, is_user_fetching=False ) # Verify the cache was not set again @@ -713,7 +717,9 @@ def test_ai_autofix_get_endpoint_polling_behavior( # Verify first request behavior mock_cache.get.assert_called_once_with(f"autofix_access_check:{group.id}") - mock_get_autofix_state.assert_called_once_with(group_id=group.id, check_repo_access=True) + mock_get_autofix_state.assert_called_once_with( + group_id=group.id, check_repo_access=True, is_user_fetching=False + ) mock_cache.set.assert_called_once_with(f"autofix_access_check:{group.id}", True, timeout=60) # Reset mocks for second request @@ -728,7 +734,9 @@ def test_ai_autofix_get_endpoint_polling_behavior( # Verify second request behavior mock_cache.get.assert_called_once_with(f"autofix_access_check:{group.id}") - mock_get_autofix_state.assert_called_once_with(group_id=group.id, check_repo_access=False) + mock_get_autofix_state.assert_called_once_with( + group_id=group.id, check_repo_access=False, is_user_fetching=False + ) mock_cache.set.assert_not_called() # Reset mocks for third request @@ -743,5 +751,7 @@ def test_ai_autofix_get_endpoint_polling_behavior( # Verify third request behavior - should be like the first request mock_cache.get.assert_called_once_with(f"autofix_access_check:{group.id}") - mock_get_autofix_state.assert_called_once_with(group_id=group.id, check_repo_access=True) + mock_get_autofix_state.assert_called_once_with( + group_id=group.id, check_repo_access=True, is_user_fetching=False + ) mock_cache.set.assert_called_once_with(f"autofix_access_check:{group.id}", True, timeout=60) diff --git a/tests/sentry/autofix/test_utils.py b/tests/sentry/autofix/test_utils.py index 57d5bd2b11b732..af9fc37250d856 100644 --- a/tests/sentry/autofix/test_utils.py +++ b/tests/sentry/autofix/test_utils.py @@ -123,7 +123,7 @@ def test_get_autofix_state_success_with_group_id(self, mock_post): mock_post.assert_called_once_with( f"{settings.SEER_AUTOFIX_URL}/v1/automation/autofix/state", - data=b'{"group_id":123,"run_id":null,"check_repo_access":false}', + data=b'{"group_id":123,"run_id":null,"check_repo_access":false,"is_user_fetching":false}', headers={"content-type": "application/json;charset=utf-8"}, ) @@ -154,7 +154,7 @@ def test_get_autofix_state_success_with_run_id(self, mock_post): mock_post.assert_called_once_with( f"{settings.SEER_AUTOFIX_URL}/v1/automation/autofix/state", - data=b'{"group_id":null,"run_id":456,"check_repo_access":false}', + data=b'{"group_id":null,"run_id":456,"check_repo_access":false,"is_user_fetching":false}', headers={"content-type": "application/json;charset=utf-8"}, )