Skip to content

Commit 691b841

Browse files
joshuarliclaude
andcommitted
fix(tests): Fix flaky test_has_object_permission user ID collision
Remove hardcoded user IDs (id=1, id=2) from create_user calls and use override_options as a context manager referencing actual user IDs. The hardcoded IDs collide with users from other tests when using --reuse-db, causing UserEmail verification to fail. Fixes #108886 Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 9b71753 commit 691b841

1 file changed

Lines changed: 99 additions & 83 deletions

File tree

‎tests/sentry/api/test_permissions.py‎

Lines changed: 99 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -51,35 +51,39 @@ class IsAuthenticatedPermissionsTest(DRFPermissionTestCase):
5151

5252
def setUp(self) -> None:
5353
super().setUp()
54-
self.normal_user = self.create_user(id=1)
55-
self.readonly_user = self.create_user(id=2)
54+
self.normal_user = self.create_user()
55+
self.readonly_user = self.create_user()
5656

57-
@override_options({"demo-mode.enabled": True, "demo-mode.users": [2]})
5857
def test_has_permission(self) -> None:
59-
assert self.user_permission.has_permission(self.make_request(self.normal_user), APIView())
60-
assert not self.user_permission.has_permission(
61-
self.make_request(self.readonly_user), APIView()
62-
)
58+
with override_options(
59+
{"demo-mode.enabled": True, "demo-mode.users": [self.readonly_user.id]}
60+
):
61+
assert self.user_permission.has_permission(
62+
self.make_request(self.normal_user), APIView()
63+
)
64+
assert not self.user_permission.has_permission(
65+
self.make_request(self.readonly_user), APIView()
66+
)
6367

64-
@override_options({"demo-mode.enabled": True, "demo-mode.users": [2]})
6568
def test_has_object_permission(self) -> None:
66-
assert self.user_permission.has_object_permission(
67-
self.make_request(self.normal_user), APIView(), None
68-
)
69-
assert not self.user_permission.has_object_permission(
70-
self.make_request(self.readonly_user), APIView(), None
71-
)
69+
with override_options(
70+
{"demo-mode.enabled": True, "demo-mode.users": [self.readonly_user.id]}
71+
):
72+
assert self.user_permission.has_object_permission(
73+
self.make_request(self.normal_user), APIView(), None
74+
)
75+
assert not self.user_permission.has_object_permission(
76+
self.make_request(self.readonly_user), APIView(), None
77+
)
7278

7379

7480
class DemoSafePermissionsTest(DRFPermissionTestCase):
7581
user_permission = DemoSafePermission()
7682

