Browse Source

Update OpenIddictParameter to return "true" and "false" for string/string array conversions

pull/2101/head
Kévin Chalet 2 years ago
parent
commit
f6975e6506
  1. 83
      src/OpenIddict.Abstractions/Primitives/OpenIddictParameter.cs
  2. 34
      test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictParameterTests.cs

83
src/OpenIddict.Abstractions/Primitives/OpenIddictParameter.cs

@ -598,20 +598,29 @@ public readonly struct OpenIddictParameter : IEquatable<OpenIddictParameter>
{ {
null => string.Empty, null => string.Empty,
bool value => value ? bool.TrueString : bool.FalseString, bool value => value ? "true" : "false",
long value => value.ToString(CultureInfo.InvariantCulture), long value => value.ToString(CultureInfo.InvariantCulture),
string value => value, string value => value,
string?[] value => string.Join(", ", value), string?[] value => string.Join(", ", value),
JsonElement { ValueKind: JsonValueKind.True } => "true",
JsonElement { ValueKind: JsonValueKind.False } => "false",
JsonElement value => value.ToString(), JsonElement value => value.ToString(),
#if SUPPORTS_JSON_NODES #if SUPPORTS_JSON_NODES
JsonValue value when value.TryGetValue(out JsonElement element) 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) JsonValue value when value.TryGetValue(out bool result)
=> result ? bool.TrueString : bool.FalseString, => result ? "true" : "false",
JsonValue value when value.TryGetValue(out int result) JsonValue value when value.TryGetValue(out int result)
=> result.ToString(CultureInfo.InvariantCulture), => result.ToString(CultureInfo.InvariantCulture),
@ -621,7 +630,14 @@ public readonly struct OpenIddictParameter : IEquatable<OpenIddictParameter>
JsonValue value when value.TryGetValue(out string? result) => result, 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 #endif
_ => string.Empty _ => string.Empty
}; };
@ -1058,11 +1074,15 @@ public readonly struct OpenIddictParameter : IEquatable<OpenIddictParameter>
string value => value, string value => value,
// When the parameter is a boolean value, use its string representation. // 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. // When the parameter is an integer, use its string representation.
long value => value.ToString(CultureInfo.InvariantCulture), 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. // When the parameter is a JsonElement, try to convert it if it's of a supported type.
JsonElement value => ConvertFromJsonElement(value), JsonElement value => ConvertFromJsonElement(value),
@ -1075,7 +1095,7 @@ public readonly struct OpenIddictParameter : IEquatable<OpenIddictParameter>
JsonValue value when value.TryGetValue(out string? result) => result, JsonValue value when value.TryGetValue(out string? result) => result,
// When the parameter is a JsonValue wrapping a boolean, return its representation. // 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. // When the parameter is a JsonValue wrapping a boolean, return its representation.
JsonValue value when value.TryGetValue(out int result) => result.ToString(CultureInfo.InvariantCulture), JsonValue value when value.TryGetValue(out int result) => result.ToString(CultureInfo.InvariantCulture),
@ -1093,11 +1113,14 @@ public readonly struct OpenIddictParameter : IEquatable<OpenIddictParameter>
static string? ConvertFromJsonElement(JsonElement element) => element.ValueKind switch static string? ConvertFromJsonElement(JsonElement element) => element.ValueKind switch
{ {
// When the parameter is a JsonElement representing a string, // When the parameter is a JsonElement representing
// a number or a boolean, return its string representation. // a boolean, return its string representation.
JsonValueKind.String or JsonValueKind.Number or JsonValueKind.True => "true",
JsonValueKind.True or JsonValueKind.False JsonValueKind.False => "false",
=> element.ToString(),
// When the parameter is a JsonElement representing a
// string or a number, return its string representation.
JsonValueKind.String or JsonValueKind.Number => element.ToString(),
_ => null _ => null
}; };
@ -1122,11 +1145,15 @@ public readonly struct OpenIddictParameter : IEquatable<OpenIddictParameter>
string value => [value], string value => [value],
// When the parameter is a boolean value, return an array with its string representation. // 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. // When the parameter is an integer, return an array with its string representation.
long value => [value.ToString(CultureInfo.InvariantCulture)], 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. // When the parameter is a JsonElement, try to convert it if it's of a supported type.
JsonElement value => ConvertFromJsonElement(value), JsonElement value => ConvertFromJsonElement(value),
@ -1140,7 +1167,7 @@ public readonly struct OpenIddictParameter : IEquatable<OpenIddictParameter>
// When the parameter is a JsonValue wrapping a boolean, return an array with its string representation. // When the parameter is a JsonValue wrapping a boolean, return an array with its string representation.
JsonValue value when value.TryGetValue(out bool result) 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. // When the parameter is a JsonValue wrapping an integer, return an array with its string representation.
JsonValue value when value.TryGetValue(out int result) JsonValue value when value.TryGetValue(out int result)
@ -1161,8 +1188,13 @@ public readonly struct OpenIddictParameter : IEquatable<OpenIddictParameter>
static string?[]? ConvertFromJsonElement(JsonElement element) => element.ValueKind switch static string?[]? ConvertFromJsonElement(JsonElement element) => element.ValueKind switch
{ {
// When the parameter is a JsonElement representing a string, a number // When the parameter is a JsonElement representing a boolean,
// or a boolean, return an 1-item array with its string representation. // 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.String or JsonValueKind.Number or
JsonValueKind.True or JsonValueKind.False JsonValueKind.True or JsonValueKind.False
=> [element.ToString()], => [element.ToString()],
@ -1180,14 +1212,27 @@ public readonly struct OpenIddictParameter : IEquatable<OpenIddictParameter>
for (var index = 0; index < length; index++) 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. // 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 else
JsonValueKind.True or JsonValueKind.False } item)
{ {
return null; return null;
} }
array[index] = item.ToString();
} }
return array; return array;

