1
+ using System . Text . Json ;
2
+ using ModelContextProtocol . Protocol ;
3
+
4
+ namespace ModelContextProtocol . Tests . Protocol ;
5
+
6
+ public class ContentBlockTests
7
+ {
8
+ [ Fact ]
9
+ public void ResourceLinkBlock_SerializationRoundTrip_PreservesAllProperties ( )
10
+ {
11
+ // Arrange
12
+ var original = new ResourceLinkBlock
13
+ {
14
+ Uri = "https://example.com/resource" ,
15
+ Name = "Test Resource" ,
16
+ Description = "A test resource for validation" ,
17
+ MimeType = "text/plain" ,
18
+ Size = 1024
19
+ } ;
20
+
21
+ // Act - Serialize to JSON
22
+ string json = JsonSerializer . Serialize ( original , McpJsonUtilities . DefaultOptions ) ;
23
+
24
+ // Act - Deserialize back from JSON
25
+ var deserialized = JsonSerializer . Deserialize < ContentBlock > ( json , McpJsonUtilities . DefaultOptions ) ;
26
+
27
+ // Assert
28
+ Assert . NotNull ( deserialized ) ;
29
+ var resourceLink = Assert . IsType < ResourceLinkBlock > ( deserialized ) ;
30
+
31
+ Assert . Equal ( original . Uri , resourceLink . Uri ) ;
32
+ Assert . Equal ( original . Name , resourceLink . Name ) ;
33
+ Assert . Equal ( original . Description , resourceLink . Description ) ;
34
+ Assert . Equal ( original . MimeType , resourceLink . MimeType ) ;
35
+ Assert . Equal ( original . Size , resourceLink . Size ) ;
36
+ Assert . Equal ( "resource_link" , resourceLink . Type ) ;
37
+ }
38
+
39
+ [ Fact ]
40
+ public void ResourceLinkBlock_DeserializationWithMinimalProperties_Succeeds ( )
41
+ {
42
+ // Arrange - JSON with only required properties
43
+ const string Json = """
44
+ {
45
+ "type": "resource_link",
46
+ "uri": "https://example.com/minimal",
47
+ "name": "Minimal Resource"
48
+ }
49
+ """ ;
50
+
51
+ // Act
52
+ var deserialized = JsonSerializer . Deserialize < ContentBlock > ( Json , McpJsonUtilities . DefaultOptions ) ;
53
+
54
+ // Assert
55
+ Assert . NotNull ( deserialized ) ;
56
+ var resourceLink = Assert . IsType < ResourceLinkBlock > ( deserialized ) ;
57
+
58
+ Assert . Equal ( "https://example.com/minimal" , resourceLink . Uri ) ;
59
+ Assert . Equal ( "Minimal Resource" , resourceLink . Name ) ;
60
+ Assert . Null ( resourceLink . Description ) ;
61
+ Assert . Null ( resourceLink . MimeType ) ;
62
+ Assert . Null ( resourceLink . Size ) ;
63
+ Assert . Equal ( "resource_link" , resourceLink . Type ) ;
64
+ }
65
+
66
+ [ Fact ]
67
+ public void ResourceLinkBlock_DeserializationWithoutName_ThrowsJsonException ( )
68
+ {
69
+ // Arrange - JSON missing the required "name" property
70
+ const string Json = """
71
+ {
72
+ "type": "resource_link",
73
+ "uri": "https://example.com/missing-name"
74
+ }
75
+ """ ;
76
+
77
+ // Act & Assert
78
+ var exception = Assert . Throws < JsonException > ( ( ) =>
79
+ JsonSerializer . Deserialize < ContentBlock > ( Json , McpJsonUtilities . DefaultOptions ) ) ;
80
+
81
+ Assert . Contains ( "Name must be provided for 'resource_link' type" , exception . Message ) ;
82
+ }
83
+ }
0 commit comments