1- import json
2-
31import jwt
42import pytest
5- import unittest
63
74from citrine .exceptions import (
85 BadRequest ,
9- CitrineException ,
106 Conflict ,
117 NonRetryableException ,
128 WorkflowNotReadyException ,
139 RetryableException )
1410
1511from datetime import datetime , timedelta
16- import pytz
12+ try :
13+ from datetime import UTC
14+ except ImportError : # Only available starting Python 3.9
15+ from pytz import utc as UTC
16+
1717import mock
1818import requests
1919import requests_mock
@@ -32,7 +32,7 @@ def refresh_token(expiration: datetime = None) -> dict:
3232
3333@pytest .fixture
3434def session ():
35- token_refresh_response = refresh_token (datetime (2019 , 3 , 14 , tzinfo = pytz . utc ))
35+ token_refresh_response = refresh_token (datetime (2019 , 3 , 14 , tzinfo = UTC ))
3636 with requests_mock .Mocker () as m :
3737 m .post ('http://citrine-testing.fake/api/v1/tokens/refresh' , json = token_refresh_response )
3838 session = Session (
@@ -43,13 +43,13 @@ def session():
4343 # Default behavior is to *not* require a refresh - those tests can clear this out
4444 # As rule of thumb, we should be using freezegun or similar to never rely on the system clock
4545 # for these scenarios, but I thought this is light enough to postpone that for the time being
46- session .access_token_expiration = datetime .utcnow ( ) + timedelta (minutes = 3 )
46+ session .access_token_expiration = datetime .now ( UTC ) + timedelta (minutes = 3 )
4747
4848 return session
4949
5050
5151def test_session_signature (monkeypatch ):
52- token_refresh_response = refresh_token (datetime (2019 , 3 , 14 , tzinfo = pytz . utc ))
52+ token_refresh_response = refresh_token (datetime (2019 , 3 , 14 , tzinfo = UTC ))
5353 with requests_mock .Mocker () as m :
5454 m .post ('ftp://citrine-testing.fake:8080/api/v1/tokens/refresh' , json = token_refresh_response )
5555
@@ -77,8 +77,8 @@ def test_session_signature(monkeypatch):
7777
7878
7979def test_get_refreshes_token (session : Session ):
80- session .access_token_expiration = datetime .utcnow ( ) - timedelta (minutes = 1 )
81- token_refresh_response = refresh_token (datetime (2019 , 3 , 14 , tzinfo = pytz . utc ))
80+ session .access_token_expiration = datetime .now ( UTC ) - timedelta (minutes = 1 )
81+ token_refresh_response = refresh_token (datetime (2019 , 3 , 14 , tzinfo = UTC ))
8282
8383 with requests_mock .Mocker () as m :
8484 m .post ('http://citrine-testing.fake/api/v1/tokens/refresh' , json = token_refresh_response )
@@ -89,11 +89,11 @@ def test_get_refreshes_token(session: Session):
8989 resp = session .get_resource ('/foo' )
9090
9191 assert {'foo' : 'bar' } == resp
92- assert datetime (2019 , 3 , 14 ) == session .access_token_expiration
92+ assert datetime (2019 , 3 , 14 , tzinfo = UTC ) == session .access_token_expiration
9393
9494
9595def test_get_refresh_token_failure (session : Session ):
96- session .access_token_expiration = datetime .utcnow ( ) - timedelta (minutes = 1 )
96+ session .access_token_expiration = datetime .now ( UTC ) - timedelta (minutes = 1 )
9797
9898 with requests_mock .Mocker () as m :
9999 m .post ('http://citrine-testing.fake/api/v1/tokens/refresh' , status_code = 401 )
@@ -197,7 +197,7 @@ def test_connection_error(session: Session):
197197
198198
199199def test_post_refreshes_token_when_denied (session : Session ):
200- token_refresh_response = refresh_token (datetime (2019 , 3 , 14 , tzinfo = pytz . utc ))
200+ token_refresh_response = refresh_token (datetime (2019 , 3 , 14 , tzinfo = UTC ))
201201
202202 with requests_mock .Mocker () as m :
203203 m .post ('http://citrine-testing.fake/api/v1/tokens/refresh' , json = token_refresh_response )
@@ -209,7 +209,7 @@ def test_post_refreshes_token_when_denied(session: Session):
209209 resp = session .post_resource ('/foo' , json = {'data' : 'hi' })
210210
211211 assert {'foo' : 'bar' } == resp
212- assert datetime (2019 , 3 , 14 ) == session .access_token_expiration
212+ assert datetime (2019 , 3 , 14 , tzinfo = UTC ) == session .access_token_expiration
213213
214214
215215# this test exists to provide 100% coverage for the legacy 401 status on Unauthorized responses
0 commit comments