Skip to content

Commit 4a6b816

Browse files
feat: serialize const prop from 3.1 schemas as single enum for prior versions
Refs: #2335
1 parent 0c2e080 commit 4a6b816

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,10 @@ 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 = !string.IsNullOrEmpty(Const) && version != OpenApiSpecVersion.OpenApi3_1
441+
? new List<JsonNode> { JsonValue.Create(Const)! }
442+
: Enum;
443+
writer.WriteOptionalCollection(OpenApiConstants.Enum, enumValue, (nodeWriter, s) => nodeWriter.WriteAny(s));
441444

442445
// type
443446
SerializeTypeProperty(writer, version);
@@ -687,7 +690,10 @@ private void SerializeAsV2(
687690
});
688691

689692
// enum
690-
writer.WriteOptionalCollection(OpenApiConstants.Enum, Enum, (w, s) => w.WriteAny(s));
693+
var enumValue = !string.IsNullOrEmpty(Const)
694+
? new List<JsonNode> { JsonValue.Create(Const)! }
695+
: Enum;
696+
writer.WriteOptionalCollection(OpenApiConstants.Enum, enumValue, (nodeWriter, s) => nodeWriter.WriteAny(s));
691697

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

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,44 @@ 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.True(v3Node!["enum"] is JsonArray singleEnum && singleEnum.Count == 1 && singleEnum[0]?.ToString() == "foo");
663+
Assert.False(v3Node.AsObject().ContainsKey("const"));
664+
}
665+
666+
[Fact]
667+
public async Task SerializeConstAsEnumV20()
668+
{
669+
// Arrange
670+
var schema = new OpenApiSchema
671+
{
672+
Type = JsonSchemaType.String,
673+
Const = "foo"
674+
};
675+
676+
// Act
677+
var actual = await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0);
678+
679+
// Assert
680+
var v2Node = JsonNode.Parse(actual);
681+
Assert.True(v2Node!["enum"] is JsonArray singleEnum && singleEnum.Count == 1 && singleEnum[0]?.ToString() == "foo");
682+
Assert.False(v2Node.AsObject().ContainsKey("const"));
683+
}
646684

647685

648686
internal class SchemaVisitor : OpenApiVisitorBase

0 commit comments

Comments
 (0)