Skip to content

Commit afd4967

Browse files
Copilotbaywet
andauthored
Omit null OpenAPI response descriptions (#3077)
* Initial plan fix(openapi): omit null response descriptions Co-authored-by: baywet <7905502+baywet@users.noreply.github.com> * test(models): update response serialization expectation Co-authored-by: baywet <7905502+baywet@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: baywet <7905502+baywet@users.noreply.github.com>
1 parent 07fac9e commit afd4967

4 files changed

Lines changed: 27 additions & 11 deletions

File tree

src/Microsoft.OpenApi/Models/OpenApiResponse.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer)
7373
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
7474
}
7575

76-
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
76+
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
7777
Action<IOpenApiWriter, IOpenApiSerializable> callback)
7878
{
7979
Utils.CheckArgumentNull(writer);
@@ -87,7 +87,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
8787
}
8888

8989
// description
90-
writer.WriteRequiredProperty(OpenApiConstants.Description, Description);
90+
writer.WriteProperty(OpenApiConstants.Description, Description);
9191

9292
// headers
9393
writer.WriteOptionalMap(OpenApiConstants.Headers, Headers, callback);
@@ -120,7 +120,7 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
120120
writer.WriteStartObject();
121121

122122
// description
123-
writer.WriteRequiredProperty(OpenApiConstants.Description, Description);
123+
writer.WriteProperty(OpenApiConstants.Description, Description);
124124

125125
var extensionsClone = Extensions is not null ? new Dictionary<string, IOpenApiExtension>(Extensions) : null;
126126

@@ -177,7 +177,7 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
177177
// so remove it from the cloned collection so we don't write it again.
178178
extensionsClone?.Remove(key);
179179
}
180-
}
180+
}
181181
}
182182
}
183183

test/Microsoft.OpenApi.Tests/Mocks/OpenApiResponseSerializationTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System.IO;
22
using System.Net.Http;
3+
using System.Text.Json.Nodes;
4+
using System.Threading.Tasks;
35
using Moq;
46
using Xunit;
57

@@ -61,5 +63,25 @@ public void SerializeAsV3_DoesNotCallV31OrV2Serialization()
6163
_linkMock.Verify(l => l.SerializeAsV31(It.IsAny<IOpenApiWriter>()), Times.Never);
6264
_linkMock.Verify(l => l.SerializeAsV2(It.IsAny<IOpenApiWriter>()), Times.Never);
6365
}
66+
67+
[Theory]
68+
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
69+
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
70+
[InlineData(OpenApiSpecVersion.OpenApi3_1)]
71+
[InlineData(OpenApiSpecVersion.OpenApi3_2)]
72+
public async Task SerializeResponseWithoutDescriptionAsJsonDoesNotWriteNullDescription(OpenApiSpecVersion specVersion)
73+
{
74+
// Arrange
75+
var response = new OpenApiResponse();
76+
77+
// Act
78+
var actual = await response.SerializeAsJsonAsync(specVersion, TestContext.Current.CancellationToken);
79+
80+
// Assert
81+
var node = JsonNode.Parse(actual);
82+
Assert.NotNull(node);
83+
var responseObject = Assert.IsType<JsonObject>(node);
84+
Assert.False(responseObject.ContainsKey(OpenApiConstants.Description));
85+
}
6486
}
6587
}

test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,6 @@ public async Task SerializeOperationWithBodyAsV3JsonWorks()
343343
"$ref": "#/components/responses/response1"
344344
},
345345
"400": {
346-
"description": null,
347346
"content": {
348347
"application/json": {
349348
"schema": {
@@ -416,7 +415,6 @@ public async Task SerializeAdvancedOperationWithTagAndSecurityAsV3JsonWorks()
416415
"$ref": "#/components/responses/response1"
417416
},
418417
"400": {
419-
"description": null,
420418
"content": {
421419
"application/json": {
422420
"schema": {
@@ -648,7 +646,6 @@ public async Task SerializeOperationWithBodyAsV2JsonWorks()
648646
"$ref": "#/responses/response1"
649647
},
650648
"400": {
651-
"description": null,
652649
"schema": {
653650
"type": "number",
654651
"maximum": 10,
@@ -718,7 +715,6 @@ public async Task SerializeAdvancedOperationWithTagAndSecurityAsV2JsonWorks()
718715
"$ref": "#/responses/response1"
719716
},
720717
"400": {
721-
"description": null,
722718
"schema": {
723719
"type": "number",
724720
"maximum": 10,

test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,7 @@ public async Task SerializeBasicResponseWorks(
193193
string format)
194194
{
195195
// Arrange
196-
var expected = format == OpenApiConstants.Json ? @"{
197-
""description"": null
198-
}" : @"description: null";
196+
var expected = @"{ }";
199197

200198
// Act
201199
var actual = await BasicResponse.SerializeAsync(version, format, TestContext.Current.CancellationToken);

0 commit comments

Comments
 (0)