Skip to content

Commit cd37f83

Browse files
committed
rebase conflicts
1 parent 961488b commit cd37f83

File tree

2 files changed

+2
-128
lines changed

2 files changed

+2
-128
lines changed

src/sentry/testutils/helpers/apigateway.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def verify_request_params(params, headers):
191191
"""Wrapper for a callback function for HttpxMockRouter.add_callback."""
192192

193193
def request_callback(request: httpx.Request):
194-
request_params = parse_qs(request.url.split("?")[1])
194+
request_params = parse_qs(str(request.url).split("?")[1])
195195
assert (request.headers[key] == headers[key] for key in headers)
196196
for key in params:
197197
assert key in request_params
@@ -261,7 +261,7 @@ def return_request_body(request: httpx.Request):
261261

262262
# Echos the query params and header back for verification
263263
def return_request_params(request: httpx.Request):
264-
params = parse_qs(request.url.split("?")[1])
264+
params = parse_qs(str(request.url).split("?")[1])
265265
return (200, dict(request.headers), json.dumps(params).encode())
266266

267267
self.httpx_router.add_callback("GET", f"{self.REGION.address}/echo", return_request_params)

tests/sentry/hybridcloud/apigateway/test_proxy.py

Lines changed: 0 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
1-
from unittest.mock import MagicMock, patch
21
from urllib.parse import urlencode
32

43
import httpx
54
from asgiref.sync import async_to_sync
65
from django.core.files.uploadedfile import SimpleUploadedFile
7-
from django.http import HttpResponse
86
from django.test.client import RequestFactory
9-
from requests.exceptions import Timeout
107

