Skip to content

Commit 906f40c

Browse files
committed
fix(bitbucket): Match GitHub's page_number_limit clamping behavior
Drop the < 1 guard so that zero/negative limits naturally return only the first page (the while loop never executes), matching how GitHub's _get_with_pagination handles the same case. Add tests for both the zero-limit and excessive-limit clamping paths.
1 parent a80ea3d commit 906f40c

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

src/sentry/integrations/bitbucket/client.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,7 @@ def _get_all_from_paginated(
125125
Bitbucket uses a ``next`` URL in the response body (not headers)
126126
to link to the next page.
127127
"""
128-
if (
129-
page_number_limit is None
130-
or page_number_limit < 1
131-
or page_number_limit > self.page_number_limit
132-
):
128+
if page_number_limit is None or page_number_limit > self.page_number_limit:
133129
page_number_limit = self.page_number_limit
134130

135131
if params is None:

tests/sentry/integrations/bitbucket/test_integration.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,49 @@ def test_get_repositories_respects_page_limit(self) -> None:
123123
]
124124
assert len(responses.calls) == 1
125125

126+
@responses.activate
127+
def test_get_repositories_zero_page_limit_returns_first_page(self) -> None:
128+
"""A page_number_limit of 0 still returns the first page but fetches no further."""
129+
base_url = "https://api.bitbucket.org/2.0/repositories/sentryuser"
130+
responses.add(
131+
responses.GET,
132+
base_url,
133+
json={
134+
"values": [{"full_name": "sentryuser/repo-1", "uuid": "{r1}"}],
135+
"next": f"{base_url}?pagelen=100&page=2",
136+
},
137+
)
138+
responses.add(
139+
responses.GET,
140+
f"{base_url}?pagelen=100&page=2",
141+
json={"values": [{"full_name": "sentryuser/repo-2", "uuid": "{r2}"}]},
142+
)
143+
144+
installation = self.integration.get_installation(self.organization.id)
145+
result = installation.get_repositories(page_number_limit=0)
146+
assert result == [
147+
{"identifier": "sentryuser/repo-1", "name": "sentryuser/repo-1", "external_id": "{r1}"},
148+
]
149+
assert len(responses.calls) == 1
150+
151+
@responses.activate
152+
def test_get_repositories_clamps_excessive_page_limit(self) -> None:
153+
"""A page_number_limit above the class max is clamped to the default."""
154+
base_url = "https://api.bitbucket.org/2.0/repositories/sentryuser"
155+
responses.add(
156+
responses.GET,
157+
base_url,
158+
json={"values": [{"full_name": "sentryuser/repo-1", "uuid": "{r1}"}]},
159+
)
160+
161+
installation = self.integration.get_installation(self.organization.id)
162+
client = installation.get_client()
163+
result = installation.get_repositories(page_number_limit=client.page_number_limit + 100)
164+
assert result == [
165+
{"identifier": "sentryuser/repo-1", "name": "sentryuser/repo-1", "external_id": "{r1}"},
166+
]
167+
assert len(responses.calls) == 1
168+
126169
@responses.activate
127170
def test_get_repositories_exact_match(self) -> None:
128171
querystring = urlencode({"q": 'name="stuf"'})

0 commit comments

Comments
 (0)