Skip to content

Commit f06da1c

Browse files
Fixes exception when converting UDIs in a PropertyValueConverter (#20011)
* Changed to use TryParse * Changed to be a null check instead * Update to "is false" syntax and add unit tests. --------- Co-authored-by: Andy Butland <[email protected]>
1 parent da05e28 commit f06da1c

File tree

3 files changed

+97
-13
lines changed

3 files changed

+97
-13
lines changed

src/Umbraco.Infrastructure/Serialization/JsonUdiConverter.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@ public override bool CanConvert(Type typeToConvert)
1515

1616
/// <inheritdoc />
1717
public override Udi? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
18-
=> reader.GetString() is string value
19-
? UdiParser.Parse(value)
20-
: null;
18+
{
19+
if (reader.GetString() is string value && string.IsNullOrWhiteSpace(value) is false)
20+
{
21+
return UdiParser.Parse(value);
22+
}
23+
24+
return null;
25+
}
2126

2227
/// <inheritdoc />
2328
public override void Write(Utf8JsonWriter writer, Udi value, JsonSerializerOptions options)

tests/Umbraco.Tests.UnitTests/Umbraco.Core/Deploy/ArtifactBaseTests.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,37 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Deploy;
1212
[TestFixture]
1313
public class ArtifactBaseTests
1414
{
15-
[Test]
16-
public void CanSerialize()
17-
{
18-
var udi = new GuidUdi("test", Guid.Parse("3382d5433b5749d08919bc9961422a1f"));
19-
var artifact = new TestArtifact(udi, new List<ArtifactDependency>()) { Name = "Test Name", Alias = "testAlias" };
20-
21-
var serialized = JsonSerializer.Serialize(artifact, new JsonSerializerOptions()
15+
private readonly JsonSerializerOptions _jsonSerializerOptions = new JsonSerializerOptions
2216
{
2317
Converters =
2418
{
2519
new JsonUdiConverter(),
2620
}
27-
});
21+
};
2822

29-
var expected =
30-
"{\"Udi\":\"umb://test/3382d5433b5749d08919bc9961422a1f\",\"Dependencies\":[],\"Checksum\":\"test checksum value\",\"Name\":\"Test Name\",\"Alias\":\"testAlias\"}";
23+
[Test]
24+
public void Can_Serialize()
25+
{
26+
var udi = new GuidUdi("document", Guid.Parse("3382d5433b5749d08919bc9961422a1f"));
27+
var artifact = new TestArtifact(udi, []) { Name = "Test Name", Alias = "testAlias" };
28+
29+
string serialized = JsonSerializer.Serialize(artifact, _jsonSerializerOptions);
30+
31+
var expected = "{\"Udi\":\"umb://document/3382d5433b5749d08919bc9961422a1f\",\"Dependencies\":[],\"Checksum\":\"test checksum value\",\"Name\":\"Test Name\",\"Alias\":\"testAlias\"}";
3132
Assert.AreEqual(expected, serialized);
3233
}
3334

35+
[Test]
36+
public void Can_Deserialize()
37+
{
38+
var serialized = "{\"Udi\":\"umb://document/3382d5433b5749d08919bc9961422a1f\",\"Dependencies\":[],\"Checksum\":\"test checksum value\",\"Name\":\"Test Name\",\"Alias\":\"testAlias\"}";
39+
40+
TestArtifact? deserialized = JsonSerializer.Deserialize<TestArtifact>(serialized, _jsonSerializerOptions);
41+
Assert.IsNotNull(deserialized);
42+
Assert.AreEqual("Test Name", deserialized.Name);
43+
Assert.AreEqual("testAlias", deserialized.Alias);
44+
}
45+
3446
[Test]
3547
public void Dependencies_Are_Correctly_Ordered()
3648
{
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
using System.Text.Json;
2+
using NUnit.Framework;
3+
using Umbraco.Cms.Core;
4+
using Umbraco.Cms.Infrastructure.Serialization;
5+
6+
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Serialization;
7+
8+
[TestFixture]
9+
public class JsonUdiConverterTests
10+
{
11+
private readonly JsonSerializerOptions _jsonSerializerOptions = new JsonSerializerOptions
12+
{
13+
Converters =
14+
{
15+
new JsonUdiConverter(),
16+
},
17+
};
18+
19+
[Test]
20+
public void Can_Serialize()
21+
{
22+
var udi = new GuidUdi("document", Guid.Parse("3382d5433b5749d08919bc9961422a1f"));
23+
var artifact = new Test { Udi = udi };
24+
25+
string serialized = JsonSerializer.Serialize(artifact, _jsonSerializerOptions);
26+
27+
var expected = "{\"Udi\":\"umb://document/3382d5433b5749d08919bc9961422a1f\"}";
28+
Assert.AreEqual(expected, serialized);
29+
}
30+
31+
[Test]
32+
public void Can_Deserialize()
33+
{
34+
var serialized = "{\"Udi\":\"umb://document/3382d5433b5749d08919bc9961422a1f\"}";
35+
36+
Test? deserialized = JsonSerializer.Deserialize<Test>(serialized, _jsonSerializerOptions);
37+
Assert.IsNotNull(deserialized);
38+
Assert.AreEqual(Guid.Parse("3382d5433b5749d08919bc9961422a1f"), deserialized.Udi.Guid);
39+
}
40+
41+
[TestCase(null)]
42+
[TestCase("")]
43+
[TestCase(" ")]
44+
public void Will_Deserialize_To_Null_With_Null_Or_Whitepsace_Udi(string? serializedUdi)
45+
{
46+
var serializedUdiPart = serializedUdi is null ? "null" : $"\"{serializedUdi}\"";
47+
var serialized = "{\"Udi\":" + serializedUdiPart + "}";
48+
49+
Test? deserialized = JsonSerializer.Deserialize<Test>(serialized, _jsonSerializerOptions);
50+
Assert.IsNotNull(deserialized);
51+
Assert.IsNull(deserialized.Udi);
52+
}
53+
54+
[Test]
55+
public void Throws_On_Invalid_Udi()
56+
{
57+
var serialized = "{\"Udi\":\"invalid-udi\"}";
58+
59+
Assert.Throws<FormatException>(() =>
60+
JsonSerializer.Deserialize<Test>(serialized, _jsonSerializerOptions));
61+
}
62+
63+
private class Test
64+
{
65+
public GuidUdi? Udi { get; set; }
66+
}
67+
}

0 commit comments

Comments
 (0)