Skip to content

Commit 5d8ec3a

Browse files
authored
fix(schema): serialize compatibility examples from examples list
1 parent 2441224 commit 5d8ec3a

2 files changed

Lines changed: 52 additions & 6 deletions

File tree

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,10 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
620620
writer.WriteOptionalObject(OpenApiConstants.ExternalDocs, ExternalDocs, callback);
621621

622622
// example
623-
writer.WriteOptionalObject(OpenApiConstants.Example, Example, (w, e) => w.WriteAny(e));
623+
writer.WriteOptionalObject(
624+
OpenApiConstants.Example,
625+
version < OpenApiSpecVersion.OpenApi3_1 ? GetCompatibilityExample() : Example,
626+
(w, e) => w.WriteAny(e));
624627

625628
// deprecated
626629
writer.WriteProperty(OpenApiConstants.Deprecated, Deprecated, false);
@@ -746,7 +749,7 @@ private void WriteV3CompatibilityKeywords(IOpenApiWriter writer, Action<IOpenApi
746749
writer.WriteOptionalObject(OpenApiConstants.IfExtension, If, callback);
747750
writer.WriteOptionalObject(OpenApiConstants.ThenExtension, Then, callback);
748751
writer.WriteOptionalObject(OpenApiConstants.ElseExtension, Else, callback);
749-
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, Examples, (nodeWriter, s) => nodeWriter.WriteAny(s));
752+
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, GetCompatibilityExamplesExtension(), (nodeWriter, s) => nodeWriter.WriteAny(s));
750753
}
751754

752755
internal void WriteAsItemsProperties(IOpenApiWriter writer)
@@ -960,7 +963,7 @@ private void SerializeAsV2(
960963
writer.WriteOptionalObject(OpenApiConstants.ExternalDocs, ExternalDocs, (w, s) => s.SerializeAsV2(w));
961964

962965
// example
963-
writer.WriteOptionalObject(OpenApiConstants.Example, Example, (w, e) => w.WriteAny(e));
966+
writer.WriteOptionalObject(OpenApiConstants.Example, GetCompatibilityExample(), (w, e) => w.WriteAny(e));
964967

965968
// x-nullable extension
966969
SerializeNullable(writer, OpenApiSpecVersion.OpenApi2_0);
@@ -991,7 +994,7 @@ private void SerializeAsV2(
991994
writer.WriteOptionalMap(OpenApiConstants.PatternPropertiesExtension, PatternProperties, (w, s) => s.SerializeAsV2(w));
992995
}
993996

994-
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, Examples, (nodeWriter, s) => nodeWriter.WriteAny(s));
997+
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, GetCompatibilityExamplesExtension(), (nodeWriter, s) => nodeWriter.WriteAny(s));
995998

996999
// extensions
9971000
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi2_0);
@@ -1027,6 +1030,26 @@ private bool TrySerializeTypeProperty(IOpenApiWriter writer, OpenApiSpecVersion
10271030
return false;
10281031
}
10291032

1033+
private JsonNode? GetCompatibilityExample()
1034+
{
1035+
return Example ?? Examples?.FirstOrDefault();
1036+
}
1037+
1038+
private IEnumerable<JsonNode>? GetCompatibilityExamplesExtension()
1039+
{
1040+
if (Examples is null || Examples.Count == 0)
1041+
{
1042+
return null;
1043+
}
1044+
1045+
if (Example is not null)
1046+
{
1047+
return Examples;
1048+
}
1049+
1050+
return Examples.Count > 1 ? Examples.Skip(1) : null;
1051+
}
1052+
10301053
private static bool IsPowerOfTwo(int x)
10311054
{
10321055
return x != 0 && (x & (x - 1)) == 0;

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,12 +1755,35 @@ public async Task SerializePatternPropertiesAsExtensionInEarlierVersions(OpenApi
17551755
[Theory]
17561756
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
17571757
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
1758-
public async Task SerializeExamplesAsExtensionInEarlierVersions(OpenApiSpecVersion version)
1758+
public async Task SerializeSingleExampleAsExamplePropertyInEarlierVersionsWhenExampleIsUnset(OpenApiSpecVersion version)
17591759
{
17601760
var expected = """
17611761
{
1762+
"example": "example value"
1763+
}
1764+
""";
1765+
var schema = new OpenApiSchema
1766+
{
1767+
Examples =
1768+
[
1769+
JsonValue.Create("example value")!
1770+
]
1771+
};
1772+
1773+
var actual = await schema.SerializeAsJsonAsync(version);
1774+
1775+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
1776+
}
1777+
1778+
[Theory]
1779+
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
1780+
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
1781+
public async Task SerializeMultipleExamplesAsExampleAndExtensionInEarlierVersionsWhenExampleIsUnset(OpenApiSpecVersion version)
1782+
{
1783+
var expected = """
1784+
{
1785+
"example": "example value",
17621786
"x-jsonschema-examples": [
1763-
"example value",
17641787
42
17651788
]
17661789
}

0 commit comments

Comments
 (0)