-
Notifications
You must be signed in to change notification settings - Fork 693
Expand file tree
/
Copy pathImplementationTests.cs
More file actions
105 lines (91 loc) · 3.9 KB
/
ImplementationTests.cs
File metadata and controls
105 lines (91 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using ModelContextProtocol.Protocol;
using System.Text.Json;
namespace ModelContextProtocol.Tests.Protocol;
public static class ImplementationTests
{
[Fact]
public static void Implementation_SerializationRoundTrip_PreservesAllProperties()
{
// Arrange
var original = new Implementation
{
Name = "test-server",
Title = "Test MCP Server",
Version = "1.0.0",
Icons =
[
new() { Src = "https://example.com/icon.png", MimeType = "image/png", Sizes = "48x48" },
new() { Src = "https://example.com/icon.svg", MimeType = "image/svg+xml", Sizes = "any" }
],
WebsiteUrl = "https://example.com"
};
// Act - Serialize to JSON
string json = JsonSerializer.Serialize(original, McpJsonUtilities.DefaultOptions);
// Act - Deserialize back from JSON
var deserialized = JsonSerializer.Deserialize<Implementation>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
Assert.Equal(original.Name, deserialized.Name);
Assert.Equal(original.Title, deserialized.Title);
Assert.Equal(original.Version, deserialized.Version);
Assert.Equal(original.WebsiteUrl, deserialized.WebsiteUrl);
Assert.NotNull(deserialized.Icons);
Assert.Equal(original.Icons.Count, deserialized.Icons.Count);
for (int i = 0; i < original.Icons.Count; i++)
{
Assert.Equal(original.Icons[i].Src, deserialized.Icons[i].Src);
Assert.Equal(original.Icons[i].MimeType, deserialized.Icons[i].MimeType);
Assert.Equal(original.Icons[i].Sizes, deserialized.Icons[i].Sizes);
}
}
[Fact]
public static void Implementation_SerializationRoundTrip_WithoutOptionalProperties()
{
// Arrange
var original = new Implementation
{
Name = "simple-server",
Version = "1.0.0"
};
// Act - Serialize to JSON
string json = JsonSerializer.Serialize(original, McpJsonUtilities.DefaultOptions);
// Act - Deserialize back from JSON
var deserialized = JsonSerializer.Deserialize<Implementation>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
Assert.Equal(original.Name, deserialized.Name);
Assert.Equal(original.Title, deserialized.Title);
Assert.Equal(original.Version, deserialized.Version);
Assert.Equal(original.Icons, deserialized.Icons);
Assert.Equal(original.WebsiteUrl, deserialized.WebsiteUrl);
}
[Fact]
public static void Implementation_HasCorrectJsonPropertyNames()
{
var implementation = new Implementation
{
Name = "test-server",
Title = "Test Server",
Version = "1.0.0",
Icons = [new() { Src = "https://example.com/icon.png" }],
WebsiteUrl = "https://example.com"
};
string json = JsonSerializer.Serialize(implementation, McpJsonUtilities.DefaultOptions);
Assert.Contains("\"name\":", json);
Assert.Contains("\"title\":", json);
Assert.Contains("\"version\":", json);
Assert.Contains("\"icons\":", json);
Assert.Contains("\"websiteUrl\":", json);
}
[Theory]
[InlineData("""{}""")]
[InlineData("""{"title":"Test Server"}""")]
[InlineData("""{"name":"test-server"}""")]
[InlineData("""{"version":"1.0.0"}""")]
[InlineData("""{"title":"Test Server","version":"1.0.0"}""")]
[InlineData("""{"name":"test-server","title":"Test Server"}""")]
public static void Implementation_DeserializationWithMissingRequiredProperties_ThrowsJsonException(string invalidJson)
{
Assert.Throws<JsonException>(() => JsonSerializer.Deserialize<Implementation>(invalidJson, McpJsonUtilities.DefaultOptions));
}
}