Skip to content

Commit 2e1b931

Browse files
author
Esteban Solano
committed
+ Tests for McpClientExtensions code
1 parent 4ecb6bc commit 2e1b931

File tree

1 file changed

+150
-1
lines changed

1 file changed

+150
-1
lines changed

tests/ModelContextProtocol.Tests/Client/McpClientExtensionsTests.cs

Lines changed: 150 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
using Microsoft.Extensions.AI;
12
using Microsoft.Extensions.DependencyInjection;
23
using ModelContextProtocol.Client;
34
using ModelContextProtocol.Protocol.Transport;
45
using ModelContextProtocol.Protocol.Types;
56
using ModelContextProtocol.Server;
67
using ModelContextProtocol.Tests.Utils;
8+
using Moq;
79
using System.IO.Pipelines;
810
using System.Text.Json;
911
using System.Text.Json.Serialization.Metadata;
@@ -40,7 +42,154 @@ public McpClientExtensionsTests(ITestOutputHelper outputHelper)
4042
_serverTask = server.RunAsync(cancellationToken: _cts.Token);
4143
}
4244

43-
public async ValueTask DisposeAsync()
45+
[Theory]
46+
[InlineData(null, null)]
47+
[InlineData(0.7f, 50)]
48+
[InlineData(1.0f, 100)]
49+
public async Task CreateSamplingHandler_ShouldHandleTextMessages(float? temperature, int? maxTokens)
50+
{
51+
// Arrange
52+
var mockChatClient = new Mock<IChatClient>();
53+
var requestParams = new CreateMessageRequestParams
54+
{
55+
Messages =
56+
[
57+
new SamplingMessage
58+
{
59+
Role = Role.User,
60+
Content = new Content { Type = "text", Text = "Hello" }
61+
}
62+
],
63+
Temperature = temperature,
64+
MaxTokens = maxTokens
65+
};
66+
67+
var cancellationToken = CancellationToken.None;
68+
var expectedResponse = new ChatResponse
69+
{
70+
Messages = { new ChatMessage { Role = ChatRole.Assistant, Contents = { new TextContent("Hi there!") } } },
71+
ModelId = "test-model",
72+
FinishReason = ChatFinishReason.Stop
73+
};
74+
75+
mockChatClient
76+
.Setup(client => client.GetResponseAsync(It.IsAny<IList<ChatMessage>>(), It.IsAny<ChatOptions>(), cancellationToken))
77+
.ReturnsAsync(expectedResponse);
78+
79+
var handler = McpClientExtensions.CreateSamplingHandler(mockChatClient.Object);
80+
81+
// Act
82+
var result = await handler(requestParams, cancellationToken);
83+
84+
// Assert
85+
Assert.NotNull(result);
86+
Assert.Equal("Hi there!", result.Content.Text);
87+
Assert.Equal("test-model", result.Model);
88+
Assert.Equal("assistant", result.Role);
89+
Assert.Equal("endTurn", result.StopReason);
90+
}
91+
92+
[Fact]
93+
public async Task CreateSamplingHandler_ShouldHandleImageMessages()
94+
{
95+
// Arrange
96+
var mockChatClient = new Mock<IChatClient>();
97+
var requestParams = new CreateMessageRequestParams
98+
{
99+
Messages = new[]
100+
{
101+
new SamplingMessage
102+
{
103+
Role = Role.User,
104+
Content = new Content
105+
{
106+
Type = "image",
107+
MimeType = "image/png",
108+
Data = Convert.ToBase64String(new byte[] { 1, 2, 3 })
109+
}
110+
}
111+
},
112+
MaxTokens = 100
113+
};
114+
var cancellationToken = CancellationToken.None;
115+
116+
var expectedResponse = new ChatResponse
117+
{
118+
Messages = { new ChatMessage { Role = ChatRole.Assistant, Contents = new[] { new TextContent("Image received!") } } },
119+
ModelId = "test-model",
120+
FinishReason = ChatFinishReason.Stop
121+
};
122+
123+
mockChatClient
124+
.Setup(client => client.GetResponseAsync(It.IsAny<IList<ChatMessage>>(), It.IsAny<ChatOptions>(), cancellationToken))
125+
.ReturnsAsync(expectedResponse);
126+
127+
var handler = McpClientExtensions.CreateSamplingHandler(mockChatClient.Object);
128+
129+
// Act
130+
var result = await handler(requestParams, cancellationToken);
131+
132+
// Assert
133+
Assert.NotNull(result);
134+
Assert.Equal("Image received!", result.Content.Text);
135+
Assert.Equal("test-model", result.Model);
136+
Assert.Equal("assistant", result.Role);
137+
Assert.Equal("endTurn", result.StopReason);
138+
}
139+
140+
[Fact]
141+
public async Task CreateSamplingHandler_ShouldHandleResourceMessages()
142+
{
143+
// Arrange
144+
var mockChatClient = new Mock<IChatClient>();
145+
var requestParams = new CreateMessageRequestParams
146+
{
147+
Messages = new[]
148+
{
149+
new SamplingMessage
150+
{
151+
Role = Role.User,
152+
Content = new Content
153+
{
154+
Type = "resource",
155+
Resource = new ResourceContents
156+
{
157+
Text = "Resource text",
158+
Blob = Convert.ToBase64String(new byte[] { 4, 5, 6 }),
159+
MimeType = "application/octet-stream"
160+
}
161+
}
162+
}
163+
},
164+
MaxTokens = 100
165+
};
166+
var cancellationToken = CancellationToken.None;
167+
168+
var expectedResponse = new ChatResponse
169+
{
170+
Messages = { new ChatMessage { Role = ChatRole.Assistant, Contents = new[] { new TextContent("Resource processed!") } } },
171+
ModelId = "test-model",
172+
FinishReason = ChatFinishReason.Stop
173+
};
174+
175+
mockChatClient
176+
.Setup(client => client.GetResponseAsync(It.IsAny<IList<ChatMessage>>(), It.IsAny<ChatOptions>(), cancellationToken))
177+
.ReturnsAsync(expectedResponse);
178+
179+
var handler = McpClientExtensions.CreateSamplingHandler(mockChatClient.Object);
180+
181+
// Act
182+
var result = await handler(requestParams, cancellationToken);
183+
184+
// Assert
185+
Assert.NotNull(result);
186+
Assert.Equal("Resource processed!", result.Content.Text);
187+
Assert.Equal("test-model", result.Model);
188+
Assert.Equal("assistant", result.Role);
189+
Assert.Equal("endTurn", result.StopReason);
190+
}
191+
192+
public ValueTask DisposeAsync()
44193
{
45194
await _cts.CancelAsync();
46195

0 commit comments

Comments
 (0)