From c954821635c72d068a99c025f97a6f12d0e6fed2 Mon Sep 17 00:00:00 2001 From: Vikas Katiyar Date: Wed, 7 Jan 2026 20:00:33 +0000 Subject: [PATCH 1/8] default product_info when None in config while verifying workspaceClient --- src/databricks/labs/dqx/base.py | 4 ++-- tests/unit/test_engine.py | 25 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/databricks/labs/dqx/base.py b/src/databricks/labs/dqx/base.py index df63d32f5..3bdbd5f06 100644 --- a/src/databricks/labs/dqx/base.py +++ b/src/databricks/labs/dqx/base.py @@ -29,8 +29,8 @@ def _verify_workspace_client(ws: WorkspaceClient) -> WorkspaceClient: Verify the Databricks WorkspaceClient configuration and connectivity. """ # Using reflection to set right value for _product_info as dqx for telemetry - product_info = getattr(ws.config, '_product_info') - if product_info[0] != "dqx": + product_info = getattr(ws.config, '_product_info', None) + if product_info is None or product_info[0] != "dqx": setattr(ws.config, '_product_info', ('dqx', __version__)) # make sure Databricks workspace is accessible diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py index 718a4510e..060759d42 100644 --- a/tests/unit/test_engine.py +++ b/tests/unit/test_engine.py @@ -1,10 +1,11 @@ from datetime import datetime, timezone -from unittest.mock import create_autospec +from unittest.mock import create_autospec, Mock import pytest from pyspark.sql import SparkSession from databricks.sdk.errors import DatabricksError from databricks.sdk import WorkspaceClient +from databricks.labs.dqx.__about__ import __version__ from databricks.labs.dqx.config import ExtraParams from databricks.labs.dqx.engine import DQEngine, DQEngineCore from databricks.labs.dqx.metrics_observer import DQMetricsObserver @@ -72,3 +73,25 @@ def test_get_streaming_metrics_listener_no_observer(mock_workspace_client, mock_ engine = DQEngine(mock_workspace_client, mock_spark) with pytest.raises(InvalidParameterError, match="Metrics cannot be collected for engine with no observer"): engine.get_streaming_metrics_listener(metrics_config=OutputConfig(location="dummy")) + + +def test_verify_workspace_client_with_null_product_info(mock_spark): + ws = create_autospec(WorkspaceClient) + mock_config = Mock() + mock_config._product_info = None + ws.config = mock_config + + DQEngine(spark=mock_spark, workspace_client=ws) + + assert mock_config._product_info == ('dqx', __version__) + + +def test_verify_workspace_client_with_non_dqx_product_info(mock_spark): + ws = create_autospec(WorkspaceClient) + mock_config = Mock() + mock_config._product_info = ('other-product', '1.0.0') + ws.config = mock_config + + DQEngine(spark=mock_spark, workspace_client=ws) + + assert mock_config._product_info == ('dqx', __version__) \ No newline at end of file From c0376e3a7a87d3c01b7e19abf9cc47f43dc09105 Mon Sep 17 00:00:00 2001 From: Vikas Katiyar Date: Wed, 7 Jan 2026 21:12:09 +0000 Subject: [PATCH 2/8] removed default argument --- src/databricks/labs/dqx/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/databricks/labs/dqx/base.py b/src/databricks/labs/dqx/base.py index 3bdbd5f06..7a4fdf8f7 100644 --- a/src/databricks/labs/dqx/base.py +++ b/src/databricks/labs/dqx/base.py @@ -29,7 +29,7 @@ def _verify_workspace_client(ws: WorkspaceClient) -> WorkspaceClient: Verify the Databricks WorkspaceClient configuration and connectivity. """ # Using reflection to set right value for _product_info as dqx for telemetry - product_info = getattr(ws.config, '_product_info', None) + product_info = getattr(ws.config, '_product_info') if product_info is None or product_info[0] != "dqx": setattr(ws.config, '_product_info', ('dqx', __version__)) From 15b92f6cf37603abb7ae65461f0a931e0c4c0602 Mon Sep 17 00:00:00 2001 From: Vikas Katiyar Date: Wed, 7 Jan 2026 21:14:15 +0000 Subject: [PATCH 3/8] added eof --- tests/unit/test_engine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py index 060759d42..c1b7ffb60 100644 --- a/tests/unit/test_engine.py +++ b/tests/unit/test_engine.py @@ -94,4 +94,4 @@ def test_verify_workspace_client_with_non_dqx_product_info(mock_spark): DQEngine(spark=mock_spark, workspace_client=ws) - assert mock_config._product_info == ('dqx', __version__) \ No newline at end of file + assert mock_config._product_info == ('dqx', __version__) From 0caca283e9ecf70fd72328504683c2e0fe73a46e Mon Sep 17 00:00:00 2001 From: Vikas Katiyar Date: Thu, 8 Jan 2026 15:49:30 +0000 Subject: [PATCH 4/8] format fixes --- tests/unit/test_engine.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py index c1b7ffb60..8146a087f 100644 --- a/tests/unit/test_engine.py +++ b/tests/unit/test_engine.py @@ -78,20 +78,20 @@ def test_get_streaming_metrics_listener_no_observer(mock_workspace_client, mock_ def test_verify_workspace_client_with_null_product_info(mock_spark): ws = create_autospec(WorkspaceClient) mock_config = Mock() - mock_config._product_info = None + mock_config._product_info = None # pylint: disable=protected-access ws.config = mock_config DQEngine(spark=mock_spark, workspace_client=ws) - assert mock_config._product_info == ('dqx', __version__) + assert mock_config._product_info == ('dqx', __version__) # pylint: disable=protected-access def test_verify_workspace_client_with_non_dqx_product_info(mock_spark): ws = create_autospec(WorkspaceClient) mock_config = Mock() - mock_config._product_info = ('other-product', '1.0.0') + mock_config._product_info = ('other-product', '1.0.0') # pylint: disable=protected-access ws.config = mock_config DQEngine(spark=mock_spark, workspace_client=ws) - assert mock_config._product_info == ('dqx', __version__) + assert mock_config._product_info == ('dqx', __version__) # pylint: disable=protected-access From b0da00165f8c67f84a10d6f868278e19628e6c34 Mon Sep 17 00:00:00 2001 From: Vikas Katiyar Date: Thu, 8 Jan 2026 16:55:20 +0000 Subject: [PATCH 5/8] updated test to avoid the pylint error --- tests/unit/test_engine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py index 8146a087f..5b7f26373 100644 --- a/tests/unit/test_engine.py +++ b/tests/unit/test_engine.py @@ -78,7 +78,7 @@ def test_get_streaming_metrics_listener_no_observer(mock_workspace_client, mock_ def test_verify_workspace_client_with_null_product_info(mock_spark): ws = create_autospec(WorkspaceClient) mock_config = Mock() - mock_config._product_info = None # pylint: disable=protected-access + setattr(mock_config, "_product_info", None) ws.config = mock_config DQEngine(spark=mock_spark, workspace_client=ws) @@ -89,7 +89,7 @@ def test_verify_workspace_client_with_null_product_info(mock_spark): def test_verify_workspace_client_with_non_dqx_product_info(mock_spark): ws = create_autospec(WorkspaceClient) mock_config = Mock() - mock_config._product_info = ('other-product', '1.0.0') # pylint: disable=protected-access + setattr(mock_config, "other-product", ('other-product', '1.0.0')) ws.config = mock_config DQEngine(spark=mock_spark, workspace_client=ws) From 18707e88352e0b166585b49700df6c30adfbe17a Mon Sep 17 00:00:00 2001 From: Vikas Katiyar Date: Thu, 8 Jan 2026 17:11:24 +0000 Subject: [PATCH 6/8] updated test to avoid the pylint error --- tests/unit/test_engine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py index 5b7f26373..fb4ad7968 100644 --- a/tests/unit/test_engine.py +++ b/tests/unit/test_engine.py @@ -83,7 +83,7 @@ def test_verify_workspace_client_with_null_product_info(mock_spark): DQEngine(spark=mock_spark, workspace_client=ws) - assert mock_config._product_info == ('dqx', __version__) # pylint: disable=protected-access + assert mock_config._product_info == ('dqx', __version__) def test_verify_workspace_client_with_non_dqx_product_info(mock_spark): @@ -94,4 +94,4 @@ def test_verify_workspace_client_with_non_dqx_product_info(mock_spark): DQEngine(spark=mock_spark, workspace_client=ws) - assert mock_config._product_info == ('dqx', __version__) # pylint: disable=protected-access + assert mock_config._product_info == ('dqx', __version__) From 96ac5a8972d7fe47f0a254ee75b1f83d8601e3d0 Mon Sep 17 00:00:00 2001 From: Vikas Katiyar Date: Thu, 8 Jan 2026 17:21:56 +0000 Subject: [PATCH 7/8] updated test to avoid the pylint error --- tests/unit/test_engine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py index fb4ad7968..83aca1cff 100644 --- a/tests/unit/test_engine.py +++ b/tests/unit/test_engine.py @@ -83,7 +83,7 @@ def test_verify_workspace_client_with_null_product_info(mock_spark): DQEngine(spark=mock_spark, workspace_client=ws) - assert mock_config._product_info == ('dqx', __version__) + assert getattr(mock_config, "_product_info") == ('dqx', __version__) def test_verify_workspace_client_with_non_dqx_product_info(mock_spark): @@ -94,4 +94,4 @@ def test_verify_workspace_client_with_non_dqx_product_info(mock_spark): DQEngine(spark=mock_spark, workspace_client=ws) - assert mock_config._product_info == ('dqx', __version__) + assert getattr(mock_config, "_product_info") == ('dqx', __version__) From ca73d983234f3202dd5e4dbadcb5721213dfa8db Mon Sep 17 00:00:00 2001 From: Vikas Katiyar Date: Thu, 8 Jan 2026 17:47:55 +0000 Subject: [PATCH 8/8] fix build issues --- tests/unit/test_engine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py index 83aca1cff..720fde6f6 100644 --- a/tests/unit/test_engine.py +++ b/tests/unit/test_engine.py @@ -89,7 +89,7 @@ def test_verify_workspace_client_with_null_product_info(mock_spark): def test_verify_workspace_client_with_non_dqx_product_info(mock_spark): ws = create_autospec(WorkspaceClient) mock_config = Mock() - setattr(mock_config, "other-product", ('other-product', '1.0.0')) + setattr(mock_config, "_product_info", ('other-product', '1.0.0')) ws.config = mock_config DQEngine(spark=mock_spark, workspace_client=ws)