From dfd94d7d662294b3c4a2b79cce90ee0610913458 Mon Sep 17 00:00:00 2001 From: Joshua Ferge Date: Wed, 4 Oct 2023 15:55:09 -0700 Subject: [PATCH 1/8] feat(feedback): ignore feedbacks in issue search --- src/sentry/api/endpoints/organization_group_index.py | 4 +++- src/sentry/issues/search.py | 9 +++++++-- src/sentry/search/snuba/executors.py | 6 ++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/sentry/api/endpoints/organization_group_index.py b/src/sentry/api/endpoints/organization_group_index.py index 327dea1cdbe91e..68a47a0abd58a6 100644 --- a/src/sentry/api/endpoints/organization_group_index.py +++ b/src/sentry/api/endpoints/organization_group_index.py @@ -164,6 +164,8 @@ class OrganizationGroupIndexEndpoint(OrganizationEventsEndpointBase): }, } + referrer = "search.group_index" + def _search( self, request: Request, organization, projects, environments, extra_query_kwargs=None ): @@ -182,7 +184,7 @@ def _search( query_kwargs.pop("sort_by") result = inbox_search(**query_kwargs) else: - query_kwargs["referrer"] = "search.group_index" + query_kwargs["referrer"] = self.referrer result = search.query(**query_kwargs) return result, query_kwargs diff --git a/src/sentry/issues/search.py b/src/sentry/issues/search.py index a7a78315a85de2..5f3a82f9b85b6c 100644 --- a/src/sentry/issues/search.py +++ b/src/sentry/issues/search.py @@ -211,6 +211,7 @@ def _query_params_for_generic( conditions: Sequence[Any], actor: Optional[Any] = None, categories: Optional[Sequence[GroupCategory]] = None, + referrer: str = None, ) -> Optional[SnubaQueryParams]: organization = Organization.objects.filter(id=organization_id).first() if organization and features.has( @@ -221,6 +222,8 @@ def _query_params_for_generic( return None category_ids = {gc.value for gc in categories} + if referrer != "api.feedback_index": + category_ids.discard(GroupCategory.FEEDBACK.value) group_types = { gt.type_id for gt in grouptype.registry.get_visible(organization, actor) @@ -248,13 +251,15 @@ def _query_params_for_generic( return None -def get_search_strategies() -> Mapping[int, GroupSearchStrategy]: +def get_search_strategies(referrer: str) -> Mapping[int, GroupSearchStrategy]: strategies = {} for group_category in GroupCategory: if group_category == GroupCategory.ERROR: strategy = _query_params_for_error else: - strategy = functools.partial(_query_params_for_generic, categories=[group_category]) + strategy = functools.partial( + _query_params_for_generic, categories=[group_category], referrer=referrer + ) strategies[group_category.value] = strategy return strategies diff --git a/src/sentry/search/snuba/executors.py b/src/sentry/search/snuba/executors.py index ca00cf4d6201bc..bc69854dc8e4a1 100644 --- a/src/sentry/search/snuba/executors.py +++ b/src/sentry/search/snuba/executors.py @@ -280,6 +280,7 @@ def _prepare_params_for_category( get_sample: bool, actor: Optional[Any] = None, aggregate_kwargs: Optional[PrioritySortWeights] = None, + referrer: Optional[str] = None, ) -> SnubaQueryParams: """ :raises UnsupportedSearchQuery: when search_filters includes conditions on a dataset that doesn't support it @@ -337,7 +338,7 @@ def _prepare_params_for_category( ), ) - strategy = get_search_strategies()[group_category] + strategy = get_search_strategies(referrer)[group_category] snuba_query_params = strategy( pinned_query_partial, selected_columns, @@ -420,7 +421,7 @@ def snuba_search( if not group_categories: group_categories = { gc - for gc in get_search_strategies().keys() + for gc in get_search_strategies(referrer).keys() if gc != GroupCategory.PROFILE.value or features.has("organizations:issue-platform", organization, actor=actor) } @@ -448,6 +449,7 @@ def snuba_search( get_sample, actor, aggregate_kwargs, + referrer, ) except UnsupportedSearchQuery: pass From da29ba15bbc4ce4cb3d9424d24fdd98e47b7a9d8 Mon Sep 17 00:00:00 2001 From: Joshua Ferge Date: Tue, 31 Oct 2023 14:28:15 -0700 Subject: [PATCH 2/8] use query parameter, add test --- .../api/endpoints/organization_group_index.py | 14 ++++++++---- .../test_organization_group_index.py | 22 ++++++++++++++++++- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/sentry/api/endpoints/organization_group_index.py b/src/sentry/api/endpoints/organization_group_index.py index 68a47a0abd58a6..5ce2694dfa18c3 100644 --- a/src/sentry/api/endpoints/organization_group_index.py +++ b/src/sentry/api/endpoints/organization_group_index.py @@ -164,10 +164,14 @@ class OrganizationGroupIndexEndpoint(OrganizationEventsEndpointBase): }, } - referrer = "search.group_index" - def _search( - self, request: Request, organization, projects, environments, extra_query_kwargs=None + self, + request: Request, + organization, + projects, + environments, + referrer, + extra_query_kwargs=None, ): with start_span(op="_search"): query_kwargs = build_query_params_from_request( @@ -184,7 +188,7 @@ def _search( query_kwargs.pop("sort_by") result = inbox_search(**query_kwargs) else: - query_kwargs["referrer"] = self.referrer + query_kwargs["referrer"] = referrer result = search.query(**query_kwargs) return result, query_kwargs @@ -233,6 +237,7 @@ def get(self, request: Request, organization) -> Response: :qparam list collapse: an optional list of strings to opt out of certain pieces of data. Supports `stats`, `lifetime`, `base`, `unhandled` """ stats_period = request.GET.get("groupStatsPeriod") + referrer = request.GET.get("referrer", "default") try: start, end = get_date_range_from_stats_period(request.GET) except InvalidParams as e: @@ -334,6 +339,7 @@ def get(self, request: Request, organization) -> Response: organization, projects, environments, + referrer, {"count_hits": True, "date_to": end, "date_from": start}, ) except (ValidationError, discover.InvalidSearchQuery) as exc: diff --git a/tests/snuba/api/endpoints/test_organization_group_index.py b/tests/snuba/api/endpoints/test_organization_group_index.py index 809167e48a284d..f5c6c4d38975bf 100644 --- a/tests/snuba/api/endpoints/test_organization_group_index.py +++ b/tests/snuba/api/endpoints/test_organization_group_index.py @@ -10,7 +10,11 @@ from rest_framework import status from sentry import options -from sentry.issues.grouptype import PerformanceNPlusOneGroupType, PerformanceSlowDBQueryGroupType +from sentry.issues.grouptype import ( + FeedbackGroup, + PerformanceNPlusOneGroupType, + PerformanceSlowDBQueryGroupType, +) from sentry.models.activity import Activity from sentry.models.apitoken import ApiToken from sentry.models.group import Group, GroupStatus @@ -501,6 +505,22 @@ def test_perf_issue(self): assert len(response.data) == 1 assert response.data[0]["id"] == str(perf_group.id) + def test_feedback_issue_doesnt_show_default(self): + self.create_group(type=FeedbackGroup.type_id) + self.login_as(user=self.user) + + response = self.get_success_response(query="issue.category:feedback") + assert len(response.data) == 0 + + def test_feedback_issue_shows_with_referrer(self): + self.create_group(type=FeedbackGroup.type_id) + self.login_as(user=self.user) + + response = self.get_success_response( + query="issue.category:feedback", referrer="api.feedback_index" + ) + assert len(response.data) == 0 + def test_lookup_by_event_id(self): project = self.project project.update_option("sentry:resolve_age", 1) From 32ef7fd09a4178dd8d6cb2c0e1ed86a187dec92b Mon Sep 17 00:00:00 2001 From: Joshua Ferge Date: Tue, 31 Oct 2023 17:42:13 -0700 Subject: [PATCH 3/8] add test --- tests/snuba/search/test_backend.py | 70 ++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/tests/snuba/search/test_backend.py b/tests/snuba/search/test_backend.py index d58be7d37eab14..8d8332b6175d08 100644 --- a/tests/snuba/search/test_backend.py +++ b/tests/snuba/search/test_backend.py @@ -14,6 +14,7 @@ from sentry.exceptions import InvalidSearchQuery from sentry.issues.grouptype import ( ErrorGroupType, + FeedbackGroup, NoiseConfig, PerformanceNPlusOneGroupType, PerformanceRenderBlockingAssetSpanGroupType, @@ -3684,6 +3685,75 @@ def test_rejected_filters(self): == [] ) + def test_feedback_category_hidden_default(self): + event_id_1 = uuid.uuid4().hex + _, group_info = process_event_and_issue_occurrence( + { + "id": uuid.uuid4().hex, + "project_id": 1, + "event_id": event_id_1, + "fingerprint": ["some-fingerprint"], + "issue_title": "something bad happened", + "subtitle": "it was bad", + "culprit": "api/123", + "resource_id": "1234", + "evidence_data": {"Test": 123}, + "evidence_display": [ + {"name": "hi", "value": "bye", "important": True}, + {"name": "what", "value": "where", "important": False}, + ], + "type": FeedbackGroup.type_id, + "detection_time": datetime.now().timestamp(), + "level": "info", + }, + { + "event_id": event_id_1, + "project_id": self.project.id, + "title": "some problem", + "platform": "python", + "tags": {"my_tag": "1"}, + "timestamp": before_now(minutes=1).isoformat(), + "received": before_now(minutes=1).isoformat(), + }, + ) + results = self.make_query(search_filter_query="issue.category:feedback") + assert set(results) == set() + + def test_feedback_category_show_when_referrer_set(self): + event_id_1 = uuid.uuid4().hex + _, group_info = process_event_and_issue_occurrence( + { + "id": uuid.uuid4().hex, + "project_id": 1, + "event_id": event_id_1, + "issue_title": "User Feedback", + "subtitle": "it was bad", + "culprit": "api/123", + "resource_id": "1234", + "evidence_data": {"Test": 123}, + "evidence_display": [ + {"name": "hi", "value": "bye", "important": True}, + {"name": "what", "value": "where", "important": False}, + ], + "type": FeedbackGroup.type_id, + "detection_time": datetime.now().timestamp(), + "level": "info", + }, + { + "event_id": event_id_1, + "project_id": self.project.id, + "title": "some problem", + "platform": "python", + "tags": {"my_tag": "1"}, + "timestamp": before_now(minutes=1).isoformat(), + "received": before_now(minutes=1).isoformat(), + }, + ) + results = self.make_query( + search_filter_query="issue.category:feedback", referrer="api.feedback_index" + ) + assert set(results) == {group_info} + class CdcEventsSnubaSearchTest(TestCase, SharedSnubaMixin): @property From 4f42ccaf5efea0dbd146c255aa2f596321adef5d Mon Sep 17 00:00:00 2001 From: Joshua Ferge Date: Tue, 31 Oct 2023 17:44:49 -0700 Subject: [PATCH 4/8] cleanup --- .../api/endpoints/organization_group_index.py | 2 +- .../test_organization_group_index.py | 22 +------------------ 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/src/sentry/api/endpoints/organization_group_index.py b/src/sentry/api/endpoints/organization_group_index.py index 5ce2694dfa18c3..d9f0adeff5ec0b 100644 --- a/src/sentry/api/endpoints/organization_group_index.py +++ b/src/sentry/api/endpoints/organization_group_index.py @@ -237,7 +237,7 @@ def get(self, request: Request, organization) -> Response: :qparam list collapse: an optional list of strings to opt out of certain pieces of data. Supports `stats`, `lifetime`, `base`, `unhandled` """ stats_period = request.GET.get("groupStatsPeriod") - referrer = request.GET.get("referrer", "default") + referrer = request.GET.get("referrer", "search.group_index") try: start, end = get_date_range_from_stats_period(request.GET) except InvalidParams as e: diff --git a/tests/snuba/api/endpoints/test_organization_group_index.py b/tests/snuba/api/endpoints/test_organization_group_index.py index f5c6c4d38975bf..809167e48a284d 100644 --- a/tests/snuba/api/endpoints/test_organization_group_index.py +++ b/tests/snuba/api/endpoints/test_organization_group_index.py @@ -10,11 +10,7 @@ from rest_framework import status from sentry import options -from sentry.issues.grouptype import ( - FeedbackGroup, - PerformanceNPlusOneGroupType, - PerformanceSlowDBQueryGroupType, -) +from sentry.issues.grouptype import PerformanceNPlusOneGroupType, PerformanceSlowDBQueryGroupType from sentry.models.activity import Activity from sentry.models.apitoken import ApiToken from sentry.models.group import Group, GroupStatus @@ -505,22 +501,6 @@ def test_perf_issue(self): assert len(response.data) == 1 assert response.data[0]["id"] == str(perf_group.id) - def test_feedback_issue_doesnt_show_default(self): - self.create_group(type=FeedbackGroup.type_id) - self.login_as(user=self.user) - - response = self.get_success_response(query="issue.category:feedback") - assert len(response.data) == 0 - - def test_feedback_issue_shows_with_referrer(self): - self.create_group(type=FeedbackGroup.type_id) - self.login_as(user=self.user) - - response = self.get_success_response( - query="issue.category:feedback", referrer="api.feedback_index" - ) - assert len(response.data) == 0 - def test_lookup_by_event_id(self): project = self.project project.update_option("sentry:resolve_age", 1) From 42e519cb8fcb739f5d3919f745991493dae35eb6 Mon Sep 17 00:00:00 2001 From: Joshua Ferge Date: Tue, 31 Oct 2023 18:14:55 -0700 Subject: [PATCH 5/8] fix tests --- src/sentry/issues/search.py | 1 - src/sentry/search/snuba/executors.py | 2 - tests/snuba/search/test_backend.py | 144 +++++++++++++++------------ 3 files changed, 78 insertions(+), 69 deletions(-) diff --git a/src/sentry/issues/search.py b/src/sentry/issues/search.py index 5f3a82f9b85b6c..59a7898ce94126 100644 --- a/src/sentry/issues/search.py +++ b/src/sentry/issues/search.py @@ -220,7 +220,6 @@ def _query_params_for_generic( if categories is None: logging.error("Category is required in _query_params_for_generic") return None - category_ids = {gc.value for gc in categories} if referrer != "api.feedback_index": category_ids.discard(GroupCategory.FEEDBACK.value) diff --git a/src/sentry/search/snuba/executors.py b/src/sentry/search/snuba/executors.py index bc69854dc8e4a1..7ff2a4efbdeaa5 100644 --- a/src/sentry/search/snuba/executors.py +++ b/src/sentry/search/snuba/executors.py @@ -337,7 +337,6 @@ def _prepare_params_for_category( orderby=orderby, ), ) - strategy = get_search_strategies(referrer)[group_category] snuba_query_params = strategy( pinned_query_partial, @@ -380,7 +379,6 @@ def snuba_search( * the count of total results (rows) available for this query. """ filters = {"project_id": project_ids} - environments = None if environment_ids is not None: filters["environment"] = environment_ids diff --git a/tests/snuba/search/test_backend.py b/tests/snuba/search/test_backend.py index 8d8332b6175d08..07ff8334db4c39 100644 --- a/tests/snuba/search/test_backend.py +++ b/tests/snuba/search/test_backend.py @@ -74,6 +74,7 @@ def make_query( date_from=None, date_to=None, cursor=None, + referrer=None, aggregate_kwargs=None, ): search_filters = [] @@ -88,7 +89,6 @@ def make_query( kwargs["limit"] = limit if aggregate_kwargs: kwargs["aggregate_kwargs"] = {"priority": {**aggregate_kwargs}} - return self.backend.query( projects, search_filters=search_filters, @@ -98,6 +98,7 @@ def make_query( date_from=date_from, date_to=date_to, cursor=cursor, + referrer=referrer, **kwargs, ) @@ -3686,73 +3687,84 @@ def test_rejected_filters(self): ) def test_feedback_category_hidden_default(self): - event_id_1 = uuid.uuid4().hex - _, group_info = process_event_and_issue_occurrence( - { - "id": uuid.uuid4().hex, - "project_id": 1, - "event_id": event_id_1, - "fingerprint": ["some-fingerprint"], - "issue_title": "something bad happened", - "subtitle": "it was bad", - "culprit": "api/123", - "resource_id": "1234", - "evidence_data": {"Test": 123}, - "evidence_display": [ - {"name": "hi", "value": "bye", "important": True}, - {"name": "what", "value": "where", "important": False}, - ], - "type": FeedbackGroup.type_id, - "detection_time": datetime.now().timestamp(), - "level": "info", - }, - { - "event_id": event_id_1, - "project_id": self.project.id, - "title": "some problem", - "platform": "python", - "tags": {"my_tag": "1"}, - "timestamp": before_now(minutes=1).isoformat(), - "received": before_now(minutes=1).isoformat(), - }, - ) - results = self.make_query(search_filter_query="issue.category:feedback") - assert set(results) == set() + with self.feature( + ["organizations:issue-platform", FeedbackGroup.build_visible_feature_name()] + ): + event_id_1 = uuid.uuid4().hex + _, group_info = process_event_and_issue_occurrence( + { + "id": uuid.uuid4().hex, + "project_id": 1, + "event_id": event_id_1, + "fingerprint": ["nonsense"], + "issue_title": "User Feedback", + "subtitle": "it was bad", + "culprit": "api/123", + "resource_id": "1234", + "evidence_data": {"Test": 123}, + "evidence_display": [ + {"name": "hi", "value": "bye", "important": True}, + {"name": "what", "value": "where", "important": False}, + ], + "type": FeedbackGroup.type_id, + "detection_time": datetime.now().timestamp(), + "level": "info", + }, + { + "event_id": event_id_1, + "project_id": self.project.id, + "title": "some problem", + "platform": "python", + "tags": {"my_tag": "1"}, + "timestamp": before_now(minutes=1).isoformat(), + "received": before_now(minutes=1).isoformat(), + }, + ) + results = self.make_query(search_filter_query="issue.category:feedback") + assert set(results) == set() def test_feedback_category_show_when_referrer_set(self): - event_id_1 = uuid.uuid4().hex - _, group_info = process_event_and_issue_occurrence( - { - "id": uuid.uuid4().hex, - "project_id": 1, - "event_id": event_id_1, - "issue_title": "User Feedback", - "subtitle": "it was bad", - "culprit": "api/123", - "resource_id": "1234", - "evidence_data": {"Test": 123}, - "evidence_display": [ - {"name": "hi", "value": "bye", "important": True}, - {"name": "what", "value": "where", "important": False}, - ], - "type": FeedbackGroup.type_id, - "detection_time": datetime.now().timestamp(), - "level": "info", - }, - { - "event_id": event_id_1, - "project_id": self.project.id, - "title": "some problem", - "platform": "python", - "tags": {"my_tag": "1"}, - "timestamp": before_now(minutes=1).isoformat(), - "received": before_now(minutes=1).isoformat(), - }, - ) - results = self.make_query( - search_filter_query="issue.category:feedback", referrer="api.feedback_index" - ) - assert set(results) == {group_info} + with self.feature( + [ + "organizations:issue-platform", + FeedbackGroup.build_visible_feature_name(), + FeedbackGroup.build_ingest_feature_name(), + ] + ): + event_id_1 = uuid.uuid4().hex + _, group_info = process_event_and_issue_occurrence( + { + "id": uuid.uuid4().hex, + "project_id": 1, + "event_id": event_id_1, + "fingerprint": ["nonsense"], + "issue_title": "User Feedback", + "subtitle": "it was bad", + "culprit": "api/123", + "resource_id": "1234", + "evidence_data": {"Test": 123}, + "evidence_display": [ + {"name": "hi", "value": "bye", "important": True}, + {"name": "what", "value": "where", "important": False}, + ], + "type": FeedbackGroup.type_id, + "detection_time": datetime.now().timestamp(), + "level": "info", + }, + { + "event_id": event_id_1, + "project_id": self.project.id, + "title": "some problem", + "platform": "python", + "tags": {"my_tag": "1"}, + "timestamp": before_now(minutes=1).isoformat(), + "received": before_now(minutes=1).isoformat(), + }, + ) + results = self.make_query( + search_filter_query="issue.category:feedback", referrer="api.feedback_index" + ) + assert list(results) == [group_info.group] class CdcEventsSnubaSearchTest(TestCase, SharedSnubaMixin): From 79ceb6f022fad088aa89f2ceaaad90c91b146c9c Mon Sep 17 00:00:00 2001 From: Joshua Ferge Date: Wed, 1 Nov 2023 11:19:03 -0700 Subject: [PATCH 6/8] add start and end to search --- tests/snuba/search/test_backend.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/snuba/search/test_backend.py b/tests/snuba/search/test_backend.py index 07ff8334db4c39..ed1b0516487b27 100644 --- a/tests/snuba/search/test_backend.py +++ b/tests/snuba/search/test_backend.py @@ -3720,7 +3720,11 @@ def test_feedback_category_hidden_default(self): "received": before_now(minutes=1).isoformat(), }, ) - results = self.make_query(search_filter_query="issue.category:feedback") + results = self.make_query( + search_filter_query="issue.category:feedback", + date_from=self.base_datetime, + date_to=self.base_datetime + timedelta(days=10), + ) assert set(results) == set() def test_feedback_category_show_when_referrer_set(self): @@ -3762,7 +3766,10 @@ def test_feedback_category_show_when_referrer_set(self): }, ) results = self.make_query( - search_filter_query="issue.category:feedback", referrer="api.feedback_index" + search_filter_query="issue.category:feedback", + referrer="api.feedback_index", + date_from=self.base_datetime, + date_to=self.base_datetime + timedelta(days=10), ) assert list(results) == [group_info.group] From 42ea00f2a59596947c8797d33a14687ec1d44d0a Mon Sep 17 00:00:00 2001 From: Joshua Ferge Date: Wed, 1 Nov 2023 12:42:17 -0700 Subject: [PATCH 7/8] add referrer to delete and put --- src/sentry/api/endpoints/organization_group_index.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/sentry/api/endpoints/organization_group_index.py b/src/sentry/api/endpoints/organization_group_index.py index d9f0adeff5ec0b..7904b17756ff0f 100644 --- a/src/sentry/api/endpoints/organization_group_index.py +++ b/src/sentry/api/endpoints/organization_group_index.py @@ -43,6 +43,7 @@ from sentry.utils.validators import normalize_event_id ERR_INVALID_STATS_PERIOD = "Invalid stats_period. Valid choices are '', '24h', and '14d'" +DEFAULT_REFERRER = "search.group_index" allowed_inbox_search_terms = frozenset(["date", "status", "for_review", "assigned_or_suggested"]) @@ -237,7 +238,7 @@ def get(self, request: Request, organization) -> Response: :qparam list collapse: an optional list of strings to opt out of certain pieces of data. Supports `stats`, `lifetime`, `base`, `unhandled` """ stats_period = request.GET.get("groupStatsPeriod") - referrer = request.GET.get("referrer", "search.group_index") + referrer = request.GET.get("referrer", DEFAULT_REFERRER) try: start, end = get_date_range_from_stats_period(request.GET) except InvalidParams as e: @@ -445,6 +446,7 @@ def put(self, request: Request, organization) -> Response: """ projects = self.get_projects(request, organization) is_fetching_replay_data = request.headers.get("X-Sentry-Replay-Request") == "1" + referrer = request.GET.get("referrer", DEFAULT_REFERRER) if ( len(projects) > 1 @@ -461,6 +463,7 @@ def put(self, request: Request, organization) -> Response: organization, projects, self.get_environments(request, organization), + referrer, ) return update_groups( @@ -491,7 +494,7 @@ def delete(self, request: Request, organization) -> Response: :auth: required """ projects = self.get_projects(request, organization) - + referrer = request.GET.get("referrer", DEFAULT_REFERRER) is_fetching_replay_data = request.headers.get("X-Sentry-Replay-Request") == "1" if ( @@ -509,6 +512,7 @@ def delete(self, request: Request, organization) -> Response: organization, projects, self.get_environments(request, organization), + referrer, ) return delete_groups(request, projects, organization.id, search_fn) From 9e1e8862f2609a34ffd841fa49cb02ff96c93bac Mon Sep 17 00:00:00 2001 From: Joshua Ferge Date: Wed, 1 Nov 2023 13:31:37 -0700 Subject: [PATCH 8/8] fix type --- tests/snuba/search/test_backend.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/snuba/search/test_backend.py b/tests/snuba/search/test_backend.py index ed1b0516487b27..226dc7fac4fd07 100644 --- a/tests/snuba/search/test_backend.py +++ b/tests/snuba/search/test_backend.py @@ -3771,6 +3771,7 @@ def test_feedback_category_show_when_referrer_set(self): date_from=self.base_datetime, date_to=self.base_datetime + timedelta(days=10), ) + assert group_info is not None assert list(results) == [group_info.group]