Skip to content

Commit 00f00f0

Browse files
authored
Merge pull request #155 from Microsoft/PerthCharern/FixFormToFormDataAndAddBasicUnitTests
Fix V2 parameter deserializer to recognize formData instead of form
2 parents 96bb3f0 + 05d3959 commit 00f00f0

File tree

10 files changed

+237
-2
lines changed

10 files changed

+237
-2
lines changed

src/Microsoft.OpenApi.Readers/ReferenceServices/OpenApiV2ReferenceService.cs

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public bool TryLoadReference(OpenApiReference reference, out IOpenApiReferenceab
9797
break;
9898

9999
case ReferenceType.Parameter:
100+
// TODO: Handle referencing to a "body" parameter in V2
100101
referencedObject = OpenApiV2Deserializer.LoadParameter(node);
101102
break;
102103

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -202,13 +202,14 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n)
202202
case "body":
203203
n.Context.SetTempStorage("bodyParameter", o);
204204
break;
205-
case "form":
205+
case "formData":
206206
var formParameters = n.Context.GetFromTempStorage<List<OpenApiParameter>>("formParameters");
207207
if (formParameters == null)
208208
{
209209
formParameters = new List<OpenApiParameter>();
210210
n.Context.SetTempStorage("formParameters", formParameters);
211211
}
212+
212213
formParameters.Add(o);
213214
break;
214215
default:
@@ -226,11 +227,12 @@ public static OpenApiParameter LoadParameter(ParseNode node)
226227
var mapNode = node.CheckMapNode("parameter");
227228

228229
var pointer = mapNode.GetReferencePointer();
230+
229231
if (pointer != null)
230232
{
231233
return mapNode.GetReferencedObject<OpenApiParameter>(ReferenceType.Parameter, pointer);
232234
}
233-
235+
234236
var parameter = new OpenApiParameter();
235237

236238
ParseMap(mapNode, parameter, _parameterFixedFields, _parameterPatternFields);

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

