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,
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<OpenIddictParameter>
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<OpenIddictParameter>
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<OpenIddictParameter>
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<OpenIddictParameter>
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<OpenIddictParameter>
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<OpenIddictParameter>
// 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<OpenIddictParameter>
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<OpenIddictParameter>
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;

34
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<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());
Assert.Equal("Fabrikam", new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field")).ToString());
@ -1270,8 +1270,8 @@ public class OpenIddictParameterTests
JsonSerializer.Deserialize<JsonElement>(@"{""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<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());
Assert.Equal("Fabrikam", new OpenIddictParameter(JsonValue.Create(
JsonSerializer.Deserialize<JsonElement>(@"{""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<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")));
Assert.Equal("42", (string?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""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<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"))));
Assert.Equal("42", (string?) new OpenIddictParameter(JsonValue.Create(
JsonSerializer.Deserialize<JsonElement>(@"{""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<JsonElement>(@"{""field"":""Fabrikam""}").GetProperty("field")));
Assert.Equal(["False"], (string?[]?) new OpenIddictParameter(
Assert.Equal(["false"], (string?[]?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":false}").GetProperty("field")));
Assert.Equal(["42"], (string?[]?) new OpenIddictParameter(
JsonSerializer.Deserialize<JsonElement>(@"{""field"":42}").GetProperty("field")));
@ -2189,17 +2189,17 @@ public class OpenIddictParameterTests
JsonSerializer.Deserialize<JsonElement>(@"[""Fabrikam""]")));
Assert.Equal(["Contoso", "Fabrikam"], (string?[]?) new OpenIddictParameter(
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]")));
#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
}
}

Loading…
Cancel
Save