6
6
7
7
import gidgethub
8
8
import pytest
9
+ from gidgethub import sansio
9
10
10
11
from django_github_app .github import AsyncGitHubAPI
11
12
from django_github_app .github import SyncGitHubAPI
12
13
from django_github_app .permissions import Permission
13
- from django_github_app .permissions import aget_user_permission
14
+ from django_github_app .permissions import aget_user_permission_from_event
14
15
from django_github_app .permissions import cache
15
- from django_github_app .permissions import get_user_permission
16
+ from django_github_app .permissions import get_user_permission_from_event
16
17
17
18
18
19
@pytest .fixture (autouse = True )
@@ -22,6 +23,18 @@ def clear_cache():
22
23
cache .clear ()
23
24
24
25
26
+ def create_test_event (username : str , owner : str , repo : str ) -> sansio .Event :
27
+ """Create a test event with comment author and repository info."""
28
+ return sansio .Event (
29
+ {
30
+ "comment" : {"user" : {"login" : username }},
31
+ "repository" : {"owner" : {"login" : owner }, "name" : repo },
32
+ },
33
+ event = "issue_comment" ,
34
+ delivery_id = "test" ,
35
+ )
36
+
37
+
25
38
class TestPermission :
26
39
def test_permission_ordering (self ):
27
40
assert Permission .NONE < Permission .READ
@@ -64,8 +77,9 @@ class TestGetUserPermission:
64
77
async def test_collaborator_with_admin_permission (self ):
65
78
gh = create_autospec (AsyncGitHubAPI , instance = True )
66
79
gh .getitem = AsyncMock (return_value = {"permission" : "admin" })
80
+ event = create_test_event ("user" , "owner" , "repo" )
67
81
68
- permission = await aget_user_permission ( gh , "owner" , "repo" , "user" )
82
+ permission = await aget_user_permission_from_event ( event , gh )
69
83
70
84
assert permission == Permission .ADMIN
71
85
gh .getitem .assert_called_once_with (
@@ -75,8 +89,9 @@ async def test_collaborator_with_admin_permission(self):
75
89
async def test_collaborator_with_write_permission (self ):
76
90
gh = create_autospec (AsyncGitHubAPI , instance = True )
77
91
gh .getitem = AsyncMock (return_value = {"permission" : "write" })
92
+ event = create_test_event ("user" , "owner" , "repo" )
78
93
79
- permission = await aget_user_permission ( gh , "owner" , "repo" , "user" )
94
+ permission = await aget_user_permission_from_event ( event , gh )
80
95
81
96
assert permission == Permission .WRITE
82
97
@@ -90,7 +105,8 @@ async def test_non_collaborator_public_repo(self):
90
105
]
91
106
)
92
107
93
- permission = await aget_user_permission (gh , "owner" , "repo" , "user" )
108
+ event = create_test_event ("user" , "owner" , "repo" )
109
+ permission = await aget_user_permission_from_event (event , gh )
94
110
95
111
assert permission == Permission .READ
96
112
assert gh .getitem .call_count == 2
@@ -106,8 +122,9 @@ async def test_non_collaborator_private_repo(self):
106
122
{"private" : True }, # Repo is private
107
123
]
108
124
)
125
+ event = create_test_event ("user" , "owner" , "repo" )
109
126
110
- permission = await aget_user_permission ( gh , "owner" , "repo" , "user" )
127
+ permission = await aget_user_permission_from_event ( event , gh )
111
128
112
129
assert permission == Permission .NONE
113
130
@@ -116,16 +133,18 @@ async def test_api_error_returns_none_permission(self):
116
133
gh .getitem = AsyncMock (
117
134
side_effect = gidgethub .HTTPException (500 , "Server error" , {})
118
135
)
136
+ event = create_test_event ("user" , "owner" , "repo" )
119
137
120
- permission = await aget_user_permission ( gh , "owner" , "repo" , "user" )
138
+ permission = await aget_user_permission_from_event ( event , gh )
121
139
122
140
assert permission == Permission .NONE
123
141
124
142
async def test_missing_permission_field (self ):
125
143
gh = create_autospec (AsyncGitHubAPI , instance = True )
126
144
gh .getitem = AsyncMock (return_value = {}) # No permission field
145
+ event = create_test_event ("user" , "owner" , "repo" )
127
146
128
- permission = await aget_user_permission ( gh , "owner" , "repo" , "user" )
147
+ permission = await aget_user_permission_from_event ( event , gh )
129
148
130
149
assert permission == Permission .NONE
131
150
@@ -134,8 +153,9 @@ class TestGetUserPermissionSync:
134
153
def test_collaborator_with_permission (self ):
135
154
gh = create_autospec (SyncGitHubAPI , instance = True )
136
155
gh .getitem = Mock (return_value = {"permission" : "maintain" })
156
+ event = create_test_event ("user" , "owner" , "repo" )
137
157
138
- permission = get_user_permission ( gh , "owner" , "repo" , "user" )
158
+ permission = get_user_permission_from_event ( event , gh )
139
159
140
160
assert permission == Permission .MAINTAIN
141
161
gh .getitem .assert_called_once_with (
@@ -151,8 +171,9 @@ def test_non_collaborator_public_repo(self):
151
171
{"private" : False }, # Repo is public
152
172
]
153
173
)
174
+ event = create_test_event ("user" , "owner" , "repo" )
154
175
155
- permission = get_user_permission ( gh , "owner" , "repo" , "user" )
176
+ permission = get_user_permission_from_event ( event , gh )
156
177
157
178
assert permission == Permission .READ
158
179
@@ -162,14 +183,15 @@ class TestPermissionCaching:
162
183
async def test_cache_hit (self ):
163
184
gh = create_autospec (AsyncGitHubAPI , instance = True )
164
185
gh .getitem = AsyncMock (return_value = {"permission" : "write" })
186
+ event = create_test_event ("user" , "owner" , "repo" )
165
187
166
188
# First call should hit the API
167
- perm1 = await aget_user_permission ( gh , "owner" , "repo" , "user" )
189
+ perm1 = await aget_user_permission_from_event ( event , gh )
168
190
assert perm1 == Permission .WRITE
169
191
assert gh .getitem .call_count == 1
170
192
171
193
# Second call should use cache
172
- perm2 = await aget_user_permission ( gh , "owner" , "repo" , "user" )
194
+ perm2 = await aget_user_permission_from_event ( event , gh )
173
195
assert perm2 == Permission .WRITE
174
196
assert gh .getitem .call_count == 1 # No additional API call
175
197
@@ -182,9 +204,11 @@ async def test_cache_different_users(self):
182
204
{"permission" : "admin" },
183
205
]
184
206
)
207
+ event1 = create_test_event ("user1" , "owner" , "repo" )
208
+ event2 = create_test_event ("user2" , "owner" , "repo" )
185
209
186
- perm1 = await aget_user_permission ( gh , "owner" , "repo" , "user1" )
187
- perm2 = await aget_user_permission ( gh , "owner" , "repo" , "user2" )
210
+ perm1 = await aget_user_permission_from_event ( event1 , gh )
211
+ perm2 = await aget_user_permission_from_event ( event2 , gh )
188
212
189
213
assert perm1 == Permission .WRITE
190
214
assert perm2 == Permission .ADMIN
@@ -194,13 +218,42 @@ def test_sync_cache_hit(self):
194
218
"""Test that sync version uses cache."""
195
219
gh = create_autospec (SyncGitHubAPI , instance = True )
196
220
gh .getitem = Mock (return_value = {"permission" : "read" })
221
+ event = create_test_event ("user" , "owner" , "repo" )
197
222
198
223
# First call should hit the API
199
- perm1 = get_user_permission ( gh , "owner" , "repo" , "user" )
224
+ perm1 = get_user_permission_from_event ( event , gh )
200
225
assert perm1 == Permission .READ
201
226
assert gh .getitem .call_count == 1
202
227
203
228
# Second call should use cache
204
- perm2 = get_user_permission ( gh , "owner" , "repo" , "user" )
229
+ perm2 = get_user_permission_from_event ( event , gh )
205
230
assert perm2 == Permission .READ
206
231
assert gh .getitem .call_count == 1 # No additional API call
232
+
233
+
234
+ class TestPermissionFromEvent :
235
+ @pytest .mark .asyncio
236
+ async def test_missing_comment_data (self ):
237
+ """Test when event has no comment data."""
238
+ gh = create_autospec (AsyncGitHubAPI , instance = True )
239
+ event = sansio .Event ({}, event = "issue_comment" , delivery_id = "test" )
240
+
241
+ permission = await aget_user_permission_from_event (event , gh )
242
+
243
+ assert permission == Permission .NONE
244
+ assert gh .getitem .called is False
245
+
246
+ @pytest .mark .asyncio
247
+ async def test_missing_repository_data (self ):
248
+ """Test when event has no repository data."""
249
+ gh = create_autospec (AsyncGitHubAPI , instance = True )
250
+ event = sansio .Event (
251
+ {"comment" : {"user" : {"login" : "user" }}},
252
+ event = "issue_comment" ,
253
+ delivery_id = "test" ,
254
+ )
255
+
256
+ permission = await aget_user_permission_from_event (event , gh )
257
+
258
+ assert permission == Permission .NONE
259
+ assert gh .getitem .called is False
0 commit comments