Skip to content

Commit 251461b

Browse files
author
Esteban Solano
committed
+ Tests for McpClientExtensions code
1 parent 4c537ef commit 251461b

1 file changed

Lines changed: 151 additions & 1 deletion

File tree

tests/ModelContextProtocol.Tests/Client/McpClientExtensionsTests.cs

Lines changed: 151 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
using Microsoft.Extensions.AI;
12
using Microsoft.Extensions.DependencyInjection;
23
using ModelContextProtocol.Client;
34
using ModelContextProtocol.Protocol.Transport;
5+
using ModelContextProtocol.Protocol.Types;
46
using ModelContextProtocol.Server;
57
using ModelContextProtocol.Tests.Transport;
68
using ModelContextProtocol.Tests.Utils;
9+
using Moq;
710
using System.IO.Pipelines;
811

912
namespace ModelContextProtocol.Tests.Client;
@@ -38,7 +41,154 @@ public McpClientExtensionsTests(ITestOutputHelper outputHelper)
3841
_serverTask = server.RunAsync(cancellationToken: _cts.Token);
3942
}
4043

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

0 commit comments

Comments
 (0)