def test_communicationtokencredential_raises_if_refresher_returns_expired_token(self): refresher = MagicMock( return_value=create_access_token(self.expired_token)) credential = CommunicationTokenCredential(self.expired_token, token_refresher=refresher) with self.assertRaises(ValueError): credential.get_token() self.assertEqual(refresher.call_count, 1)
def test_proactive_refresher_keeps_scheduling_again(self): refresh_minutes = 10 token_validity_minutes = 60 expired_token = generate_token_with_custom_expiry(-5 * 60) skip_to_timestamp = get_current_utc_as_int() + (token_validity_minutes - refresh_minutes) * 60 + 1 first_refreshed_token = create_access_token( generate_token_with_custom_expiry(token_validity_minutes * 60)) last_refreshed_token = create_access_token( generate_token_with_custom_expiry(2 * token_validity_minutes * 60)) refresher = MagicMock( side_effect=[first_refreshed_token, last_refreshed_token]) credential = CommunicationTokenCredential( expired_token, token_refresher=refresher, proactive_refresh=True) access_token = credential.get_token() with patch(user_credential.__name__+'.'+get_current_utc_as_int.__name__, return_value=skip_to_timestamp): access_token = credential.get_token() assert refresher.call_count == 2 assert access_token.token == last_refreshed_token.token # check that next refresh is always scheduled assert credential._timer is not None
def test_fractional_backoff_applied_when_token_expiring(self): token_validity_seconds = 5 * 60 expiring_token = generate_token_with_custom_expiry( token_validity_seconds) refresher = MagicMock(side_effect=[ create_access_token(expiring_token), create_access_token(expiring_token) ]) credential = CommunicationTokenCredential(expiring_token, token_refresher=refresher, proactive_refresh=True) next_milestone = token_validity_seconds / 2 with credential: assert credential._timer.interval == next_milestone with patch(user_credential.__name__ + '.' + get_current_utc_as_int.__name__, return_value=(get_current_utc_as_int() + next_milestone)): credential.get_token() assert refresher.call_count == 1 next_milestone = next_milestone / 2 assert credential._timer.interval == next_milestone
def test_exit_cancels_timer(self): refreshed_token = create_access_token( generate_token_with_custom_expiry(30 * 60)) refresher = MagicMock(return_value=refreshed_token) credential = CommunicationTokenCredential( self.expired_token,token_refresher=refresher, proactive_refresh=True) credential.get_token() credential.close() assert credential._timer is None
def test_exit_enter_scenario_throws_exception(self): refreshed_token = create_access_token( generate_token_with_custom_expiry(30 * 60)) refresher = MagicMock(return_value=refreshed_token) credential = CommunicationTokenCredential( self.expired_token,token_refresher=refresher, proactive_refresh=True) credential.get_token() credential.close() assert credential._timer is None with pytest.raises(RuntimeError) as err: credential.get_token() assert str(err.value) == "An instance of CommunicationTokenCredential cannot be reused once it has been closed."
def test_communicationtokencredential_token_expired_refresh_called(self): refresher = MagicMock( return_value=create_access_token(self.sample_token)) credential = CommunicationTokenCredential(self.expired_token, token_refresher=refresher) access_token = credential.get_token() refresher.assert_called_once() self.assertEqual(access_token.token, self.sample_token)
def test_proactive_refresher_should_be_called_after_specified_time(self): refresh_minutes = 10 token_validity_minutes = 60 start_timestamp = get_current_utc_as_int() skip_to_timestamp = start_timestamp + \ (token_validity_minutes - refresh_minutes + 5) * 60 initial_token = generate_token_with_custom_expiry( token_validity_minutes * 60) refreshed_token = generate_token_with_custom_expiry( 2 * token_validity_minutes * 60) refresher = MagicMock( return_value=create_access_token(refreshed_token)) with patch(user_credential.__name__+'.'+get_current_utc_as_int.__name__, return_value=skip_to_timestamp): credential = CommunicationTokenCredential( initial_token, token_refresher=refresher, proactive_refresh=True) access_token = credential.get_token() assert refresher.call_count == 1 assert access_token.token == refreshed_token # check that next refresh is always scheduled assert credential._timer is not None
def test_uses_initial_token_as_expected(self): refresher = MagicMock( return_value=create_access_token(self.expired_token)) credential = CommunicationTokenCredential( self.sample_token, token_refresher=refresher, proactive_refresh=True) access_token = credential.get_token() self.assertEqual(refresher.call_count, 0) self.assertEqual(access_token.token, self.sample_token)
def test_refresher_should_not_be_called_when_token_still_valid(self): generated_token = generate_token_with_custom_expiry(15 * 60) new_token = generate_token_with_custom_expiry(10 * 60) refresher = MagicMock(return_value=create_access_token(new_token)) credential = CommunicationTokenCredential( generated_token, token_refresher=refresher, proactive_refresh=False) for _ in range(10): access_token = credential.get_token() refresher.assert_not_called() assert generated_token == access_token.token
def test_communicationtokencredential_decodes_token(self): refresh_options = CommunicationTokenRefreshOptions(self.sample_token) credential = CommunicationTokenCredential(refresh_options) access_token = credential.get_token() self.assertEqual(access_token.token, self.sample_token)
def test_communicationtokencredential_static_token_returns_expired_token(self): credential = CommunicationTokenCredential(self.expired_token) self.assertEqual(credential.get_token().token, self.expired_token)
def test_communicationtokencredential_decodes_token(self): credential = CommunicationTokenCredential(self.sample_token) access_token = credential.get_token() self.assertEqual(access_token.token, self.sample_token)