34
test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictParameterTests.cs

@ -1160,8 +1160,8 @@ public class OpenIddictParameterTests
public void ToString_ReturnsBooleanValue() public void ToString_ReturnsBooleanValue()
{ {
// Arrange, act and assert // Arrange, act and assert
Assert.Equal(bool.TrueString, new OpenIddictParameter(true).ToString()); Assert.Equal("true", new OpenIddictParameter(true).ToString());
Assert.Equal(bool.FalseString, new OpenIddictParameter(false).ToString()); Assert.Equal("false", new OpenIddictParameter(false).ToString());
} }
[Fact] [Fact]
@ -1258,9 +1258,9 @@ public class OpenIddictParameterTests
public void ToString_ReturnsUnderlyingJsonValue() public void ToString_ReturnsUnderlyingJsonValue()
{ {
// Arrange, act and assert // Arrange, act and assert
Assert.Equal(bool.TrueString, new OpenIddictParameter( Assert.Equal("true", new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":true}").GetProperty("field")).ToString()); JsonSerializer.Deserialize<JsonElement>(@"{""field"":true}").GetProperty("field")).ToString());
Assert.Equal(bool.FalseString, new OpenIddictParameter( Assert.Equal("false", new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field")).ToString()); JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field")).ToString());
Assert.Equal("Fabrikam", new OpenIddictParameter( Assert.Equal("Fabrikam", new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field")).ToString()); JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field")).ToString());
@ -1270,8 +1270,8 @@ public class OpenIddictParameterTests
JsonSerializer.Deserialize<JsonElement>(@"{""field"":""value""}")).ToString()); JsonSerializer.Deserialize<JsonElement>(@"{""field"":""value""}")).ToString());
#if SUPPORTS_JSON_NODES #if SUPPORTS_JSON_NODES
Assert.Equal(bool.TrueString, new OpenIddictParameter(JsonValue.Create(true)).ToString()); Assert.Equal("true", new OpenIddictParameter(JsonValue.Create(true)).ToString());
Assert.Equal(bool.FalseString, new OpenIddictParameter(JsonValue.Create(false)).ToString()); Assert.Equal("false", new OpenIddictParameter(JsonValue.Create(false)).ToString());
Assert.Equal("Fabrikam", new OpenIddictParameter(JsonValue.Create("Fabrikam")).ToString()); Assert.Equal("Fabrikam", new OpenIddictParameter(JsonValue.Create("Fabrikam")).ToString());
Assert.Equal(@"[""Fabrikam"",""Contoso""]", new OpenIddictParameter(new JsonArray("Fabrikam", "Contoso")).ToString()); Assert.Equal(@"[""Fabrikam"",""Contoso""]", new OpenIddictParameter(new JsonArray("Fabrikam", "Contoso")).ToString());
@ -1285,9 +1285,9 @@ public class OpenIddictParameterTests
field = "value" field = "value"
})).ToString()); })).ToString());
Assert.Equal(bool.TrueString, new OpenIddictParameter(JsonValue.Create( Assert.Equal("true", new OpenIddictParameter(JsonValue.Create(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":true}").GetProperty("field"))).ToString()); JsonSerializer.Deserialize<JsonElement>(@"{""field"":true}").GetProperty("field"))).ToString());
Assert.Equal(bool.FalseString, new OpenIddictParameter(JsonValue.Create( Assert.Equal("false", new OpenIddictParameter(JsonValue.Create(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field"))).ToString()); JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field"))).ToString());
Assert.Equal("Fabrikam", new OpenIddictParameter(JsonValue.Create( Assert.Equal("Fabrikam", new OpenIddictParameter(JsonValue.Create(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field"))).ToString()); JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field"))).ToString());
@ -2091,7 +2091,7 @@ public class OpenIddictParameterTests
{ {
// Arrange, act and assert // Arrange, act and assert
Assert.Equal("Fabrikam", (string?) new OpenIddictParameter("Fabrikam")); 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)); Assert.Equal("42", (string?) new OpenIddictParameter(42));
} }
@ -2101,20 +2101,20 @@ public class OpenIddictParameterTests
// Arrange, act and assert // Arrange, act and assert
Assert.Equal("Fabrikam", (string?) new OpenIddictParameter( Assert.Equal("Fabrikam", (string?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field"))); JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field")));
Assert.Equal(bool.FalseString, (string?) new OpenIddictParameter( Assert.Equal("false", (string?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field"))); JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field")));
Assert.Equal("42", (string?) new OpenIddictParameter( Assert.Equal("42", (string?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":42}").GetProperty("field"))); JsonSerializer.Deserialize<JsonElement>(@"{""field"":42}").GetProperty("field")));
#if SUPPORTS_JSON_NODES #if SUPPORTS_JSON_NODES
Assert.Equal("Fabrikam", (string?) new OpenIddictParameter(JsonValue.Create("Fabrikam"))); 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(42)));
Assert.Equal("42", (string?) new OpenIddictParameter(JsonValue.Create(42L))); Assert.Equal("42", (string?) new OpenIddictParameter(JsonValue.Create(42L)));
Assert.Equal("Fabrikam", (string?) new OpenIddictParameter(JsonValue.Create( Assert.Equal("Fabrikam", (string?) new OpenIddictParameter(JsonValue.Create(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field")))); JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field"))));
Assert.Equal(bool.FalseString, (string?) new OpenIddictParameter(JsonValue.Create( Assert.Equal("false", (string?) new OpenIddictParameter(JsonValue.Create(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field")))); JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field"))));
Assert.Equal("42", (string?) new OpenIddictParameter(JsonValue.Create( Assert.Equal("42", (string?) new OpenIddictParameter(JsonValue.Create(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":42}").GetProperty("field")))); JsonSerializer.Deserialize<JsonElement>(@"{""field"":42}").GetProperty("field"))));
@ -2139,7 +2139,7 @@ public class OpenIddictParameterTests
{ {
// Arrange, act and assert // Arrange, act and assert
Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter("Fabrikam")); 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)); Assert.Equal(["42"], (string?[]?) new OpenIddictParameter(42));
} }
@ -2181,7 +2181,7 @@ public class OpenIddictParameterTests
// Arrange, act and assert // Arrange, act and assert
Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter( Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field"))); JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field")));
Assert.Equal(["False"], (string?[]?) new OpenIddictParameter( Assert.Equal(["false"], (string?[]?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field"))); JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field")));
Assert.Equal(["42"], (string?[]?) new OpenIddictParameter( Assert.Equal(["42"], (string?[]?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":42}").GetProperty("field"))); JsonSerializer.Deserialize<JsonElement>(@"{""field"":42}").GetProperty("field")));
@ -2189,17 +2189,17 @@ public class OpenIddictParameterTests
JsonSerializer.Deserialize<JsonElement>(@"[""Fabrikam""]"))); JsonSerializer.Deserialize<JsonElement>(@"[""Fabrikam""]")));
Assert.Equal(["Contoso", "Fabrikam"], (string?[]?) new OpenIddictParameter( Assert.Equal(["Contoso", "Fabrikam"], (string?[]?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"[""Contoso"",""Fabrikam""]"))); JsonSerializer.Deserialize<JsonElement>(@"[""Contoso"",""Fabrikam""]")));
Assert.Equal(["value", "42", bool.TrueString], (string?[]?) new OpenIddictParameter( Assert.Equal(["value", "42", "true"], (string?[]?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"[""value"",42,true]"))); JsonSerializer.Deserialize<JsonElement>(@"[""value"",42,true]")));
#if SUPPORTS_JSON_NODES #if SUPPORTS_JSON_NODES
Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter(JsonValue.Create("Fabrikam"))); 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(42)));
Assert.Equal(["42"], (string?[]?) new OpenIddictParameter(JsonValue.Create(42L))); Assert.Equal(["42"], (string?[]?) new OpenIddictParameter(JsonValue.Create(42L)));
Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter(new JsonArray("Fabrikam"))); Assert.Equal(["Fabrikam"], (string?[]?) new OpenIddictParameter(new JsonArray("Fabrikam")));
Assert.Equal(["Contoso", "Fabrikam"], (string?[]?) new OpenIddictParameter(new JsonArray("Contoso", "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 #endif
} }
} }

Loading…
Cancel
Save