Skip to content

Commit b59864c

Browse files
committed
fix: an issue where deprecation extension parsing would fail
1 parent e039532 commit b59864c

File tree

2 files changed

+57
-9
lines changed

2 files changed

+57
-9
lines changed

src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiDeprecationExtension.cs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
using Microsoft.OpenApi.Interfaces;
1010
using Microsoft.OpenApi.Writers;
1111
using System.Text.Json.Nodes;
12+
using System.Text.Json;
13+
using System.Globalization;
1214

1315
namespace Microsoft.OpenApi.MicrosoftExtensions;
1416

@@ -71,6 +73,35 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
7173
writer.WriteEndObject();
7274
}
7375
}
76+
private static readonly DateTimeStyles datesStyle = DateTimeStyles.AssumeUniversal | DateTimeStyles.RoundtripKind;
77+
private static DateTimeOffset? GetDateTimeOffsetValue(string propertyName, JsonObject rawObject)
78+
{
79+
if (!rawObject.TryGetPropertyValue(propertyName.ToFirstCharacterLowerCase(), out var jsonNode) ||
80+
jsonNode is not JsonValue jsonValue ||
81+
jsonNode.GetValueKind() is not JsonValueKind.String)
82+
return null;
83+
84+
if (jsonValue.TryGetValue<string>(out var strValue) &&
85+
DateTimeOffset.TryParse(strValue, CultureInfo.InvariantCulture, datesStyle, out var parsedValue))
86+
{
87+
return parsedValue;
88+
}
89+
if (jsonValue.TryGetValue<DateTimeOffset>(out var returnedDto))
90+
{
91+
return returnedDto;
92+
}
93+
if (jsonValue.TryGetValue<DateTime>(out var returnedDt))
94+
{
95+
return new DateTimeOffset(returnedDt, TimeSpan.FromHours(0));
96+
}
97+
#if NET6_0_OR_GREATER
98+
if (jsonValue.TryGetValue<DateOnly>(out var returnedDo))
99+
{
100+
return new(returnedDo.Year, returnedDo.Month, returnedDo.Day, 0, 0, 0, TimeSpan.FromHours(0));
101+
}
102+
#endif
103+
return null;
104+
}
74105
/// <summary>
75106
/// Parses the <see cref="OpenApiAny"/> to <see cref="OpenApiDeprecationExtension"/>.
76107
/// </summary>
@@ -80,11 +111,11 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
80111
public static OpenApiDeprecationExtension Parse(JsonNode source)
81112
{
82113
if (source is not JsonObject rawObject) return null;
83-
var extension = new OpenApiDeprecationExtension();
84-
if (rawObject.TryGetPropertyValue(nameof(RemovalDate).ToFirstCharacterLowerCase(), out var removalDate) && removalDate is JsonNode removalDateValue)
85-
extension.RemovalDate = removalDateValue.GetValue<DateTimeOffset>();
86-
if (rawObject.TryGetPropertyValue(nameof(Date).ToFirstCharacterLowerCase(), out var date) && date is JsonNode dateValue)
87-
extension.Date = dateValue.GetValue<DateTimeOffset>();
114+
var extension = new OpenApiDeprecationExtension
115+
{
116+
RemovalDate = GetDateTimeOffsetValue(nameof(RemovalDate), rawObject),
117+
Date = GetDateTimeOffsetValue(nameof(Date), rawObject)
118+
};
88119
if (rawObject.TryGetPropertyValue(nameof(Version).ToFirstCharacterLowerCase(), out var version) && version is JsonNode versionValue)
89120
extension.Version = versionValue.GetValue<string>();
90121
if (rawObject.TryGetPropertyValue(nameof(Description).ToFirstCharacterLowerCase(), out var description) && description is JsonNode descriptionValue)

test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiDeprecationExtensionTests.cs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ public void Parses()
7575
{
7676
var oaiValue = new JsonObject
7777
{
78-
{ "date", new OpenApiAny(new DateTimeOffset(2023,05,04, 16, 0, 0, 0, 0, new(4, 0, 0))).Node},
79-
{ "removalDate", new OpenApiAny(new DateTimeOffset(2023,05,04, 16, 0, 0, 0, 0, new(4, 0, 0))).Node},
80-
{ "version", new OpenApiAny("v1.0").Node},
81-
{ "description", new OpenApiAny("removing").Node}
78+
{ "date", new DateTimeOffset(2023,05,04, 16, 0, 0, 0, 0, new(4, 0, 0))},
79+
{ "removalDate", new DateTimeOffset(2023,05,04, 16, 0, 0, 0, 0, new(4, 0, 0))},
80+
{ "version", "v1.0"},
81+
{ "description", "removing"}
8282
};
8383
var value = OpenApiDeprecationExtension.Parse(oaiValue);
8484
Assert.NotNull(value);
@@ -88,6 +88,23 @@ public void Parses()
8888
Assert.Equal(new DateTimeOffset(2023, 05, 04, 16, 0, 0, 0, 0, new(4, 0, 0)), value.RemovalDate);
8989
}
9090
[Fact]
91+
public void ParsesStringValues()
92+
{
93+
var oaiValue = new JsonObject
94+
{
95+
{ "date", "2023-05-04T16:00:00Z"},
96+
{ "removalDate", "2023-05-04"},
97+
{ "version", "v1.0"},
98+
{ "description", "removing"}
99+
};
100+
var value = OpenApiDeprecationExtension.Parse(oaiValue);
101+
Assert.NotNull(value);
102+
Assert.Equal("v1.0", value.Version);
103+
Assert.Equal("removing", value.Description);
104+
Assert.Equal(new DateTimeOffset(2023, 05, 04, 16, 0, 0, 0, 0, new(0, 0, 0)), value.Date);
105+
Assert.Equal(new DateTimeOffset(2023, 05, 04, 0, 0, 0, 0, 0, new(0, 0, 0)), value.RemovalDate);
106+
}
107+
[Fact]
91108
public void Serializes()
92109
{
93110
var value = new OpenApiDeprecationExtension

0 commit comments

Comments
 (0)