From 04041519f3e04dfb9dd72c8cde6c243af0a1db76 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 30 Mar 2026 15:07:18 -0700 Subject: [PATCH 1/8] ref(cells): Update assert_webhook_payloads_for_mailbox --- src/sentry/testutils/outbox.py | 23 +++++++++++-------- .../parsers/test_bitbucket_server.py | 8 +++---- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/sentry/testutils/outbox.py b/src/sentry/testutils/outbox.py index 98da1a967b66a5..54bd9c4b6b5a37 100644 --- a/src/sentry/testutils/outbox.py +++ b/src/sentry/testutils/outbox.py @@ -64,7 +64,10 @@ def assert_no_webhook_payloads() -> None: def assert_webhook_payloads_for_mailbox( request: WSGIRequest, mailbox_name: str, - region_names: list[str], + # TODO(cells): make required once getsentry passes cell everywhere + cell_names: list[str] | None = None, + # TODO(cells): remove once getsentry passes cell everywhere + region_names: list[str] | None = None, destination_types: dict[DestinationType, int] | None = None, ) -> None: """ @@ -73,16 +76,16 @@ def assert_webhook_payloads_for_mailbox( :param request: :param mailbox_name: The mailbox name that messages should be found in. - :param region_names: Optional list of regions each messages should be queued for + :param cell_names: List of cells each messages should be queued for :param destination_types: Optional Mapping of destination types to the number of messages that should be found for that destination type """ expected_payload = WebhookPayload.get_attributes_from_request(request=request) - region_names_set = set(region_names) + cell_names_set = set(cell_names or region_names) messages = WebhookPayload.objects.filter(mailbox_name=mailbox_name) - messages_with_region_count = messages.filter(cell_name__isnull=False).count() - if messages_with_region_count != len(region_names_set): + messages_with_cell_count = messages.filter(cell_name__isnull=False).count() + if messages_with_cell_count != len(cell_names_set): raise Exception( - f"Mismatch: Found {messages_with_region_count} WebhookPayload but {len(region_names_set)} region_names" + f"Mismatch: Found {messages_with_cell_count} WebhookPayload but {len(cell_names_set)} cell_names" ) for message in messages: assert message.request_method == expected_payload["request_method"] @@ -104,13 +107,13 @@ def assert_webhook_payloads_for_mailbox( else: assert message.cell_name is not None try: - region_names_set.remove(message.cell_name) + cell_names_set.remove(message.cell_name) except KeyError: raise Exception( - f"Found ControlOutbox for '{message.cell_name}', which was not in region_names: {str(region_names_set)}" + f"Found ControlOutbox for '{message.cell_name}', which was not in region_names: {str(cell_names_set)}" ) - if len(region_names_set) != 0: - raise Exception(f"WebhookPayload not found for some region_names: {str(region_names_set)}") + if len(cell_names_set) != 0: + raise Exception(f"WebhookPayload not found for some region_names: {str(cell_names_set)}") if destination_types and len(destination_types) != 0: exc_strs = [ diff --git a/tests/sentry/middleware/integrations/parsers/test_bitbucket_server.py b/tests/sentry/middleware/integrations/parsers/test_bitbucket_server.py index 4664a8cf0782d1..81e88b7d8b2ae4 100644 --- a/tests/sentry/middleware/integrations/parsers/test_bitbucket_server.py +++ b/tests/sentry/middleware/integrations/parsers/test_bitbucket_server.py @@ -19,10 +19,10 @@ class BitbucketServerRequestParserTest(TestCase): get_response = MagicMock(return_value=HttpResponse(content=b"no-error", status=200)) factory = RequestFactory() - region = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) - region_config = (region,) + cell = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) + cell_config = (cell,) - @override_cells(region_config) + @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) def test_routing_webhook(self) -> None: region_route = reverse( @@ -51,5 +51,5 @@ def test_routing_webhook(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"bitbucket_server:{self.organization.id}", - region_names=[self.region.name], + cell_names=[self.cell.name], ) From f266c5dbb34f8e7cf8dbd4b2dbf5628d4f406f56 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 30 Mar 2026 15:10:10 -0700 Subject: [PATCH 2/8] update tests --- .../integrations/parsers/test_bitbucket.py | 30 +++++++++---------- .../parsers/test_bitbucket_server.py | 8 ++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/sentry/middleware/integrations/parsers/test_bitbucket.py b/tests/sentry/middleware/integrations/parsers/test_bitbucket.py index 07fa1b9856a28b..2ab0797f12143a 100644 --- a/tests/sentry/middleware/integrations/parsers/test_bitbucket.py +++ b/tests/sentry/middleware/integrations/parsers/test_bitbucket.py @@ -12,8 +12,8 @@ from sentry.testutils.silo import control_silo_test from sentry.types.cell import Cell, RegionCategory -region = Cell("us", 1, "http://us.testserver", RegionCategory.MULTI_TENANT) -region_config = (region,) +cell = Cell("us", 1, "http://us.testserver", RegionCategory.MULTI_TENANT) +cell_config = (cell,) @control_silo_test @@ -22,8 +22,8 @@ def get_response(self, req: HttpRequest) -> HttpResponse: return HttpResponse(status=200, content="passthrough") factory = RequestFactory() - region = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) - region_config = (region,) + cell = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) + cell_config = (cell,) def get_integration(self) -> Integration: return self.create_integration( @@ -31,7 +31,7 @@ def get_integration(self) -> Integration: ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_routing_endpoints(self) -> None: self.get_integration() control_routes = [ @@ -57,15 +57,15 @@ def test_routing_endpoints(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) - def test_routing_webhook_no_regions(self) -> None: - region_route = reverse( + @override_cells(cell_config) + def test_routing_webhook_no_cells(self) -> None: + cell_route = reverse( "sentry-extensions-bitbucket-webhook", kwargs={"organization_id": self.organization.id} ) - request = self.factory.post(region_route) + request = self.factory.post(cell_route) parser = BitbucketRequestParser(request=request, response_handler=self.get_response) - # Missing region + # Missing cell OrganizationMapping.objects.get(organization_id=self.organization.id).update(cell_name="eu") response = parser.get_response() @@ -75,13 +75,13 @@ def test_routing_webhook_no_regions(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) - def test_routing_webhook_with_regions(self) -> None: + @override_cells(cell_config) + def test_routing_webhook_with_cells(self) -> None: self.get_integration() - region_route = reverse( + cell_route = reverse( "sentry-extensions-bitbucket-webhook", kwargs={"organization_id": self.organization.id} ) - request = self.factory.post(region_route) + request = self.factory.post(cell_route) parser = BitbucketRequestParser(request=request, response_handler=self.get_response) response = parser.get_response() @@ -91,5 +91,5 @@ def test_routing_webhook_with_regions(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"bitbucket:{self.organization.id}", - region_names=[self.region.name], + cell_names=[self.cell.name], ) diff --git a/tests/sentry/middleware/integrations/parsers/test_bitbucket_server.py b/tests/sentry/middleware/integrations/parsers/test_bitbucket_server.py index 81e88b7d8b2ae4..c07006f84b67d7 100644 --- a/tests/sentry/middleware/integrations/parsers/test_bitbucket_server.py +++ b/tests/sentry/middleware/integrations/parsers/test_bitbucket_server.py @@ -25,15 +25,15 @@ class BitbucketServerRequestParserTest(TestCase): @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) def test_routing_webhook(self) -> None: - region_route = reverse( + cell_route = reverse( "sentry-extensions-bitbucketserver-webhook", kwargs={"organization_id": self.organization.id, "integration_id": self.integration.id}, ) with outbox_runner(): - request = self.factory.post(region_route) + request = self.factory.post(cell_route) parser = BitbucketServerRequestParser(request=request, response_handler=self.get_response) - # Missing region + # Missing cell OrganizationMapping.objects.get(organization_id=self.organization.id).update(cell_name="eu") with mock.patch.object( parser, "get_response_from_control_silo" @@ -41,7 +41,7 @@ def test_routing_webhook(self) -> None: parser.get_response() assert get_response_from_control_silo.called - # Valid region + # Valid cell OrganizationMapping.objects.get(organization_id=self.organization.id).update(cell_name="us") response = parser.get_response() assert isinstance(response, HttpResponse) From a2c5a415b13e9f99a1c6877ec2345ac9d4df02cb Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 30 Mar 2026 15:14:49 -0700 Subject: [PATCH 3/8] update gh tests --- .../integrations/parsers/test_github.py | 80 +++++++++---------- .../parsers/test_github_enterprise.py | 20 ++--- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/tests/sentry/middleware/integrations/parsers/test_github.py b/tests/sentry/middleware/integrations/parsers/test_github.py index ed497fdb80ae1a..a86de294b8f96e 100644 --- a/tests/sentry/middleware/integrations/parsers/test_github.py +++ b/tests/sentry/middleware/integrations/parsers/test_github.py @@ -22,8 +22,8 @@ from sentry.testutils.silo import control_silo_test from sentry.types.cell import Cell, RegionCategory -region = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) -region_config = (region,) +cell = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) +cell_config = (cell,) @control_silo_test @@ -42,7 +42,7 @@ def get_integration(self) -> Integration: ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_invalid_webhook(self) -> None: if SiloMode.get_current_mode() != SiloMode.CONTROL: return @@ -59,7 +59,7 @@ def test_invalid_webhook(self) -> None: assert response.status_code == status.HTTP_400_BAD_REQUEST @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_routing_no_organization_integration_found(self) -> None: integration = self.get_integration() @@ -82,7 +82,7 @@ def test_routing_no_organization_integration_found(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_routing_no_integration_found(self) -> None: self.get_integration() @@ -101,7 +101,7 @@ def test_routing_no_integration_found(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_routing_search_properly(self) -> None: path = reverse( @@ -126,7 +126,7 @@ def test_routing_search_properly(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_get_integration_from_request(self) -> None: integration = self.get_integration() request = self.factory.post( @@ -140,7 +140,7 @@ def test_get_integration_from_request(self) -> None: assert result == integration @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_webhook_outbox_creation(self) -> None: integration = self.get_integration() request = self.factory.post( @@ -158,7 +158,7 @@ def test_webhook_outbox_creation(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) @override_settings(SILO_MODE=SiloMode.CONTROL, CODECOV_API_BASE_URL="https://api.codecov.io") @@ -169,7 +169,7 @@ def test_webhook_outbox_creation(self) -> None: "codecov.forward-webhooks.disabled": False, } ) - @override_cells(region_config) + @override_cells(cell_config) def test_webhook_for_codecov(self) -> None: integration = self.get_integration() request = self.factory.post( @@ -187,13 +187,13 @@ def test_webhook_for_codecov(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], destination_types={DestinationType.SENTRY_REGION: 1}, ) assert_webhook_payloads_for_mailbox( request=request, mailbox_name="github:codecov:1", - region_names=[], + cell_names=[], destination_types={DestinationType.CODECOV: 1}, ) @@ -205,8 +205,8 @@ def test_webhook_for_codecov(self) -> None: "codecov.forward-webhooks.disabled": False, } ) - @override_cells(region_config) - def test_webhook_for_codecov_no_regions(self) -> None: + @override_cells(cell_config) + def test_webhook_for_codecov_no_cells(self) -> None: integration = self.get_integration() request = self.factory.post( self.path, @@ -223,7 +223,7 @@ def test_webhook_for_codecov_no_regions(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], destination_types={DestinationType.SENTRY_REGION: 1}, ) with pytest.raises( @@ -233,7 +233,7 @@ def test_webhook_for_codecov_no_regions(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name="github:codecov:1", - region_names=[], + cell_names=[], destination_types={DestinationType.CODECOV: 1}, ) @@ -245,9 +245,9 @@ def test_webhook_for_codecov_no_regions(self) -> None: "codecov.forward-webhooks.disabled": True, } ) - @override_cells(region_config) + @override_cells(cell_config) def test_webhook_no_codecov_payload_when_forwarding_disabled(self) -> None: - """When codecov.forward-webhooks.disabled is True, only region payload is created.""" + """When codecov.forward-webhooks.disabled is True, only cell payload is created.""" integration = self.get_integration() request = self.factory.post( self.path, @@ -264,7 +264,7 @@ def test_webhook_no_codecov_payload_when_forwarding_disabled(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], destination_types={DestinationType.SENTRY_REGION: 1}, ) with pytest.raises( @@ -274,12 +274,12 @@ def test_webhook_no_codecov_payload_when_forwarding_disabled(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name="github:codecov:1", - region_names=[], + cell_names=[], destination_types={DestinationType.CODECOV: 1}, ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_installation_created_routing(self) -> None: self.get_integration() @@ -315,7 +315,7 @@ def test_installation_deleted_routing(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_issue_deleted_routing(self) -> None: integration = self.get_integration() @@ -340,7 +340,7 @@ def test_issue_deleted_routing(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], destination_types={DestinationType.SENTRY_REGION: 1}, ) @@ -394,7 +394,7 @@ def test_mailbox_bucket_id_handles_malformed_payload(self) -> None: assert parser.mailbox_bucket_id({}) is None @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_webhook_outbox_creation_with_bucketing(self) -> None: integration = self.get_integration() request = self.factory.post( @@ -414,11 +414,11 @@ def test_webhook_outbox_creation_with_bucketing(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}:77:push", - region_names=[region.name], + cell_names=[cell.name], ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_webhook_outbox_creation_with_bucketing_isolates_event_types(self) -> None: """Different event types for the same repo land in different mailboxes.""" integration = self.get_integration() @@ -447,7 +447,7 @@ def test_webhook_outbox_creation_with_bucketing_isolates_event_types(self) -> No ) != check_run_parser.get_mailbox_identifier(integration, {}) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_webhook_outbox_creation_with_bucketing_no_event_type_header(self) -> None: """Falls back gracefully when X-GitHub-Event header is absent.""" integration = self.get_integration() @@ -468,11 +468,11 @@ def test_webhook_outbox_creation_with_bucketing_no_event_type_header(self) -> No assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}:77", - region_names=[region.name], + cell_names=[cell.name], ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_webhook_outbox_creation_without_bucketing(self) -> None: integration = self.get_integration() request = self.factory.post( @@ -489,11 +489,11 @@ def test_webhook_outbox_creation_without_bucketing(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_webhook_without_repository_uses_event_type_only(self) -> None: """No repository ID means no repo bucket, but event type still provides isolation.""" integration = self.get_integration() @@ -513,13 +513,13 @@ def test_webhook_without_repository_uses_event_type_only(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}:issues", - region_names=[region.name], + cell_names=[cell.name], ) @control_silo_test class GithubRequestParserDropUnprocessedEventsTest(TestCase): - """Tests for dropping GitHub webhook events that the region does not process.""" + """Tests for dropping GitHub webhook events that the cell does not process.""" factory = RequestFactory() path = reverse("sentry-integration-github-webhook") @@ -535,7 +535,7 @@ def get_integration(self) -> Integration: ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate @patch("sentry.middleware.integrations.parsers.github.metrics") def test_drops_unprocessed_event(self, mock_metrics: Mock) -> None: @@ -559,7 +559,7 @@ def test_drops_unprocessed_event(self, mock_metrics: Mock) -> None: ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_supported_event_never_dropped(self) -> None: """Supported event (push) is never dropped.""" @@ -578,14 +578,14 @@ def test_supported_event_never_dropped(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate - def test_missing_x_github_event_forwards_to_region(self) -> None: - """Missing X-GitHub-Event is forwarded to region so it can return 400.""" + def test_missing_x_github_event_forwards_to_cell(self) -> None: + """Missing X-GitHub-Event is forwarded to cell so it can return 400.""" integration = self.get_integration() request = self.factory.post( self.path, @@ -601,7 +601,7 @@ def test_missing_x_github_event_forwards_to_region(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) diff --git a/tests/sentry/middleware/integrations/parsers/test_github_enterprise.py b/tests/sentry/middleware/integrations/parsers/test_github_enterprise.py index d44aefff5a65d1..8743230f937df1 100644 --- a/tests/sentry/middleware/integrations/parsers/test_github_enterprise.py +++ b/tests/sentry/middleware/integrations/parsers/test_github_enterprise.py @@ -15,8 +15,8 @@ from sentry.testutils.silo import control_silo_test from sentry.types.cell import Cell, RegionCategory -region = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) -region_config = (region,) +cell = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) +cell_config = (cell,) @control_silo_test @@ -38,7 +38,7 @@ def get_integration(self) -> Integration: ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_invalid_webhook(self) -> None: self.get_integration() request = self.factory.post( @@ -49,7 +49,7 @@ def test_invalid_webhook(self) -> None: assert response.status_code == 400 @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_routing_no_organization_integrations_found(self) -> None: integration = self.get_integration() @@ -72,7 +72,7 @@ def test_routing_no_organization_integrations_found(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_routing_no_integrations_found(self) -> None: self.get_integration() @@ -86,7 +86,7 @@ def test_routing_no_integrations_found(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_get_integration_from_request_no_host(self) -> None: # No host header request = self.factory.post( @@ -100,7 +100,7 @@ def test_get_integration_from_request_no_host(self) -> None: assert result is None @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_get_integration_from_request_with_host(self) -> None: # With host header request = self.factory.post( @@ -115,7 +115,7 @@ def test_get_integration_from_request_with_host(self) -> None: assert result == integration @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_installation_hook_handled_in_control(self) -> None: self.get_integration() @@ -137,7 +137,7 @@ def test_installation_hook_handled_in_control(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_webhook_outbox_creation(self) -> None: integration = self.get_integration() @@ -156,5 +156,5 @@ def test_webhook_outbox_creation(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"github_enterprise:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) From fc87ec4a28a0348c340a21499b917ea7fc95cb5c Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 30 Mar 2026 15:15:37 -0700 Subject: [PATCH 4/8] . --- src/sentry/testutils/outbox.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sentry/testutils/outbox.py b/src/sentry/testutils/outbox.py index 54bd9c4b6b5a37..77af5aa4825d1a 100644 --- a/src/sentry/testutils/outbox.py +++ b/src/sentry/testutils/outbox.py @@ -110,10 +110,10 @@ def assert_webhook_payloads_for_mailbox( cell_names_set.remove(message.cell_name) except KeyError: raise Exception( - f"Found ControlOutbox for '{message.cell_name}', which was not in region_names: {str(cell_names_set)}" + f"Found ControlOutbox for '{message.cell_name}', which was not in cell_names: {str(cell_names_set)}" ) if len(cell_names_set) != 0: - raise Exception(f"WebhookPayload not found for some region_names: {str(cell_names_set)}") + raise Exception(f"WebhookPayload not found for some cell_names: {str(cell_names_set)}") if destination_types and len(destination_types) != 0: exc_strs = [ From 2cd8e3213c614f4a64f9d78ff0ecf7d72cb669b8 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 30 Mar 2026 15:20:19 -0700 Subject: [PATCH 5/8] update more integrations --- .../integrations/parsers/test_gitlab.py | 34 +++++++++---------- .../integrations/parsers/test_jira_server.py | 26 +++++++------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/tests/sentry/middleware/integrations/parsers/test_gitlab.py b/tests/sentry/middleware/integrations/parsers/test_gitlab.py index 53d50f28d2ea3b..a82575cf105bbe 100644 --- a/tests/sentry/middleware/integrations/parsers/test_gitlab.py +++ b/tests/sentry/middleware/integrations/parsers/test_gitlab.py @@ -20,8 +20,8 @@ from sentry.testutils.silo import control_silo_test from sentry.types.cell import Cell, RegionCategory -region = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) -region_config = (region,) +cell = Cell("us", 1, "https://us.testserver", RegionCategory.MULTI_TENANT) +cell_config = (cell,) @control_silo_test @@ -54,7 +54,7 @@ def run_parser(self, request): return parser.get_response() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_missing_x_gitlab_token(self) -> None: self.get_integration() request = self.factory.post( @@ -70,7 +70,7 @@ def test_missing_x_gitlab_token(self) -> None: ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_invalid_token(self) -> None: self.get_integration() request = self.factory.post( @@ -86,9 +86,9 @@ def test_invalid_token(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate - def test_routing_webhook_properly_no_regions(self) -> None: + def test_routing_webhook_properly_no_cells(self) -> None: request = self.factory.post( self.path, data=PUSH_EVENT, @@ -111,9 +111,9 @@ def test_routing_webhook_properly_no_regions(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate - def test_routing_webhook_properly_with_regions(self) -> None: + def test_routing_webhook_properly_with_cells(self) -> None: integration = self.get_integration() request = self.factory.post( self.path, @@ -132,11 +132,11 @@ def test_routing_webhook_properly_with_regions(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"gitlab:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_routing_webhook_properly_with_multiple_orgs(self) -> None: integration = self.get_integration() @@ -160,10 +160,10 @@ def test_routing_webhook_properly_with_multiple_orgs(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"gitlab:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) - @override_cells(region_config) + @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) @responses.activate def test_routing_webhook_with_mailbox_buckets(self) -> None: @@ -189,11 +189,11 @@ def test_routing_webhook_with_mailbox_buckets(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"gitlab:{integration.id}:15", - region_names=[region.name], + cell_names=[cell.name], ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_routing_search_properly(self) -> None: self.get_integration() @@ -215,7 +215,7 @@ def test_routing_search_properly(self) -> None: assert_no_webhook_payloads() @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_get_integration_from_request(self) -> None: integration = self.get_integration() request = self.factory.post( @@ -231,7 +231,7 @@ def test_get_integration_from_request(self) -> None: assert result.id == integration.id @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_webhook_outbox_creation(self) -> None: request = self.factory.post( @@ -253,5 +253,5 @@ def test_webhook_outbox_creation(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"gitlab:{integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) diff --git a/tests/sentry/middleware/integrations/parsers/test_jira_server.py b/tests/sentry/middleware/integrations/parsers/test_jira_server.py index 058ef837a97798..aef9a8b38e0f9a 100644 --- a/tests/sentry/middleware/integrations/parsers/test_jira_server.py +++ b/tests/sentry/middleware/integrations/parsers/test_jira_server.py @@ -17,9 +17,9 @@ from sentry.testutils.silo import control_silo_test from sentry.types.cell import Cell, RegionCategory -region = Cell("us", 1, "http://us.testserver", RegionCategory.MULTI_TENANT) +cell = Cell("us", 1, "http://us.testserver", RegionCategory.MULTI_TENANT) -region_config = (region,) +cell_config = (cell,) issue_updated_payload = StubService.get_stub_data("jira", "edit_issue_assignee_payload.json") no_changelog: dict[str, Any] = {} @@ -32,7 +32,7 @@ class JiraServerRequestParserTest(TestCase): def get_response(self, req: HttpRequest) -> HttpResponse: return HttpResponse(status=status.HTTP_200_OK, content="passthrough") - @override_cells(region_config) + @override_cells(cell_config) def setUp(self) -> None: super().setUp() self.integration = self.create_integration( @@ -57,7 +57,7 @@ def test_routing_endpoint_no_integration(self) -> None: assert len(responses.calls) == 0 assert_no_webhook_payloads() - @override_cells(region_config) + @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) @responses.activate def test_routing_endpoint_with_integration(self) -> None: @@ -80,10 +80,10 @@ def test_routing_endpoint_with_integration(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"jira_server:{self.integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) - @override_cells(region_config) + @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) @responses.activate def test_routing_endpoint_with_integration_no_organization_integration(self) -> None: @@ -109,7 +109,7 @@ def test_routing_endpoint_with_integration_no_organization_integration(self) -> assert response.content == b"" assert len(responses.calls) == 0 - @override_cells(region_config) + @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) @responses.activate def test_routing_webhook_with_mailbox_buckets_low_volume(self) -> None: @@ -132,10 +132,10 @@ def test_routing_webhook_with_mailbox_buckets_low_volume(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"jira_server:{self.integration.id}", - region_names=[region.name], + cell_names=[cell.name], ) - @override_cells(region_config) + @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) @responses.activate def test_routing_webhook_with_mailbox_buckets_high_volume(self) -> None: @@ -165,10 +165,10 @@ def test_routing_webhook_with_mailbox_buckets_high_volume(self) -> None: request=request, # Mailbox name should have an extra segment mailbox_name=f"jira_server:{self.integration.id}:1", - region_names=[region.name], + cell_names=[cell.name], ) - @override_cells(region_config) + @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) @responses.activate def test_routing_webhook_with_mailbox_bucket_mode_active(self) -> None: @@ -197,11 +197,11 @@ def test_routing_webhook_with_mailbox_bucket_mode_active(self) -> None: request=request, # Mailbox name should have an extra segment mailbox_name=f"jira_server:{self.integration.id}:1", - region_names=[region.name], + cell_names=[cell.name], ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) @responses.activate def test_drop_request_without_changelog(self) -> None: route = reverse("sentry-extensions-jiraserver-issue-updated", kwargs={"token": "TOKEN"}) From 2e0c183ffc4e0ae8f1bc6222c9f82a78fee67d13 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 30 Mar 2026 15:22:02 -0700 Subject: [PATCH 6/8] . --- .../middleware/integrations/parsers/test_msteams.py | 8 ++++---- .../sentry/middleware/integrations/parsers/test_plugin.py | 6 +++--- tests/sentry/middleware/integrations/parsers/test_vsts.py | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/sentry/middleware/integrations/parsers/test_msteams.py b/tests/sentry/middleware/integrations/parsers/test_msteams.py index 9e64bb77e3f098..988849e991fe4c 100644 --- a/tests/sentry/middleware/integrations/parsers/test_msteams.py +++ b/tests/sentry/middleware/integrations/parsers/test_msteams.py @@ -64,7 +64,7 @@ def generate_card_response(self, integration_id: int) -> dict[str, Any]: @responses.activate def test_routing_events(self) -> None: - # No regions identified + # No cells identified request = self.factory.post( self.path, data=GENERIC_EVENT, @@ -95,7 +95,7 @@ def test_routing_events(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"msteams:{self.integration.id}", - region_names=["us"], + cell_names=["us"], ) def test_routing_events_no_org_integration(self) -> None: @@ -147,7 +147,7 @@ def test_routing_control_paths(self) -> None: def test_get_integration_from_request(self) -> None: CARD_ACTION_RESPONSE = self.generate_card_response(self.integration.id) - region_silo_payloads = [ + cell_silo_payloads = [ # Integration inferred from channelData.team.id EXAMPLE_TEAM_MEMBER_REMOVED, EXAMPLE_TEAM_MEMBER_ADDED, @@ -156,7 +156,7 @@ def test_get_integration_from_request(self) -> None: CARD_ACTION_RESPONSE, ] - for payload in region_silo_payloads: + for payload in cell_silo_payloads: request = self.factory.post( self.path, data=payload, diff --git a/tests/sentry/middleware/integrations/parsers/test_plugin.py b/tests/sentry/middleware/integrations/parsers/test_plugin.py index 3554cfb1aa2323..b9040f0a717f2f 100644 --- a/tests/sentry/middleware/integrations/parsers/test_plugin.py +++ b/tests/sentry/middleware/integrations/parsers/test_plugin.py @@ -19,7 +19,7 @@ def get_response(self, request: HttpRequest) -> HttpResponse: return HttpResponse(status=200, content="passthrough") @responses.activate - def test_routing_webhooks_no_region(self) -> None: + def test_routing_webhooks_no_cell(self) -> None: routes = [ reverse("sentry-plugins-github-webhook", args=[self.organization.id]), reverse("sentry-plugins-bitbucket-webhook", args=[self.organization.id]), @@ -37,7 +37,7 @@ def test_routing_webhooks_no_region(self) -> None: assert len(responses.calls) == 0 assert_no_webhook_payloads() - def test_routing_webhooks_with_region(self) -> None: + def test_routing_webhooks_with_cell(self) -> None: routes = [ reverse("sentry-plugins-github-webhook", args=[self.organization.id]), reverse("sentry-plugins-bitbucket-webhook", args=[self.organization.id]), @@ -50,7 +50,7 @@ def test_routing_webhooks_with_region(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"plugins:{self.organization.id}", - region_names=["us"], + cell_names=["us"], ) # Purge outboxes after checking each route WebhookPayload.objects.all().delete() diff --git a/tests/sentry/middleware/integrations/parsers/test_vsts.py b/tests/sentry/middleware/integrations/parsers/test_vsts.py index 3b830a66bc9157..3a08dda5466eb4 100644 --- a/tests/sentry/middleware/integrations/parsers/test_vsts.py +++ b/tests/sentry/middleware/integrations/parsers/test_vsts.py @@ -71,7 +71,7 @@ def test_routing_work_item_webhook(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"vsts:{self.integration.id}", - region_names=["us"], + cell_names=["us"], ) @responses.activate @@ -101,9 +101,9 @@ def test_routing_control_paths(self) -> None: assert_no_webhook_payloads() def test_get_integration_from_request(self) -> None: - region_silo_payloads = [WORK_ITEM_UNASSIGNED, WORK_ITEM_UPDATED, WORK_ITEM_UPDATED_STATUS] + cell_silo_payloads = [WORK_ITEM_UNASSIGNED, WORK_ITEM_UPDATED, WORK_ITEM_UPDATED_STATUS] - for payload in region_silo_payloads: + for payload in cell_silo_payloads: request = self.factory.post( self.path, HTTP_SHARED_SECRET=self.shared_secret, @@ -139,5 +139,5 @@ def test_webhook_outbox_creation(self) -> None: assert_webhook_payloads_for_mailbox( request=request, mailbox_name=f"vsts:{self.integration.id}", - region_names=["us"], + cell_names=["us"], ) From ff5bc2fb614c8b7019df6e225999bb5ab85ed1fa Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 30 Mar 2026 15:24:32 -0700 Subject: [PATCH 7/8] . --- .../integrations/parsers/test_jira.py | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/sentry/middleware/integrations/parsers/test_jira.py b/tests/sentry/middleware/integrations/parsers/test_jira.py index 7caf2d098cf160..d0a609fc897b61 100644 --- a/tests/sentry/middleware/integrations/parsers/test_jira.py +++ b/tests/sentry/middleware/integrations/parsers/test_jira.py @@ -17,12 +17,12 @@ from sentry.testutils.silo import control_silo_test from sentry.types.cell import Cell, Locality, RegionCategory -region = Cell("us", 1, "http://us.testserver", RegionCategory.MULTI_TENANT) -eu_region = Cell("eu", 2, "http://eu.testserver", RegionCategory.MULTI_TENANT) +cell = Cell("us", 1, "http://us.testserver", RegionCategory.MULTI_TENANT) +eu_cell = Cell("eu", 2, "http://eu.testserver", RegionCategory.MULTI_TENANT) locality = Locality("us", frozenset(["us"]), RegionCategory.MULTI_TENANT, new_org_cell="us") eu_locality = Locality("eu", frozenset(["eu"]), RegionCategory.MULTI_TENANT, new_org_cell="eu") -region_config = (region, eu_region) +cell_config = (cell, eu_cell) @control_silo_test @@ -40,7 +40,7 @@ def get_integration(self) -> Integration: ) @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_get_integration_from_request(self) -> None: request = self.factory.post(path=f"{self.path_base}/issue-updated/") parser = JiraRequestParser(request, self.get_response) @@ -54,7 +54,7 @@ def test_get_integration_from_request(self) -> None: assert parser.get_integration_from_request() == integration @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_get_response_routing_to_control(self) -> None: paths = [ "/ui-hook/", @@ -76,12 +76,12 @@ def test_get_response_routing_to_control(self) -> None: @responses.activate @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) - def test_get_response_routing_to_region_sync(self) -> None: + @override_cells(cell_config) + def test_get_response_routing_to_cell_sync(self) -> None: responses.add( responses.POST, locality.to_url("/extensions/jira/issue/LR-123/"), - body="region response", + body="cell response", status=200, ) request = self.factory.post(path=f"{self.path_base}/issue/LR-123/") @@ -93,17 +93,17 @@ def test_get_response_routing_to_region_sync(self) -> None: assert isinstance(response, HttpResponse) assert response.status_code == status.HTTP_200_OK - assert response.content == b"region response" + assert response.content == b"cell response" assert_no_webhook_payloads() @responses.activate @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) - def test_get_response_routing_to_region_sync_retry_errors(self) -> None: + @override_cells(cell_config) + def test_get_response_routing_to_cell_sync_retry_errors(self) -> None: responses.add( responses.POST, locality.to_url("/extensions/jira/issue/LR-123/"), - body="region response", + body="cell response", status=503, ) request = self.factory.post(path=f"{self.path_base}/issue/LR-123/") @@ -122,8 +122,8 @@ def test_get_response_routing_to_region_sync_retry_errors(self) -> None: @responses.activate @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) - def test_get_response_routing_to_region_async(self) -> None: + @override_cells(cell_config) + def test_get_response_routing_to_cell_async(self) -> None: request = self.factory.post(path=f"{self.path_base}/issue-updated/") parser = JiraRequestParser(request, self.get_response) @@ -139,12 +139,12 @@ def test_get_response_routing_to_region_async(self) -> None: assert len(responses.calls) == 0 assert_webhook_payloads_for_mailbox( - mailbox_name=f"jira:{integration.id}", region_names=[region.name], request=request + mailbox_name=f"jira:{integration.id}", cell_names=[cell.name], request=request ) @responses.activate @override_settings(SILO_MODE=SiloMode.CONTROL) - @override_cells(region_config) + @override_cells(cell_config) def test_get_response_missing_org_integration(self) -> None: request = self.factory.post(path=f"{self.path_base}/issue-updated/") parser = JiraRequestParser(request, self.get_response) @@ -165,7 +165,7 @@ def test_get_response_missing_org_integration(self) -> None: assert len(responses.calls) == 0 assert_no_webhook_payloads() - @override_cells(region_config) + @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) @responses.activate def test_get_response_invalid_path(self) -> None: @@ -183,9 +183,9 @@ def test_get_response_invalid_path(self) -> None: assert len(responses.calls) == 0 assert_no_webhook_payloads() - @override_cells(region_config) + @override_cells(cell_config) @override_settings(SILO_MODE=SiloMode.CONTROL) - def test_get_response_multiple_regions(self) -> None: + def test_get_response_multiple_cells(self) -> None: # Use GET — the view only handles GET, and Jira sends GET for issue hooks. request = self.factory.get(path=f"{self.path_base}/issue/LR-123/") parser = JiraRequestParser(request, self.get_response) From 71d2ce8e5219a68e99687b35a5aba711bc5e654f Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 30 Mar 2026 16:12:00 -0700 Subject: [PATCH 8/8] . --- src/sentry/testutils/outbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/testutils/outbox.py b/src/sentry/testutils/outbox.py index 77af5aa4825d1a..7f38bb13d2c830 100644 --- a/src/sentry/testutils/outbox.py +++ b/src/sentry/testutils/outbox.py @@ -80,7 +80,7 @@ def assert_webhook_payloads_for_mailbox( :param destination_types: Optional Mapping of destination types to the number of messages that should be found for that destination type """ expected_payload = WebhookPayload.get_attributes_from_request(request=request) - cell_names_set = set(cell_names or region_names) + cell_names_set = set(cell_names or region_names or []) messages = WebhookPayload.objects.filter(mailbox_name=mailbox_name) messages_with_cell_count = messages.filter(cell_name__isnull=False).count() if messages_with_cell_count != len(cell_names_set):