Skip to content

Commit 0c9ee09

Browse files
committed
- V2 doc parameter in can be "formData", not just "form".
- Basic unit tests for 5 types of possible parameters in V2.
1 parent f77a3db commit 0c9ee09

File tree

9 files changed

+240
-2
lines changed

9 files changed

+240
-2
lines changed

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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 4 additions & 2 deletions
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

Lines changed: 15 additions & 0 deletions
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>
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System;
5+
using System.IO;
6+
using System.Linq;
7+
using FluentAssertions;
8+
using Microsoft.OpenApi.Models;
9+
using Microsoft.OpenApi.Readers.ParseNodes;
10+
using Microsoft.OpenApi.Readers.V2;
11+
using SharpYaml.Serialization;
12+
using Xunit;
13+
14+
namespace Microsoft.OpenApi.Readers.Tests.V2Tests
15+
{
16+
[Collection("DefaultSettings")]
17+
public class OpenApiParameterTests
18+
{
19+
private const string SampleFolderPath = "V2Tests/Samples/OpenApiParameter";
20+
21+
[Fact]
22+
public void ParseBodyParameterShouldSucceed()
23+
{
24+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "bodyParameter.yaml")))
25+
{
26+
var yamlStream = new YamlStream();
27+
yamlStream.Load(new StreamReader(stream));
28+
var yamlNode = yamlStream.Documents.First().RootNode;
29+
30+
var context = new ParsingContext();
31+
var diagnostic = new OpenApiDiagnostic();
32+
33+
var node = new MapNode(context, diagnostic, (YamlMappingNode)yamlNode);
34+
35+
// Act
36+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
37+
38+
// Assert
39+
// Body parameter is currently not translated via LoadParameter.
40+
// This design may be revisited and this unit test may likely change.
41+
parameter.ShouldBeEquivalentTo(null);
42+
}
43+
}
44+
45+
[Fact]
46+
public void ParsePathParameterShouldSucceed()
47+
{
48+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "pathParameter.yaml")))
49+
{
50+
var yamlStream = new YamlStream();
51+
yamlStream.Load(new StreamReader(stream));
52+
var yamlNode = yamlStream.Documents.First().RootNode;
53+
54+
var context = new ParsingContext();
55+
var diagnostic = new OpenApiDiagnostic();
56+
57+
var node = new MapNode(context, diagnostic, (YamlMappingNode)yamlNode);
58+
59+
// Act
60+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
61+
62+
// Assert
63+
parameter.ShouldBeEquivalentTo(
64+
new OpenApiParameter
65+
{
66+
In = ParameterLocation.Path,
67+
Name = "username",
68+
Description = "username to fetch",
69+
Required = true,
70+
Schema = new OpenApiSchema()
71+
{
72+
Type = "string"
73+
}
74+
});
75+
}
76+
}
77+
78+
[Fact]
79+
public void ParseQueryParameterShouldSucceed()
80+
{
81+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "queryParameter.yaml")))
82+
{
83+
var yamlStream = new YamlStream();
84+
yamlStream.Load(new StreamReader(stream));
85+
var yamlNode = yamlStream.Documents.First().RootNode;
86+
87+
var context = new ParsingContext();
88+
var diagnostic = new OpenApiDiagnostic();
89+
90+
var node = new MapNode(context, diagnostic, (YamlMappingNode)yamlNode);
91+
92+
// Act
93+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
94+
95+
// Assert
96+
parameter.ShouldBeEquivalentTo(
97+
new OpenApiParameter
98+
{
99+
In = ParameterLocation.Query,
100+
Name = "id",
101+
Description = "ID of the object to fetch",
102+
Required = false,
103+
Schema = new OpenApiSchema()
104+
{
105+
Type = "array",
106+
Items = new OpenApiSchema()
107+
{
108+
Type = "string"
109+
}
110+
},
111+
Style = ParameterStyle.Form,
112+
Explode = true
113+
});
114+
}
115+
}
116+
117+
[Fact]
118+
public void ParseFormDataParameterShouldSucceed()
119+
{
120+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "formDataParameter.yaml")))
121+
{
122+
var yamlStream = new YamlStream();
123+
yamlStream.Load(new StreamReader(stream));
124+
var yamlNode = yamlStream.Documents.First().RootNode;
125+
126+
var context = new ParsingContext();
127+
var diagnostic = new OpenApiDiagnostic();
128+
129+
var node = new MapNode(context, diagnostic, (YamlMappingNode)yamlNode);
130+
131+
// Act
132+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
133+
134+
// Assert
135+
// Form data parameter is currently not translated via LoadParameter.
136+
// This design may be revisited and this unit test may likely change.
137+
parameter.ShouldBeEquivalentTo(null);
138+
}
139+
}
140+
141+
[Fact]
142+
public void ParseHeaderParameterShouldSucceed()
143+
{
144+
using (var stream = File.OpenRead(Path.Combine(SampleFolderPath, "headerParameter.yaml")))
145+
{
146+
var yamlStream = new YamlStream();
147+
yamlStream.Load(new StreamReader(stream));
148+
var yamlNode = yamlStream.Documents.First().RootNode;
149+
150+
var context = new ParsingContext();
151+
var diagnostic = new OpenApiDiagnostic();
152+
153+
var node = new MapNode(context, diagnostic, (YamlMappingNode)yamlNode);
154+
155+
// Act
156+
var parameter = OpenApiV2Deserializer.LoadParameter(node);
157+
158+
// Assert
159+
parameter.ShouldBeEquivalentTo(
160+
new OpenApiParameter
161+
{
162+
In = ParameterLocation.Header,
163+
Name = "token",
164+
Description = "token to be passed as a header",
165+
Required = true,
166+
Style = ParameterStyle.Simple,
167+
Schema = new OpenApiSchema()
168+
{
169+
Type = "array",
170+
Items = new OpenApiSchema()
171+
{
172+
Type = "integer",
173+
Format = "int64"
174+
}
175+
}
176+
});
177+
}
178+
}
179+
}
180+
}
Lines changed: 9 additions & 0 deletions
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
Lines changed: 6 additions & 0 deletions
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
Lines changed: 10 additions & 0 deletions
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
Lines changed: 6 additions & 0 deletions
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
Lines changed: 9 additions & 0 deletions
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)