From dc2701cb5eb12a4050428c572e86199ea70927b5 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Wed, 14 Dec 2022 11:39:36 +0100 Subject: [PATCH] Handle StringValues in ObjectExtensions.TryConvertTo (#13575) --- .../Extensions/ObjectExtensions.cs | 6 ++- .../CoreThings/ObjectExtensionsTests.cs | 51 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/Extensions/ObjectExtensions.cs b/src/Umbraco.Core/Extensions/ObjectExtensions.cs index 6dc220446b..f0f10d8cc6 100644 --- a/src/Umbraco.Core/Extensions/ObjectExtensions.cs +++ b/src/Umbraco.Core/Extensions/ObjectExtensions.cs @@ -8,6 +8,7 @@ using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Xml; +using Microsoft.Extensions.Primitives; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Collections; @@ -189,9 +190,10 @@ public static class ObjectExtensions else { // target is not a generic type - if (input is string inputString) + var inputString = input as string ?? (input is StringValues sv ? sv.ToString() : null); + if (inputString != null) { - // Try convert from string, returns an Attempt if the string could be + // Try convert from string or StringValues, returns an Attempt if the string could be // processed (either succeeded or failed), else null if we need to try // other methods Attempt? result = TryConvertToFromString(inputString, target); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/ObjectExtensionsTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/ObjectExtensionsTests.cs index dc87f7094c..bfbe581f2e 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/ObjectExtensionsTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/ObjectExtensionsTests.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Threading; +using Microsoft.Extensions.Primitives; using NUnit.Framework; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Tests.Common.TestHelpers; @@ -281,6 +282,56 @@ public class ObjectExtensionsTests Assert.AreEqual(new DateTime(2016, 6, 7), conv.Result); } + [TestCase("d72f12a9-29db-42b4-9ffb-25a3ba4dcef5")] + [TestCase("D72F12A9-29DB-42B4-9FFB-25A3BA4DCEF5")] + public void CanConvertToGuid(string guidValue) + { + var conv = guidValue.TryConvertTo(); + Assert.IsTrue(conv); + Assert.AreEqual(Guid.Parse(guidValue), conv.Result); + } + + [TestCase("d72f12a9-29db-42b4-9ffb-25a3ba4dcef5")] + [TestCase("D72F12A9-29DB-42B4-9FFB-25A3BA4DCEF5")] + public void CanConvertToNullableGuid(string guidValue) + { + var conv = guidValue.TryConvertTo(); + Assert.IsTrue(conv); + Assert.AreEqual(Guid.Parse(guidValue), conv.Result); + } + + [TestCase("d72f12a9-29db-42b4-9ffb-25a3ba4dcef5")] + [TestCase("D72F12A9-29DB-42B4-9FFB-25A3BA4DCEF5")] + public void CanConvertStringValuesToNullableGuid(string guidValue) + { + StringValues stringValues = guidValue; + var conv = stringValues.TryConvertTo(); + Assert.IsTrue(conv); + Assert.AreEqual(Guid.Parse(guidValue), conv.Result); + } + + [TestCase(10)] + [TestCase(0)] + [TestCase(-10)] + [TestCase(int.MinValue)] + [TestCase(int.MaxValue)] + public void CanConvertStringValuesToInt(int intValue) + { + StringValues stringValues = intValue.ToString(); + var conv = stringValues.TryConvertTo(); + Assert.IsTrue(conv); + Assert.AreEqual(intValue, conv.Result); + } + + [Test] + public void CanConvertStringValuesToString() + { + StringValues stringValues = "This is a string"; + var conv = stringValues.TryConvertTo(); + Assert.IsTrue(conv); + Assert.AreEqual("This is a string", conv.Result); + } + [Test] public void Value_Editor_Can_Convert_Decimal_To_Decimal_Clr_Type() {