diff --git a/src/Umbraco.Infrastructure/Serialization/JsonUdiConverter.cs b/src/Umbraco.Infrastructure/Serialization/JsonUdiConverter.cs index 0528f5e983..b909d9b3cc 100644 --- a/src/Umbraco.Infrastructure/Serialization/JsonUdiConverter.cs +++ b/src/Umbraco.Infrastructure/Serialization/JsonUdiConverter.cs @@ -15,9 +15,14 @@ public sealed class JsonUdiConverter : JsonConverter /// public override Udi? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - => reader.GetString() is string value - ? UdiParser.Parse(value) - : null; + { + if (reader.GetString() is string value && string.IsNullOrWhiteSpace(value) is false) + { + return UdiParser.Parse(value); + } + + return null; + } /// public override void Write(Utf8JsonWriter writer, Udi value, JsonSerializerOptions options) diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Deploy/ArtifactBaseTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Deploy/ArtifactBaseTests.cs index fddae4a60c..1a20ee76b2 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Deploy/ArtifactBaseTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Deploy/ArtifactBaseTests.cs @@ -12,25 +12,37 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Deploy; [TestFixture] public class ArtifactBaseTests { - [Test] - public void CanSerialize() - { - var udi = new GuidUdi("test", Guid.Parse("3382d5433b5749d08919bc9961422a1f")); - var artifact = new TestArtifact(udi, new List()) { Name = "Test Name", Alias = "testAlias" }; - - var serialized = JsonSerializer.Serialize(artifact, new JsonSerializerOptions() + private readonly JsonSerializerOptions _jsonSerializerOptions = new JsonSerializerOptions { Converters = { new JsonUdiConverter(), } - }); + }; - var expected = - "{\"Udi\":\"umb://test/3382d5433b5749d08919bc9961422a1f\",\"Dependencies\":[],\"Checksum\":\"test checksum value\",\"Name\":\"Test Name\",\"Alias\":\"testAlias\"}"; + [Test] + public void Can_Serialize() + { + var udi = new GuidUdi("document", Guid.Parse("3382d5433b5749d08919bc9961422a1f")); + var artifact = new TestArtifact(udi, []) { Name = "Test Name", Alias = "testAlias" }; + + string serialized = JsonSerializer.Serialize(artifact, _jsonSerializerOptions); + + var expected = "{\"Udi\":\"umb://document/3382d5433b5749d08919bc9961422a1f\",\"Dependencies\":[],\"Checksum\":\"test checksum value\",\"Name\":\"Test Name\",\"Alias\":\"testAlias\"}"; Assert.AreEqual(expected, serialized); } + [Test] + public void Can_Deserialize() + { + var serialized = "{\"Udi\":\"umb://document/3382d5433b5749d08919bc9961422a1f\",\"Dependencies\":[],\"Checksum\":\"test checksum value\",\"Name\":\"Test Name\",\"Alias\":\"testAlias\"}"; + + TestArtifact? deserialized = JsonSerializer.Deserialize(serialized, _jsonSerializerOptions); + Assert.IsNotNull(deserialized); + Assert.AreEqual("Test Name", deserialized.Name); + Assert.AreEqual("testAlias", deserialized.Alias); + } + [Test] public void Dependencies_Are_Correctly_Ordered() { diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Serialization/JsonUdiConverterTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Serialization/JsonUdiConverterTests.cs new file mode 100644 index 0000000000..7462c8335a --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Serialization/JsonUdiConverterTests.cs @@ -0,0 +1,67 @@ +using System.Text.Json; +using NUnit.Framework; +using Umbraco.Cms.Core; +using Umbraco.Cms.Infrastructure.Serialization; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Serialization; + +[TestFixture] +public class JsonUdiConverterTests +{ + private readonly JsonSerializerOptions _jsonSerializerOptions = new JsonSerializerOptions + { + Converters = + { + new JsonUdiConverter(), + }, + }; + + [Test] + public void Can_Serialize() + { + var udi = new GuidUdi("document", Guid.Parse("3382d5433b5749d08919bc9961422a1f")); + var artifact = new Test { Udi = udi }; + + string serialized = JsonSerializer.Serialize(artifact, _jsonSerializerOptions); + + var expected = "{\"Udi\":\"umb://document/3382d5433b5749d08919bc9961422a1f\"}"; + Assert.AreEqual(expected, serialized); + } + + [Test] + public void Can_Deserialize() + { + var serialized = "{\"Udi\":\"umb://document/3382d5433b5749d08919bc9961422a1f\"}"; + + Test? deserialized = JsonSerializer.Deserialize(serialized, _jsonSerializerOptions); + Assert.IsNotNull(deserialized); + Assert.AreEqual(Guid.Parse("3382d5433b5749d08919bc9961422a1f"), deserialized.Udi.Guid); + } + + [TestCase(null)] + [TestCase("")] + [TestCase(" ")] + public void Will_Deserialize_To_Null_With_Null_Or_Whitepsace_Udi(string? serializedUdi) + { + var serializedUdiPart = serializedUdi is null ? "null" : $"\"{serializedUdi}\""; + var serialized = "{\"Udi\":" + serializedUdiPart + "}"; + + Test? deserialized = JsonSerializer.Deserialize(serialized, _jsonSerializerOptions); + Assert.IsNotNull(deserialized); + Assert.IsNull(deserialized.Udi); + } + + [Test] + public void Throws_On_Invalid_Udi() + { + var serialized = "{\"Udi\":\"invalid-udi\"}"; + + Assert.Throws(() => + JsonSerializer.Deserialize(serialized, _jsonSerializerOptions)); + } + + private class Test + { + public GuidUdi? Udi { get; set; } + } +}