Skip to content

Commit 07071ac

Browse files
authored
Merge pull request #2371 from microsoft/feat/const-serilization-v2-v3-compatibility
Feat: Serialize const prop from 3.1 schemas as single enum
2 parents 43bc838 + 3a8f7e2 commit 07071ac

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,12 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
437437
});
438438

439439
// enum
440-
writer.WriteOptionalCollection(OpenApiConstants.Enum, Enum, (nodeWriter, s) => nodeWriter.WriteAny(s));
440+
var enumValue = Enum is not { Count: > 0 }
441+
&& !string.IsNullOrEmpty(Const)
442+
&& version < OpenApiSpecVersion.OpenApi3_1
443+
? new List<JsonNode> { JsonValue.Create(Const)! }
444+
: Enum;
445+
writer.WriteOptionalCollection(OpenApiConstants.Enum, enumValue, (nodeWriter, s) => nodeWriter.WriteAny(s));
441446

442447
// type
443448
SerializeTypeProperty(writer, version);
@@ -687,7 +692,10 @@ private void SerializeAsV2(
687692
});
688693

689694
// enum
690-
writer.WriteOptionalCollection(OpenApiConstants.Enum, Enum, (w, s) => w.WriteAny(s));
695+
var enumValue = Enum is not { Count: > 0 } && !string.IsNullOrEmpty(Const)
696+
? new List<JsonNode> { JsonValue.Create(Const)! }
697+
: Enum;
698+
writer.WriteOptionalCollection(OpenApiConstants.Enum, enumValue, (nodeWriter, s) => nodeWriter.WriteAny(s));
691699

692700
// items
693701
writer.WriteOptionalObject(OpenApiConstants.Items, Items, (w, s) => s.SerializeAsV2(w));

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,46 @@ public async Task WriteAsItemsPropertiesDoesNotWriteNull()
643643
""";
644644
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
645645
}
646+
[Fact]
647+
public async Task SerializeConstAsEnumV30()
648+
{
649+
// Arrange
650+
var schema = new OpenApiSchema
651+
{
652+
Type = JsonSchemaType.String,
653+
Const = "foo"
654+
};
655+
656+
657+
// Act
658+
var actual = await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
659+
660+
// Assert
661+
var v3Node = JsonNode.Parse(actual);
662+
Assert.NotNull(v3Node);
663+
Assert.True(v3Node["enum"] is JsonArray singleEnum && singleEnum.Count == 1 && singleEnum[0]?.ToString() == "foo");
664+
Assert.False(v3Node.AsObject().ContainsKey("const"));
665+
}
666+
667+
[Fact]
668+
public async Task SerializeConstAsEnumV20()
669+
{
670+
// Arrange
671+
var schema = new OpenApiSchema
672+
{
673+
Type = JsonSchemaType.String,
674+
Const = "foo"
675+
};
676+
677+
// Act
678+
var actual = await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0);
679+
680+
// Assert
681+
var v2Node = JsonNode.Parse(actual);
682+
Assert.NotNull(v2Node);
683+
Assert.True(v2Node["enum"] is JsonArray singleEnum && singleEnum.Count == 1 && singleEnum[0]?.ToString() == "foo");
684+
Assert.False(v2Node.AsObject().ContainsKey("const"));
685+
}
646686

647687

648688
internal class SchemaVisitor : OpenApiVisitorBase

0 commit comments

Comments
 (0)