Skip to content

Commit 53b8062

Browse files
committed
mock_mcp_in_langchain
1 parent 7ee93f4 commit 53b8062

1 file changed

Lines changed: 42 additions & 10 deletions

File tree

integrations/langchain/tests/unit_tests/test_genie.py

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from unittest.mock import patch
1+
from unittest.mock import MagicMock, patch
22

33
import pytest
44
from databricks.sdk.service.dashboards import GenieSpace
@@ -12,6 +12,20 @@
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+
1529
def 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

Comments
 (0)