9
9
from sentry .testutils .cases import TestCase
10
10
from sentry .testutils .hybrid_cloud import HybridCloudTestMixin
11
11
from sentry .testutils .outbox import outbox_runner
12
- from sentry .testutils .silo import assume_test_silo_mode , control_silo_test
13
- from sentry .types .region import Region , RegionCategory
12
+ from sentry .testutils .silo import assume_test_silo_mode , assume_test_silo_mode_of , control_silo_test
13
+ from sentry .types .region import Region , RegionCategory , find_regions_for_user
14
14
15
15
_TEST_REGIONS = (
16
16
Region ("na" , 1 , "http://eu.testserver" , RegionCategory .MULTI_TENANT ),
@@ -34,21 +34,21 @@ def setUp(self):
34
34
)
35
35
36
36
@assume_test_silo_mode (SiloMode .REGION )
37
- def user_tombstone_exists (self ) -> bool :
37
+ def user_tombstone_exists (self , user_id : int ) -> bool :
38
38
return RegionTombstone .objects .filter (
39
- table_name = "auth_user" , object_identifier = self . user_id
39
+ table_name = "auth_user" , object_identifier = user_id
40
40
).exists ()
41
41
42
42
@assume_test_silo_mode (SiloMode .REGION )
43
43
def get_user_saved_search_count (self ) -> int :
44
44
return SavedSearch .objects .filter (owner_id = self .user_id ).count ()
45
45
46
46
def test_simple (self ):
47
- assert not self .user_tombstone_exists ()
47
+ assert not self .user_tombstone_exists (user_id = self . user_id )
48
48
with outbox_runner ():
49
49
self .user .delete ()
50
50
assert not User .objects .filter (id = self .user_id ).exists ()
51
- assert self .user_tombstone_exists ()
51
+ assert self .user_tombstone_exists (user_id = self . user_id )
52
52
53
53
# cascade is asynchronous, ensure there is still related search,
54
54
assert self .get_user_saved_search_count () == 1
@@ -87,6 +87,35 @@ def test_cascades_to_multiple_regions(self):
87
87
schedule_hybrid_cloud_foreign_key_jobs ()
88
88
assert self .get_user_saved_search_count () == 0
89
89
90
+ def test_deletions_create_tombstones_in_regions_for_user_with_no_orgs (self ):
91
+ # Create a user with no org memberships
92
+ user_to_delete = self .create_user ("foo@example.com" )
93
+ user_id = user_to_delete .id
94
+ with outbox_runner ():
95
+ user_to_delete .delete ()
96
+
97
+ assert self .user_tombstone_exists (user_id = user_id )
98
+
99
+ def test_cascades_to_regions_even_if_user_ownership_revoked (self ):
100
+ eu_org = self .create_organization (region = _TEST_REGIONS [1 ])
101
+ self .create_member (user = self .user , organization = eu_org )
102
+ self .create_saved_search (name = "eu-search" , owner = self .user , organization = eu_org )
103
+ assert self .get_user_saved_search_count () == 2
104
+
105
+ with outbox_runner (), assume_test_silo_mode_of (OrganizationMember ):
106
+ for member in OrganizationMember .objects .filter (user_id = self .user .id ):
107
+ member .delete ()
108
+
109
+ assert find_regions_for_user (self .user .id ) == set ()
110
+
111
+ with outbox_runner ():
112
+ self .user .delete ()
113
+
114
+ assert self .get_user_saved_search_count () == 2
115
+ with assume_test_silo_mode (SiloMode .REGION ), self .tasks ():
116
+ schedule_hybrid_cloud_foreign_key_jobs ()
117
+ assert self .get_user_saved_search_count () == 0
118
+
90
119
91
120
@control_silo_test
92
121
class UserDetailsTest (TestCase ):
0 commit comments