Fix ResourceLinkBlock deserialization by adding missing "name" case (#645)
* Initial plan * Initial analysis and plan for ResourceLinkBlock deserialization fix Co-authored-by: eiriktsarpalis <2813363+eiriktsarpalis@users.noreply.github.com> * Fix ResourceLinkBlock deserialization by adding missing "name" case Co-authored-by: eiriktsarpalis <2813363+eiriktsarpalis@users.noreply.github.com> * Remove unnecessary dotnet-install.sh file Co-authored-by: eiriktsarpalis <2813363+eiriktsarpalis@users.noreply.github.com> * Use const for JSON string variables and improve indentation Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com> * Remove temporary backup file Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com> * Change JSON variable names to use PascalCase (Json) as requested Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: eiriktsarpalis <2813363+eiriktsarpalis@users.noreply.github.com> Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
This commit is contained in:
parent
9e12167dc8
commit
650df63194
2 changed files with 87 additions and 0 deletions
|
|
@ -103,6 +103,10 @@ public abstract class ContentBlock
|
||||||
text = reader.GetString();
|
text = reader.GetString();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "name":
|
||||||
|
name = reader.GetString();
|
||||||
|
break;
|
||||||
|
|
||||||
case "data":
|
case "data":
|
||||||
data = reader.GetString();
|
data = reader.GetString();
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in a new issue