Skip to content

Commit 7921f28

Browse files
authored
Merge pull request #370 from VitaliyKurokhtin/vvk/parameter-with-no-schema
Nullref fixed when parsing parameter without any schema
2 parents c6fa889 + b735b3d commit 7921f28

File tree

5 files changed

+61
-14
lines changed

5 files changed

+61
-14
lines changed

src/Microsoft.OpenApi.Readers/V2/OpenApiParameterDeserializer.cs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,13 @@ internal static partial class OpenApiV2Deserializer
149149
{
150150
OpenApiConstants.Default,
151151
new AnyFieldMapParameter<OpenApiParameter>(
152-
p => p.Schema.Default,
153-
(p, v) => p.Schema.Default = v,
152+
p => p.Schema?.Default,
153+
(p, v) => {
154+
if (p.Schema != null || v != null)
155+
{
156+
GetOrCreateSchema(p).Default = v;
157+
}
158+
},
154159
p => p.Schema)
155160
}
156161
};
@@ -161,8 +166,13 @@ internal static partial class OpenApiV2Deserializer
161166
{
162167
OpenApiConstants.Enum,
163168
new AnyListFieldMapParameter<OpenApiParameter>(
164-
p => p.Schema.Enum,
165-
(p, v) => p.Schema.Enum = v,
169+
p => p.Schema?.Enum,
170+
(p, v) => {
171+
if (p.Schema != null || v != null && v.Count > 0)
172+
{
173+
GetOrCreateSchema(p).Enum = v;
174+
}
175+
},
166176
p => p.Schema)
167177
},
168178
};
@@ -285,7 +295,7 @@ public static OpenApiParameter LoadParameter(ParseNode node, bool loadRequestBod
285295
return null; // Don't include Form or Body parameters when normal parameters are loaded.
286296
}
287297

288-
if ( loadRequestBody && !_isBodyOrFormData )
298+
if (loadRequestBody && !_isBodyOrFormData)
289299
{
290300
return null; // Don't include non-Body or non-Form parameters when request bodies are loaded.
291301
}

src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,16 @@ private static void ProcessAnyListFields<T>(
7878

7979
mapNode.Context.StartObject(anyListFieldName);
8080

81-
foreach (var propertyElement in anyListFieldMap[anyListFieldName].PropertyGetter(domainObject))
81+
var list = anyListFieldMap[anyListFieldName].PropertyGetter(domainObject);
82+
if (list != null)
8283
{
83-
newProperty.Add(
84-
OpenApiAnyConverter.GetSpecificOpenApiAny(
85-
propertyElement,
86-
anyListFieldMap[anyListFieldName].SchemaGetter(domainObject)));
84+
foreach (var propertyElement in list)
85+
{
86+
newProperty.Add(
87+
OpenApiAnyConverter.GetSpecificOpenApiAny(
88+
propertyElement,
89+
anyListFieldMap[anyListFieldName].SchemaGetter(domainObject)));
90+
}
8791
}
8892

8993
anyListFieldMap[anyListFieldName].PropertySetter(domainObject, newProperty);

test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
<SignAssembly>true</SignAssembly>
1313
<AssemblyOriginatorKeyFile>..\..\src\Microsoft.OpenApi.snk</AssemblyOriginatorKeyFile>
1414
</PropertyGroup>
15+
<ItemGroup>
16+
<None Remove="V2Tests\Samples\OpenApiParameter\parameterWithNoSchema.yaml" />
17+
</ItemGroup>
1518
<ItemGroup>
1619
<EmbeddedResource Include="OpenApiReaderTests\Samples\unsupported.v1.yaml">
1720
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
@@ -55,6 +58,9 @@
5558
<EmbeddedResource Include="V2Tests\Samples\OpenApiParameter\parameterWithEnum.yaml">
5659
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
5760
</EmbeddedResource>
61+
<EmbeddedResource Include="V2Tests\Samples\OpenApiParameter\parameterWithNoSchema.yaml">
62+
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
63+
</EmbeddedResource>
5864
<EmbeddedResource Include="V2Tests\Samples\OpenApiParameter\parameterWithNoLocation.yaml">
5965
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
6066
</EmbeddedResource>

test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public void ParseHeaderParameterShouldSucceed()
139139
Description = "token to be passed as a header",
140140
Required = true,
141141
Style = ParameterStyle.Simple,
142-
142+
143143
Schema = new OpenApiSchema
144144
{
145145
Type = "array",
@@ -226,7 +226,7 @@ public void ParseParameterWithNullLocationShouldSucceed()
226226
{
227227
// Arrange
228228
MapNode node;
229-
using ( var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml")) )
229+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml")))
230230
{
231231
node = TestHelper.CreateYamlMapNode(stream);
232232
}
@@ -254,7 +254,7 @@ public void ParseParameterWithNoLocationShouldSucceed()
254254
{
255255
// Arrange
256256
MapNode node;
257-
using ( var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNoLocation.yaml")) )
257+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNoLocation.yaml")))
258258
{
259259
node = TestHelper.CreateYamlMapNode(stream);
260260
}
@@ -277,12 +277,36 @@ public void ParseParameterWithNoLocationShouldSucceed()
277277
});
278278
}
279279

280+
[Fact]
281+
public void ParseParameterWithNoSchemaShouldSucceed()
282+
{
283+
// Arrange
284+
MapNode node;
285+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNoSchema.yaml")))
286+
{
287+
node = TestHelper.CreateYamlMapNode(stream);
288+
}
289+
290+
// Act
291+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
292+
293+
// Assert
294+
parameter.ShouldBeEquivalentTo(
295+
new OpenApiParameter
296+
{
297+
In = null,
298+
Name = "username",
299+
Description = "username to fetch",
300+
Required = false
301+
});
302+
}
303+
280304
[Fact]
281305
public void ParseParameterWithUnknownLocationShouldSucceed()
282306
{
283307
// Arrange
284308
MapNode node;
285-
using ( var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithUnknownLocation.yaml")) )
309+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithUnknownLocation.yaml")))
286310
{
287311
node = TestHelper.CreateYamlMapNode(stream);
288312
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
name: username
2+
description: username to fetch
3+
required: false

0 commit comments

Comments
 (0)