7783
def setUp(self) -> None:
7884
super().setUp()
79-
self.normal_user = self.create_user(
80-
id=1,
81-
)
82-
self.readonly_user = self.create_user(id=2)
85+
self.normal_user = self.create_user()
86+
self.readonly_user = self.create_user()
8387
self.organization = self.create_organization(owner=self.normal_user)
8488
self.org_member_scopes = self.create_member(
8589
organization_id=self.organization.id, user_id=self.readonly_user.id
@@ -93,90 +97,102 @@ def _get_rpc_context(self, user):
9397
assert rpc_context
9498
return rpc_context
9599

96-
@override_options({"demo-mode.enabled": True, "demo-mode.users": [2]})
97100
def test_safe_methods(self) -> None:
98-
for method in ("GET", "HEAD", "OPTIONS"):
99-
assert self.user_permission.has_permission(
100-
self.make_request(self.readonly_user, method=method), APIView()
101-
)
102-
assert self.user_permission.has_permission(
103-
self.make_request(self.normal_user, method=method), APIView()
104-
)
101+
with override_options(
102+
{"demo-mode.enabled": True, "demo-mode.users": [self.readonly_user.id]}
103+
):
104+
for method in ("GET", "HEAD", "OPTIONS"):
105+
assert self.user_permission.has_permission(
106+
self.make_request(self.readonly_user, method=method), APIView()
107+
)
108+
assert self.user_permission.has_permission(
109+
self.make_request(self.normal_user, method=method), APIView()
110+
)
105111

106-
@override_options({"demo-mode.enabled": True, "demo-mode.users": [2]})
107112
def test_unsafe_methods(self) -> None:
108-
for method in ("POST", "PUT", "PATCH", "DELETE"):
109-
assert not self.user_permission.has_permission(
110-
self.make_request(self.readonly_user, method=method), APIView()
111-
)
112-
assert self.user_permission.has_permission(
113-
self.make_request(self.normal_user, method=method), APIView()
114-
)
113+
with override_options(
114+
{"demo-mode.enabled": True, "demo-mode.users": [self.readonly_user.id]}
115+
):
116+
for method in ("POST", "PUT", "PATCH", "DELETE"):
117+
assert not self.user_permission.has_permission(
118+
self.make_request(self.readonly_user, method=method), APIView()
119+
)
120+
assert self.user_permission.has_permission(
121+
self.make_request(self.normal_user, method=method), APIView()
122+
)
115123

116-
@override_options({"demo-mode.enabled": False, "demo-mode.users": [2]})
117124
def test_safe_method_demo_mode_disabled(self) -> None:
118-
for method in ("GET", "HEAD", "OPTIONS"):
119-
assert not self.user_permission.has_permission(
120-
self.make_request(self.readonly_user, method=method), APIView()
121-
)
122-
assert self.user_permission.has_permission(
123-
self.make_request(self.normal_user, method=method), APIView()
124-
)
125+
with override_options(
126+
{"demo-mode.enabled": False, "demo-mode.users": [self.readonly_user.id]}
127+
):
128+
for method in ("GET", "HEAD", "OPTIONS"):
129+
assert not self.user_permission.has_permission(
130+
self.make_request(self.readonly_user, method=method), APIView()
131+
)
132+
assert self.user_permission.has_permission(
133+
self.make_request(self.normal_user, method=method), APIView()
134+
)
125135

126-
@override_options({"demo-mode.enabled": False, "demo-mode.users": [2]})
127136
def test_unsafe_methods_demo_mode_disabled(self) -> None:
128-
for method in ("POST", "PUT", "PATCH", "DELETE"):
129-
assert not self.user_permission.has_permission(
130-
self.make_request(self.readonly_user, method=method), APIView()
131-
)
132-
assert self.user_permission.has_permission(
133-
self.make_request(self.normal_user, method=method), APIView()
134-
)
137+
with override_options(
138+
{"demo-mode.enabled": False, "demo-mode.users": [self.readonly_user.id]}
139+
):
140+
for method in ("POST", "PUT", "PATCH", "DELETE"):
141+
assert not self.user_permission.has_permission(
142+
self.make_request(self.readonly_user, method=method), APIView()
143+
)
144+
assert self.user_permission.has_permission(
145+
self.make_request(self.normal_user, method=method), APIView()
146+
)
135147

136-
@override_options({"demo-mode.enabled": False, "demo-mode.users": [2]})
137148
def test_determine_access_disabled(self) -> None:
138-
self.user_permission.determine_access(
139-
request=self.make_request(self.normal_user),
140-
organization=self._get_rpc_context(self.normal_user),
141-
)
149+
with override_options(
150+
{"demo-mode.enabled": False, "demo-mode.users": [self.readonly_user.id]}
151+
):
152+
self.user_permission.determine_access(
153+
request=self.make_request(self.normal_user),
154+
organization=self._get_rpc_context(self.normal_user),
155+
)
142156

143-
readonly_rpc_context = self._get_rpc_context(self.readonly_user)
157+
readonly_rpc_context = self._get_rpc_context(self.readonly_user)
144158

145-
self.user_permission.determine_access(
146-
request=self.make_request(self.readonly_user),
147-
organization=readonly_rpc_context,
148-
)
159+
self.user_permission.determine_access(
160+
request=self.make_request(self.readonly_user),
161+
organization=readonly_rpc_context,
162+
)
149163

150-
assert readonly_rpc_context.member.scopes == list(self.org_member_scopes)
164+
assert readonly_rpc_context.member.scopes == list(self.org_member_scopes)
151165

152-
@override_options({"demo-mode.enabled": True, "demo-mode.users": [2]})
153166
def test_determine_access(self) -> None:
154-
self.user_permission.determine_access(
155-
request=self.make_request(self.normal_user),
156-
organization=self._get_rpc_context(self.normal_user),
157-
)
167+
with override_options(
168+
{"demo-mode.enabled": True, "demo-mode.users": [self.readonly_user.id]}
169+
):
170+
self.user_permission.determine_access(
171+
request=self.make_request(self.normal_user),
172+
organization=self._get_rpc_context(self.normal_user),
173+
)
158174

159-
readonly_rpc_context = self._get_rpc_context(self.readonly_user)
175+
readonly_rpc_context = self._get_rpc_context(self.readonly_user)
160176

161-
self.user_permission.determine_access(
162-
request=self.make_request(self.readonly_user),
163-
organization=readonly_rpc_context,
164-
)
177+
self.user_permission.determine_access(
178+
request=self.make_request(self.readonly_user),
179+
organization=readonly_rpc_context,
180+
)
165181

166-
assert readonly_rpc_context.member.scopes == sorted(READONLY_SCOPES)
182+
assert readonly_rpc_context.member.scopes == sorted(READONLY_SCOPES)
167183

168-
@override_options({"demo-mode.enabled": False, "demo-mode.users": []})
169184
def test_determine_access_no_demo_users(self) -> None:
170-
self.user_permission.determine_access(
171-
request=self.make_request(self.normal_user),
172-
organization=self._get_rpc_context(self.normal_user),
173-
)
185+
with override_options({"demo-mode.enabled": False, "demo-mode.users": []}):
186+
self.user_permission.determine_access(
187+
request=self.make_request(self.normal_user),
188+
organization=self._get_rpc_context(self.normal_user),
189+
)
174190

175-
readonly_rpc_context = self._get_rpc_context(self.readonly_user)
191+
readonly_rpc_context = self._get_rpc_context(self.readonly_user)
176192

177-
self.user_permission.determine_access(
178-
request=self.make_request(self.readonly_user),
179-
organization=readonly_rpc_context,
180-
)
193+
self.user_permission.determine_access(
194+
request=self.make_request(self.readonly_user),
195+
organization=readonly_rpc_context,
196+
)
181197

182-
assert readonly_rpc_context.member.scopes == list(self.org_member_scopes)
198+
assert readonly_rpc_context.member.scopes == list(self.org_member_scopes)

0 commit comments

Comments
 (0)