Skip to content

Commit 0dd517f

Browse files
author
Bart Koelman
committed
Use configured STJ options for null/default value inclusion
Bugfix: do not break out of method on first attribute
1 parent 9353f3a commit 0dd517f

File tree

4 files changed

+93
-118
lines changed

4 files changed

+93
-118
lines changed

src/JsonApiDotNetCore/Serialization/Building/ResourceObjectBuilder.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
using System.Collections.Generic;
22
using System.Linq;
3+
using System.Text.Json.Serialization;
34
using JetBrains.Annotations;
45
using JsonApiDotNetCore.Configuration;
56
using JsonApiDotNetCore.Resources;
67
using JsonApiDotNetCore.Resources.Annotations;
78
using JsonApiDotNetCore.Resources.Internal;
89
using JsonApiDotNetCore.Serialization.Objects;
9-
using Newtonsoft.Json;
1010

1111
namespace JsonApiDotNetCore.Serialization.Building
1212
{
@@ -168,15 +168,15 @@ private void ProcessAttributes(IIdentifiable resource, IEnumerable<AttrAttribute
168168
{
169169
object value = attr.GetValue(resource);
170170

171-
if (_options.SerializerSettings.NullValueHandling == NullValueHandling.Ignore && value == null)
171+
if (_options.SerializerOptions.DefaultIgnoreCondition == JsonIgnoreCondition.WhenWritingNull && value == null)
172172
{
173-
return;
173+
continue;
174174
}
175175

176-
if (_options.SerializerSettings.DefaultValueHandling == DefaultValueHandling.Ignore &&
176+
if (_options.SerializerOptions.DefaultIgnoreCondition == JsonIgnoreCondition.WhenWritingDefault &&
177177
Equals(value, RuntimeTypeConverter.GetDefaultValue(attr.Property.PropertyType)))
178178
{
179-
return;
179+
continue;
180180
}
181181

182182
ro.Attributes.Add(attr.PublicName, value);

test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Calendar.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ public sealed class Calendar : Identifiable
1111
[Attr]
1212
public string TimeZone { get; set; }
1313

14+
[Attr]
15+
public bool ShowWeekNumbers { get; set; }
16+
1417
[Attr]
1518
public int DefaultAppointmentDurationInMinutes { get; set; }
1619

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
using System.Linq;
2+
using System.Net;
3+
using System.Net.Http;
4+
using System.Text.Json.Serialization;
5+
using System.Threading.Tasks;
6+
using FluentAssertions;
7+
using FluentAssertions.Extensions;
8+
using JsonApiDotNetCore.Configuration;
9+
using JsonApiDotNetCore.Serialization.Objects;
10+
using Microsoft.Extensions.DependencyInjection;
11+
using TestBuildingBlocks;
12+
using Xunit;
13+
14+
namespace JsonApiDotNetCoreTests.IntegrationTests.QueryStrings
15+
{
16+
public sealed class SerializerIgnoreConditionTests : IntegrationTestContext<TestableStartup<QueryStringDbContext>, QueryStringDbContext>
17+
{
18+
private readonly QueryStringFakers _fakers = new();
19+
20+
public SerializerIgnoreConditionTests()
21+
{
22+
UseController<CalendarsController>();
23+
}
24+
25+
[Theory]
26+
[InlineData(JsonIgnoreCondition.Never, true, true)]
27+
[InlineData(JsonIgnoreCondition.WhenWritingDefault, false, false)]
28+
[InlineData(JsonIgnoreCondition.WhenWritingNull, false, true)]
29+
public async Task Applies_configuration_for_ignore_condition(JsonIgnoreCondition configurationValue, bool expectNullValueInDocument,
30+
bool expectDefaultValueInDocument)
31+
{
32+
// Arrange
33+
var options = (JsonApiOptions)Factory.Services.GetRequiredService<IJsonApiOptions>();
34+
options.SerializerOptions.DefaultIgnoreCondition = configurationValue;
35+
36+
Calendar calendar = _fakers.Calendar.Generate();
37+
calendar.TimeZone = null;
38+
calendar.DefaultAppointmentDurationInMinutes = default;
39+
calendar.ShowWeekNumbers = true;
40+
calendar.Appointments = _fakers.Appointment.Generate(1).ToHashSet();
41+
calendar.Appointments.Single().Title = null;
42+
calendar.Appointments.Single().StartTime = default;
43+
calendar.Appointments.Single().EndTime = 1.January(2001);
44+
45+
await RunOnDatabaseAsync(async dbContext =>
46+
{
47+
dbContext.Calendars.Add(calendar);
48+
await dbContext.SaveChangesAsync();
49+
});
50+
51+
string route = $"/calendars/{calendar.StringId}?include=appointments";
52+
53+
// Act
54+
(HttpResponseMessage httpResponse, Document responseDocument) = await ExecuteGetAsync<Document>(route);
55+
56+
// Assert
57+
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
58+
59+
responseDocument.SingleData.Should().NotBeNull();
60+
responseDocument.Included.Should().HaveCount(1);
61+
62+
if (expectNullValueInDocument)
63+
{
64+
responseDocument.SingleData.Attributes.Should().ContainKey("timeZone");
65+
responseDocument.Included[0].Attributes.Should().ContainKey("title");
66+
}
67+
else
68+
{
69+
responseDocument.SingleData.Attributes.Should().NotContainKey("timeZone");
70+
responseDocument.Included[0].Attributes.Should().NotContainKey("title");
71+
}
72+
73+
if (expectDefaultValueInDocument)
74+
{
75+
responseDocument.SingleData.Attributes.Should().ContainKey("defaultAppointmentDurationInMinutes");
76+
responseDocument.Included[0].Attributes.Should().ContainKey("startTime");
77+
}
78+
else
79+
{
80+
responseDocument.SingleData.Attributes.Should().NotContainKey("defaultAppointmentDurationInMinutes");
81+
responseDocument.Included[0].Attributes.Should().NotContainKey("startTime");
82+
}
83+
}
84+
}
85+
}

test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/SerializerIgnoreValueTests.cs

Lines changed: 0 additions & 113 deletions
This file was deleted.

0 commit comments

Comments
 (0)