+15
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,21 @@
6565
<None Update="V2Tests\Samples\minimal.v3.yaml">
6666
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
6767
</None>
68+
<None Update="V2Tests\Samples\OpenApiParameter\formDataParameter.yaml">
69+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
70+
</None>
71+
<None Update="V2Tests\Samples\OpenApiParameter\queryParameter.yaml">
72+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
73+
</None>
74+
<None Update="V2Tests\Samples\OpenApiParameter\pathParameter.yaml">
75+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
76+
</None>
77+
<None Update="V2Tests\Samples\OpenApiParameter\headerParameter.yaml">
78+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
79+
</None>
80+
<None Update="V2Tests\Samples\OpenApiParameter\bodyParameter.yaml">
81+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
82+
</None>
6883
<None Update="V2Tests\Samples\OpenApiSecurityScheme\apiKeySecurityScheme.yaml">
6984
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
7085
</None>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.IO;
5+
using System.Linq;
6+
using Microsoft.OpenApi.Readers.ParseNodes;
7+
using SharpYaml.Serialization;
8+
9+
namespace Microsoft.OpenApi.Readers.Tests
10+
{
11+
internal class TestHelper
12+
{
13+
public static MapNode CreateYamlMapNode(Stream stream)
14+
{
15+
var yamlStream = new YamlStream();
16+
yamlStream.Load(new StreamReader(stream));
17+
var yamlNode = yamlStream.Documents.First().RootNode;
18+
19+
var context = new ParsingContext();
20+
var diagnostic = new OpenApiDiagnostic();
21+
22+
return new MapNode(context, diagnostic, (YamlMappingNode)yamlNode);
23+
}
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.IO;
5+
using FluentAssertions;
6+
using Microsoft.OpenApi.Models;
7+
using Microsoft.OpenApi.Readers.ParseNodes;
8+
using Microsoft.OpenApi.Readers.V2;
9+
using Xunit;
10+
11+
namespace Microsoft.OpenApi.Readers.Tests.V2Tests
12+
{
13+
[Collection("DefaultSettings")]
14+
public class OpenApiParameterTests
15+
{
16+
private const string SampleFolderPath = "V2Tests/Samples/OpenApiParameter";
17+
18+
[Fact]
19+
public void ParseBodyParameterShouldSucceed()
20+
{
21+
// Arrange
22+
MapNode node;
23+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "bodyParameter.yaml")))
24+
{
25+
node = TestHelper.CreateYamlMapNode(stream);
26+
}
27+
28+
// Act
29+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
30+
31+
// Assert
32+
// Body parameter is currently not translated via LoadParameter.
33+
// This design may be revisited and this unit test may likely change.
34+
parameter.ShouldBeEquivalentTo(null);
35+
}
36+
37+
[Fact]
38+
public void ParsePathParameterShouldSucceed()
39+
{
40+
// Arrange
41+
MapNode node;
42+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "pathParameter.yaml")))
43+
{
44+
node = TestHelper.CreateYamlMapNode(stream);
45+
}
46+
47+
// Act
48+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
49+
50+
// Assert
51+
parameter.ShouldBeEquivalentTo(
52+
new OpenApiParameter
53+
{
54+
In = ParameterLocation.Path,
55+
Name = "username",
56+
Description = "username to fetch",
57+
Required = true,
58+
Schema = new OpenApiSchema
59+
{
60+
Type = "string"
61+
}
62+
});
63+
}
64+
65+
[Fact]
66+
public void ParseQueryParameterShouldSucceed()
67+
{
68+
// Arrange
69+
MapNode node;
70+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "queryParameter.yaml")))
71+
{
72+
node = TestHelper.CreateYamlMapNode(stream);
73+
}
74+
75+
// Act
76+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
77+
78+
// Assert
79+
parameter.ShouldBeEquivalentTo(
80+
new OpenApiParameter
81+
{
82+
In = ParameterLocation.Query,
83+
Name = "id",
84+
Description = "ID of the object to fetch",
85+
Required = false,
86+
Schema = new OpenApiSchema
87+
{
88+
Type = "array",
89+
Items = new OpenApiSchema
90+
{
91+
Type = "string"
92+
}
93+
},
94+
Style = ParameterStyle.Form,
95+
Explode = true
96+
});
97+
}
98+
99+
[Fact]
100+
public void ParseFormDataParameterShouldSucceed()
101+
{
102+
// Arrange
103+
MapNode node;
104+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "formDataParameter.yaml")))
105+
{
106+
node = TestHelper.CreateYamlMapNode(stream);
107+
}
108+
109+
// Act
110+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
111+
112+
// Assert
113+
// Form data parameter is currently not translated via LoadParameter.
114+
// This design may be revisited and this unit test may likely change.
115+
parameter.ShouldBeEquivalentTo(null);
116+
}
117+
118+
[Fact]
119+
public void ParseHeaderParameterShouldSucceed()
120+
{
121+
// Arrange
122+
MapNode node;
123+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "headerParameter.yaml")))
124+
{
125+
node = TestHelper.CreateYamlMapNode(stream);
126+
}
127+
128+
// Act
129+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
130+
131+
// Assert
132+
parameter.ShouldBeEquivalentTo(
133+
new OpenApiParameter
134+
{
135+
In = ParameterLocation.Header,
136+
Name = "token",
137+
Description = "token to be passed as a header",
138+
Required = true,
139+
Style = ParameterStyle.Simple,
140+
Schema = new OpenApiSchema
141+
{
142+
Type = "array",
143+
Items = new OpenApiSchema
144+
{
145+
Type = "integer",
146+
Format = "int64"
147+
}
148+
}
149+
});
150+
}
151+
}
152+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameterObject
2+
name: user
3+
in: body
4+
description: user to add to the system
5+
required: true
6+
schema:
7+
type: array
8+
items:
9+
type: string
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameterObject
2+
name: avatar
3+
in: formData
4+
description: The avatar of the user
5+
required: true
6+
type: file
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameterObject
2+
name: token
3+
in: header
4+
description: token to be passed as a header
5+
required: true
6+
type: array
7+
items:
8+
type: integer
9+
format: int64
10+
collectionFormat: csv
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameterObject
2+
name: username
3+
in: path
4+
description: username to fetch
5+
required: true
6+
type: string
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameterObject
2+
name: id
3+
in: query
4+
description: ID of the object to fetch
5+
required: false
6+
type: array
7+
items:
8+
type: string
9+
collectionFormat: multi

0 commit comments

Comments
 (0)