22from unittest .mock import patch
33
44from test_utils import *
5- from uid2_client import BidstreamClient , EncryptionError , Uid2Base64UrlCoder
5+ from uid2_client import BidstreamClient , EncryptionError , Uid2Base64UrlCoder , DecryptionStatus
66
77
88@patch ('uid2_client.bid_stream_client.refresh_bidstream_keys' )
99class TestBidStreamClient (unittest .TestCase ):
1010 _CONST_BASE_URL = 'base_url'
1111 _CONST_API_KEY = 'api_key'
1212
13+ def assert_success (self , decryption_response , token_version , scope ):
14+ self .assertEqual (decryption_response .advertising_token_version , token_version )
15+ self .assertEqual (decryption_response .uid , example_uid )
16+ self .assertEqual (decryption_response .identity_scope , scope )
17+ self .assertEqual ((now - decryption_response .established ).total_seconds (), 0 )
18+
19+ def decrypt_and_assert_success (self , token , token_version , scope ):
20+ decrypted = self ._client .decrypt_token_into_raw_uid (token , None )
21+ self .assert_success (decrypted , token_version , scope )
22+
1323 def setUp (self ):
1424 self ._key_collection = create_key_collection (IdentityScope .UID2 )
1525 self ._client = BidstreamClient (self ._CONST_BASE_URL , self ._CONST_API_KEY , client_secret )
@@ -20,10 +30,8 @@ def test_smoke_test(self, mock_refresh_bidstream_keys): # SmokeTest
2030 token = generate_uid_token (expected_scope , expected_version )
2131 mock_refresh_bidstream_keys .return_value = create_key_collection (expected_scope )
2232 self ._client .refresh ()
23- decrypted = self ._client .decrypt_token_into_raw_uid (token , None )
24- self .assertEqual (decrypted .identity_scope , expected_scope )
25- self .assertEqual (decrypted .advertising_token_version , expected_version )
26- self .assertEqual ((now - decrypted .established ).total_seconds (), 0 )
33+ self .decrypt_and_assert_success (token , expected_version , expected_scope )
34+
2735
2836 def test_phone_uids (self , mock_refresh_bidstream_keys ): # PhoneTest
2937 for expected_scope , expected_version in test_cases_all_scopes_v3_v4_versions :
@@ -51,9 +59,9 @@ def test_token_lifetime_too_long_for_bidstream(self, mock_refresh_bidstream_keys
5159 99999 , 86400 ,
5260 max_bidstream_lifetime_seconds = max_bidstream_lifetime )
5361 self ._client .refresh ()
54- with self .assertRaises ( EncryptionError ) as context :
55- self ._client . decrypt_token_into_raw_uid ( token , None )
56- self .assertEqual ('invalid token lifetime' , str ( context . exception ) )
62+ result = self ._client . decrypt_token_into_raw_uid ( token , None )
63+ self .assertFalse ( result . success )
64+ self .assertEqual (result . status , DecryptionStatus . INVALID_TOKEN_LIFETIME )
5765
5866 def test_token_generated_in_the_future_to_simulate_clock_skew (self , mock_refresh_bidstream_keys ): # TokenGeneratedInTheFutureToSimulateClockSkew
5967 created_at_future = dt .datetime .now (tz = timezone .utc ) + dt .timedelta (minutes = 31 ) #max allowed clock skew is 30m
@@ -64,9 +72,9 @@ def test_token_generated_in_the_future_to_simulate_clock_skew(self, mock_refresh
6472 expected_scope , site_id , 1 ,
6573 99999 , 86400 )
6674 self ._client .refresh ()
67- with self .assertRaises ( EncryptionError ) as context :
68- self ._client . decrypt_token_into_raw_uid ( token , None )
69- self .assertEqual ('invalid token lifetime' , str ( context . exception ) )
75+ result = self ._client . decrypt_token_into_raw_uid ( token , None )
76+ self .assertFalse ( result . success )
77+ self .assertEqual (result . status , DecryptionStatus . INVALID_TOKEN_LIFETIME )
7078
7179 def test_token_generated_in_the_future_within_allowed_clock_skew (self , mock_refresh_bidstream_keys ): # TokenGeneratedInTheFutureWithinAllowedClockSkew
7280 created_at_future = dt .datetime .now (tz = timezone .utc ) + dt .timedelta (minutes = 29 ) #max allowed clock skew is 30m
@@ -86,9 +94,9 @@ def test_empty_keys(self, mock_refresh_bidstream_keys): # EmptyKeyContainer
8694 token = generate_uid_token (IdentityScope .UID2 , AdvertisingTokenVersion .ADVERTISING_TOKEN_V3 )
8795 mock_refresh_bidstream_keys .return_value = None
8896 self ._client .refresh ()
89- with self .assertRaises ( EncryptionError ) as context :
90- self ._client . decrypt_token_into_raw_uid ( token , None )
91- self .assertEqual ('keys not initialized' , str ( context . exception ) )
97+ result = self ._client . decrypt_token_into_raw_uid ( token , None )
98+ self .assertFalse ( result . success )
99+ self .assertEqual (result . status , DecryptionStatus . NOT_INITIALIZED )
92100
93101 def test_master_key_expired (self , mock_refresh_bidstream_keys ): #ExpiredKeyContainer
94102 def get_post_refresh_keys_response_with_key_expired ():
@@ -101,10 +109,9 @@ def get_post_refresh_keys_response_with_key_expired():
101109 mock_refresh_bidstream_keys .return_value = get_post_refresh_keys_response_with_key_expired ()
102110 self ._client .refresh ()
103111
104- with self .assertRaises (EncryptionError ) as context :
105- self ._client .decrypt_token_into_raw_uid (example_uid , None )
106-
107- self .assertEqual ('no keys available or all keys have expired; refresh the latest keys from UID2 service' , str (context .exception ))
112+ result = self ._client .decrypt_token_into_raw_uid (example_uid , None )
113+ self .assertFalse (result .success )
114+ self .assertEqual (result .status , DecryptionStatus .KEYS_NOT_SYNCED )
108115
109116 def test_not_authorized_for_master_key (self , mock_refresh_bidstream_keys ): #NotAuthorizedForMasterKey
110117 def get_post_refresh_keys_response_with_key_expired ():
@@ -116,10 +123,9 @@ def get_post_refresh_keys_response_with_key_expired():
116123 self ._client .refresh ()
117124 token = generate_uid_token (IdentityScope .UID2 , AdvertisingTokenVersion .ADVERTISING_TOKEN_V4 )
118125
119- with self .assertRaises (EncryptionError ) as context :
120- self ._client .decrypt_token_into_raw_uid (token , None )
121-
122- self .assertEqual ('not authorized for master key' , str (context .exception ))
126+ result = self ._client .decrypt_token_into_raw_uid (token , None )
127+ self .assertFalse (result .success )
128+ self .assertEqual (result .status , DecryptionStatus .NOT_AUTHORIZED_FOR_MASTER_KEY )
123129
124130 def test_invalid_payload (self , mock_refresh_bidstream_keys ): #InvalidPayload
125131 mock_refresh_bidstream_keys .return_value = create_default_key_collection ([master_key , site_key ])
@@ -128,21 +134,21 @@ def test_invalid_payload(self, mock_refresh_bidstream_keys): #InvalidPayload
128134 payload = Uid2Base64UrlCoder .decode (token )
129135 bad_token = base64 .urlsafe_b64encode (payload [:0 ])
130136
131- with self .assertRaises ( EncryptionError ) as context :
132- self ._client . decrypt_token_into_raw_uid ( bad_token , None )
133- self .assertEqual ('invalid payload' , str ( context . exception ) )
137+ result = self ._client . decrypt_token_into_raw_uid ( bad_token , None )
138+ self .assertFalse ( result . success )
139+ self .assertEqual (result . status , DecryptionStatus . INVALID_PAYLOAD )
134140
135- def test_token_expiry_custom_decryption_time (self , mock_refresh_bidstream_keys ):
141+ def test_token_expiry_custom_decryption_time (self , mock_refresh_bidstream_keys ): #TokenExpiryAndCustomNow
136142 mock_refresh_bidstream_keys .return_value = create_default_key_collection ([master_key , site_key ])
137143 self ._client .refresh ()
138144
139145 expires_at = now - dt .timedelta (days = 60 )
140146 created_at = expires_at - dt .timedelta (minutes = 1 )
141147 token = generate_uid_token (IdentityScope .UID2 , AdvertisingTokenVersion .ADVERTISING_TOKEN_V4 ,
142148 created_at = created_at , expires_at = expires_at )
143- with self .assertRaises ( EncryptionError ) as context :
144- self ._client . _decrypt_token_into_raw_uid ( token , None , expires_at + dt . timedelta ( seconds = 1 ) )
145- self .assertEqual ('token expired' , str ( context . exception ) )
149+ result = self ._client . _decrypt_token_into_raw_uid ( token , None , expires_at + dt . timedelta ( seconds = 1 ))
150+ self .assertFalse ( result . success )
151+ self .assertEqual (result . status , DecryptionStatus . TOKEN_EXPIRED )
146152
147153 result = self ._client ._decrypt_token_into_raw_uid (token , None , expires_at - dt .timedelta (seconds = 1 ))
148154 self .assertIsNotNone (result )
0 commit comments