Skip to content

Commit be57a7c

Browse files
Copilotbaywet
authored andcommitted
fix(schema): serialize compatibility examples from examples list
1 parent d27141b commit be57a7c

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
@@ -615,7 +615,10 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
615615
writer.WriteOptionalObject(OpenApiConstants.ExternalDocs, ExternalDocs, callback);
616616

617617
// example
618-
writer.WriteOptionalObject(OpenApiConstants.Example, Example, (w, e) => w.WriteAny(e));
618+
writer.WriteOptionalObject(
619+
OpenApiConstants.Example,
620+
version < OpenApiSpecVersion.OpenApi3_1 ? GetCompatibilityExample() : Example,
621+
(w, e) => w.WriteAny(e));
619622

620623
// deprecated
621624
writer.WriteProperty(OpenApiConstants.Deprecated, Deprecated, false);
@@ -741,7 +744,7 @@ private void WriteV3CompatibilityKeywords(IOpenApiWriter writer, Action<IOpenApi
741744
writer.WriteOptionalObject(OpenApiConstants.IfExtension, If, callback);
742745
writer.WriteOptionalObject(OpenApiConstants.ThenExtension, Then, callback);
743746
writer.WriteOptionalObject(OpenApiConstants.ElseExtension, Else, callback);
744-
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, Examples, (nodeWriter, s) => nodeWriter.WriteAny(s));
747+
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, GetCompatibilityExamplesExtension(), (nodeWriter, s) => nodeWriter.WriteAny(s));
745748
}
746749

747750
internal void WriteAsItemsProperties(IOpenApiWriter writer)
@@ -955,7 +958,7 @@ private void SerializeAsV2(
955958
writer.WriteOptionalObject(OpenApiConstants.ExternalDocs, ExternalDocs, (w, s) => s.SerializeAsV2(w));
956959

957960
// example
958-
writer.WriteOptionalObject(OpenApiConstants.Example, Example, (w, e) => w.WriteAny(e));
961+
writer.WriteOptionalObject(OpenApiConstants.Example, GetCompatibilityExample(), (w, e) => w.WriteAny(e));
959962

960963
// x-nullable extension
961964
SerializeNullable(writer, OpenApiSpecVersion.OpenApi2_0);
@@ -986,7 +989,7 @@ private void SerializeAsV2(
986989
writer.WriteOptionalMap(OpenApiConstants.PatternPropertiesExtension, PatternProperties, (w, s) => s.SerializeAsV2(w));
987990
}
988991

989-
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, Examples, (nodeWriter, s) => nodeWriter.WriteAny(s));
992+
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, GetCompatibilityExamplesExtension(), (nodeWriter, s) => nodeWriter.WriteAny(s));
990993

991994
// extensions
992995
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi2_0);
@@ -1022,6 +1025,26 @@ private bool TrySerializeTypeProperty(IOpenApiWriter writer, OpenApiSpecVersion
10221025
return false;
10231026
}
10241027

1028+
private JsonNode? GetCompatibilityExample()
1029+
{
1030+
return Example ?? Examples?.FirstOrDefault();
1031+
}
1032+
1033+
private IEnumerable<JsonNode>? GetCompatibilityExamplesExtension()
1034+
{
1035+
if (Examples is null || Examples.Count == 0)
1036+
{
1037+
return null;
1038+
}
1039+
1040+
if (Example is not null)
1041+
{
1042+
return Examples;
1043+
}
1044+
1045+
return Examples.Count > 1 ? Examples.Skip(1) : null;
1046+
}
1047+
10251048
private static bool IsPowerOfTwo(int x)
10261049
{
10271050
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
@@ -1749,12 +1749,35 @@ public async Task SerializePatternPropertiesAsExtensionInEarlierVersions(OpenApi
17491749
[Theory]
17501750
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
17511751
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
1752-
public async Task SerializeExamplesAsExtensionInEarlierVersions(OpenApiSpecVersion version)
1752+
public async Task SerializeSingleExampleAsExamplePropertyInEarlierVersionsWhenExampleIsUnset(OpenApiSpecVersion version)
17531753
{
17541754
var expected = """
17551755
{
1756+
"example": "example value"
1757+
}
1758+
""";
1759+
var schema = new OpenApiSchema
1760+
{
1761+
Examples =
1762+
[
1763+
JsonValue.Create("example value")!
1764+
]
1765+
};
1766+
1767+
var actual = await schema.SerializeAsJsonAsync(version);
1768+
1769+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
1770+
}
1771+
1772+
[Theory]
1773+
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
1774+
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
1775+
public async Task SerializeMultipleExamplesAsExampleAndExtensionInEarlierVersionsWhenExampleIsUnset(OpenApiSpecVersion version)
1776+
{
1777+
var expected = """
1778+
{
1779+
"example": "example value",
17561780
"x-jsonschema-examples": [
1757-
"example value",
17581781
42
17591782
]
17601783
}

0 commit comments

Comments
 (0)