3333class TestOAuth2CredentialExchanger :
3434 """Test suite for OAuth2CredentialExchanger."""
3535
36- @pytest .mark .asyncio
3736 async def test_exchange_with_existing_token (self ):
3837 """Test exchange method when access token already exists."""
3938 scheme = OpenIdConnectWithConfig (
@@ -55,14 +54,14 @@ async def test_exchange_with_existing_token(self):
5554 )
5655
5756 exchanger = OAuth2CredentialExchanger ()
58- result = await exchanger .exchange (credential , scheme )
57+ exchanged_credential , was_exchanged = 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 exchanged_credential == credential
61+ assert exchanged_credential .oauth2 .access_token == "existing_token"
62+ assert not was_exchanged
6363
6464 @patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
65- @pytest .mark .asyncio
6665 async def test_exchange_success (self , mock_oauth2_session ):
6766 """Test successful token exchange."""
6867 # Setup mock
@@ -96,14 +95,14 @@ async def test_exchange_success(self, mock_oauth2_session):
9695 )
9796
9897 exchanger = OAuth2CredentialExchanger ()
99- result = await exchanger .exchange (credential , scheme )
98+ exchanged_credential , was_exchanged = 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 exchanged_credential .oauth2 .access_token == "new_access_token"
102+ assert exchanged_credential .oauth2 .refresh_token == "new_refresh_token"
103+ assert was_exchanged
104104 mock_client .fetch_token .assert_called_once ()
105105
106- @pytest .mark .asyncio
107106 async def test_exchange_missing_auth_scheme (self ):
108107 """Test exchange with missing auth_scheme raises ValueError."""
109108 credential = AuthCredential (
@@ -122,7 +121,6 @@ async def test_exchange_missing_auth_scheme(self):
122121 assert "auth_scheme is required" in str (e )
123122
124123 @patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
125- @pytest .mark .asyncio
126124 async def test_exchange_no_session (self , mock_oauth2_session ):
127125 """Test exchange when OAuth2Session cannot be created."""
128126 # Mock to return None for create_oauth2_session
@@ -146,14 +144,14 @@ async def test_exchange_no_session(self, mock_oauth2_session):
146144 )
147145
148146 exchanger = OAuth2CredentialExchanger ()
149- result = await exchanger .exchange (credential , scheme )
147+ exchanged_credential , was_exchanged = await exchanger .exchange (credential , scheme )
150148
151149 # Should return original credential when session creation fails
152- assert result == credential
153- assert result .oauth2 .access_token is None
150+ assert exchanged_credential == credential
151+ assert exchanged_credential .oauth2 .access_token is None
152+ assert not was_exchanged
154153
155154 @patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
156- @pytest .mark .asyncio
157155 async def test_exchange_fetch_token_failure (self , mock_oauth2_session ):
158156 """Test exchange when fetch_token fails."""
159157 # Setup mock to raise exception during fetch_token
@@ -181,14 +179,14 @@ async def test_exchange_fetch_token_failure(self, mock_oauth2_session):
181179 )
182180
183181 exchanger = OAuth2CredentialExchanger ()
184- result = await exchanger .exchange (credential , scheme )
182+ exchanged_credential , was_exchanged = await exchanger .exchange (credential , scheme )
185183
186184 # Should return original credential when fetch_token fails
187- assert result == credential
188- assert result .oauth2 .access_token is None
185+ assert exchanged_credential == credential
186+ assert exchanged_credential .oauth2 .access_token is None
187+ assert not was_exchanged
189188 mock_client .fetch_token .assert_called_once ()
190189
191- @pytest .mark .asyncio
192190 async def test_exchange_authlib_not_available (self ):
193191 """Test exchange when authlib is not available."""
194192 scheme = OpenIdConnectWithConfig (
@@ -217,14 +215,14 @@ async def test_exchange_authlib_not_available(self):
217215 "google.adk.auth.exchanger.oauth2_credential_exchanger.AUTHLIB_AVAILABLE" ,
218216 False ,
219217 ):
220- result = await exchanger .exchange (credential , scheme )
218+ exchanged_credential , was_exchanged = await exchanger .exchange (credential , scheme )
221219
222220 # Should return original credential when authlib is not available
223- assert result == credential
224- assert result .oauth2 .access_token is None
221+ assert exchanged_credential == credential
222+ assert exchanged_credential .oauth2 .access_token is None
223+ assert not was_exchanged
225224
226225 @patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
227- @pytest .mark .asyncio
228226 async def test_exchange_client_credentials_success (self , mock_oauth2_session ):
229227 """Test successful client credentials exchange."""
230228 # Setup mock
@@ -255,17 +253,17 @@ async def test_exchange_client_credentials_success(self, mock_oauth2_session):
255253 )
256254
257255 exchanger = OAuth2CredentialExchanger ()
258- result = await exchanger .exchange (credential , scheme )
256+ exchanged_credential , was_exchanged = await exchanger .exchange (credential , scheme )
259257
260258 # Verify client credentials exchange was successful
261- assert result .oauth2 .access_token == "client_access_token"
259+ assert exchanged_credential .oauth2 .access_token == "client_access_token"
260+ assert was_exchanged
262261 mock_client .fetch_token .assert_called_once_with (
263262 "https://example.com/token" ,
264263 grant_type = "client_credentials" ,
265264 )
266265
267266 @patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
268- @pytest .mark .asyncio
269267 async def test_exchange_client_credentials_failure (self , mock_oauth2_session ):
270268 """Test client credentials exchange failure."""
271269 # Setup mock to raise exception during fetch_token
@@ -292,15 +290,15 @@ async def test_exchange_client_credentials_failure(self, mock_oauth2_session):
292290 )
293291
294292 exchanger = OAuth2CredentialExchanger ()
295- result = await exchanger .exchange (credential , scheme )
293+ exchanged_credential , was_exchanged = await exchanger .exchange (credential , scheme )
296294
297295 # Should return original credential when client credentials exchange fails
298- assert result == credential
299- assert result .oauth2 .access_token is None
296+ assert exchanged_credential == credential
297+ assert exchanged_credential .oauth2 .access_token is None
298+ assert not was_exchanged
300299 mock_client .fetch_token .assert_called_once ()
301300
302301 @patch ("google.adk.auth.oauth2_credential_util.OAuth2Session" )
303- @pytest .mark .asyncio
304302 async def test_exchange_normalize_uri (self , mock_oauth2_session ):
305303 """Test exchange method normalizes auth_response_uri."""
306304 mock_client = Mock ()
@@ -343,7 +341,6 @@ async def test_exchange_normalize_uri(self, mock_oauth2_session):
343341 grant_type = OAuthGrantType .AUTHORIZATION_CODE ,
344342 )
345343
346- @pytest .mark .asyncio
347344 async def test_determine_grant_type_client_credentials (self ):
348345 """Test grant type determination for client credentials."""
349346 flows = OAuthFlows (
@@ -360,7 +357,6 @@ async def test_determine_grant_type_client_credentials(self):
360357
361358 assert grant_type == OAuthGrantType .CLIENT_CREDENTIALS
362359
363- @pytest .mark .asyncio
364360 async def test_determine_grant_type_openid_connect (self ):
365361 """Test grant type determination for OpenID Connect (defaults to auth code)."""
366362 scheme = OpenIdConnectWithConfig (
0 commit comments