Browse Source

ref: use a smaller page size in test_get_key_transaction_list_pagination test (#64270)

<!-- Describe your PR here. -->
anthony sottile 1 year ago
parent
commit
74c9d180c7

+ 17 - 11
src/sentry/api/base.py

@@ -44,6 +44,13 @@ from sentry.utils.http import (
 )
 from sentry.utils.sdk import capture_exception, merge_context_into_scope
 
+from ..services.hybrid_cloud import rpcmetrics
+from ..utils.pagination_factory import (
+    annotate_span_with_pagination_args,
+    clamp_pagination_per_page,
+    get_cursor,
+    get_paginator,
+)
 from .authentication import (
     ApiKeyAuthentication,
     OrgAuthTokenAuthentication,
@@ -56,6 +63,7 @@ from .permissions import (
     SuperuserOrStaffFeatureFlaggedPermission,
     SuperuserPermission,
 )
+from .utils import generate_organization_url
 
 __all__ = [
     "Endpoint",
@@ -65,14 +73,7 @@ __all__ = [
     "region_silo_endpoint",
 ]
 
-from ..services.hybrid_cloud import rpcmetrics
-from ..utils.pagination_factory import (
-    annotate_span_with_pagination_args,
-    clamp_pagination_per_page,
-    get_cursor,
-    get_paginator,
-)
-from .utils import generate_organization_url
+PAGINATION_DEFAULT_PER_PAGE = 100
 
 ONE_MINUTE = 60
 ONE_HOUR = ONE_MINUTE * 60
@@ -438,7 +439,12 @@ class Endpoint(APIView):
     def respond_with_text(self, text):
         return self.respond({"text": text})
 
-    def get_per_page(self, request: Request, default_per_page=100, max_per_page=100):
+    def get_per_page(
+        self, request: Request, default_per_page: int | None = None, max_per_page: int | None = None
+    ):
+        default_per_page = default_per_page or PAGINATION_DEFAULT_PER_PAGE
+        max_per_page = max_per_page or 100
+
         try:
             return clamp_pagination_per_page(
                 request.GET.get("per_page", default_per_page),
@@ -460,8 +466,8 @@ class Endpoint(APIView):
         on_results=None,
         paginator=None,
         paginator_cls=Paginator,
-        default_per_page=100,
-        max_per_page=100,
+        default_per_page: int | None = None,
+        max_per_page: int | None = None,
         cursor_cls=Cursor,
         response_cls=Response,
         response_kwargs=None,

+ 7 - 1
src/sentry/api/endpoints/organization_user_reports.py

@@ -1,3 +1,5 @@
+from typing import NotRequired, TypedDict
+
 from rest_framework.request import Request
 from rest_framework.response import Response
 
@@ -13,6 +15,10 @@ from sentry.api.serializers.models import UserReportWithGroupSerializer
 from sentry.models.userreport import UserReport
 
 
+class _PaginateKwargs(TypedDict):
+    post_query_filter: NotRequired[object]
+
+
 @region_silo_endpoint
 class OrganizationUserReportsEndpoint(OrganizationEndpoint):
     owner = ApiOwner.FEEDBACK
@@ -52,7 +58,7 @@ class OrganizationUserReportsEndpoint(OrganizationEndpoint):
             )
 
         status = request.GET.get("status", "unresolved")
-        paginate_kwargs = {}
+        paginate_kwargs: _PaginateKwargs = {}
         if status == "unresolved":
             paginate_kwargs["post_query_filter"] = user_reports_filter_to_unresolved
         elif status:

+ 7 - 1
src/sentry/api/endpoints/project_user_reports.py

@@ -1,3 +1,5 @@
+from typing import NotRequired, TypedDict
+
 from rest_framework import serializers
 from rest_framework.request import Request
 from rest_framework.response import Response
@@ -23,6 +25,10 @@ class UserReportSerializer(serializers.ModelSerializer):
         fields = ("name", "email", "comments", "event_id")
 
 
+class _PaginateKwargs(TypedDict):
+    post_query_filter: NotRequired[object]
+
+
 @region_silo_endpoint
 class ProjectUserReportsEndpoint(ProjectEndpoint, EnvironmentMixin):
     owner = ApiOwner.FEEDBACK
@@ -47,7 +53,7 @@ class ProjectUserReportsEndpoint(ProjectEndpoint, EnvironmentMixin):
         if isinstance(request.auth, ProjectKey):
             return self.respond(status=401)
 
-        paginate_kwargs = {}
+        paginate_kwargs: _PaginateKwargs = {}
         try:
             environment = self._get_environment_from_request(request, project.organization_id)
         except Environment.DoesNotExist:

+ 11 - 0
src/sentry/testutils/helpers/pagination.py

@@ -0,0 +1,11 @@
+import contextlib
+from collections.abc import Generator
+from unittest import mock
+
+from sentry.api import base
+
+
+@contextlib.contextmanager
+def override_pagination_limit(n: int) -> Generator[None, None, None]:
+    with mock.patch.object(base, "PAGINATION_DEFAULT_PER_PAGE", n):
+        yield

+ 5 - 3
tests/snuba/api/endpoints/test_discover_key_transactions.py

@@ -9,6 +9,7 @@ from sentry.discover.models import MAX_TEAM_KEY_TRANSACTIONS, TeamKeyTransaction
 from sentry.models.projectteam import ProjectTeam
 from sentry.testutils.cases import APITestCase, SnubaTestCase
 from sentry.testutils.helpers import parse_link_header
+from sentry.testutils.helpers.pagination import override_pagination_limit
 from sentry.testutils.silo import region_silo_test
 from sentry.utils.samples import load_data
 
@@ -868,6 +869,7 @@ class TeamKeyTransactionListTest(TeamKeyTransactionTestBase):
             },
         ]
 
+    @override_pagination_limit(5)
     def test_get_key_transaction_list_pagination(self):
         user = self.create_user()
         self.login_as(user=user)
@@ -875,7 +877,7 @@ class TeamKeyTransactionListTest(TeamKeyTransactionTestBase):
         project = self.create_project(name="baz", organization=org)
 
         teams = []
-        for i in range(123):
+        for i in range(8):
             team = self.create_team(organization=org, name=f"Team {i:02d}")
             self.create_team_membership(team, user=user)
             project.add_team(team)
@@ -893,7 +895,7 @@ class TeamKeyTransactionListTest(TeamKeyTransactionTestBase):
             )
 
         assert response.status_code == 200, response.content
-        assert len(response.data) == 100
+        assert len(response.data) == 5
         links = {
             link["rel"]: {"url": url, **link}
             for url, link in parse_link_header(response["Link"]).items()
@@ -915,7 +917,7 @@ class TeamKeyTransactionListTest(TeamKeyTransactionTestBase):
             )
 
         assert response.status_code == 200, response.content
-        assert len(response.data) == 23
+        assert len(response.data) == 3
         links = {
             link["rel"]: {"url": url, **link}
             for url, link in parse_link_header(response["Link"]).items()