1
1
import re
2
- from datetime import datetime , timedelta
2
+ from datetime import datetime , timedelta , timezone
3
3
from unittest .mock import MagicMock , call , patch
4
4
5
5
import pytest
14
14
)
15
15
16
16
17
+ def _now ():
18
+ return datetime .now (tz = timezone .utc )
19
+
20
+
17
21
class TestTokenManager :
18
22
def test_default_rate_limits (self ):
19
23
token_manager = TokenManager ("mytoken" , rate_limit_buffer = 700 )
@@ -40,7 +44,15 @@ def test_update_rate_limit(self):
40
44
41
45
assert token_manager .rate_limit == 5000
42
46
assert token_manager .rate_limit_remaining == 4999
43
- assert token_manager .rate_limit_reset == datetime (2013 , 7 , 1 , 17 , 47 , 53 )
47
+ assert token_manager .rate_limit_reset == datetime (
48
+ 2013 ,
49
+ 7 ,
50
+ 1 ,
51
+ 17 ,
52
+ 47 ,
53
+ 53 ,
54
+ tzinfo = timezone .utc ,
55
+ )
44
56
assert token_manager .rate_limit_used == 1
45
57
46
58
def test_is_valid_token_successful (self ):
@@ -108,9 +120,7 @@ def test_has_calls_remaining_fails_if_few_calls_remaining_and_reset_time_not_rea
108
120
mock_response_headers = {
109
121
"X-RateLimit-Limit" : "5000" ,
110
122
"X-RateLimit-Remaining" : "1" ,
111
- "X-RateLimit-Reset" : str (
112
- int ((datetime .now () + timedelta (days = 100 )).timestamp ())
113
- ),
123
+ "X-RateLimit-Reset" : str (int ((_now () + timedelta (days = 100 )).timestamp ())),
114
124
"X-RateLimit-Used" : "4999" ,
115
125
}
116
126
@@ -164,8 +174,8 @@ def test_successful_token_generation(self):
164
174
assert token_manager .token_expires_at == token_time
165
175
166
176
def test_has_calls_remaining_regenerates_a_token_if_close_to_expiry (self ):
167
- unexpired_time = datetime . now () + timedelta (days = 1 )
168
- expired_time = datetime . now () - timedelta (days = 1 )
177
+ unexpired_time = _now () + timedelta (days = 1 )
178
+ expired_time = _now () - timedelta (days = 1 )
169
179
with patch .object (AppTokenManager , "is_valid_token" , return_value = True ), patch (
170
180
"tap_github.authenticator.generate_app_access_token" ,
171
181
return_value = ("valid_token" , unexpired_time ),
@@ -193,8 +203,8 @@ def test_has_calls_remaining_regenerates_a_token_if_close_to_expiry(self):
193
203
)
194
204
195
205
def test_has_calls_remaining_logs_warning_if_token_regeneration_fails (self ):
196
- unexpired_time = datetime . now () + timedelta (days = 1 )
197
- expired_time = datetime . now () - timedelta (days = 1 )
206
+ unexpired_time = _now () + timedelta (days = 1 )
207
+ expired_time = _now () - timedelta (days = 1 )
198
208
with patch .object (
199
209
AppTokenManager , "is_valid_token" , return_value = True
200
210
) as mock_is_valid , patch (
@@ -222,7 +232,7 @@ def test_has_calls_remaining_logs_warning_if_token_regeneration_fails(self):
222
232
)
223
233
224
234
def test_has_calls_remaining_succeeds_if_token_new_and_never_used (self ):
225
- unexpired_time = datetime . now () + timedelta (days = 1 )
235
+ unexpired_time = _now () + timedelta (days = 1 )
226
236
with patch .object (AppTokenManager , "is_valid_token" , return_value = True ), patch (
227
237
"tap_github.authenticator.generate_app_access_token" ,
228
238
return_value = ("valid_token" , unexpired_time ),
@@ -231,7 +241,7 @@ def test_has_calls_remaining_succeeds_if_token_new_and_never_used(self):
231
241
assert token_manager .has_calls_remaining ()
232
242
233
243
def test_has_calls_remaining_succeeds_if_time_and_requests_left (self ):
234
- unexpired_time = datetime . now () + timedelta (days = 1 )
244
+ unexpired_time = _now () + timedelta (days = 1 )
235
245
with patch .object (AppTokenManager , "is_valid_token" , return_value = True ), patch (
236
246
"tap_github.authenticator.generate_app_access_token" ,
237
247
return_value = ("valid_token" , unexpired_time ),
@@ -249,7 +259,7 @@ def test_has_calls_remaining_succeeds_if_time_and_requests_left(self):
249
259
assert token_manager .has_calls_remaining ()
250
260
251
261
def test_has_calls_remaining_succeeds_if_time_left_and_reset_time_reached (self ):
252
- unexpired_time = datetime . now () + timedelta (days = 1 )
262
+ unexpired_time = _now () + timedelta (days = 1 )
253
263
with patch .object (AppTokenManager , "is_valid_token" , return_value = True ), patch (
254
264
"tap_github.authenticator.generate_app_access_token" ,
255
265
return_value = ("valid_token" , unexpired_time ),
@@ -271,7 +281,7 @@ def test_has_calls_remaining_succeeds_if_time_left_and_reset_time_reached(self):
271
281
def test_has_calls_remaining_fails_if_time_left_and_few_calls_remaining_and_reset_time_not_reached ( # noqa: E501
272
282
self ,
273
283
):
274
- unexpired_time = datetime . now () + timedelta (days = 1 )
284
+ unexpired_time = _now () + timedelta (days = 1 )
275
285
with patch .object (AppTokenManager , "is_valid_token" , return_value = True ), patch (
276
286
"tap_github.authenticator.generate_app_access_token" ,
277
287
return_value = ("valid_token" , unexpired_time ),
@@ -280,7 +290,7 @@ def test_has_calls_remaining_fails_if_time_left_and_few_calls_remaining_and_rese
280
290
"X-RateLimit-Limit" : "5000" ,
281
291
"X-RateLimit-Remaining" : "1" ,
282
292
"X-RateLimit-Reset" : str (
283
- int ((datetime . now () + timedelta (days = 100 )).timestamp ())
293
+ int ((_now () + timedelta (days = 100 )).timestamp ())
284
294
),
285
295
"X-RateLimit-Used" : "4999" ,
286
296
}
@@ -427,7 +437,10 @@ def test_all_token_types(self, mock_stream):
427
437
):
428
438
stream = mock_stream
429
439
stream .config .update (
430
- {"auth_token" : "gt5" , "additional_auth_tokens" : ["gt7" , "gt8" , "gt9" ]}
440
+ {
441
+ "auth_token" : "gt5" ,
442
+ "additional_auth_tokens" : ["gt7" , "gt8" , "gt9" ],
443
+ }
431
444
)
432
445
auth = GitHubTokenAuthenticator (stream = stream )
433
446
token_managers = auth .prepare_tokens ()
@@ -568,7 +581,10 @@ def test_prepare_tokens_returns_empty_if_all_tokens_invalid(self, mock_stream):
568
581
):
569
582
stream = mock_stream
570
583
stream .config .update (
571
- {"auth_token" : "gt5" , "additional_auth_tokens" : ["gt7" , "gt8" , "gt9" ]}
584
+ {
585
+ "auth_token" : "gt5" ,
586
+ "additional_auth_tokens" : ["gt7" , "gt8" , "gt9" ],
587
+ }
572
588
)
573
589
auth = GitHubTokenAuthenticator (stream = stream )
574
590
token_managers = auth .prepare_tokens ()
0 commit comments