Skip to content

Commit e5d0820

Browse files
committed
Strengthen telemetry token-federation tests
Build real TokenFederationProvider instances (instead of MagicMocks) so attribute renames on external_provider break the test rather than passing silently. Add a payload-serialization assertion confirming the federated PAT case emits "auth_mech": "PAT" in the JSON event, and a None-inner- provider edge case. Co-authored-by: Isaac
1 parent be93f11 commit e5d0820

1 file changed

Lines changed: 56 additions & 29 deletions

File tree

tests/unit/test_telemetry.py

Lines changed: 56 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

247274
class TestTelemetryFactory:

0 commit comments

Comments
 (0)