diff --git a/src/sentry/api/endpoints/user_organizationintegrations.py b/src/sentry/api/endpoints/user_organizationintegrations.py index ced6ea411bd85d..5fc86db6471bd6 100644 --- a/src/sentry/api/endpoints/user_organizationintegrations.py +++ b/src/sentry/api/endpoints/user_organizationintegrations.py @@ -53,6 +53,6 @@ def get(self, request: Request, user) -> Response: return self.paginate( request=request, queryset=queryset, - on_results=lambda x: serialize(x, request.user), + on_results=lambda x: [item for item in serialize(x, request.user) if item is not None], paginator_cls=OffsetPaginator, ) diff --git a/src/sentry/integrations/api/endpoints/organization_integrations_index.py b/src/sentry/integrations/api/endpoints/organization_integrations_index.py index cd17e705d0bf51..5760278cd901f2 100644 --- a/src/sentry/integrations/api/endpoints/organization_integrations_index.py +++ b/src/sentry/integrations/api/endpoints/organization_integrations_index.py @@ -125,7 +125,11 @@ def get( def on_results(results: Sequence[OrganizationIntegration]) -> Sequence[Mapping[str, Any]]: if feature_filters: results = filter_by_features(results, feature_filters) - return serialize(results, request.user, include_config=include_config) + return [ + item + for item in serialize(results, request.user, include_config=include_config) + if item is not None + ] return self.paginate( queryset=queryset, diff --git a/tests/sentry/integrations/api/endpoints/test_user_organizationintegration.py b/tests/sentry/integrations/api/endpoints/test_user_organizationintegration.py index ff3463aa297604..b05a7964eb11e5 100644 --- a/tests/sentry/integrations/api/endpoints/test_user_organizationintegration.py +++ b/tests/sentry/integrations/api/endpoints/test_user_organizationintegration.py @@ -72,3 +72,18 @@ def test_billing_users_dont_see_integrations(self) -> None: assert response.status_code == 200 content = orjson.loads(response.content) assert content == [] + + def test_serialization_error_filtered_from_response(self) -> None: + """An exception during serialization should produce an empty list, not null entries.""" + integration = self.create_provider_integration(provider="github") + self.create_organization_integration( + organization_id=self.organization.id, integration_id=integration.id + ) + + with patch( + "sentry.integrations.base.IntegrationInstallation.get_dynamic_display_information", + side_effect=RuntimeError("boom"), + ): + response = self.get_success_response(self.user.id) + + assert response.data == []