Skip to content

Commit fefc7eb

Browse files
[OpenAPI] Fix ImmutableArray deserialization (#9011)
1 parent 65a4eb2 commit fefc7eb

File tree

4 files changed

+176
-4
lines changed

4 files changed

+176
-4
lines changed

src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Definitions/OpenApiModelDefinition.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ public static OpenApiModelDefinition From(
1616
string name,
1717
DocumentNode document)
1818
{
19-
var fragmentReferences = FragmentReferenceFinder.Find(document);
19+
var primaryFragmentDefinition = document.Definitions.OfType<FragmentDefinitionNode>().First();
20+
21+
var fragmentReferences = FragmentReferenceFinder.Find(document, primaryFragmentDefinition);
2022

2123
return new OpenApiModelDefinition(
2224
name,

src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Serialization/OpenApiEndpointSettingsDto.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ namespace HotChocolate.Adapters.OpenApi;
44

55
public sealed record OpenApiEndpointSettingsDto(
66
string? Description,
7-
ImmutableArray<OpenApiEndpointDefinitionParameter> RouteParameters,
8-
ImmutableArray<OpenApiEndpointDefinitionParameter> QueryParameters,
9-
string? BodyVariableName);
7+
ImmutableArray<OpenApiEndpointDefinitionParameter> RouteParameters = default,
8+
ImmutableArray<OpenApiEndpointDefinitionParameter> QueryParameters = default,
9+
string? BodyVariableName = null)
10+
{
11+
public ImmutableArray<OpenApiEndpointDefinitionParameter> RouteParameters { get; init; } =
12+
RouteParameters.IsDefault ? [] : RouteParameters;
13+
14+
public ImmutableArray<OpenApiEndpointDefinitionParameter> QueryParameters { get; init; } =
15+
QueryParameters.IsDefault ? [] : QueryParameters;
16+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
using System.Text.Json;
2+
3+
namespace HotChocolate.Adapters.OpenApi.Serialization;
4+
5+
public class OpenApiEndpointSettingsSerializerTests
6+
{
7+
[Fact]
8+
public void Parse_With_Initialized_Properties_Succeeds()
9+
{
10+
// arrange
11+
var jsonDocument = JsonDocument.Parse(
12+
"""
13+
{
14+
"description": "Fetches user posts",
15+
"routeParameters": [
16+
{
17+
"key": "userId",
18+
"variableName":"userId"
19+
}],
20+
"queryParameters": [
21+
{
22+
"key": "limit",
23+
"variableName": "limit"
24+
},
25+
{
26+
"key": "offset",
27+
"variableName": "offset"
28+
}],
29+
"bodyVariableName": "input"
30+
}
31+
""");
32+
33+
// act
34+
var settings = OpenApiEndpointSettingsSerializer.Parse(jsonDocument);
35+
36+
// assert
37+
Assert.Equal("Fetches user posts", settings.Description);
38+
39+
var routeParam = Assert.Single(settings.RouteParameters);
40+
Assert.Equal("userId", routeParam.Key);
41+
Assert.Equal("userId", routeParam.VariableName);
42+
43+
Assert.Equal(2, settings.QueryParameters.Length);
44+
Assert.Contains(settings.QueryParameters, p => p.Key == "limit");
45+
Assert.Contains(settings.QueryParameters, p => p.Key == "offset");
46+
47+
Assert.Equal("input", settings.BodyVariableName);
48+
}
49+
50+
[Fact]
51+
public void Parse_With_Null_Properties_Succeeds()
52+
{
53+
// arrange
54+
var jsonDocument = JsonDocument.Parse(
55+
"""
56+
{
57+
"description": null,
58+
"routeParameters": [
59+
{
60+
"key": "userId",
61+
"variableName":"userId"
62+
}],
63+
"queryParameters": [
64+
{
65+
"key": "limit",
66+
"variableName": "limit"
67+
},
68+
{
69+
"key": "offset",
70+
"variableName": "offset"
71+
}],
72+
"bodyVariableName": null
73+
}
74+
""");
75+
76+
// act
77+
var settings = OpenApiEndpointSettingsSerializer.Parse(jsonDocument);
78+
79+
// assert
80+
Assert.Null(settings.Description);
81+
82+
var routeParam = Assert.Single(settings.RouteParameters);
83+
Assert.Equal("userId", routeParam.Key);
84+
Assert.Equal("userId", routeParam.VariableName);
85+
86+
Assert.Equal(2, settings.QueryParameters.Length);
87+
Assert.Contains(settings.QueryParameters, p => p.Key == "limit");
88+
Assert.Contains(settings.QueryParameters, p => p.Key == "offset");
89+
90+
Assert.Null(settings.BodyVariableName);
91+
}
92+
93+
[Fact]
94+
public void Parse_Empty_JsonObject_Succeeds()
95+
{
96+
// arrange
97+
var jsonDocument = JsonDocument.Parse("{}");
98+
99+
// act
100+
var settings = OpenApiEndpointSettingsSerializer.Parse(jsonDocument);
101+
102+
// assert
103+
Assert.Null(settings.Description);
104+
Assert.Empty(settings.RouteParameters);
105+
Assert.Empty(settings.QueryParameters);
106+
Assert.Null(settings.BodyVariableName);
107+
}
108+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System.Text.Json;
2+
3+
namespace HotChocolate.Adapters.OpenApi.Serialization;
4+
5+
public class OpenApiModelSettingsSerializerTests
6+
{
7+
[Fact]
8+
public void Parse_With_Initialized_Properties_Succeeds()
9+
{
10+
// arrange
11+
var jsonDocument = JsonDocument.Parse(
12+
"""
13+
{
14+
"description": "The user's address information"
15+
}
16+
""");
17+
18+
// act
19+
var settings = OpenApiModelSettingsSerializer.Parse(jsonDocument);
20+
21+
// assert
22+
Assert.Equal("The user's address information", settings.Description);
23+
}
24+
25+
[Fact]
26+
public void Parse_With_Null_Properties_Succeeds()
27+
{
28+
// arrange
29+
var jsonDocument = JsonDocument.Parse(
30+
"""
31+
{
32+
"description": null
33+
}
34+
""");
35+
36+
// act
37+
var settings = OpenApiModelSettingsSerializer.Parse(jsonDocument);
38+
39+
// assert
40+
Assert.Null(settings.Description);
41+
}
42+
43+
[Fact]
44+
public void Parse_Empty_JsonObject_Succeeds()
45+
{
46+
// arrange
47+
var jsonDocument = JsonDocument.Parse("{}");
48+
49+
// act
50+
var settings = OpenApiModelSettingsSerializer.Parse(jsonDocument);
51+
52+
// assert
53+
Assert.Null(settings.Description);
54+
}
55+
}

0 commit comments

Comments
 (0)