Skip to content

Commit 08c05fa

Browse files
committed
Fix serializing a null In
Add a few more tests
1 parent 8b99269 commit 08c05fa

File tree

10 files changed

+179
-13
lines changed

10 files changed

+179
-13
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,13 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n)
218218

219219
formParameters.Add(o);
220220
break;
221-
case "null":
222-
case null:
223-
o.In = null;
221+
case "query":
222+
case "header":
223+
case "path":
224+
o.In = value.GetEnumFromDisplayName<ParameterLocation>();
224225
break;
225226
default:
226-
o.In = value.GetEnumFromDisplayName<ParameterLocation>();
227+
o.In = null;
227228
break;
228229
}
229230
}

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4-
using System.Collections.Generic;
4+
using System;
55
using System.Linq;
66
using Microsoft.OpenApi.Extensions;
77
using Microsoft.OpenApi.Models;
@@ -28,13 +28,16 @@ internal static partial class OpenApiV3Deserializer
2828
"in", (o, n) =>
2929
{
3030
var inString = n.GetScalarValue();
31-
if ( inString == null || inString == "null" )
31+
32+
if ( Enum.GetValues(typeof(ParameterLocation)).Cast<ParameterLocation>()
33+
.Select( e => e.GetDisplayName() )
34+
.Contains(inString) )
3235
{
33-
o.In = null;
36+
o.In = n.GetScalarValue().GetEnumFromDisplayName<ParameterLocation>();
3437
}
3538
else
3639
{
37-
o.In = n.GetScalarValue().GetEnumFromDisplayName<ParameterLocation>();
40+
o.In = null;
3841
}
3942
}
4043
},
@@ -123,7 +126,6 @@ public static OpenApiParameter LoadParameter(ParseNode node)
123126
}
124127

125128
var parameter = new OpenApiParameter();
126-
var required = new List<string> {"name", "in"};
127129

128130
ParseMap(mapNode, parameter, _parameterFixedFields, _parameterPatternFields);
129131

src/Microsoft.OpenApi/Models/OpenApiParameter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ public void SerializeAsV3WithoutReference(IOpenApiWriter writer)
159159
writer.WriteProperty(OpenApiConstants.Name, Name);
160160

161161
// in
162-
writer.WriteProperty(OpenApiConstants.In, In.GetDisplayName());
162+
writer.WriteProperty(OpenApiConstants.In, In?.GetDisplayName());
163163

164164
// description
165165
writer.WriteProperty(OpenApiConstants.Description, Description);
@@ -237,7 +237,7 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer)
237237
}
238238
else
239239
{
240-
writer.WriteProperty(OpenApiConstants.In, In.GetDisplayName());
240+
writer.WriteProperty(OpenApiConstants.In, In?.GetDisplayName());
241241
}
242242

243243
// name

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@
4949
<EmbeddedResource Include="V2Tests\Samples\OpenApiParameter\parameterWithNoLocation.yaml">
5050
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
5151
</EmbeddedResource>
52+
<EmbeddedResource Include="V2Tests\Samples\OpenApiParameter\parameterWithUnknownLocation.yaml">
53+
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
54+
</EmbeddedResource>
5255
<EmbeddedResource Include="V2Tests\Samples\OpenApiParameter\parameterWithNullLocation.yaml">
5356
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
5457
</EmbeddedResource>
@@ -119,13 +122,21 @@
119122
<EmbeddedResource Include="V3Tests\Samples\OpenApiInfo\minimalInfo.yaml">
120123
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
121124
</EmbeddedResource>
122-
<EmbeddedResource Include="V3Tests\Samples\OpenApiOperation\securedOperation.yaml" />
125+
<EmbeddedResource Include="V3Tests\Samples\OpenApiOperation\operationWithParameterWithNoLocation.json">
126+
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
127+
</EmbeddedResource>
128+
<EmbeddedResource Include="V3Tests\Samples\OpenApiOperation\securedOperation.yaml">
129+
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
130+
</EmbeddedResource>
123131
<EmbeddedResource Include="V3Tests\Samples\OpenApiParameter\headerParameter.yaml">
124132
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
125133
</EmbeddedResource>
126134
<EmbeddedResource Include="V3Tests\Samples\OpenApiParameter\parameterWithNoLocation.yaml">
127135
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
128136
</EmbeddedResource>
137+
<EmbeddedResource Include="V3Tests\Samples\OpenApiParameter\parameterWithUnknownLocation.yaml">
138+
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
139+
</EmbeddedResource>
129140
<EmbeddedResource Include="V3Tests\Samples\OpenApiParameter\parameterWithNullLocation.yaml">
130141
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
131142
</EmbeddedResource>

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,5 +224,33 @@ public void ParseParameterWithNoLocationShouldSucceed()
224224
}
225225
});
226226
}
227+
228+
[Fact]
229+
public void ParseParameterWithUnknownLocationShouldSucceed()
230+
{
231+
// Arrange
232+
MapNode node;
233+
using ( var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithUnknownLocation.yaml")) )
234+
{
235+
node = TestHelper.CreateYamlMapNode(stream);
236+
}
237+
238+
// Act
239+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
240+
241+
// Assert
242+
parameter.ShouldBeEquivalentTo(
243+
new OpenApiParameter
244+
{
245+
In = null,
246+
Name = "username",
247+
Description = "username to fetch",
248+
Required = true,
249+
Schema = new OpenApiSchema
250+
{
251+
Type = "string"
252+
}
253+
});
254+
}
227255
}
228256
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: username
2+
in: abcde
3+
description: username to fetch
4+
required: true
5+
type: string

