diff --git a/Refit.Tests/SerializedContentTests.cs b/Refit.Tests/SerializedContentTests.cs index a9d4ebea1..afaba9639 100644 --- a/Refit.Tests/SerializedContentTests.cs +++ b/Refit.Tests/SerializedContentTests.cs @@ -520,6 +520,54 @@ public void SystemTextJsonContentSerializer_DefaultOptions_SerializeLowercaseEnu Assert.Equal("\"alreadyLowercase\"", json); } + [Theory] + [InlineData("vAlUeOnE")] + [InlineData("ValueOne")] + [InlineData("VALUEONE")] + [InlineData("valueone")] + public void SystemTextJsonContentSerializer_DefaultOptions_DeserializesEnumValuesWithVariousCasings( + string jsonValue + ) + { + var result = SystemTextJsonSerializer.Deserialize( + $"\"{jsonValue}\"", + SystemTextJsonContentSerializer.GetDefaultJsonSerializerOptions() + ); + + Assert.Equal(CamelCaseEnum.ValueOne, result); + } + + [Fact] + public void SystemTextJsonContentSerializer_DefaultOptions_ExactCaseMatchTakesPriorityOverCaseInsensitiveWhenMembersDifferByCase() + { + // When enum has members whose names differ only by case, the exact serialized form + // (camelCase) should be used first (case-sensitive), falling back to case-insensitive only + // for inputs that do not exactly match any known serialized form. + + // CaseDifferentMembers.Alpha serializes to "alpha" (camelCase), + // CaseDifferentMembers.ALPHA serializes to "aLPHA" (camelCase). + // Exact-match lookups must correctly disambiguate these. + var options = SystemTextJsonContentSerializer.GetDefaultJsonSerializerOptions(); + + Assert.Equal( + CaseDifferentMembers.Alpha, + SystemTextJsonSerializer.Deserialize("\"alpha\"", options) + ); + Assert.Equal( + CaseDifferentMembers.ALPHA, + SystemTextJsonSerializer.Deserialize("\"aLPHA\"", options) + ); + // Field names are also accepted via exact match + Assert.Equal( + CaseDifferentMembers.Alpha, + SystemTextJsonSerializer.Deserialize("\"Alpha\"", options) + ); + Assert.Equal( + CaseDifferentMembers.ALPHA, + SystemTextJsonSerializer.Deserialize("\"ALPHA\"", options) + ); + } + [Fact] public async Task SystemTextJsonContentSerializer_UsesSourceGeneratedMetadataWhenProvided() { @@ -759,6 +807,14 @@ enum CamelCaseEnum alreadyLowercase = 2 } + // Members Alpha and ALPHA differ only by case; this enum is used to verify that + // the case-sensitive lookup takes priority and the correct member is chosen. + enum CaseDifferentMembers + { + Alpha = 1, + ALPHA = 2, + } + sealed class AsyncOnlyJsonContent(string json) : HttpContent { readonly byte[] _bytes = Encoding.UTF8.GetBytes(json);