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