From f6975e650614b68b4956c2d0651695f1c7d6b283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Chalet?= Date: Tue, 18 Jun 2024 17:59:22 +0200 Subject: [PATCH] Update OpenIddictParameter to return "true" and "false" for string/string array conversions --- .../Primitives/OpenIddictParameter.cs | 83 ++++++++++++++----- .../Primitives/OpenIddictParameterTests.cs | 34 ++++---- 2 files changed, 81 insertions(+), 36 deletions(-) diff --git a/src/OpenIddict.Abstractions/Primitives/OpenIddictParameter.cs b/src/OpenIddict.Abstractions/Primitives/OpenIddictParameter.cs index 8ab1c6fa..8080da9f 100644 --- a/src/OpenIddict.Abstractions/Primitives/OpenIddictParameter.cs +++ b/src/OpenIddict.Abstractions/Primitives/OpenIddictParameter.cs @@ -598,20 +598,29 @@ public readonly struct OpenIddictParameter : IEquatable { null => string.Empty, - bool value => value ? bool.TrueString : bool.FalseString, + bool value => value ? "true" : "false", long value => value.ToString(CultureInfo.InvariantCulture), string value => value, string?[] value => string.Join(", ", value), + JsonElement { ValueKind: JsonValueKind.True } => "true", + JsonElement { ValueKind: JsonValueKind.False } => "false", + JsonElement value => value.ToString(), #if SUPPORTS_JSON_NODES JsonValue value when value.TryGetValue(out JsonElement element) - => element.ToString(), + => element.ValueKind switch + { + JsonValueKind.True => "true", + JsonValueKind.False => "false", + + _ => element.ToString() + }, JsonValue value when value.TryGetValue(out bool result) - => result ? bool.TrueString : bool.FalseString, + => result ? "true" : "false", JsonValue value when value.TryGetValue(out int result) => result.ToString(CultureInfo.InvariantCulture), @@ -621,7 +630,14 @@ public readonly struct OpenIddictParameter : IEquatable JsonValue value when value.TryGetValue(out string? result) => result, - JsonNode value => value.ToJsonString(), + JsonNode value when JsonSerializer.SerializeToElement(value) is JsonElement element + => element.ValueKind switch + { + JsonValueKind.True => "true", + JsonValueKind.False => "false", + + _ => element.ToString() + }, #endif _ => string.Empty }; @@ -1058,11 +1074,15 @@ public readonly struct OpenIddictParameter : IEquatable string value => value, // When the parameter is a boolean value, use its string representation. - bool value => value ? bool.TrueString : bool.FalseString, + bool value => value ? "true" : "false", // When the parameter is an integer, use its string representation. long value => value.ToString(CultureInfo.InvariantCulture), + // When the parameter is a JSON boolean value, use its string representation. + JsonElement { ValueKind: JsonValueKind.True } => "true", + JsonElement { ValueKind: JsonValueKind.False } => "false", + // When the parameter is a JsonElement, try to convert it if it's of a supported type. JsonElement value => ConvertFromJsonElement(value), @@ -1075,7 +1095,7 @@ public readonly struct OpenIddictParameter : IEquatable JsonValue value when value.TryGetValue(out string? result) => result, // When the parameter is a JsonValue wrapping a boolean, return its representation. - JsonValue value when value.TryGetValue(out bool result) => result ? bool.TrueString : bool.FalseString, + JsonValue value when value.TryGetValue(out bool result) => result ? "true" : "false", // When the parameter is a JsonValue wrapping a boolean, return its representation. JsonValue value when value.TryGetValue(out int result) => result.ToString(CultureInfo.InvariantCulture), @@ -1093,11 +1113,14 @@ public readonly struct OpenIddictParameter : IEquatable static string? ConvertFromJsonElement(JsonElement element) => element.ValueKind switch { - // When the parameter is a JsonElement representing a string, - // a number or a boolean, return its string representation. - JsonValueKind.String or JsonValueKind.Number or - JsonValueKind.True or JsonValueKind.False - => element.ToString(), + // When the parameter is a JsonElement representing + // a boolean, return its string representation. + JsonValueKind.True => "true", + JsonValueKind.False => "false", + + // When the parameter is a JsonElement representing a + // string or a number, return its string representation. + JsonValueKind.String or JsonValueKind.Number => element.ToString(), _ => null }; @@ -1122,11 +1145,15 @@ public readonly struct OpenIddictParameter : IEquatable string value => [value], // When the parameter is a boolean value, return an array with its string representation. - bool value => [value ? bool.TrueString : bool.FalseString], + bool value => [value ? "true" : "false"], // When the parameter is an integer, return an array with its string representation. long value => [value.ToString(CultureInfo.InvariantCulture)], + // When the parameter is a JSON boolean value, return an array with its string representation. + JsonElement { ValueKind: JsonValueKind.True } => ["true"], + JsonElement { ValueKind: JsonValueKind.False } => ["false"], + // When the parameter is a JsonElement, try to convert it if it's of a supported type. JsonElement value => ConvertFromJsonElement(value), @@ -1140,7 +1167,7 @@ public readonly struct OpenIddictParameter : IEquatable // When the parameter is a JsonValue wrapping a boolean, return an array with its string representation. JsonValue value when value.TryGetValue(out bool result) - => [result ? bool.TrueString : bool.FalseString], + => [result ? "true" : "false"], // When the parameter is a JsonValue wrapping an integer, return an array with its string representation. JsonValue value when value.TryGetValue(out int result) @@ -1161,8 +1188,13 @@ public readonly struct OpenIddictParameter : IEquatable static string?[]? ConvertFromJsonElement(JsonElement element) => element.ValueKind switch { - // When the parameter is a JsonElement representing a string, a number - // or a boolean, return an 1-item array with its string representation. + // When the parameter is a JsonElement representing a boolean, + // return an 1-item array with its string representation. + JsonValueKind.True => ["true"], + JsonValueKind.False => ["false"], + + // When the parameter is a JsonElement representing a string or a + // number, return an 1-item array with its string representation. JsonValueKind.String or JsonValueKind.Number or JsonValueKind.True or JsonValueKind.False => [element.ToString()], @@ -1180,14 +1212,27 @@ public readonly struct OpenIddictParameter : IEquatable for (var index = 0; index < length; index++) { + var item = element[index]; + if (item.ValueKind is JsonValueKind.True) + { + array[index] = "true"; + } + + else if (item.ValueKind is JsonValueKind.False) + { + array[index] = "false"; + } + + else if (item.ValueKind is JsonValueKind.String or JsonValueKind.Number) + { + array[index] = item.ToString(); + } + // Always return a null array if one of the items is a not string, a number or a boolean. - if (element[index] is not { ValueKind: JsonValueKind.String or JsonValueKind.Number or - JsonValueKind.True or JsonValueKind.False } item) + else { return null; } - - array[index] = item.ToString(); } return array; diff --git a/test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictParameterTests.cs b/test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictParameterTests.cs index fa543035..d9310049 100644 --- a/test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictParameterTests.cs +++ b/test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictParameterTests.cs @@ -1160,8 +1160,8 @@ public class OpenIddictParameterTests public void ToString_ReturnsBooleanValue() { // Arrange, act and assert - Assert.Equal(bool.TrueString, new OpenIddictParameter(true).ToString()); - Assert.Equal(bool.FalseString, new OpenIddictParameter(false).ToString()); + Assert.Equal("true", new OpenIddictParameter(true).ToString()); + Assert.Equal("false", new OpenIddictParameter(false).ToString()); } [Fact] @@ -1258,9 +1258,9 @@ public class OpenIddictParameterTests public void ToString_ReturnsUnderlyingJsonValue() { // Arrange, act and assert - Assert.Equal(bool.TrueString, new OpenIddictParameter( + Assert.Equal("true", new OpenIddictParameter( JsonSerializer.Deserialize(@"{""field"":true}").GetProperty("field")).ToString()); - Assert.Equal(bool.FalseString, new OpenIddictParameter( + Assert.Equal("false", new OpenIddictParameter( JsonSerializer.Deserialize(@"{""field"":false}").GetProperty("field")).ToString()); Assert.Equal("Fabrikam", new OpenIddictParameter( JsonSerializer.Deserialize(@"{""field"":""Fabrikam""}").GetProperty("field")).ToString()); @@ -1270,8 +1270,8 @@ public class OpenIddictParameterTests JsonSerializer.Deserialize(@"{""field"":""value""}")).ToString()); #if SUPPORTS_JSON_NODES - Assert.Equal(bool.TrueString, new OpenIddictParameter(JsonValue.Create(true)).ToString()); - Assert.Equal(bool.FalseString, new OpenIddictParameter(JsonValue.Create(false)).ToString()); + Assert.Equal("true", new OpenIddictParameter(JsonValue.Create(true)).ToString()); + Assert.Equal("false", new OpenIddictParameter(JsonValue.Create(false)).ToString()); Assert.Equal("Fabrikam", new OpenIddictParameter(JsonValue.Create("Fabrikam")).ToString()); Assert.Equal(@"[""Fabrikam"",""Contoso""]", new OpenIddictParameter(new JsonArray("Fabrikam", "Contoso")).ToString()); @@ -1285,9 +1285,9 @@ public class OpenIddictParameterTests field = "value" })).ToString()); - Assert.Equal(bool.TrueString, new OpenIddictParameter(JsonValue.Create( + Assert.Equal("true", new OpenIddictParameter(JsonValue.Create( JsonSerializer.Deserialize(@"{""field"":true}").GetProperty("field"))).ToString()); - Assert.Equal(bool.FalseString, new OpenIddictParameter(JsonValue.Create( + Assert.Equal("false", new OpenIddictParameter(JsonValue.Create( JsonSerializer.Deserialize(@"{""field"":false}").GetProperty("field"))).ToString()); Assert.Equal("Fabrikam", new OpenIddictParameter(JsonValue.Create( JsonSerializer.Deserialize(@"{""field"":""Fabrikam""}").GetProperty("field"))).ToString()); @@ -2091,7 +2091,7 @@ public class OpenIddictParameterTests { // Arrange, act and assert Assert.Equal("Fabrikam", (string?) new OpenIddictParameter("Fabrikam")); - Assert.Equal("False", (string?) new OpenIddictParameter(false)); + Assert.Equal("false", (string?) new OpenIddictParameter(false)); Assert.Equal("42", (string?) new OpenIddictParameter(42)); } @@ -2101,20 +2101,20 @@ public class OpenIddictParameterTests // Arrange, act and assert Assert.Equal("Fabrikam", (string?) new OpenIddictParameter( JsonSerializer.Deserialize(@"{""field"":""Fabrikam""}").GetProperty("field"))); - Assert.Equal(bool.FalseString, (string?) new OpenIddictParameter( + Assert.Equal("false", (string?) new OpenIddictParameter( JsonSerializer.Deserialize(@"{""field"":false}").GetProperty("field"))); Assert.Equal("42", (string?) new OpenIddictParameter( JsonSerializer.Deserialize(@"{""field"":42}").GetProperty("field"))); #if SUPPORTS_JSON_NODES Assert.Equal("Fabrikam", (string?) new OpenIddictParameter(JsonValue.Create("Fabrikam"))); - Assert.Equal(bool.FalseString, (string?) new OpenIddictParameter(JsonValue.Create(false))); + Assert.Equal("false", (string?) new OpenIddictParameter(JsonValue.Create(false))); Assert.Equal("42", (string?) new OpenIddictParameter(JsonValue.Create(42))); Assert.Equal("42", (string?) new OpenIddictParameter(JsonValue.Create(42L))); Assert.Equal("Fabrikam", (string?) new OpenIddictParameter(JsonValue.Create( JsonSerializer.Deserialize(@"{""field"":""Fabrikam""}").GetProperty("field")))); - Assert.Equal(bool.FalseString, (string?) new OpenIddictParameter(JsonValue.Create( + Assert.Equal("false", (string?) new OpenIddictParameter(JsonValue.Create( JsonSerializer.Deserialize(@"{""field"":false}").GetProperty("field")))); Assert.Equal("42", (string?) new OpenIddictParameter(JsonValue.Create( JsonSerializer.Deserialize(@"{""field"":42}").GetProperty("field")))); @@ -2139,7 +2139,7 @@ public class OpenIddictParameterTests { // Arrange, act and assert Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter("Fabrikam")); - Assert.Equal(["False"], (string?[]?) new OpenIddictParameter(false)); + Assert.Equal(["false"], (string?[]?) new OpenIddictParameter(false)); Assert.Equal(["42"], (string?[]?) new OpenIddictParameter(42)); } @@ -2181,7 +2181,7 @@ public class OpenIddictParameterTests // Arrange, act and assert Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter( JsonSerializer.Deserialize(@"{""field"":""Fabrikam""}").GetProperty("field"))); - Assert.Equal(["False"], (string?[]?) new OpenIddictParameter( + Assert.Equal(["false"], (string?[]?) new OpenIddictParameter( JsonSerializer.Deserialize(@"{""field"":false}").GetProperty("field"))); Assert.Equal(["42"], (string?[]?) new OpenIddictParameter( JsonSerializer.Deserialize(@"{""field"":42}").GetProperty("field"))); @@ -2189,17 +2189,17 @@ public class OpenIddictParameterTests JsonSerializer.Deserialize(@"[""Fabrikam""]"))); Assert.Equal(["Contoso", "Fabrikam"], (string?[]?) new OpenIddictParameter( JsonSerializer.Deserialize(@"[""Contoso"",""Fabrikam""]"))); - Assert.Equal(["value", "42", bool.TrueString], (string?[]?) new OpenIddictParameter( + Assert.Equal(["value", "42", "true"], (string?[]?) new OpenIddictParameter( JsonSerializer.Deserialize(@"[""value"",42,true]"))); #if SUPPORTS_JSON_NODES Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter(JsonValue.Create("Fabrikam"))); - Assert.Equal([bool.FalseString], (string?[]?) new OpenIddictParameter(JsonValue.Create(false))); + Assert.Equal(["false"], (string?[]?) new OpenIddictParameter(JsonValue.Create(false))); Assert.Equal(["42"], (string?[]?) new OpenIddictParameter(JsonValue.Create(42))); Assert.Equal(["42"], (string?[]?) new OpenIddictParameter(JsonValue.Create(42L))); Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter(new JsonArray("Fabrikam"))); Assert.Equal(["Contoso", "Fabrikam"], (string?[]?) new OpenIddictParameter(new JsonArray("Contoso", "Fabrikam"))); - Assert.Equal(["value", "42", bool.TrueString], (string?[]?) new OpenIddictParameter(new JsonArray("value", 42, true))); + Assert.Equal(["value", "42", "true"], (string?[]?) new OpenIddictParameter(new JsonArray("value", 42, true))); #endif } }