@@ -212,36 +212,63 @@ def test_auth_flow_detection(self):
212212 # Test None auth provider
213213 assert TelemetryHelper .get_auth_flow (None ) is None
214214
215- def test_token_federation_unwraps_to_inner_provider (self ):
216- """Token federation should report the wrapped provider's mech and flow."""
217-
218- def make_federation (inner ):
219- fed = MagicMock (spec = TokenFederationProvider )
220- fed .external_provider = inner
221- return fed
222-
223- # PAT wrapped by federation
224- pat_inner = AccessTokenAuthProvider ("test-token" )
225- fed_pat = make_federation (pat_inner )
226- assert TelemetryHelper .get_auth_mechanism (fed_pat ) == AuthMech .PAT
227- assert TelemetryHelper .get_auth_flow (fed_pat ) is None
228-
229- # M2M (ExternalAuthProvider) wrapped by federation
230- m2m_inner = MagicMock (spec = ExternalAuthProvider )
231- fed_m2m = make_federation (m2m_inner )
232- assert TelemetryHelper .get_auth_mechanism (fed_m2m ) == AuthMech .OTHER
233- assert TelemetryHelper .get_auth_flow (fed_m2m ) == AuthFlow .CLIENT_CREDENTIALS
234-
235- # OAuth (browser) wrapped by federation
236- oauth_inner = MagicMock (spec = DatabricksOAuthProvider )
237- oauth_inner ._access_token = None
238- oauth_inner ._refresh_token = None
239- fed_oauth = make_federation (oauth_inner )
240- assert TelemetryHelper .get_auth_mechanism (fed_oauth ) == AuthMech .OAUTH
241- assert (
242- TelemetryHelper .get_auth_flow (fed_oauth )
243- == AuthFlow .BROWSER_BASED_AUTHENTICATION
215+ def _make_real_federation (self , inner ):
216+ """Build a real TokenFederationProvider so attribute renames break tests."""
217+ return TokenFederationProvider (
218+ hostname = "example.cloud.databricks.com" ,
219+ external_provider = inner ,
220+ http_client = MagicMock (),
221+ )
222+
223+ def test_token_federation_unwraps_pat (self ):
224+ fed = self ._make_real_federation (AccessTokenAuthProvider ("test-token" ))
225+ assert TelemetryHelper .get_auth_mechanism (fed ) == AuthMech .PAT
226+ assert TelemetryHelper .get_auth_flow (fed ) is None
227+
228+ def test_token_federation_unwraps_m2m (self ):
229+ fed = self ._make_real_federation (MagicMock (spec = ExternalAuthProvider ))
230+ assert TelemetryHelper .get_auth_mechanism (fed ) == AuthMech .OTHER
231+ assert TelemetryHelper .get_auth_flow (fed ) == AuthFlow .CLIENT_CREDENTIALS
232+
233+ def test_token_federation_unwraps_oauth_browser (self ):
234+ oauth = MagicMock (spec = DatabricksOAuthProvider )
235+ oauth ._access_token = None
236+ oauth ._refresh_token = None
237+ fed = self ._make_real_federation (oauth )
238+ assert TelemetryHelper .get_auth_mechanism (fed ) == AuthMech .OAUTH
239+ assert TelemetryHelper .get_auth_flow (fed ) == AuthFlow .BROWSER_BASED_AUTHENTICATION
240+
241+ def test_token_federation_unwraps_oauth_passthrough (self ):
242+ oauth = MagicMock (spec = DatabricksOAuthProvider )
243+ oauth ._access_token = "a"
244+ oauth ._refresh_token = "r"
245+ fed = self ._make_real_federation (oauth )
246+ assert TelemetryHelper .get_auth_mechanism (fed ) == AuthMech .OAUTH
247+ assert TelemetryHelper .get_auth_flow (fed ) == AuthFlow .TOKEN_PASSTHROUGH
248+
249+ def test_token_federation_payload_serialization (self ):
250+ """End-to-end: federated PAT must serialize as PAT in the connection-params payload."""
251+ fed = self ._make_real_federation (AccessTokenAuthProvider ("test-token" ))
252+ params = DriverConnectionParameters (
253+ http_path = "/sql/1.0/warehouses/abc" ,
254+ mode = DatabricksClientType .THRIFT ,
255+ host_info = HostDetails (host_url = "https://example.cloud.databricks.com" , port = 443 ),
256+ auth_mech = TelemetryHelper .get_auth_mechanism (fed ),
257+ auth_flow = TelemetryHelper .get_auth_flow (fed ),
258+ )
259+ payload = json .loads (params .to_json ())
260+ assert payload ["auth_mech" ] == "PAT"
261+ assert "auth_flow" not in payload # None-valued fields are stripped
262+
263+ def test_token_federation_with_no_inner_provider (self ):
264+ """Federation with a None inner provider should not crash; both helpers return None."""
265+ fed = TokenFederationProvider (
266+ hostname = "example.cloud.databricks.com" ,
267+ external_provider = None ,
268+ http_client = MagicMock (),
244269 )
270+ assert TelemetryHelper .get_auth_mechanism (fed ) is None
271+ assert TelemetryHelper .get_auth_flow (fed ) is None
245272
246273
247274class TestTelemetryFactory :
0 commit comments