test_client.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import responses
  2. from django.test import RequestFactory, override_settings
  3. from pytest import raises
  4. from sentry.shared_integrations.response.base import BaseApiResponse
  5. from sentry.silo import SiloMode
  6. from sentry.silo.client import RegionSiloClient, SiloClientError
  7. from sentry.silo.util import PROXY_DIRECT_LOCATION_HEADER, PROXY_SIGNATURE_HEADER
  8. from sentry.testutils.cases import TestCase
  9. from sentry.testutils.region import override_regions
  10. from sentry.types.region import Region, RegionCategory, RegionResolutionError
  11. from sentry.utils import json
  12. class SiloClientTest(TestCase):
  13. dummy_address = "http://eu.testserver"
  14. region = Region("eu", 1, dummy_address, RegionCategory.MULTI_TENANT)
  15. region_config = (region,)
  16. def setUp(self):
  17. self.factory = RequestFactory()
  18. @override_settings(SILO_MODE=SiloMode.MONOLITH)
  19. def test_init_clients_from_monolith(self):
  20. with raises(SiloClientError):
  21. RegionSiloClient(self.region)
  22. @override_settings(SILO_MODE=SiloMode.CONTROL)
  23. def test_init_clients_from_control(self):
  24. with override_regions(self.region_config):
  25. with raises(SiloClientError):
  26. RegionSiloClient("atlantis") # type: ignore[arg-type]
  27. with raises(RegionResolutionError):
  28. region = Region("atlantis", 1, self.dummy_address, RegionCategory.MULTI_TENANT)
  29. RegionSiloClient(region)
  30. client = RegionSiloClient(self.region)
  31. assert client.base_url is not None
  32. assert self.region.address in client.base_url
  33. @override_settings(SILO_MODE=SiloMode.REGION)
  34. @override_settings(SENTRY_CONTROL_ADDRESS=dummy_address)
  35. def test_init_clients_from_region(self):
  36. with raises(SiloClientError):
  37. RegionSiloClient(self.region)
  38. @responses.activate
  39. @override_settings(SILO_MODE=SiloMode.CONTROL)
  40. def test_client_request(self):
  41. with override_regions(self.region_config):
  42. client = RegionSiloClient(self.region)
  43. path = "/api/0/imaginary-public-endpoint/"
  44. responses.add(
  45. responses.GET,
  46. f"{self.dummy_address}{path}",
  47. json={"ok": True},
  48. )
  49. response = client.request("GET", path)
  50. assert isinstance(response, BaseApiResponse)
  51. assert response.status_code == 200
  52. assert response.body.get("ok")
  53. @responses.activate
  54. @override_settings(SILO_MODE=SiloMode.CONTROL)
  55. def test_client_proxy_request(self):
  56. with override_regions(self.region_config):
  57. client = RegionSiloClient(self.region)
  58. path = f"{self.dummy_address}/api/0/imaginary-public-endpoint/"
  59. responses.add(
  60. responses.GET,
  61. path,
  62. json={"ok": True},
  63. headers={"X-Some-Header": "Some-Value", PROXY_SIGNATURE_HEADER: "123"},
  64. )
  65. request = self.factory.get(path, HTTP_HOST="https://control.sentry.io")
  66. response = client.proxy_request(request)
  67. assert response.status_code == 200
  68. assert json.loads(response.content).get("ok")
  69. assert response["X-Some-Header"] == "Some-Value"
  70. assert response.get(PROXY_SIGNATURE_HEADER) is None
  71. assert response[PROXY_DIRECT_LOCATION_HEADER] == path