11import pytest
2+ import sys
23from unittest .mock import patch , MagicMock , Mock , PropertyMock
34import gc
45
1415import databricks .sql
1516
1617
18+ def _forget_kernel_client_module ():
19+ sys .modules .pop ("databricks.sql.backend.kernel.client" , None )
20+ import databricks .sql .backend .kernel as kernel_pkg
21+
22+ if hasattr (kernel_pkg , "client" ):
23+ delattr (kernel_pkg , "client" )
24+
25+
1726class TestSession :
1827 """
1928 Unit tests for Session functionality
@@ -427,7 +436,6 @@ class TestKernelRetryOptionsThreading:
427436 PACKAGE = "databricks.sql"
428437
429438 def test_retry_kwargs_threaded_into_kernel_client (self ):
430- import sys
431439 import types
432440
433441 pytest .importorskip (
@@ -442,6 +450,7 @@ def test_retry_kwargs_threaded_into_kernel_client(self):
442450 fake = types .ModuleType ("databricks_sql_kernel" )
443451 fake .KernelError = type ("KernelError" , (Exception ,), {})
444452 fake .Session = MagicMock ()
453+ _forget_kernel_client_module ()
445454
446455 # Patch the kernel client class (imported lazily inside
447456 # _create_backend) and the provider builder; capture the kwargs
@@ -478,6 +487,54 @@ def test_retry_kwargs_threaded_into_kernel_client(self):
478487 conn .close ()
479488
480489
490+ class TestKernelTelemetryOptionsThreading :
491+ """The kernel path must forward telemetry options from connect()
492+ into ``KernelDatabricksClient`` so phase-7 PyO3 Session kwargs can
493+ be populated before the kernel opens its session."""
494+
495+ PACKAGE = "databricks.sql"
496+
497+ def test_telemetry_kwargs_threaded_into_kernel_client (self ):
498+ import types
499+
500+ pytest .importorskip (
501+ "pyarrow" ,
502+ reason = "kernel client module imports pyarrow at load" ,
503+ )
504+
505+ fake = types .ModuleType ("databricks_sql_kernel" )
506+ fake .KernelError = type ("KernelError" , (Exception ,), {})
507+ fake .Session = MagicMock ()
508+ _forget_kernel_client_module ()
509+
510+ with patch .dict (sys .modules , {"databricks_sql_kernel" : fake }), patch (
511+ "databricks.sql.backend.kernel.client.KernelDatabricksClient"
512+ ) as mock_kernel_client , patch (
513+ "%s.session.get_python_sql_connector_auth_provider" % self .PACKAGE
514+ ):
515+ instance = mock_kernel_client .return_value
516+ instance .open_session .return_value = SessionId (
517+ BackendType .SEA , "sess-id" , None
518+ )
519+
520+ conn = databricks .sql .connect (
521+ server_hostname = "foo" ,
522+ http_path = "/sql/1.0/warehouses/abc" ,
523+ use_kernel = True ,
524+ access_token = "dapi-xyz" ,
525+ enable_telemetry = True ,
526+ force_enable_telemetry = False ,
527+ telemetry_batch_size = 17 ,
528+ )
529+ try :
530+ _ , kwargs = mock_kernel_client .call_args
531+ opts = kwargs ["telemetry_options" ]
532+ assert opts ["enable_telemetry" ] is True
533+ assert opts ["telemetry_batch_size" ] == 17
534+ finally :
535+ conn .close ()
536+
537+
481538class TestKernelUserAgentForwarding :
482539 """user_agent_entry must reach the kernel on the use_kernel path —
483540 session.py folds it into the composed User-Agent and includes it in
@@ -488,7 +545,6 @@ class TestKernelUserAgentForwarding:
488545 PACKAGE = "databricks.sql"
489546
490547 def test_user_agent_entry_reaches_kernel_client_http_headers (self ):
491- import sys
492548 import types
493549
494550 pytest .importorskip (
@@ -498,6 +554,7 @@ def test_user_agent_entry_reaches_kernel_client_http_headers(self):
498554 fake = types .ModuleType ("databricks_sql_kernel" )
499555 fake .KernelError = type ("KernelError" , (Exception ,), {})
500556 fake .Session = MagicMock ()
557+ _forget_kernel_client_module ()
501558
502559 with patch .dict (sys .modules , {"databricks_sql_kernel" : fake }), patch (
503560 "databricks.sql.backend.kernel.client.KernelDatabricksClient"
0 commit comments