Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/ModelContextProtocol.Core/Protocol/ContentBlock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,10 @@ public class Converter : JsonConverter<ContentBlock>
text = reader.GetString();
break;

case "name":
name = reader.GetString();
break;

case "data":
data = reader.GetString();
break;
Expand Down
83 changes: 83 additions & 0 deletions tests/ModelContextProtocol.Tests/Protocol/ContentBlockTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
using System.Text.Json;
using ModelContextProtocol.Protocol;

namespace ModelContextProtocol.Tests.Protocol;

public class ContentBlockTests
{
[Fact]
public void ResourceLinkBlock_SerializationRoundTrip_PreservesAllProperties()
{
// Arrange
var original = new ResourceLinkBlock
{
Uri = "https://example.com/resource",
Name = "Test Resource",
Description = "A test resource for validation",
MimeType = "text/plain",
Size = 1024
};

// Act - Serialize to JSON
string json = JsonSerializer.Serialize(original, McpJsonUtilities.DefaultOptions);

// Act - Deserialize back from JSON
var deserialized = JsonSerializer.Deserialize<ContentBlock>(json, McpJsonUtilities.DefaultOptions);

// Assert
Assert.NotNull(deserialized);
var resourceLink = Assert.IsType<ResourceLinkBlock>(deserialized);

Assert.Equal(original.Uri, resourceLink.Uri);
Assert.Equal(original.Name, resourceLink.Name);
Assert.Equal(original.Description, resourceLink.Description);
Assert.Equal(original.MimeType, resourceLink.MimeType);
Assert.Equal(original.Size, resourceLink.Size);
Assert.Equal("resource_link", resourceLink.Type);
}

[Fact]
public void ResourceLinkBlock_DeserializationWithMinimalProperties_Succeeds()
{
// Arrange - JSON with only required properties
const string Json = """
{
"type": "resource_link",
"uri": "https://example.com/minimal",
"name": "Minimal Resource"
}
""";

// Act
var deserialized = JsonSerializer.Deserialize<ContentBlock>(Json, McpJsonUtilities.DefaultOptions);

// Assert
Assert.NotNull(deserialized);
var resourceLink = Assert.IsType<ResourceLinkBlock>(deserialized);

Assert.Equal("https://example.com/minimal", resourceLink.Uri);
Assert.Equal("Minimal Resource", resourceLink.Name);
Assert.Null(resourceLink.Description);
Assert.Null(resourceLink.MimeType);
Assert.Null(resourceLink.Size);
Assert.Equal("resource_link", resourceLink.Type);
}

[Fact]
public void ResourceLinkBlock_DeserializationWithoutName_ThrowsJsonException()
{
// Arrange - JSON missing the required "name" property
const string Json = """
{
"type": "resource_link",
"uri": "https://example.com/missing-name"
}
""";

// Act & Assert
var exception = Assert.Throws<JsonException>(() =>
JsonSerializer.Deserialize<ContentBlock>(Json, McpJsonUtilities.DefaultOptions));

Assert.Contains("Name must be provided for 'resource_link' type", exception.Message);
}
}
Loading