Skip to content

Commit 537754c

Browse files
Copilotbaywet
andcommitted
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 7d0e857 commit 537754c

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
@@ -61,15 +61,15 @@ public virtual void SerializeAsV3(IOpenApiWriter writer)
6161
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
6262
}
6363

64-
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
64+
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
6565
Action<IOpenApiWriter, IOpenApiSerializable> callback)
6666
{
6767
Utils.CheckArgumentNull(writer);
6868

6969
writer.WriteStartObject();
7070

7171
// description
72-
writer.WriteRequiredProperty(OpenApiConstants.Description, Description);
72+
writer.WriteProperty(OpenApiConstants.Description, Description);
7373

7474
// headers
7575
writer.WriteOptionalMap(OpenApiConstants.Headers, Headers, callback);
@@ -96,7 +96,7 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
9696
writer.WriteStartObject();
9797

9898
// description
99-
writer.WriteRequiredProperty(OpenApiConstants.Description, Description);
99+
writer.WriteProperty(OpenApiConstants.Description, Description);
100100

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

@@ -153,7 +153,7 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
153153
// so remove it from the cloned collection so we don't write it again.
154154
extensionsClone?.Remove(key);
155155
}
156-
}
156+
}
157157
}
158158
}
159159

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
@@ -176,9 +176,7 @@ public async Task SerializeBasicResponseWorks(
176176
string format)
177177
{
178178
// Arrange
179-
var expected = format == OpenApiConstants.Json ? @"{
180-
""description"": null
181-
}" : @"description: null";
179+
var expected = @"{ }";
182180

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

0 commit comments

Comments
 (0)