118
from sentry.hybridcloud.apigateway.proxy import proxy_request as _proxy_request
129
from sentry.silo.util import (
1310
INVALID_OUTBOUND_HEADERS,
1411
PROXY_APIGATEWAY_HEADER,
1512
PROXY_DIRECT_LOCATION_HEADER,
1613
)
17-
from sentry.testutils.helpers import override_options
1814
from sentry.testutils.helpers.apigateway import (
1915
ApiGatewayTestCase,
2016
verify_file_body,
@@ -254,125 +250,3 @@ def test_strip_request_headers(self) -> None:
254250

255251
resp = proxy_request(request, self.organization.slug, url_name)
256252
assert not any([header in resp for header in INVALID_OUTBOUND_HEADERS])
257-
258-
259-
CB_ENABLED = {
260-
"apigateway.proxy.circuit-breaker.enabled": True,
261-
"apigateway.proxy.circuit-breaker.enforce": True,
262-
}
263-
264-
265-
@control_silo_test(regions=[ApiGatewayTestCase.REGION])
266-
class ProxyCircuitBreakerTestCase(ApiGatewayTestCase):
267-
def _make_breaker_mock(self, *, allow_request: bool) -> MagicMock:
268-
mock_breaker = MagicMock()
269-
mock_breaker.should_allow_request.return_value = allow_request
270-
return mock_breaker
271-
272-
@responses.activate
273-
@override_options(CB_ENABLED)
274-
def test_open_circuit_returns_503(self) -> None:
275-
with patch("sentry.hybridcloud.apigateway.proxy.CircuitBreaker") as mock_breaker_class:
276-
mock_breaker_class.return_value = self._make_breaker_mock(allow_request=False)
277-
request = RequestFactory().get("http://sentry.io/get")
278-
resp = proxy_request(request, self.organization.slug, url_name)
279-
assert isinstance(resp, HttpResponse)
280-
assert resp.status_code == 503
281-
assert json.loads(resp.content) == {
282-
"error": "apigateway",
283-
"detail": "Downstream service temporarily unavailable",
284-
}
285-
286-
@responses.activate
287-
@override_options(CB_ENABLED)
288-
def test_circuit_breaker_keyed_per_cell(self) -> None:
289-
with patch("sentry.hybridcloud.apigateway.proxy.CircuitBreaker") as mock_breaker_class:
290-
mock_breaker_class.return_value = self._make_breaker_mock(allow_request=False)
291-
request = RequestFactory().get("http://sentry.io/get")
292-
proxy_request(request, self.organization.slug, url_name)
293-
key_used = mock_breaker_class.call_args[0][0]
294-
assert key_used == f"apigateway.proxy.{self.REGION.name}"
295-
296-
@responses.activate
297-
def test_circuit_breaker_disabled_by_default(self) -> None:
298-
with patch("sentry.hybridcloud.apigateway.proxy.CircuitBreaker") as mock_breaker_class:
299-
request = RequestFactory().get("http://sentry.io/get")
300-
proxy_request(request, self.organization.slug, url_name)
301-
mock_breaker_class.assert_not_called()
302-
303-
@responses.activate
304-
@override_options(
305-
{
306-
"apigateway.proxy.circuit-breaker.enabled": True,
307-
"apigateway.proxy.circuit-breaker.enforce": False,
308-
}
309-
)
310-
def test_open_circuit_not_enforced(self) -> None:
311-
with patch("sentry.hybridcloud.apigateway.proxy.CircuitBreaker") as mock_breaker_class:
312-
mock_breaker_class.return_value = self._make_breaker_mock(allow_request=False)
313-
request = RequestFactory().get("http://sentry.io/get")
314-
resp = proxy_request(request, self.organization.slug, url_name)
315-
assert resp.status_code == 200
316-
317-
@responses.activate
318-
@override_options({"apigateway.proxy.circuit-breaker.config": "invalid-lol", **CB_ENABLED})
319-
def test_handles_invalid_config(self) -> None:
320-
request = RequestFactory().get("http://sentry.io/get")
321-
res = proxy_request(request, self.organization.slug, url_name)
322-
assert res.status_code == 200
323-
324-
@responses.activate
325-
@override_options(CB_ENABLED)
326-
def test_timeout_records_error(self) -> None:
327-
responses.add(
328-
responses.GET,
329-
f"{self.REGION.address}/timeout",
330-
body=Timeout(),
331-
)
332-
with patch("sentry.hybridcloud.apigateway.proxy.CircuitBreaker") as mock_breaker_class:
333-
mock_breaker = self._make_breaker_mock(allow_request=True)
334-
mock_breaker_class.return_value = mock_breaker
335-
request = RequestFactory().get("http://sentry.io/timeout")
336-
with pytest.raises(RequestTimeout):
337-
proxy_request(request, self.organization.slug, url_name)
338-
mock_breaker.record_error.assert_called_once()
339-
340-
@responses.activate
341-
@override_options(CB_ENABLED)
342-
def test_5xx_response_records_error(self) -> None:
343-
responses.add(
344-
responses.GET,
345-
f"{self.REGION.address}/server-error",
346-
status=500,
347-
body=json.dumps({"detail": "internal server error"}),
348-
content_type="application/json",
349-
)
350-
with patch("sentry.hybridcloud.apigateway.proxy.CircuitBreaker") as mock_breaker_class:
351-
mock_breaker = self._make_breaker_mock(allow_request=True)
352-
mock_breaker_class.return_value = mock_breaker
353-
request = RequestFactory().get("http://sentry.io/server-error")
354-
resp = proxy_request(request, self.organization.slug, url_name)
355-
assert resp.status_code == 500
356-
mock_breaker.record_error.assert_called_once()
357-
358-
@responses.activate
359-
@override_options(CB_ENABLED)
360-
def test_4xx_response_does_not_record_error(self) -> None:
361-
with patch("sentry.hybridcloud.apigateway.proxy.CircuitBreaker") as mock_breaker_class:
362-
mock_breaker = self._make_breaker_mock(allow_request=True)
363-
mock_breaker_class.return_value = mock_breaker
364-
request = RequestFactory().get("http://sentry.io/error")
365-
resp = proxy_request(request, self.organization.slug, url_name)
366-
assert resp.status_code == 400
367-
mock_breaker.record_error.assert_not_called()
368-
369-
@responses.activate
370-
@override_options(CB_ENABLED)
371-
def test_2xx_response_does_not_record_error(self) -> None:
372-
with patch("sentry.hybridcloud.apigateway.proxy.CircuitBreaker") as mock_breaker_class:
373-
mock_breaker = self._make_breaker_mock(allow_request=True)
374-
mock_breaker_class.return_value = mock_breaker
375-
request = RequestFactory().get("http://sentry.io/get")
376-
resp = proxy_request(request, self.organization.slug, url_name)
377-
assert resp.status_code == 200
378-
mock_breaker.record_error.assert_not_called()

0 commit comments

Comments
 (0)