Skip to content

Commit efc1ed2

Browse files
committed
Move converter, implement serialize, and add roundtrip test
1 parent 290b81e commit efc1ed2

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed
Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,30 @@ public class ChangesFieldValueChangeConverter : JsonConverter<ChangesFieldValueC
2828
}
2929
}
3030

31-
public override void Write(Utf8JsonWriter writer, ChangesFieldValueChangeBase value, JsonSerializerOptions options) => throw new NotImplementedException();
31+
public override void Write(Utf8JsonWriter writer, ChangesFieldValueChangeBase value, JsonSerializerOptions options)
32+
{
33+
if (value is ChangesFieldValueScalarChange scalarChange)
34+
{
35+
if (scalarChange.StringValue is not null)
36+
{
37+
writer.WriteStringValue(scalarChange.StringValue);
38+
}
39+
else if (scalarChange.NumericValue is not null)
40+
{
41+
writer.WriteNumberValue(scalarChange.NumericValue.Value);
42+
}
43+
else
44+
{
45+
writer.WriteNullValue();
46+
}
47+
}
48+
else if (value is ChangesFieldValueChange change)
49+
{
50+
JsonSerializer.Serialize(writer, change, options);
51+
}
52+
else
53+
{
54+
writer.WriteNullValue();
55+
}
56+
}
3257
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
namespace Octokit.Webhooks.Test.Converter;
2+
3+
using System;
4+
using System.Text.Json;
5+
using System.Text.Json.Serialization;
6+
using AwesomeAssertions;
7+
using Octokit.Webhooks.Models.ProjectsV2ItemEvent;
8+
using Xunit;
9+
10+
public class ChangesFieldValueChangeConverterTests(ITestOutputHelper output)
11+
{
12+
private readonly JsonSerializerOptions options = new()
13+
{
14+
WriteIndented = true,
15+
Converters =
16+
{
17+
new ChangesFieldValueChangeConverter(),
18+
},
19+
};
20+
21+
[Fact]
22+
public void Roundtrip()
23+
{
24+
var test = new TestObject
25+
{
26+
AsString = new ChangesFieldValueScalarChange { StringValue = "Hello world" },
27+
AsNumber = new ChangesFieldValueScalarChange { NumericValue = 3.1415926m },
28+
AsObject = new ChangesFieldValueChange
29+
{
30+
Color = "color",
31+
Description = "description",
32+
Id = "12345",
33+
Name = "Name",
34+
},
35+
};
36+
37+
var serialized = JsonSerializer.Serialize(test, this.options);
38+
output.WriteLine(serialized);
39+
40+
var deserialized = JsonSerializer.Deserialize<TestObject>(serialized, this.options);
41+
42+
deserialized.Should().NotBeNull();
43+
deserialized.AsString.Should().NotBeNull().And.BeOfType<ChangesFieldValueScalarChange>();
44+
deserialized.AsNumber.Should().NotBeNull().And.BeOfType<ChangesFieldValueScalarChange>();
45+
46+
(deserialized.AsString as ChangesFieldValueScalarChange)?.StringValue.Should().Be("Hello world");
47+
(deserialized.AsString as ChangesFieldValueScalarChange)?.NumericValue.Should().BeNull();
48+
49+
(deserialized.AsNumber as ChangesFieldValueScalarChange)?.StringValue.Should().BeNull();
50+
(deserialized.AsNumber as ChangesFieldValueScalarChange)?.NumericValue.Should().Be(3.1415926m);
51+
52+
deserialized.AsObject.Should().NotBeNull().And.BeOfType<ChangesFieldValueChange>();
53+
var changeObject = deserialized.AsObject.As<ChangesFieldValueChange>();
54+
55+
changeObject.Color.Should().Be("color");
56+
changeObject.Description.Should().Be("description");
57+
changeObject.Id.Should().Be("12345");
58+
changeObject.Name.Should().Be("Name");
59+
}
60+
61+
internal sealed class TestObject
62+
{
63+
[JsonPropertyName("as_string")]
64+
public ChangesFieldValueChangeBase AsString { get; init; } = null!;
65+
66+
[JsonPropertyName("as_number")]
67+
public ChangesFieldValueChangeBase AsNumber { get; init; } = null!;
68+
69+
[JsonPropertyName("as_object")]
70+
public ChangesFieldValueChangeBase AsObject { get; init; } = null!;
71+
}
72+
}

0 commit comments

Comments
 (0)