test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
using System.IO;
55
using System.Linq;
6+
using FluentAssertions;
7+
using Microsoft.OpenApi.Models;
8+
using Microsoft.OpenApi.Readers.ParseNodes;
9+
using Microsoft.OpenApi.Readers.V3;
610
using Xunit;
711

812
namespace Microsoft.OpenApi.Readers.Tests.V3Tests
@@ -24,6 +28,62 @@ public void OperationWithSecurityRequirementShouldReferenceSecurityScheme()
2428
}
2529
}
2630

27-
31+
[Fact]
32+
public void ParseOperationWithParameterWithNoLocationShouldSucceed()
33+
{
34+
// Arrange
35+
MapNode node;
36+
using ( var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "operationWithParameterWithNoLocation.json")) )
37+
{
38+
node = TestHelper.CreateYamlMapNode(stream);
39+
}
40+
41+
// Act
42+
var operation = OpenApiV3Deserializer.LoadOperation(node);
43+
44+
// Assert
45+
operation.ShouldBeEquivalentTo(new OpenApiOperation()
46+
{
47+
Tags =
48+
{
49+
new OpenApiTag
50+
{
51+
UnresolvedReference = true,
52+
Reference = new OpenApiReference()
53+
{
54+
Id = "user",
55+
Type = ReferenceType.Tag
56+
}
57+
}
58+
},
59+
Summary = "Logs user into the system",
60+
Description = "",
61+
OperationId = "loginUser",
62+
Parameters =
63+
{
64+
new OpenApiParameter
65+
{
66+
Name = "username",
67+
Description = "The user name for login",
68+
Required = true,
69+
Schema = new OpenApiSchema
70+
{
71+
Type = "string"
72+
}
73+
},
74+
new OpenApiParameter
75+
{
76+
Name = "password",
77+
Description = "The password for login in clear text",
78+
In = ParameterLocation.Query,
79+
Required = true,
80+
Schema = new OpenApiSchema
81+
{
82+
Type = "string"
83+
}
84+
}
85+
}
86+
});
87+
}
2888
}
2989
}

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,5 +246,33 @@ public void ParseParameterWithNoLocationShouldSucceed()
246246
}
247247
});
248248
}
249+
250+
[Fact]
251+
public void ParseParameterWithUnknownLocationShouldSucceed()
252+
{
253+
// Arrange
254+
MapNode node;
255+
using ( var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithUnknownLocation.yaml")) )
256+
{
257+
node = TestHelper.CreateYamlMapNode(stream);
258+
}
259+
260+
// Act
261+
var parameter = OpenApiV3Deserializer.LoadParameter(node);
262+
263+
// Assert
264+
parameter.ShouldBeEquivalentTo(
265+
new OpenApiParameter
266+
{
267+
In = null,
268+
Name = "username",
269+
Description = "username to fetch",
270+
Required = true,
271+
Schema = new OpenApiSchema
272+
{
273+
Type = "string"
274+
}
275+
});
276+
}
249277
}
250278
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"tags": [ "user" ],
3+
"summary": "Logs user into the system",
4+
"description": "",
5+
"operationId": "loginUser",
6+
"parameters": [
7+
{
8+
"name": "username",
9+
"description": "The user name for login",
10+
"required": true,
11+
"schema": {
12+
"type": "string"
13+
}
14+
},
15+
{
16+
"name": "password",
17+
"in": "query",
18+
"description": "The password for login in clear text",
19+
"required": true,
20+
"schema": {
21+
"type": "string"
22+
}
23+
}
24+
]
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
name: username
2+
in: null
3+
description: username to fetch
4+
required: true
5+
schema:
6+
type: string

0 commit comments

Comments
 (0)