3333class TestOAuth2CredentialExchanger :
3434"""Test suite for OAuth2CredentialExchanger."""
3535
36- @pytest .mark .asyncio
3736async def test_exchange_with_existing_token (self ):
3837"""Test exchange method when access token already exists."""
3938scheme = OpenIdConnectWithConfig (
@@ -55,14 +54,14 @@ async def test_exchange_with_existing_token(self):
5554 )
5655
5756exchanger = OAuth2CredentialExchanger ()
58- result = await exchanger .exchange (credential ,scheme )
57+ exchange_result = await exchanger .exchange (credential ,scheme )
5958
6059# Should return the same credential since access token already exists
61- assert result == credential
62- assert result .oauth2 .access_token == "existing_token"
60+ assert exchange_result .credential == credential
61+ assert exchange_result .credential .oauth2 .access_token == "existing_token"
62+ assert not exchange_result .was_exchanged
6363
6464@patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
65- @pytest .mark .asyncio
6665async def test_exchange_success (self ,mock_oauth2_session ):
6766"""Test successful token exchange."""
6867# Setup mock
@@ -96,14 +95,16 @@ async def test_exchange_success(self, mock_oauth2_session):
9695 )
9796
9897exchanger = OAuth2CredentialExchanger ()
99- result = await exchanger .exchange (credential ,scheme )
98+ exchange_result = await exchanger .exchange (credential ,scheme )
10099
101100# Verify token exchange was successful
102- assert result .oauth2 .access_token == "new_access_token"
103- assert result .oauth2 .refresh_token == "new_refresh_token"
101+ assert exchange_result .credential .oauth2 .access_token == "new_access_token"
102+ assert (
103+ exchange_result .credential .oauth2 .refresh_token == "new_refresh_token"
104+ )
105+ assert exchange_result .was_exchanged
104106mock_client .fetch_token .assert_called_once ()
105107
106- @pytest .mark .asyncio
107108async def test_exchange_missing_auth_scheme (self ):
108109"""Test exchange with missing auth_scheme raises ValueError."""
109110credential = AuthCredential (
@@ -122,7 +123,6 @@ async def test_exchange_missing_auth_scheme(self):
122123assert "auth_scheme is required" in str (e )
123124
124125@patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
125- @pytest .mark .asyncio
126126async def test_exchange_no_session (self ,mock_oauth2_session ):
127127"""Test exchange when OAuth2Session cannot be created."""
128128# Mock to return None for create_oauth2_session
@@ -146,14 +146,14 @@ async def test_exchange_no_session(self, mock_oauth2_session):
146146 )
147147
148148exchanger = OAuth2CredentialExchanger ()
149- result = await exchanger .exchange (credential ,scheme )
149+ exchange_result = await exchanger .exchange (credential ,scheme )
150150
151151# Should return original credential when session creation fails
152- assert result == credential
153- assert result .oauth2 .access_token is None
152+ assert exchange_result .credential == credential
153+ assert exchange_result .credential .oauth2 .access_token is None
154+ assert not exchange_result .was_exchanged
154155
155156@patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
156- @pytest .mark .asyncio
157157async def test_exchange_fetch_token_failure (self ,mock_oauth2_session ):
158158"""Test exchange when fetch_token fails."""
159159# Setup mock to raise exception during fetch_token
@@ -181,14 +181,14 @@ async def test_exchange_fetch_token_failure(self, mock_oauth2_session):
181181 )
182182
183183exchanger = OAuth2CredentialExchanger ()
184- result = await exchanger .exchange (credential ,scheme )
184+ exchange_result = await exchanger .exchange (credential ,scheme )
185185
186186# Should return original credential when fetch_token fails
187- assert result == credential
188- assert result .oauth2 .access_token is None
187+ assert exchange_result .credential == credential
188+ assert exchange_result .credential .oauth2 .access_token is None
189+ assert not exchange_result .was_exchanged
189190mock_client .fetch_token .assert_called_once ()
190191
191- @pytest .mark .asyncio
192192async def test_exchange_authlib_not_available (self ):
193193"""Test exchange when authlib is not available."""
194194scheme = OpenIdConnectWithConfig (
@@ -217,14 +217,14 @@ async def test_exchange_authlib_not_available(self):
217217"google.adk.auth.exchanger.oauth2_credential_exchanger.AUTHLIB_AVAILABLE" ,
218218False ,
219219 ):
220- result = await exchanger .exchange (credential ,scheme )
220+ exchange_result = await exchanger .exchange (credential ,scheme )
221221
222222# Should return original credential when authlib is not available
223- assert result == credential
224- assert result .oauth2 .access_token is None
223+ assert exchange_result .credential == credential
224+ assert exchange_result .credential .oauth2 .access_token is None
225+ assert not exchange_result .was_exchanged
225226
226227@patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
227- @pytest .mark .asyncio
228228async def test_exchange_client_credentials_success (self ,mock_oauth2_session ):
229229"""Test successful client credentials exchange."""
230230# Setup mock
@@ -255,17 +255,19 @@ async def test_exchange_client_credentials_success(self, mock_oauth2_session):
255255 )
256256
257257exchanger = OAuth2CredentialExchanger ()
258- result = await exchanger .exchange (credential ,scheme )
258+ exchange_result = await exchanger .exchange (credential ,scheme )
259259
260260# Verify client credentials exchange was successful
261- assert result .oauth2 .access_token == "client_access_token"
261+ assert (
262+ exchange_result .credential .oauth2 .access_token == "client_access_token"
263+ )
264+ assert exchange_result .was_exchanged
262265mock_client .fetch_token .assert_called_once_with (
263266"https://example.com/token" ,
264267grant_type = "client_credentials" ,
265268 )
266269
267270@patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
268- @pytest .mark .asyncio
269271async def test_exchange_client_credentials_failure (self ,mock_oauth2_session ):
270272"""Test client credentials exchange failure."""
271273# Setup mock to raise exception during fetch_token
@@ -292,15 +294,15 @@ async def test_exchange_client_credentials_failure(self, mock_oauth2_session):
292294 )
293295
294296exchanger = OAuth2CredentialExchanger ()
295- result = await exchanger .exchange (credential ,scheme )
297+ exchange_result = await exchanger .exchange (credential ,scheme )
296298
297299# Should return original credential when client credentials exchange fails
298- assert result == credential
299- assert result .oauth2 .access_token is None
300+ assert exchange_result .credential == credential
301+ assert exchange_result .credential .oauth2 .access_token is None
302+ assert not exchange_result .was_exchanged
300303mock_client .fetch_token .assert_called_once ()
301304
302305@patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
303- @pytest .mark .asyncio
304306async def test_exchange_normalize_uri (self ,mock_oauth2_session ):
305307"""Test exchange method normalizes auth_response_uri."""
306308mock_client = Mock ()
@@ -344,7 +346,6 @@ async def test_exchange_normalize_uri(self, mock_oauth2_session):
344346client_id = "test_client_id" ,
345347 )
346348
347- @pytest .mark .asyncio
348349async def test_determine_grant_type_client_credentials (self ):
349350"""Test grant type determination for client credentials."""
350351flows = OAuthFlows (
@@ -361,7 +362,6 @@ async def test_determine_grant_type_client_credentials(self):
361362
362363assert grant_type == OAuthGrantType .CLIENT_CREDENTIALS
363364
364- @pytest .mark .asyncio
365365async def test_determine_grant_type_openid_connect (self ):
366366"""Test grant type determination for OpenID Connect (defaults to auth code)."""
367367scheme = OpenIdConnectWithConfig (