diff --git a/bin/mock-replay b/bin/mock-replay index 472614a8dfb0d6..774e2fddf1e9d8 100755 --- a/bin/mock-replay +++ b/bin/mock-replay @@ -77,7 +77,7 @@ def create_recording(replay_id, project_id, timestamp): store_replay_segments(replay_id, project_id, segment_id, segment) -def store_replay_segments(replay_id: str, project_id: str, segment_id: int, segment): +def store_replay_segments(replay_id: str, project_id: int, segment_id: int, segment) -> None: f = File.objects.create(name="rr:{segment_id}", type="replay.recording") f.putfile(BytesIO(compress(dumps_htmlsafe(segment).encode()))) ReplayRecordingSegment.objects.create( diff --git a/src/sentry/replays/testutils.py b/src/sentry/replays/testutils.py index 2d594348875093..1bb818fa58d721 100644 --- a/src/sentry/replays/testutils.py +++ b/src/sentry/replays/testutils.py @@ -71,7 +71,7 @@ def assert_expected_response(response: dict[str, Any], expected_response: dict[s def mock_expected_response( - project_id: str, + project_id: int, replay_id: str, started_at: datetime.datetime, finished_at: datetime.datetime, @@ -222,7 +222,7 @@ def mock_replay( def mock_replay_click( timestamp: datetime.datetime, - project_id: str, + project_id: int, replay_id: str, **kwargs: Any, ) -> dict[str, Any]: @@ -266,7 +266,7 @@ def mock_replay_click( def mock_replay_viewed( timestamp: float, - project_id: str, + project_id: int, replay_id: str, viewed_by_id: int, retention_days: int = 30, diff --git a/src/sentry/testutils/cases.py b/src/sentry/testutils/cases.py index 0e49da002b59e3..5e6765c92dd85f 100644 --- a/src/sentry/testutils/cases.py +++ b/src/sentry/testutils/cases.py @@ -2460,10 +2460,10 @@ def store_replays(self, replays): def store_replay_segments( self, replay_id: str, - project_id: str, + project_id: int, segment_id: int, segment, - ): + ) -> None: f = File.objects.create(name="rr:{segment_id}", type="replay.recording") f.putfile(BytesIO(compress(dumps_htmlsafe(segment).encode()))) ReplayRecordingSegment.objects.create( diff --git a/src/sentry/testutils/fixtures.py b/src/sentry/testutils/fixtures.py index 949cc56a52ea1e..f473989bc78ac2 100644 --- a/src/sentry/testutils/fixtures.py +++ b/src/sentry/testutils/fixtures.py @@ -160,7 +160,7 @@ def create_environment(self, project=None, **kwargs): project = self.project return Factories.create_environment(project=project, **kwargs) - def create_project(self, **kwargs): + def create_project(self, **kwargs) -> Project: if "teams" not in kwargs: kwargs["teams"] = [self.team] return Factories.create_project(**kwargs) diff --git a/src/sentry/tsdb/base.py b/src/sentry/tsdb/base.py index 8575613cd7daea..977908d615c37f 100644 --- a/src/sentry/tsdb/base.py +++ b/src/sentry/tsdb/base.py @@ -685,13 +685,13 @@ def get_frequency_series( def get_frequency_totals( self, model: TSDBModel, - items: Mapping[str, Sequence[str]], + items: Mapping[TSDBKey, Sequence[TSDBItem]], start: datetime, end: datetime | None = None, rollup: int | None = None, environment_id: int | None = None, tenant_ids: dict[str, str | int] | None = None, - ) -> dict[str, dict[str, float]]: + ) -> dict[TSDBKey, dict[TSDBItem, float]]: """ Retrieve the total frequency of known items in a table over time. diff --git a/src/sentry/tsdb/dummy.py b/src/sentry/tsdb/dummy.py index ff012c733a64f9..ed9b5d7209bb48 100644 --- a/src/sentry/tsdb/dummy.py +++ b/src/sentry/tsdb/dummy.py @@ -141,13 +141,14 @@ def get_frequency_series( def get_frequency_totals( self, - model, - items: Mapping[str, Sequence[str]], - start, - end=None, - rollup=None, - environment_id=None, - ): + model: TSDBModel, + items: Mapping[TSDBKey, Sequence[TSDBItem]], + start: datetime, + end: datetime | None = None, + rollup: int | None = None, + environment_id: int | None = None, + tenant_ids: dict[str, str | int] | None = None, + ) -> dict[TSDBKey, dict[TSDBItem, float]]: self.validate_arguments([model], [environment_id]) results = {} for key, members in items.items(): diff --git a/src/sentry/tsdb/inmemory.py b/src/sentry/tsdb/inmemory.py index f8dcb6b36683a5..dd2854c16000e6 100644 --- a/src/sentry/tsdb/inmemory.py +++ b/src/sentry/tsdb/inmemory.py @@ -310,13 +310,14 @@ def get_frequency_series( def get_frequency_totals( self, - model, - items: Mapping[str, Sequence[str]], - start, - end=None, - rollup=None, - environment_id=None, - ): + model: TSDBModel, + items: Mapping[TSDBKey, Sequence[TSDBItem]], + start: datetime, + end: datetime | None = None, + rollup: int | None = None, + environment_id: int | None = None, + tenant_ids: dict[str, str | int] | None = None, + ) -> dict[TSDBKey, dict[TSDBItem, float]]: self.validate_arguments([model], [environment_id]) results = {} diff --git a/src/sentry/tsdb/redis.py b/src/sentry/tsdb/redis.py index 6a4474ac1ba355..7c9a692c960482 100644 --- a/src/sentry/tsdb/redis.py +++ b/src/sentry/tsdb/redis.py @@ -964,19 +964,19 @@ def get_frequency_series( def get_frequency_totals( self, model: TSDBModel, - items: Mapping[str, Sequence[str]], + items: Mapping[TSDBKey, Sequence[TSDBItem]], start: datetime, end: datetime | None = None, rollup: int | None = None, environment_id: int | None = None, tenant_ids: dict[str, str | int] | None = None, - ) -> dict[str, dict[str, float]]: + ) -> dict[TSDBKey, dict[TSDBItem, float]]: self.validate_arguments([model], [environment_id]) if not self.enable_frequency_sketches: raise NotImplementedError("Frequency sketches are disabled.") - responses: dict[str, dict[str, float]] = {} + responses: dict[TSDBKey, dict[TSDBItem, float]] = {} frequency_series = self.get_frequency_series( model, items, start, end, rollup, environment_id ) diff --git a/src/sentry/tsdb/snuba.py b/src/sentry/tsdb/snuba.py index d5af6c0c9a1ee7..5fe3bb838364fa 100644 --- a/src/sentry/tsdb/snuba.py +++ b/src/sentry/tsdb/snuba.py @@ -911,14 +911,14 @@ def get_frequency_series( def get_frequency_totals( self, - model, - items: Mapping[str, Sequence[str]], - start, - end=None, - rollup=None, - environment_id=None, - tenant_ids=None, - ): + model: TSDBModel, + items: Mapping[TSDBKey, Sequence[TSDBItem]], + start: datetime, + end: datetime | None = None, + rollup: int | None = None, + environment_id: int | None = None, + tenant_ids: dict[str, str | int] | None = None, + ) -> dict[TSDBKey, dict[TSDBItem, float]]: return self.get_data( model, items, diff --git a/tests/sentry/api/endpoints/test_organization_release_details.py b/tests/sentry/api/endpoints/test_organization_release_details.py index fd549dfc9fedeb..c3ebeaf2928695 100644 --- a/tests/sentry/api/endpoints/test_organization_release_details.py +++ b/tests/sentry/api/endpoints/test_organization_release_details.py @@ -173,7 +173,7 @@ def test_incorrect_sort_option_should_return_invalid_sort_response(self): "sentry-api-0-organization-release-details", kwargs={"organization_id_or_slug": self.organization.slug, "version": release.version}, ) - response = self.client.get(url, {"project": self.project1.id, "sort": "invalid_sort"}) + response = self.client.get(url, {"project": str(self.project1.id), "sort": "invalid_sort"}) assert response.status_code == 400 def test_get_prev_and_next_release_to_current_release_on_date_sort(self): @@ -329,7 +329,7 @@ def test_get_prev_and_next_release_to_current_release_on_date_sort_env_filter_ap "version": release_3.version, }, ) - response = self.client.get(url, {"project": self.project1.id, "environment": ["prod"]}) + response = self.client.get(url, {"project": str(self.project1.id), "environment": ["prod"]}) assert response.status_code == 200 assert response.data["currentProjectMeta"]["nextReleaseVersion"] is None assert response.data["currentProjectMeta"]["prevReleaseVersion"] == "foobar@1.0.0" @@ -384,7 +384,7 @@ def test_get_prev_and_next_release_to_current_release_on_date_sort_status_filter "version": release_3.version, }, ) - response = self.client.get(url, {"project": self.project1.id, "status": "archived"}) + response = self.client.get(url, {"project": str(self.project1.id), "status": "archived"}) assert response.status_code == 200 assert response.data["currentProjectMeta"]["prevReleaseVersion"] is None assert response.data["currentProjectMeta"]["nextReleaseVersion"] is None @@ -421,7 +421,7 @@ def test_get_prev_and_next_release_to_current_release_on_date_sort_query_filter_ "version": release_2.version, }, ) - response = self.client.get(url, {"project": self.project1.id, "query": "foobar@1"}) + response = self.client.get(url, {"project": str(self.project1.id), "query": "foobar@1"}) assert response.status_code == 200 assert response.data["currentProjectMeta"]["prevReleaseVersion"] == "foobar@1.0.0" assert response.data["currentProjectMeta"]["nextReleaseVersion"] is None @@ -461,7 +461,9 @@ def test_get_prev_and_next_release_on_date_sort_does_not_apply_stats_period_filt "version": release_1.version, }, ) - response = self.client.get(url, {"project": self.project1.id, "summaryStatsPeriod": "24h"}) + response = self.client.get( + url, {"project": str(self.project1.id), "summaryStatsPeriod": "24h"} + ) assert response.status_code == 200 assert response.data["currentProjectMeta"]["nextReleaseVersion"] == "foobar@2.0.0" assert response.data["currentProjectMeta"]["prevReleaseVersion"] == "foobar@3.0.0" @@ -581,7 +583,7 @@ def test_get_first_and_last_release_on_date_sort_env_filter_applied(self): "version": release_3.version, }, ) - response = self.client.get(url, {"project": self.project1.id, "environment": ["prod"]}) + response = self.client.get(url, {"project": str(self.project1.id), "environment": ["prod"]}) assert response.status_code == 200 assert response.data["currentProjectMeta"]["firstReleaseVersion"] == "foobar@2.0.0" assert response.data["currentProjectMeta"]["lastReleaseVersion"] == "foobar@3.0.0" @@ -607,7 +609,7 @@ def test_get_first_and_last_release_on_non_date_sort(self): "version": release_1.version, }, ) - response = self.client.get(url, {"project": self.project1.id, "sort": "sessions"}) + response = self.client.get(url, {"project": str(self.project1.id), "sort": "sessions"}) assert response.status_code == 400 assert response.data["detail"] == "invalid sort" @@ -632,7 +634,7 @@ def test_get_first_and_last_release_when_project_has_no_releases(self): "sentry-api-0-organization-release-details", kwargs={"organization_id_or_slug": self.organization.slug, "version": release.version}, ) - response = self.client.get(url, {"project": self.project1.id, "environment": ["test"]}) + response = self.client.get(url, {"project": str(self.project1.id), "environment": ["test"]}) assert response.status_code == 200 assert response.data["currentProjectMeta"]["firstReleaseVersion"] is None assert response.data["currentProjectMeta"]["lastReleaseVersion"] is None diff --git a/tests/sentry/features/test_flagpole_context.py b/tests/sentry/features/test_flagpole_context.py index c9abf21b644824..8f18888fedbf77 100644 --- a/tests/sentry/features/test_flagpole_context.py +++ b/tests/sentry/features/test_flagpole_context.py @@ -40,7 +40,7 @@ def test_with_invalid_organization(self): organization_context_transformer(SentryContextData(organization=1234)) # type: ignore[arg-type] with pytest.raises(InvalidContextDataException): - organization_context_transformer(SentryContextData(organization=self.create_project())) + organization_context_transformer(SentryContextData(organization=self.create_project())) # type: ignore[arg-type] def test_with_valid_organization(self): org = self.create_organization(slug="foobar", name="Foo Bar") diff --git a/tests/sentry/incidents/endpoints/test_organization_combined_rule_index_endpoint.py b/tests/sentry/incidents/endpoints/test_organization_combined_rule_index_endpoint.py index 6fbeec0f4ef306..2efee8c827383b 100644 --- a/tests/sentry/incidents/endpoints/test_organization_combined_rule_index_endpoint.py +++ b/tests/sentry/incidents/endpoints/test_organization_combined_rule_index_endpoint.py @@ -64,7 +64,7 @@ def setup_project_and_rules(self): organization=self.org, teams=[self.team], name="Elephant" ) self.projects = [self.project, self.project2] - self.project_ids = [self.project.id, self.project2.id] + self.project_ids = [str(self.project.id), str(self.project2.id)] self.alert_rule = self.create_alert_rule( name="alert rule", organization=self.org, @@ -128,7 +128,12 @@ def test_limit_as_1_with_paging_sort_name(self): self.setup_project_and_rules() # Test Limit as 1, no cursor: with self.feature(["organizations:incidents", "organizations:performance-view"]): - request_data = {"per_page": "1", "project": self.project.id, "sort": "name", "asc": 1} + request_data = { + "per_page": "1", + "project": str(self.project.id), + "sort": "name", + "asc": "1", + } response = self.client.get( path=self.combined_rules_url, data=request_data, content_type="application/json" ) @@ -145,9 +150,9 @@ def test_limit_as_1_with_paging_sort_name(self): request_data = { "cursor": next_cursor, "per_page": "1", - "project": self.project.id, + "project": str(self.project.id), "sort": "name", - "asc": 1, + "asc": "1", } response = self.client.get( path=self.combined_rules_url, data=request_data, content_type="application/json" @@ -183,7 +188,12 @@ def test_limit_as_1_with_paging_sort_name_urlencode(self): # Test Limit as 1, no cursor: url = f"/api/0/organizations/{self.org.slug}/combined-rules/" with self.feature(["organizations:incidents", "organizations:performance-view"]): - request_data = {"per_page": "1", "project": self.project.id, "sort": "name", "asc": 1} + request_data = { + "per_page": "1", + "project": str(self.project.id), + "sort": "name", + "asc": "1", + } response = self.client.get( path=url, data=request_data, @@ -202,9 +212,9 @@ def test_limit_as_1_with_paging_sort_name_urlencode(self): request_data = { "cursor": next_cursor, "per_page": "1", - "project": self.project.id, + "project": str(self.project.id), "sort": "name", - "asc": 1, + "asc": "1", } response = self.client.get(path=url, data=request_data, content_type="application/json") assert response.status_code == 200 @@ -234,7 +244,7 @@ def test_limit_as_1_with_paging(self): # Test Limit as 1, next page of previous request: with self.feature(["organizations:incidents", "organizations:performance-view"]): - request_data = {"cursor": next_cursor, "per_page": "1", "project": self.project.id} + request_data = {"cursor": next_cursor, "per_page": "1", "project": str(self.project.id)} response = self.client.get( path=self.combined_rules_url, data=request_data, content_type="application/json" ) @@ -561,7 +571,7 @@ def test_myteams_filter_superuser(self): with self.feature(["organizations:incidents", "organizations:performance-view"]): request_data = { "per_page": "10", - "project": [another_project.id], + "project": [str(another_project.id)], "team": ["myteams"], } response = self.client.get( @@ -573,7 +583,7 @@ def test_myteams_filter_superuser(self): with self.feature(["organizations:incidents", "organizations:performance-view"]): request_data = { "per_page": "10", - "project": [another_project.id], + "project": [str(another_project.id)], "team": [another_org_team.id], } response = self.client.get( diff --git a/tests/sentry/issues/test_escalating.py b/tests/sentry/issues/test_escalating.py index b67d270a52904b..08d4a5febf046e 100644 --- a/tests/sentry/issues/test_escalating.py +++ b/tests/sentry/issues/test_escalating.py @@ -233,8 +233,8 @@ def test_query_different_orgs(self, mock_logger: MagicMock) -> None: org_b = self.create_organization() proj_b = self.create_project(organization=org_b) - event1 = self._create_events_for_group(project_id=proj_a, hours_ago=1) - event_proj_org_b_1 = self._create_events_for_group(project_id=proj_b, hours_ago=1) + event1 = self._create_events_for_group(project_id=proj_a.id, hours_ago=1) + event_proj_org_b_1 = self._create_events_for_group(project_id=proj_b.id, hours_ago=1) # Since proj_org_b is created assert query_groups_past_counts(Group.objects.all()) == [ diff --git a/tests/sentry/receivers/test_onboarding.py b/tests/sentry/receivers/test_onboarding.py index bf7a7d809a3ca1..02c90d715e63b6 100644 --- a/tests/sentry/receivers/test_onboarding.py +++ b/tests/sentry/receivers/test_onboarding.py @@ -11,6 +11,7 @@ OnboardingTaskStatus, OrganizationOnboardingTask, ) +from sentry.models.project import Project from sentry.models.rule import Rule from sentry.plugins.bases.issue import IssueTrackingPlugin from sentry.services.hybrid_cloud.organization import organization_service @@ -684,8 +685,10 @@ def test_old_project_sending_minified_stack_trace_event(self, record_analytics): ] } - # project.flags.has_minified_stack_trace = False - assert not project.flags.has_minified_stack_trace + def _project_has_minified_stack_trace(p: Project) -> bool: + return p.flags.has_minified_stack_trace + + assert not _project_has_minified_stack_trace(project) # Store event self.store_event( @@ -695,8 +698,7 @@ def test_old_project_sending_minified_stack_trace_event(self, record_analytics): project.refresh_from_db() - # project.flags.has_minified_stack_trace = True - assert project.flags.has_minified_stack_trace + assert _project_has_minified_stack_trace(project) # The analytic's event "first_event_with_minified_stack_trace_for_project" shall not be sent count = 0 @@ -866,16 +868,17 @@ def test_old_project_sending_sourcemap_event(self, record_analytics): ] } - # project.flags.has_sourcemaps = False - assert not project.flags.has_sourcemaps + def _project_has_sourcemaps(p: Project) -> bool: + return project.flags.has_sourcemaps + + assert not _project_has_sourcemaps(project) event = self.store_event(project_id=project.id, data=data) event_processed.send(project=project, event=event, sender=type(project)) project.refresh_from_db() - # project.flags.has_sourcemaps = True - assert project.flags.has_sourcemaps + assert _project_has_sourcemaps(project) # The analytic's event "first_event_with_minified_stack_trace_for_project" shall not be sent count = 0 diff --git a/tests/sentry/release_health/test_tasks.py b/tests/sentry/release_health/test_tasks.py index 65d7a097f48d0e..622258caf45283 100644 --- a/tests/sentry/release_health/test_tasks.py +++ b/tests/sentry/release_health/test_tasks.py @@ -152,8 +152,8 @@ def test_simple(self): }, ] process_projects_with_sessions(test_data[0]["org_id"][0], test_data[0]["project_id"]) - self.project1.refresh_from_db() - assert self.project1.flags.has_sessions + project1 = Project.objects.get(id=self.project1.id) + assert project1.flags.has_sessions assert not ReleaseProjectEnvironment.objects.filter( project_id=self.project1.id, diff --git a/tests/sentry/tasks/test_weekly_reports.py b/tests/sentry/tasks/test_weekly_reports.py index dda8075c3f19fd..104dfb3eb002bb 100644 --- a/tests/sentry/tasks/test_weekly_reports.py +++ b/tests/sentry/tasks/test_weekly_reports.py @@ -88,7 +88,7 @@ def test_integration(self): teams=[self.team], date_added=self.now - timedelta(days=90), ) - member_set = set(project.teams.first().member_set.all()) + member_set = set(project.teams.get().member_set.all()) with self.options({"issues.group_attributes.send_kafka": True}): self.store_event( data={ @@ -115,7 +115,7 @@ def test_with_empty_string_user_option(self): self.store_event( data={"timestamp": iso_format(before_now(days=1))}, project_id=project.id ) - member_set = set(project.teams.first().member_set.all()) + member_set = set(project.teams.get().member_set.all()) for member in member_set: # some users have an empty string value set for this key, presumably cleared. user_option_service.set_option( diff --git a/tests/snuba/api/endpoints/test_discover_key_transactions.py b/tests/snuba/api/endpoints/test_discover_key_transactions.py index eada5615b1edba..b2b08963b7a561 100644 --- a/tests/snuba/api/endpoints/test_discover_key_transactions.py +++ b/tests/snuba/api/endpoints/test_discover_key_transactions.py @@ -885,7 +885,7 @@ def test_get_key_transaction_list_pagination(self): response = self.client.get( reverse("sentry-api-0-organization-key-transactions-list", args=[org.slug]), data={ - "project": [project.id], + "project": [str(project.id)], "team": ["myteams"], }, format="json", @@ -906,7 +906,7 @@ def test_get_key_transaction_list_pagination(self): response = self.client.get( reverse("sentry-api-0-organization-key-transactions-list", args=[org.slug]), data={ - "project": [project.id], + "project": [str(project.id)], "team": ["myteams"], "cursor": links["next"]["cursor"], }, diff --git a/tests/snuba/api/endpoints/test_organization_events_facets.py b/tests/snuba/api/endpoints/test_organization_events_facets.py index 07f022de323565..29eaf004ef9a38 100644 --- a/tests/snuba/api/endpoints/test_organization_events_facets.py +++ b/tests/snuba/api/endpoints/test_organization_events_facets.py @@ -711,7 +711,7 @@ def test_with_cursor_parameter(self): # Get the next page with self.feature(self.features): response = self.client.get( - self.url, format="json", data={"project": test_project.id, "cursor": "0:10:0"} + self.url, format="json", data={"project": str(test_project.id), "cursor": "0:10:0"} ) links = requests.utils.parse_header_links( response.get("link", "").rstrip(">").replace(">,<", ",<") @@ -784,7 +784,7 @@ def test_projects_data_are_injected_on_first_page_with_multiple_projects_selecte response = self.client.get( self.url, format="json", - data={"project": [test_project.id, test_project2.id], "cursor": "0:10:0"}, + data={"project": [str(test_project.id), str(test_project2.id)], "cursor": "0:10:0"}, ) links = requests.utils.parse_header_links( response.get("link", "").rstrip(">").replace(">,<", ",<") @@ -832,7 +832,7 @@ def test_multiple_pages_with_single_project(self): response = self.client.get( self.url, format="json", - data={"project": test_project.id, "cursor": links[1]["cursor"]}, + data={"project": str(test_project.id), "cursor": links[1]["cursor"]}, ) links = requests.utils.parse_header_links( response.get("link", "").rstrip(">").replace(">,<", ",<") @@ -847,7 +847,7 @@ def test_multiple_pages_with_single_project(self): response = self.client.get( self.url, format="json", - data={"project": test_project.id, "cursor": links[1]["cursor"]}, + data={"project": str(test_project.id), "cursor": links[1]["cursor"]}, ) links = requests.utils.parse_header_links( response.get("link", "").rstrip(">").replace(">,<", ",<") @@ -886,7 +886,10 @@ def test_multiple_pages_with_multiple_projects(self): response = self.client.get( self.url, format="json", - data={"project": [test_project.id, test_project2.id], "cursor": links[1]["cursor"]}, + data={ + "project": [str(test_project.id), str(test_project2.id)], + "cursor": links[1]["cursor"], + }, ) links = requests.utils.parse_header_links( response.get("link", "").rstrip(">").replace(">,<", ",<") @@ -901,7 +904,10 @@ def test_multiple_pages_with_multiple_projects(self): response = self.client.get( self.url, format="json", - data={"project": [test_project.id, test_project2.id], "cursor": links[1]["cursor"]}, + data={ + "project": [str(test_project.id), str(test_project2.id)], + "cursor": links[1]["cursor"], + }, ) links = requests.utils.parse_header_links( response.get("link", "").rstrip(">").replace(">,<", ",<") diff --git a/tests/snuba/api/endpoints/test_organization_events_meta.py b/tests/snuba/api/endpoints/test_organization_events_meta.py index bf3a1db3c0ab83..f869927d6738b5 100644 --- a/tests/snuba/api/endpoints/test_organization_events_meta.py +++ b/tests/snuba/api/endpoints/test_organization_events_meta.py @@ -368,7 +368,7 @@ def test_related_issues_transactions_from_different_projects(self): ) response = self.client.get( url, - {"transaction": "/beth/sanchez", "project": project1.id}, + {"transaction": "/beth/sanchez", "project": str(project1.id)}, format="json", ) @@ -396,7 +396,7 @@ def test_related_issues_transactions_with_quotes(self): ) response = self.client.get( url, - {"transaction": '/beth/"sanchez"', "project": project.id}, + {"transaction": '/beth/"sanchez"', "project": str(project.id)}, format="json", ) @@ -411,7 +411,7 @@ def test_related_issues_transactions_with_quotes(self): ) response = self.client.get( url, - {"transaction": '/beth/\\"sanchez\\"', "project": project.id}, + {"transaction": '/beth/\\"sanchez\\"', "project": str(project.id)}, format="json", ) diff --git a/tests/snuba/api/endpoints/test_organization_events_stats.py b/tests/snuba/api/endpoints/test_organization_events_stats.py index 4569411d76ddf2..1f0881969a0d4d 100644 --- a/tests/snuba/api/endpoints/test_organization_events_stats.py +++ b/tests/snuba/api/endpoints/test_organization_events_stats.py @@ -1,5 +1,8 @@ +from __future__ import annotations + import uuid from datetime import timedelta +from typing import Any, TypedDict from unittest import mock from uuid import uuid4 @@ -12,6 +15,7 @@ from sentry.constants import MAX_TOP_EVENTS from sentry.issues.grouptype import ProfileFileIOGroupType +from sentry.models.project import Project from sentry.models.transaction_threshold import ProjectTransactionThreshold, TransactionMetric from sentry.snuba.discover import OTHER_KEY from sentry.testutils.cases import APITestCase, ProfilesSnubaTestCase, SnubaTestCase @@ -22,6 +26,12 @@ pytestmark = pytest.mark.sentry_metrics +class _EventDataDict(TypedDict): + data: dict[str, Any] + project: Project + count: int + + class OrganizationEventsStatsEndpointTest(APITestCase, SnubaTestCase, SearchIssueTestMixin): endpoint = "sentry-api-0-organization-events-stats" @@ -1067,7 +1077,7 @@ def test_tag_with_conflicting_function_alias_simple(self): assert all([interval[1][0]["count"] == 0 for interval in response.data["data"]]) def test_group_id_tag_simple(self): - event_data = { + event_data: _EventDataDict = { "data": { "message": "poof", "timestamp": iso_format(self.day_ago + timedelta(minutes=2)), @@ -1120,7 +1130,7 @@ def setUp(self): transaction_data["start_timestamp"] = iso_format(self.day_ago + timedelta(minutes=2)) transaction_data["timestamp"] = iso_format(self.day_ago + timedelta(minutes=4)) transaction_data["tags"] = {"shared-tag": "yup"} - self.event_data = [ + self.event_data: list[_EventDataDict] = [ { "data": { "message": "poof", @@ -1349,7 +1359,7 @@ def test_top_events_with_projects_other(self): assert [attrs[0]["count"] for _, attrs in data["Other"]["data"]] == [7, 6] def test_tag_with_conflicting_function_alias_simple(self): - event_data = { + event_data: _EventDataDict = { "data": { "message": "poof", "timestamp": iso_format(self.day_ago + timedelta(minutes=2)), @@ -1396,7 +1406,7 @@ def test_tag_with_conflicting_function_alias_simple(self): reason="The response.data[Other] returns 15 locally and returns 16 or 15 remotely." ) def test_tag_with_conflicting_function_alias_with_other_single_grouping(self): - event_data = [ + event_data: list[_EventDataDict] = [ { "data": { "message": "poof", @@ -1444,7 +1454,7 @@ def test_tag_with_conflicting_function_alias_with_other_single_grouping(self): assert response.data["Other"]["data"][0][1] == [{"count": 16}] def test_tag_with_conflicting_function_alias_with_other_multiple_groupings(self): - event_data = [ + event_data: list[_EventDataDict] = [ { "data": { "message": "abc", @@ -1492,7 +1502,7 @@ def test_tag_with_conflicting_function_alias_with_other_multiple_groupings(self) assert response.data["Other"]["data"][0][1] == [{"count": 25}] def test_group_id_tag_simple(self): - event_data = { + event_data: _EventDataDict = { "data": { "message": "poof", "timestamp": iso_format(self.day_ago + timedelta(minutes=2)), @@ -2247,14 +2257,14 @@ def test_top_events_with_error_handled(self): ) assert response.status_code == 200, response.content - data = response.data + res_data = response.data - assert len(data) == 2 + assert len(res_data) == 2 - results = data["1"] + results = res_data["1"] assert [attrs for time, attrs in results["data"]] == [[{"count": 20}], [{"count": 6}]] - results = data["0"] + results = res_data["0"] assert [attrs for time, attrs in results["data"]] == [[{"count": 1}], [{"count": 0}]] def test_top_events_with_aggregate_condition(self):