diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs index 4a4c5491e..a802f79af 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; @@ -45,7 +44,7 @@ public class OpenApiResponse : IOpenApiSerializable, IOpenApiReferenceable, IOpe /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set;} + public bool UnresolvedReference { get; set; } /// /// Reference pointer. @@ -79,7 +78,7 @@ public void SerializeAsV3WithoutReference(IOpenApiWriter writer) writer.WriteStartObject(); // description - writer.WriteProperty(OpenApiConstants.Description, Description); + writer.WriteRequiredProperty(OpenApiConstants.Description, Description); // headers writer.WriteOptionalMap(OpenApiConstants.Headers, Headers, (w, h) => h.SerializeAsV3(w)); @@ -123,7 +122,8 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteStartObject(); // description - writer.WriteProperty(OpenApiConstants.Description, Description); + writer.WriteRequiredProperty(OpenApiConstants.Description, Description); + if (Content != null) { var mediatype = Content.FirstOrDefault(); diff --git a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs index 8da814bbb..1c82d2cb9 100644 --- a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs +++ b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs @@ -32,6 +32,26 @@ public static void WriteProperty(this IOpenApiWriter writer, string name, string writer.WriteValue(value); } + /// + /// Write required string property. + /// + /// The writer. + /// The property name. + /// The property value. + public static void WriteRequiredProperty(this IOpenApiWriter writer, string name, string value) + { + CheckArguments(writer, name); + writer.WritePropertyName(name); + if (value == null) + { + writer.WriteNull(); + } + else + { + writer.WriteValue(value); + } + } + /// /// Write a boolean property. /// diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs index 51ba8b08d..f83950ef3 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs @@ -359,6 +359,7 @@ public void SerializeOperationWithBodyAsV3JsonWorks() ""$ref"": ""#/components/responses/response1"" }, ""400"": { + ""description"": null, ""content"": { ""application/json"": { ""schema"": { @@ -431,6 +432,7 @@ public void SerializeAdvancedOperationWithTagAndSecurityAsV3JsonWorks() ""$ref"": ""#/components/responses/response1"" }, ""400"": { + ""description"": null, ""content"": { ""application/json"": { ""schema"": { @@ -554,7 +556,7 @@ public void SerializeOperationWithFormDataAsV3JsonWorks() // Act var actual = _operationWithFormData.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); - + // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); @@ -607,7 +609,7 @@ public void SerializeOperationWithFormDataAsV2JsonWorks() // Act var actual = _operationWithFormData.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); - + // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); @@ -658,6 +660,7 @@ public void SerializeOperationWithBodyAsV2JsonWorks() ""$ref"": ""#/responses/response1"" }, ""400"": { + ""description"": null, ""schema"": { ""maximum"": 10, ""minimum"": 5, @@ -672,7 +675,7 @@ public void SerializeOperationWithBodyAsV2JsonWorks() // Act var actual = _operationWithBody.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); - + // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); @@ -727,6 +730,7 @@ public void SerializeAdvancedOperationWithTagAndSecurityAsV2JsonWorks() ""$ref"": ""#/responses/response1"" }, ""400"": { + ""description"": null, ""schema"": { ""maximum"": 10, ""minimum"": 5, diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs index 98fab35f5..fce3bf097 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs @@ -116,11 +116,18 @@ public void SerializeBasicResponseWorks( OpenApiSpecVersion version, OpenApiFormat format) { - // Arrange & Act + // Arrange + var expected = format == OpenApiFormat.Json ? @"{ + ""description"": null +}" : @"description: "; + + // Act var actual = BasicResponse.Serialize(version, format); // Assert - actual.Should().Be("{ }"); + actual = actual.MakeLineBreaksEnvironmentNeutral(); + expected = expected.MakeLineBreaksEnvironmentNeutral(); + actual.Should().Be(expected); } [Fact]