Skip to content

Commit 39d85a4

Browse files
authored
Merge branch 'master' into scraps/kbd
2 parents dd22ad6 + 4f5d3bc commit 39d85a4

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/sentry/pipeline/base.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ def unpack_state(cls, request: HttpRequest) -> PipelineRequestState[M, S] | None
8181
provider_model = None
8282
if state.provider_model_id:
8383
assert cls.provider_model_cls is not None
84-
provider_model = cls.provider_model_cls.objects.get(id=state.provider_model_id)
84+
try:
85+
provider_model = cls.provider_model_cls.objects.get(id=state.provider_model_id)
86+
except cls.provider_model_cls.DoesNotExist:
87+
return None
8588

8689
organization: RpcOrganization | None = None
8790
if state.org_id:

tests/sentry/pipeline/test_pipeline.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from sentry.silo.base import SiloMode
1919
from sentry.testutils.cases import TestCase
2020
from sentry.testutils.silo import assume_test_silo_mode, control_silo_test
21+
from sentry.users.models.identity import IdentityProvider
2122

2223

2324
class PipelineStep:
@@ -313,6 +314,24 @@ def test_pipeline_intercept_fails(self, mock_bind_org_context: MagicMock) -> Non
313314
assert isinstance(resp, HttpResponse) # TODO(cathy): fix typing on
314315
assert ERR_MISMATCHED_USER.encode() in resp.content
315316

317+
@patch("sentry.pipeline.base.bind_organization_context")
318+
def test_unpack_state_returns_none_when_provider_model_deleted(
319+
self, mock_bind_org_context: MagicMock
320+
) -> None:
321+
"""If the provider model is deleted after the pipeline session was created,
322+
get_for_request should return None instead of raising DoesNotExist."""
323+
idp = IdentityProvider.objects.create(type="dummy", external_id="test123")
324+
325+
with patch.object(DummyPipeline, "provider_model_cls", IdentityProvider):
326+
pipeline = DummyPipeline(self.request, "dummy", self.org, provider_model=idp)
327+
pipeline.initialize()
328+
329+
assert DummyPipeline.get_for_request(self.request) is not None
330+
331+
idp.delete()
332+
333+
assert DummyPipeline.get_for_request(self.request) is None
334+
316335

317336
@control_silo_test
318337
class PipelineApiModeTestCase(TestCase):

0 commit comments

Comments
 (0)