csharp-sdk/tests/ModelContextProtocol.Tests/Protocol/ElicitationDefaultValuesTests.cs
2025-12-05 00:03:16 -08:00

415 lines
17 KiB
C#

using ModelContextProtocol.Protocol;
using System.Text.Json;
namespace ModelContextProtocol.Tests.Protocol;
public static class ElicitationDefaultValuesTests
{
[Fact]
public static void StringSchema_Default_Serializes_Correctly()
{
// Arrange
var schema = new ElicitRequestParams.StringSchema
{
Title = "Name",
Description = "User's name",
Default = "John Doe"
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
var deserialized = JsonSerializer.Deserialize<ElicitRequestParams.PrimitiveSchemaDefinition>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
var stringSchema = Assert.IsType<ElicitRequestParams.StringSchema>(deserialized);
Assert.Equal("John Doe", stringSchema.Default);
Assert.Equal("Name", stringSchema.Title);
Assert.Equal("User's name", stringSchema.Description);
Assert.Contains("\"default\":\"John Doe\"", json);
}
[Fact]
public static void StringSchema_Default_Null_DoesNotSerialize()
{
// Arrange
var schema = new ElicitRequestParams.StringSchema
{
Title = "Name"
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
// Assert
Assert.DoesNotContain("\"default\"", json);
}
[Fact]
public static void NumberSchema_Default_Serializes_Correctly()
{
// Arrange
var schema = new ElicitRequestParams.NumberSchema
{
Title = "Age",
Description = "User's age",
Default = 25.5,
Minimum = 0,
Maximum = 150
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
var deserialized = JsonSerializer.Deserialize<ElicitRequestParams.PrimitiveSchemaDefinition>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
var numberSchema = Assert.IsType<ElicitRequestParams.NumberSchema>(deserialized);
Assert.Equal(25.5, numberSchema.Default);
Assert.Equal("Age", numberSchema.Title);
Assert.Equal("User's age", numberSchema.Description);
Assert.Contains("\"default\":25.5", json);
}
[Fact]
public static void NumberSchema_Integer_Default_Serializes_Correctly()
{
// Arrange
var schema = new ElicitRequestParams.NumberSchema
{
Type = "integer",
Title = "Count",
Default = 42
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
var deserialized = JsonSerializer.Deserialize<ElicitRequestParams.PrimitiveSchemaDefinition>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
var numberSchema = Assert.IsType<ElicitRequestParams.NumberSchema>(deserialized);
Assert.Equal(42, numberSchema.Default);
Assert.Equal("Count", numberSchema.Title);
Assert.Contains("\"default\":42", json);
}
[Fact]
public static void NumberSchema_Default_Null_DoesNotSerialize()
{
// Arrange
var schema = new ElicitRequestParams.NumberSchema
{
Title = "Age"
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
// Assert
Assert.DoesNotContain("\"default\"", json);
}
[Fact]
public static void BooleanSchema_Default_True_Serializes_Correctly()
{
// Arrange
var schema = new ElicitRequestParams.BooleanSchema
{
Title = "Active",
Description = "Is user active",
Default = true
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
var deserialized = JsonSerializer.Deserialize<ElicitRequestParams.PrimitiveSchemaDefinition>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
var booleanSchema = Assert.IsType<ElicitRequestParams.BooleanSchema>(deserialized);
Assert.True(booleanSchema.Default);
Assert.Contains("\"default\":true", json);
}
[Fact]
public static void BooleanSchema_Default_False_Serializes_Correctly()
{
// Arrange
var schema = new ElicitRequestParams.BooleanSchema
{
Title = "Active",
Default = false
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
var deserialized = JsonSerializer.Deserialize<ElicitRequestParams.PrimitiveSchemaDefinition>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
var booleanSchema = Assert.IsType<ElicitRequestParams.BooleanSchema>(deserialized);
Assert.False(booleanSchema.Default);
Assert.Contains("\"default\":false", json);
}
[Fact]
public static void PrimitiveSchemaDefinition_StringSchema_WithDefault_RoundTrips()
{
// Arrange
var schema = new ElicitRequestParams.StringSchema
{
Title = "Email",
Format = "email",
Default = "user@example.com"
};
// Act - serialize as base type to test the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
var deserialized = JsonSerializer.Deserialize<ElicitRequestParams.PrimitiveSchemaDefinition>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
var stringSchema = Assert.IsType<ElicitRequestParams.StringSchema>(deserialized);
Assert.Equal("user@example.com", stringSchema.Default);
Assert.Equal("email", stringSchema.Format);
}
[Fact]
public static void PrimitiveSchemaDefinition_NumberSchema_WithDefault_RoundTrips()
{
// Arrange
var schema = new ElicitRequestParams.NumberSchema
{
Title = "Score",
Minimum = 0,
Maximum = 100,
Default = 75.5
};
// Act - serialize as base type to test the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
var deserialized = JsonSerializer.Deserialize<ElicitRequestParams.PrimitiveSchemaDefinition>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
var numberSchema = Assert.IsType<ElicitRequestParams.NumberSchema>(deserialized);
Assert.Equal(75.5, numberSchema.Default);
Assert.Equal(0, numberSchema.Minimum);
Assert.Equal(100, numberSchema.Maximum);
}
[Fact]
public static void UntitledSingleSelectEnumSchema_Default_Null_DoesNotSerialize()
{
// Arrange
var schema = new ElicitRequestParams.UntitledSingleSelectEnumSchema
{
Title = "Priority",
Enum = ["low", "medium", "high"]
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
// Assert
Assert.DoesNotContain("\"default\"", json);
}
[Fact]
public static void TitledSingleSelectEnumSchema_Default_Null_DoesNotSerialize()
{
// Arrange
var schema = new ElicitRequestParams.TitledSingleSelectEnumSchema
{
Title = "Priority",
OneOf =
{
new ElicitRequestParams.EnumSchemaOption { Title = "Low", Const = "low" },
new ElicitRequestParams.EnumSchemaOption { Title = "Medium", Const = "medium" },
new ElicitRequestParams.EnumSchemaOption { Title = "High", Const = "high" }
}
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
// Assert
Assert.DoesNotContain("\"default\"", json);
}
[Fact]
public static void UntitledMultiSelectEnumSchema_Default_Null_DoesNotSerialize()
{
// Arrange
var schema = new ElicitRequestParams.UntitledMultiSelectEnumSchema
{
Title = "Tags",
Items = new ElicitRequestParams.UntitledEnumItemsSchema
{
Enum = ["tag1", "tag2", "tag3"]
}
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
// Assert
Assert.DoesNotContain("\"default\"", json);
}
[Fact]
public static void TitledMultiSelectEnumSchema_Default_Null_DoesNotSerialize()
{
// Arrange
var schema = new ElicitRequestParams.TitledMultiSelectEnumSchema
{
Title = "Tags",
Items = new ElicitRequestParams.TitledEnumItemsSchema
{
AnyOf =
[
new ElicitRequestParams.EnumSchemaOption { Title = "Tag 1", Const = "tag1" },
new ElicitRequestParams.EnumSchemaOption { Title = "Tag 2", Const = "tag2" },
new ElicitRequestParams.EnumSchemaOption { Title = "Tag 3", Const = "tag3" }
]
}
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
// Assert
Assert.DoesNotContain("\"default\"", json);
}
#pragma warning disable MCP9001 // LegacyTitledEnumSchema is deprecated but supported for backward compatibility
[Fact]
public static void LegacyTitledEnumSchema_Default_Null_DoesNotSerialize()
{
// Arrange
var schema = new ElicitRequestParams.LegacyTitledEnumSchema
{
Title = "Legacy Options",
Enum = ["option1", "option2"],
EnumNames = ["Option 1", "Option 2"]
};
// Act - serialize as base type to use the converter
string json = JsonSerializer.Serialize<ElicitRequestParams.PrimitiveSchemaDefinition>(schema, McpJsonUtilities.DefaultOptions);
// Assert
Assert.DoesNotContain("\"default\"", json);
}
#pragma warning restore MCP9001
[Fact]
public static void RequestSchema_WithAllDefaultTypes_Serializes_Correctly()
{
// Arrange
var requestParams = new ElicitRequestParams
{
Message = "Please fill out the form",
RequestedSchema = new()
{
Properties = new Dictionary<string, ElicitRequestParams.PrimitiveSchemaDefinition>
{
["name"] = new ElicitRequestParams.StringSchema
{
Title = "Name",
Default = "John Doe"
},
["age"] = new ElicitRequestParams.NumberSchema
{
Title = "Age",
Type = "integer",
Default = 30
},
["score"] = new ElicitRequestParams.NumberSchema
{
Title = "Score",
Default = 85.5
},
["active"] = new ElicitRequestParams.BooleanSchema
{
Title = "Active",
Default = true
},
["status"] = new ElicitRequestParams.UntitledSingleSelectEnumSchema
{
Title = "Status",
Enum = ["active", "inactive"],
Default = "active"
},
["tags"] = new ElicitRequestParams.UntitledMultiSelectEnumSchema
{
Title = "Tags",
Items = new ElicitRequestParams.UntitledEnumItemsSchema
{
Enum = ["tag1", "tag2", "tag3"]
},
Default = ["tag1", "tag3"]
},
["salutation"] = new ElicitRequestParams.TitledSingleSelectEnumSchema
{
Title = "Salutation",
OneOf =
{
new ElicitRequestParams.EnumSchemaOption { Title = "N/A", Const = "none" },
new ElicitRequestParams.EnumSchemaOption { Title = "Mr.", Const = "mr" },
new ElicitRequestParams.EnumSchemaOption { Title = "Ms.", Const = "ms" },
new ElicitRequestParams.EnumSchemaOption { Title = "Dr.", Const = "dr" }
},
Default = "none"
},
["categories"] = new ElicitRequestParams.TitledMultiSelectEnumSchema
{
Title = "Categories",
Items = new ElicitRequestParams.TitledEnumItemsSchema
{
AnyOf =
[
new ElicitRequestParams.EnumSchemaOption { Title = "Category 1", Const = "cat1" },
new ElicitRequestParams.EnumSchemaOption { Title = "Category 2", Const = "cat2" },
new ElicitRequestParams.EnumSchemaOption { Title = "Category 3", Const = "cat3" }
]
},
Default = ["cat2", "cat3"]
}
}
}
};
// Act
string json = JsonSerializer.Serialize(requestParams, McpJsonUtilities.DefaultOptions);
var deserialized = JsonSerializer.Deserialize<ElicitRequestParams>(json, McpJsonUtilities.DefaultOptions);
// Assert
Assert.NotNull(deserialized);
Assert.NotNull(deserialized.RequestedSchema);
Assert.Equal(8, deserialized.RequestedSchema.Properties.Count);
var nameSchema = Assert.IsType<ElicitRequestParams.StringSchema>(deserialized.RequestedSchema.Properties["name"]);
Assert.Equal("John Doe", nameSchema.Default);
var ageSchema = Assert.IsType<ElicitRequestParams.NumberSchema>(deserialized.RequestedSchema.Properties["age"]);
Assert.Equal(30, ageSchema.Default);
var scoreSchema = Assert.IsType<ElicitRequestParams.NumberSchema>(deserialized.RequestedSchema.Properties["score"]);
Assert.Equal(85.5, scoreSchema.Default);
var activeSchema = Assert.IsType<ElicitRequestParams.BooleanSchema>(deserialized.RequestedSchema.Properties["active"]);
Assert.True(activeSchema.Default);
var statusSchema = Assert.IsType<ElicitRequestParams.UntitledSingleSelectEnumSchema>(deserialized.RequestedSchema.Properties["status"]);
Assert.Equal("active", statusSchema.Default);
var tagsSchema = Assert.IsType<ElicitRequestParams.UntitledMultiSelectEnumSchema>(deserialized.RequestedSchema.Properties["tags"]);
Assert.Equal(new List<string> { "tag1", "tag3" }, tagsSchema.Default);
var salutationSchema = Assert.IsType<ElicitRequestParams.TitledSingleSelectEnumSchema>(deserialized.RequestedSchema.Properties["salutation"]);
Assert.Equal("none", salutationSchema.Default);
var categoriesSchema = Assert.IsType<ElicitRequestParams.TitledMultiSelectEnumSchema>(deserialized.RequestedSchema.Properties["categories"]);
Assert.Equal(new List<string> { "cat2", "cat3" }, categoriesSchema.Default);
}
}