Skip to content

Commit 2691cb8

Browse files
committed
test behavior given configuration for both versions
1 parent f2121e4 commit 2691cb8

2 files changed

Lines changed: 82 additions & 30 deletions

File tree

sdk/identity/azure-identity/tests/test_managed_identity.py

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from azure.identity import ManagedIdentityCredential
1414
from azure.identity._constants import Endpoints, EnvironmentVariables
1515
from azure.identity._internal.user_agent import USER_AGENT
16+
import pytest
1617

1718
from helpers import build_aad_response, validating_transport, mock_response, Request
1819

@@ -92,8 +93,8 @@ def test_cloud_shell_user_assigned_identity():
9293
assert token == expected_token
9394

9495

95-
def test_app_service_2019_08_01():
96-
"""App Service 2019-08-01: IDENTITY_ENDPOINT, IDENTITY_HEADER set"""
96+
def test_prefers_app_service_2019_08_01():
97+
"""When the environment is configured for both App Service versions, the credential should prefer the most recent"""
9798

9899
access_token = "****"
99100
expires_on = 42
@@ -121,13 +122,60 @@ def test_app_service_2019_08_01():
121122
],
122123
)
123124

124-
environ = {EnvironmentVariables.IDENTITY_ENDPOINT: endpoint, EnvironmentVariables.IDENTITY_HEADER: secret}
125+
environ = {
126+
EnvironmentVariables.IDENTITY_ENDPOINT: endpoint,
127+
EnvironmentVariables.IDENTITY_HEADER: secret,
128+
EnvironmentVariables.MSI_ENDPOINT: endpoint,
129+
EnvironmentVariables.MSI_SECRET: secret,
130+
}
125131
with mock.patch.dict("os.environ", environ, clear=True):
126132
token = ManagedIdentityCredential(transport=transport).get_token(scope)
127133
assert token.token == access_token
128134
assert token.expires_on == expires_on
129135

130136

137+
def test_app_service_2019_08_01():
138+
"""App Service 2019-08-01: IDENTITY_ENDPOINT, IDENTITY_HEADER set"""
139+
140+
access_token = "****"
141+
expires_on = 42
142+
endpoint = "http://localhost:42/token"
143+
secret = "expected-secret"
144+
scope = "scope"
145+
146+
def send(request, **_):
147+
assert request.url.startswith(endpoint)
148+
assert request.method == "GET"
149+
assert request.headers["X-IDENTITY-HEADER"] == secret
150+
assert request.headers["User-Agent"] == USER_AGENT
151+
assert request.query["api-version"] == "2019-08-01"
152+
assert request.query["resource"] == scope
153+
154+
return mock_response(
155+
json_payload={
156+
"access_token": access_token,
157+
"expires_on": str(expires_on),
158+
"resource": scope,
159+
"token_type": "Bearer",
160+
}
161+
)
162+
163+
# when configuration for both API versions is present, the credential should prefer the most recent
164+
for environment in [
165+
{EnvironmentVariables.IDENTITY_ENDPOINT: endpoint, EnvironmentVariables.IDENTITY_HEADER: secret},
166+
{
167+
EnvironmentVariables.IDENTITY_ENDPOINT: endpoint,
168+
EnvironmentVariables.IDENTITY_HEADER: secret,
169+
EnvironmentVariables.MSI_ENDPOINT: endpoint,
170+
EnvironmentVariables.MSI_SECRET: secret,
171+
},
172+
]:
173+
with mock.patch.dict("os.environ", environment, clear=True):
174+
token = ManagedIdentityCredential(transport=mock.Mock(send=send)).get_token(scope)
175+
assert token.token == access_token
176+
assert token.expires_on == expires_on
177+
178+
131179
def test_app_service_2017_09_01():
132180
"""test parsing of App Service MSI 2017-09-01's eccentric platform-dependent expires_on strings"""
133181

sdk/identity/azure-identity/tests/test_managed_identity_async.py

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -99,37 +99,41 @@ async def test_app_service_2019_08_01():
9999

100100
access_token = "****"
101101
expires_on = 42
102-
expected_token = AccessToken(access_token, expires_on)
103102
endpoint = "http://localhost:42/token"
104103
secret = "expected-secret"
105104
scope = "scope"
106-
transport = async_validating_transport(
107-
requests=[
108-
Request(
109-
base_url=endpoint,
110-
method="GET",
111-
required_headers={"X-IDENTITY-HEADER": secret, "User-Agent": USER_AGENT},
112-
required_params={"api-version": "2019-08-01", "resource": scope},
113-
)
114-
],
115-
responses=[
116-
mock_response(
117-
json_payload={
118-
"access_token": access_token,
119-
"expires_on": str(expires_on),
120-
"resource": scope,
121-
"token_type": "Bearer",
122-
}
123-
)
124-
],
125-
)
126105

127-
with mock.patch.dict(
128-
"os.environ", {EnvironmentVariables.IDENTITY_ENDPOINT: endpoint, EnvironmentVariables.IDENTITY_HEADER: secret}, clear=True
129-
):
130-
token = await ManagedIdentityCredential(transport=transport).get_token(scope)
131-
assert token.token == access_token
132-
assert token.expires_on == expires_on
106+
async def send(request, **_):
107+
assert request.url.startswith(endpoint)
108+
assert request.method == "GET"
109+
assert request.headers["X-IDENTITY-HEADER"] == secret
110+
assert request.headers["User-Agent"] == USER_AGENT
111+
assert request.query["api-version"] == "2019-08-01"
112+
assert request.query["resource"] == scope
113+
114+
return mock_response(
115+
json_payload={
116+
"access_token": access_token,
117+
"expires_on": str(expires_on),
118+
"resource": scope,
119+
"token_type": "Bearer",
120+
}
121+
)
122+
123+
# when configuration for both API versions is present, the credential should prefer the most recent
124+
for environment in [
125+
{EnvironmentVariables.IDENTITY_ENDPOINT: endpoint, EnvironmentVariables.IDENTITY_HEADER: secret},
126+
{
127+
EnvironmentVariables.IDENTITY_ENDPOINT: endpoint,
128+
EnvironmentVariables.IDENTITY_HEADER: secret,
129+
EnvironmentVariables.MSI_ENDPOINT: endpoint,
130+
EnvironmentVariables.MSI_SECRET: secret,
131+
},
132+
]:
133+
with mock.patch.dict("os.environ", environment, clear=True):
134+
token = await ManagedIdentityCredential(transport=mock.Mock(send=send)).get_token(scope)
135+
assert token.token == access_token
136+
assert token.expires_on == expires_on
133137

134138

135139
@pytest.mark.asyncio

0 commit comments

Comments
 (0)