Skip to content
Merged
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
56 changes: 56 additions & 0 deletions Refit.Tests/SerializedContentTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<CamelCaseEnum>(
$"\"{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<CaseDifferentMembers>("\"alpha\"", options)
);
Assert.Equal(
CaseDifferentMembers.ALPHA,
SystemTextJsonSerializer.Deserialize<CaseDifferentMembers>("\"aLPHA\"", options)
);
// Field names are also accepted via exact match
Assert.Equal(
CaseDifferentMembers.Alpha,
SystemTextJsonSerializer.Deserialize<CaseDifferentMembers>("\"Alpha\"", options)
);
Assert.Equal(
CaseDifferentMembers.ALPHA,
SystemTextJsonSerializer.Deserialize<CaseDifferentMembers>("\"ALPHA\"", options)
);
}

[Fact]
public async Task SystemTextJsonContentSerializer_UsesSourceGeneratedMetadataWhenProvided()
{
Expand Down Expand Up @@ -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);
Expand Down