Skip to content

Commit 4af0878

Browse files
authored
Merge pull request #2083 from microsoft/fix/request-body-reference-v2
fixes OpenAPI v2 request body parameter references serialization
2 parents 3ea1fa9 + 03436cb commit 4af0878

File tree

5 files changed

+112
-6
lines changed

5 files changed

+112
-6
lines changed

src/Microsoft.OpenApi/Models/OpenApiDocument.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ public void SerializeAsV2(IOpenApiWriter writer)
283283
{
284284
foreach (var requestBody in Components.RequestBodies.Where(b => !parameters.ContainsKey(b.Key)))
285285
{
286-
parameters.Add(requestBody.Key, requestBody.Value.ConvertToBodyParameter());
286+
parameters.Add(requestBody.Key, requestBody.Value.ConvertToBodyParameter(writer));
287287
}
288288
}
289289
writer.WriteOptionalMap(

src/Microsoft.OpenApi/Models/OpenApiOperation.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
212212
/// </summary>
213213
public void SerializeAsV2(IOpenApiWriter writer)
214214
{
215-
Utils.CheckArgumentNull(writer);;
215+
Utils.CheckArgumentNull(writer);
216216

217217
writer.WriteStartObject();
218218

@@ -258,7 +258,7 @@ public void SerializeAsV2(IOpenApiWriter writer)
258258
}
259259
else
260260
{
261-
parameters.Add(RequestBody.ConvertToBodyParameter());
261+
parameters.Add(RequestBody.ConvertToBodyParameter(writer));
262262
}
263263
}
264264
else if (RequestBody.Reference != null && RequestBody.Reference.HostDocument is {} hostDocument)

src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public void SerializeAsV2(IOpenApiWriter writer)
112112
// RequestBody object does not exist in V2.
113113
}
114114

115-
internal OpenApiBodyParameter ConvertToBodyParameter()
115+
internal virtual OpenApiParameter ConvertToBodyParameter(IOpenApiWriter writer)
116116
{
117117
var bodyParameter = new OpenApiBodyParameter
118118
{

src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ public override void SerializeAsV3(IOpenApiWriter writer)
9292
if (!writer.GetSettings().ShouldInlineReference(_reference))
9393
{
9494
_reference.SerializeAsV3(writer);
95-
return;
9695
}
9796
else
9897
{
@@ -106,7 +105,6 @@ public override void SerializeAsV31(IOpenApiWriter writer)
106105
if (!writer.GetSettings().ShouldInlineReference(_reference))
107106
{
108107
_reference.SerializeAsV31(writer);
109-
return;
110108
}
111109
else
112110
{
@@ -121,5 +119,18 @@ private void SerializeInternal(IOpenApiWriter writer,
121119
Utils.CheckArgumentNull(writer);
122120
action(writer, Target);
123121
}
122+
123+
/// <inheritdoc/>
124+
internal override OpenApiParameter ConvertToBodyParameter(IOpenApiWriter writer)
125+
{
126+
if (writer.GetSettings().ShouldInlineReference(_reference))
127+
{
128+
return Target.ConvertToBodyParameter(writer);
129+
}
130+
else
131+
{
132+
return new OpenApiParameterReference(_reference.Id, _reference.HostDocument);
133+
}
134+
}
124135
}
125136
}

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

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Microsoft.OpenApi.Any;
1111
using Microsoft.OpenApi.Extensions;
1212
using Microsoft.OpenApi.Models;
13+
using Microsoft.OpenApi.Models.References;
1314
using Microsoft.OpenApi.Reader.ParseNodes;
1415
using Microsoft.OpenApi.Reader.V2;
1516
using Microsoft.OpenApi.Reader.V3;
@@ -507,5 +508,99 @@ public async Task LoadV3ExamplesInRequestBodyParameterAsExtensionsWorks()
507508
expected = expected.MakeLineBreaksEnvironmentNeutral();
508509
Assert.Equal(expected, actual);
509510
}
511+
[Fact]
512+
public async Task SerializesBodyReferencesWorks()
513+
{
514+
var openApiDocument = new OpenApiDocument();
515+
516+
var operation = new OpenApiOperation
517+
{
518+
RequestBody = new OpenApiRequestBodyReference("UserRequest", openApiDocument)
519+
{
520+
Description = "User request body"
521+
}
522+
};
523+
openApiDocument.Paths.Add("/users", new OpenApiPathItem
524+
{
525+
Operations = new Dictionary<OperationType, OpenApiOperation>
526+
{
527+
[OperationType.Post] = operation
528+
}
529+
});
530+
openApiDocument.AddComponent("UserRequest", new OpenApiRequestBody
531+
{
532+
Description = "User creation request body",
533+
Content =
534+
{
535+
["application/json"] = new OpenApiMediaType
536+
{
537+
Schema = new OpenApiSchemaReference("UserSchema", openApiDocument)
538+
}
539+
}
540+
});
541+
openApiDocument.AddComponent("UserSchema", new OpenApiSchema
542+
{
543+
Type = JsonSchemaType.Object,
544+
Properties =
545+
{
546+
["name"] = new OpenApiSchema
547+
{
548+
Type = JsonSchemaType.String
549+
},
550+
["email"] = new OpenApiSchema
551+
{
552+
Type = JsonSchemaType.String
553+
}
554+
}
555+
});
556+
557+
var actual = await openApiDocument.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0);
558+
var expected =
559+
"""
560+
{
561+
"swagger": "2.0",
562+
"info": { },
563+
"paths": {
564+
"/users": {
565+
"post": {
566+
"consumes": [
567+
"application/json"
568+
],
569+
"parameters": [
570+
{
571+
"$ref": "#/parameters/UserRequest"
572+
}
573+
],
574+
"responses": { }
575+
}
576+
}
577+
},
578+
"definitions": {
579+
"UserSchema": {
580+
"type": "object",
581+
"properties": {
582+
"name": {
583+
"type": "string"
584+
},
585+
"email": {
586+
"type": "string"
587+
}
588+
}
589+
}
590+
},
591+
"parameters": {
592+
"UserRequest": {
593+
"in": "body",
594+
"name": "body",
595+
"description": "User creation request body",
596+
"schema": {
597+
"$ref": "#/definitions/UserSchema"
598+
}
599+
}
600+
}
601+
}
602+
""";
603+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
604+
}
510605
}
511606
}

0 commit comments

Comments
 (0)