diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index 17ba10ada..db3064b00 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -437,7 +437,12 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version }); // enum - writer.WriteOptionalCollection(OpenApiConstants.Enum, Enum, (nodeWriter, s) => nodeWriter.WriteAny(s)); + var enumValue = Enum is not { Count: > 0 } + && !string.IsNullOrEmpty(Const) + && version < OpenApiSpecVersion.OpenApi3_1 + ? new List { JsonValue.Create(Const)! } + : Enum; + writer.WriteOptionalCollection(OpenApiConstants.Enum, enumValue, (nodeWriter, s) => nodeWriter.WriteAny(s)); // type SerializeTypeProperty(writer, version); @@ -687,7 +692,10 @@ private void SerializeAsV2( }); // enum - writer.WriteOptionalCollection(OpenApiConstants.Enum, Enum, (w, s) => w.WriteAny(s)); + var enumValue = Enum is not { Count: > 0 } && !string.IsNullOrEmpty(Const) + ? new List { JsonValue.Create(Const)! } + : Enum; + writer.WriteOptionalCollection(OpenApiConstants.Enum, enumValue, (nodeWriter, s) => nodeWriter.WriteAny(s)); // items writer.WriteOptionalObject(OpenApiConstants.Items, Items, (w, s) => s.SerializeAsV2(w)); diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs index ef5ca3d59..87dc85ced 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs @@ -643,6 +643,46 @@ public async Task WriteAsItemsPropertiesDoesNotWriteNull() """; Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual))); } + [Fact] + public async Task SerializeConstAsEnumV30() + { + // Arrange + var schema = new OpenApiSchema + { + Type = JsonSchemaType.String, + Const = "foo" + }; + + + // Act + var actual = await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); + + // Assert + var v3Node = JsonNode.Parse(actual); + Assert.NotNull(v3Node); + Assert.True(v3Node["enum"] is JsonArray singleEnum && singleEnum.Count == 1 && singleEnum[0]?.ToString() == "foo"); + Assert.False(v3Node.AsObject().ContainsKey("const")); + } + + [Fact] + public async Task SerializeConstAsEnumV20() + { + // Arrange + var schema = new OpenApiSchema + { + Type = JsonSchemaType.String, + Const = "foo" + }; + + // Act + var actual = await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); + + // Assert + var v2Node = JsonNode.Parse(actual); + Assert.NotNull(v2Node); + Assert.True(v2Node["enum"] is JsonArray singleEnum && singleEnum.Count == 1 && singleEnum[0]?.ToString() == "foo"); + Assert.False(v2Node.AsObject().ContainsKey("const")); + } internal class SchemaVisitor : OpenApiVisitorBase