1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
# -------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------
import pytest
import jwt
import time
import asyncio
from azure.communication.phonenumbers._shared.user_credential_async import CommunicationTokenCredential
from azure.communication.phonenumbers._shared.utils import create_access_token
async def generate_test_token(expiry_time_seconds=1000):
payload = {
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": time.time() + expiry_time_seconds, # Expiration time
}
return jwt.encode(payload, "secret", algorithm="HS256")
async def token_refresher(expiry_time_seconds=1000):
new_token = await generate_test_token(expiry_time_seconds)
return create_access_token(new_token)
@pytest.mark.asyncio
async def test_communication_token_credential_initialization():
test_token = await generate_test_token()
CommunicationTokenCredential(token=test_token)
@pytest.mark.asyncio
async def test_communication_token_credential_with_token_refresher():
test_token = await generate_test_token()
CommunicationTokenCredential(token=test_token, token_refresher=token_refresher)
@pytest.mark.asyncio
async def test_communication_token_credential_with_proactive_refresh():
test_token = await generate_test_token()
CommunicationTokenCredential(token=test_token, token_refresher=token_refresher, proactive_refresh=True)
@pytest.mark.asyncio
async def test_communication_token_credential_get_token():
test_token = await generate_test_token()
token_credential = CommunicationTokenCredential(token=test_token)
result = await token_credential.get_token()
assert result.token == test_token
@pytest.mark.asyncio
async def test_communication_token_credential_get_token_with_refresh():
test_token = await generate_test_token()
token_credential = CommunicationTokenCredential(token=test_token, token_refresher=token_refresher)
result = await token_credential.get_token()
assert result.token == test_token
@pytest.mark.asyncio
async def test_communication_token_credential_get_token_with_proactive_refresh():
test_token = await generate_test_token()
token_credential = CommunicationTokenCredential(
token=test_token, token_refresher=token_refresher, proactive_refresh=True
)
result = await token_credential.get_token()
assert result.token == test_token
@pytest.mark.asyncio
async def test_communication_token_credential_with_non_string_token():
with pytest.raises(TypeError):
CommunicationTokenCredential(token=12345)
@pytest.mark.asyncio
async def test_communication_token_credential_with_proactive_refresh_but_no_token_refresher():
test_token = await generate_test_token()
with pytest.raises(ValueError):
CommunicationTokenCredential(token=test_token, proactive_refresh=True)
@pytest.mark.asyncio
async def test_communication_token_credential_get_token_no_refresh():
test_token = await generate_test_token()
token_credential = CommunicationTokenCredential(token=test_token)
assert (await token_credential.get_token()).token == test_token
@pytest.mark.asyncio
async def test_communication_token_credential_context_manager():
test_token = await generate_test_token()
async with CommunicationTokenCredential(
token=test_token, token_refresher=token_refresher, proactive_refresh=True
) as token_credential:
assert (await token_credential.get_token()).token == test_token
@pytest.mark.asyncio
async def test_communication_token_credential_close():
test_token = await generate_test_token()
token_credential = CommunicationTokenCredential(
token=test_token, token_refresher=token_refresher, proactive_refresh=True
)
await token_credential.close()
assert token_credential._is_closed.is_set()
assert token_credential._timer is None
@pytest.mark.asyncio
async def test_communication_token_credential_get_token_with_refresh_and_expiring_soon():
test_token = await generate_test_token(3)
token_credential = CommunicationTokenCredential(token=test_token, token_refresher=lambda: token_refresher())
await asyncio.sleep(4)
new_token = await token_credential.get_token()
decoded_test_token = jwt.decode(test_token, "secret", options={"verify_exp": False}, algorithms=["HS256"])
decoded_new_token = jwt.decode(new_token.token, "secret", options={"verify_exp": False}, algorithms=["HS256"])
assert decoded_new_token["exp"] > decoded_test_token["exp"]
|