1- from unittest .mock import patch
1+ from unittest .mock import MagicMock , patch
22
33import pytest
44from databricks .sdk .service .dashboards import GenieSpace
1212)
1313
1414
15+ def _mock_mcp_client ():
16+ """Helper to create a mock MCP client for Genie tests"""
17+ mock_tool_query = MagicMock ()
18+ mock_tool_query .name = "query_space_space-id"
19+
20+ mock_tool_poll = MagicMock ()
21+ mock_tool_poll .name = "poll_response_space-id"
22+
23+ mock_mcp_client = MagicMock ()
24+ mock_mcp_client .list_tools .return_value = [mock_tool_query , mock_tool_poll ]
25+
26+ return mock_mcp_client
27+
28+
1529def test_concat_messages_array ():
1630 # Test a simple case with multiple messages
1731 messages = [
@@ -43,14 +57,16 @@ def __init__(self, role, content):
4357 assert result == expected
4458
4559
60+ @patch ("databricks_ai_bridge.genie.DatabricksMCPClient" )
4661@patch ("databricks.sdk.WorkspaceClient" )
47- def test_query_genie_as_agent (MockWorkspaceClient ):
62+ def test_query_genie_as_agent (MockWorkspaceClient , MockMCPClient ):
4863 mock_space = GenieSpace (
4964 space_id = "space-id" ,
5065 title = "Sales Space" ,
5166 description = "description" ,
5267 )
5368 MockWorkspaceClient .genie .get_space .return_value = mock_space
69+ MockMCPClient .return_value = _mock_mcp_client ()
5470
5571 # Create a proper GenieResponse instance with conversation_id
5672 mock_genie_response = GenieResponse (
@@ -86,16 +102,18 @@ def test_query_genie_as_agent(MockWorkspaceClient):
86102 assert result == expected_messages
87103
88104
105+ @patch ("databricks_ai_bridge.genie.DatabricksMCPClient" )
89106@patch ("databricks.sdk.WorkspaceClient" )
90107@patch ("langchain_core.runnables.RunnableLambda" )
91- def test_create_genie_agent (MockRunnableLambda , MockWorkspaceClient ):
108+ def test_create_genie_agent (MockRunnableLambda , MockWorkspaceClient , MockMCPClient ):
92109 mock_space = GenieSpace (
93110 space_id = "space-id" ,
94111 title = "Sales Space" ,
95112 description = "description" ,
96113 )
97114 mock_client = MockWorkspaceClient .return_value
98115 mock_client .genie .get_space .return_value = mock_space
116+ MockMCPClient .return_value = _mock_mcp_client ()
99117
100118 agent = GenieAgent ("space-id" , "Genie" , client = mock_client )
101119 assert agent .description == "description"
@@ -104,16 +122,18 @@ def test_create_genie_agent(MockRunnableLambda, MockWorkspaceClient):
104122 assert agent == MockRunnableLambda .return_value
105123
106124
125+ @patch ("databricks_ai_bridge.genie.DatabricksMCPClient" )
107126@patch ("databricks.sdk.WorkspaceClient" )
108127@patch ("langchain_core.runnables.RunnableLambda" )
109- def test_create_genie_agent_with_description (MockRunnableLambda , MockWorkspaceClient ):
128+ def test_create_genie_agent_with_description (MockRunnableLambda , MockWorkspaceClient , MockMCPClient ):
110129 mock_space = GenieSpace (
111130 space_id = "space-id" ,
112131 title = "Sales Space" ,
113132 description = None ,
114133 )
115134 mock_client = MockWorkspaceClient .return_value
116135 mock_client .genie .get_space .return_value = mock_space
136+ MockMCPClient .return_value = _mock_mcp_client ()
117137
118138 agent = GenieAgent ("space-id" , "Genie" , "this is a description" , client = mock_client )
119139 assert agent .description == "this is a description"
@@ -122,13 +142,15 @@ def test_create_genie_agent_with_description(MockRunnableLambda, MockWorkspaceCl
122142 assert agent == MockRunnableLambda .return_value
123143
124144
145+ @patch ("databricks_ai_bridge.genie.DatabricksMCPClient" )
125146@patch ("databricks.sdk.WorkspaceClient" )
126- def test_query_genie_with_client (mock_workspace_client ):
147+ def test_query_genie_with_client (mock_workspace_client , MockMCPClient ):
127148 mock_workspace_client .genie .get_space .return_value = GenieSpace (
128149 space_id = "space-id" ,
129150 title = "Sales Space" ,
130151 description = "description" ,
131152 )
153+ MockMCPClient .return_value = _mock_mcp_client ()
132154
133155 # Create a proper GenieResponse instance
134156 mock_genie_response = GenieResponse (
@@ -151,8 +173,9 @@ def test_query_genie_with_client(mock_workspace_client):
151173 assert result == expected_message
152174
153175
176+ @patch ("databricks_ai_bridge.genie.DatabricksMCPClient" )
154177@patch ("databricks.sdk.WorkspaceClient" )
155- def test_create_genie_agent_with_include_context (MockWorkspaceClient ):
178+ def test_create_genie_agent_with_include_context (MockWorkspaceClient , MockMCPClient ):
156179 """Test creating a GenieAgent with include_context parameter and verify it propagates correctly"""
157180 mock_space = GenieSpace (
158181 space_id = "space-id" ,
@@ -161,6 +184,7 @@ def test_create_genie_agent_with_include_context(MockWorkspaceClient):
161184 )
162185 mock_client = MockWorkspaceClient .return_value
163186 mock_client .genie .get_space .return_value = mock_space
187+ MockMCPClient .return_value = _mock_mcp_client ()
164188
165189 # Create a proper GenieResponse instance
166190 mock_genie_response = GenieResponse (
@@ -199,11 +223,13 @@ def test_create_genie_agent_no_space_id():
199223 GenieAgent ("" , "Genie" )
200224
201225
226+ @patch ("databricks_ai_bridge.genie.DatabricksMCPClient" )
202227@patch ("databricks.sdk.WorkspaceClient" )
203- def test_message_processor_functionality (MockWorkspaceClient ):
228+ def test_message_processor_functionality (MockWorkspaceClient , MockMCPClient ):
204229 """Test message_processor parameter in both _query_genie_as_agent and GenieAgent"""
205230 mock_space = GenieSpace (space_id = "space-id" , title = "Sales Space" , description = "description" )
206231 MockWorkspaceClient .genie .get_space .return_value = mock_space
232+ MockMCPClient .return_value = _mock_mcp_client ()
207233
208234 mock_genie_response = GenieResponse (
209235 result = "It is sunny." ,
@@ -286,15 +312,17 @@ def last_message_processor(messages):
286312 assert result ["conversation_id" ] == "conv-abc" # Add this
287313
288314
315+ @patch ("databricks_ai_bridge.genie.DatabricksMCPClient" )
289316@patch ("databricks.sdk.WorkspaceClient" )
290- def test_conversation_continuity (MockWorkspaceClient ):
317+ def test_conversation_continuity (MockWorkspaceClient , MockMCPClient ):
291318 """Test that conversation_id is passed through correctly for conversation continuity"""
292319 mock_space = GenieSpace (
293320 space_id = "space-id" ,
294321 title = "Sales Space" ,
295322 description = "description" ,
296323 )
297324 MockWorkspaceClient .genie .get_space .return_value = mock_space
325+ MockMCPClient .return_value = _mock_mcp_client ()
298326
299327 # First response creates a conversation
300328 mock_genie_response_1 = GenieResponse (
@@ -342,8 +370,9 @@ def test_conversation_continuity(MockWorkspaceClient):
342370 assert result_2 ["conversation_id" ] == "conv-new-123"
343371
344372
373+ @patch ("databricks_ai_bridge.genie.DatabricksMCPClient" )
345374@patch ("databricks.sdk.WorkspaceClient" )
346- def test_dataframe_return (MockWorkspaceClient ):
375+ def test_dataframe_return (MockWorkspaceClient , MockMCPClient ):
347376 """Test that DataFrames are returned correctly with markdown conversion"""
348377 import pandas as pd
349378
@@ -353,6 +382,7 @@ def test_dataframe_return(MockWorkspaceClient):
353382 description = "description" ,
354383 )
355384 MockWorkspaceClient .genie .get_space .return_value = mock_space
385+ MockMCPClient .return_value = _mock_mcp_client ()
356386
357387 # Create a DataFrame result
358388 test_df = pd .DataFrame ({"name" : ["Alice" , "Bob" ], "age" : [25 , 30 ]})
@@ -384,15 +414,17 @@ def test_dataframe_return(MockWorkspaceClient):
384414 assert result ["conversation_id" ] == "conv-df-123"
385415
386416
417+ @patch ("databricks_ai_bridge.genie.DatabricksMCPClient" )
387418@patch ("databricks.sdk.WorkspaceClient" )
388- def test_string_return_no_dataframe_field (MockWorkspaceClient ):
419+ def test_string_return_no_dataframe_field (MockWorkspaceClient , MockMCPClient ):
389420 """Test that string results don't include dataframe field"""
390421 mock_space = GenieSpace (
391422 space_id = "space-id" ,
392423 title = "Sales Space" ,
393424 description = "description" ,
394425 )
395426 MockWorkspaceClient .genie .get_space .return_value = mock_space
427+ MockMCPClient .return_value = _mock_mcp_client ()
396428
397429 mock_genie_response = GenieResponse (
398430 result = "String result" , # String, not DataFrame
0 commit comments