Skip to content

Commit 6e22ec6

Browse files
baywetCopilot
andcommitted
fix(library): use version-specific schema keyword callbacks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 82f84e0 commit 6e22ec6

2 files changed

Lines changed: 43 additions & 11 deletions

File tree

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
451451

452452
if (version >= OpenApiSpecVersion.OpenApi3_1)
453453
{
454-
WriteJsonSchemaKeywords(writer);
454+
WriteJsonSchemaKeywords(writer, callback);
455455
}
456456

457457
// title
@@ -652,14 +652,14 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
652652
SerializeAsV2(writer: writer, parentRequiredProperties: new HashSet<string>(), propertyName: null);
653653
}
654654

655-
internal void WriteJsonSchemaKeywords(IOpenApiWriter writer)
655+
internal void WriteJsonSchemaKeywords(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiSerializable> callback)
656656
{
657657
writer.WriteProperty(OpenApiConstants.Id, Id);
658658
writer.WriteProperty(OpenApiConstants.DollarSchema, Schema?.ToString());
659659
writer.WriteProperty(OpenApiConstants.Comment, Comment);
660660
writer.WriteProperty(OpenApiConstants.Const, Const);
661661
writer.WriteOptionalMap(OpenApiConstants.Vocabulary, Vocabulary, (w, s) => w.WriteValue(s));
662-
writer.WriteOptionalMap(OpenApiConstants.Defs, Definitions, (w, s) => s.SerializeAsV31(w));
662+
writer.WriteOptionalMap(OpenApiConstants.Defs, Definitions, callback);
663663
writer.WriteProperty(OpenApiConstants.Anchor, Anchor);
664664
writer.WriteProperty(OpenApiConstants.DynamicRef, DynamicRef);
665665
writer.WriteProperty(OpenApiConstants.DynamicAnchor, DynamicAnchor);
@@ -674,24 +674,24 @@ internal void WriteJsonSchemaKeywords(IOpenApiWriter writer)
674674
writer.WriteOptionalObject(
675675
OpenApiConstants.UnevaluatedProperties,
676676
UnevaluatedPropertiesSchema,
677-
(w, s) => s.SerializeAsV31(w));
677+
callback);
678678
}
679679
else if (!UnevaluatedProperties)
680680
{
681681
writer.WriteProperty(OpenApiConstants.UnevaluatedProperties, UnevaluatedProperties);
682682
}
683683
}
684684
writer.WriteOptionalCollection(OpenApiConstants.Examples, Examples, (nodeWriter, s) => nodeWriter.WriteAny(s));
685-
writer.WriteOptionalMap(OpenApiConstants.PatternProperties, PatternProperties, (w, s) => s.SerializeAsV31(w));
685+
writer.WriteOptionalMap(OpenApiConstants.PatternProperties, PatternProperties, callback);
686686
writer.WriteOptionalMap(OpenApiConstants.DependentRequired, DependentRequired, (w, s) => w.WriteValue(s));
687687
writer.WriteProperty(OpenApiConstants.ContentEncoding, ContentEncoding);
688688
writer.WriteProperty(OpenApiConstants.ContentMediaType, ContentMediaType);
689-
writer.WriteOptionalObject(OpenApiConstants.ContentSchema, ContentSchema, (w, s) => s.SerializeAsV31(w));
690-
writer.WriteOptionalObject(OpenApiConstants.PropertyNames, PropertyNames, (w, s) => s.SerializeAsV31(w));
691-
writer.WriteOptionalMap(OpenApiConstants.DependentSchemas, DependentSchemas, (w, s) => s.SerializeAsV31(w));
692-
writer.WriteOptionalObject(OpenApiConstants.If, If, (w, s) => s.SerializeAsV31(w));
693-
writer.WriteOptionalObject(OpenApiConstants.Then, Then, (w, s) => s.SerializeAsV31(w));
694-
writer.WriteOptionalObject(OpenApiConstants.Else, Else, (w, s) => s.SerializeAsV31(w));
689+
writer.WriteOptionalObject(OpenApiConstants.ContentSchema, ContentSchema, callback);
690+
writer.WriteOptionalObject(OpenApiConstants.PropertyNames, PropertyNames, callback);
691+
writer.WriteOptionalMap(OpenApiConstants.DependentSchemas, DependentSchemas, callback);
692+
writer.WriteOptionalObject(OpenApiConstants.If, If, callback);
693+
writer.WriteOptionalObject(OpenApiConstants.Then, Then, callback);
694+
writer.WriteOptionalObject(OpenApiConstants.Else, Else, callback);
695695
}
696696

697697
private void WriteV3CompatibilityKeywords(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiSerializable> callback)

test/Microsoft.OpenApi.Tests/Mocks/OpenApiSchemaSerializationTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,37 @@ public void SerializeAsV3_DoesNotCallV31OrV2Serialization()
4545
_xmlMock.Verify(c => c.SerializeAsV2(It.IsAny<IOpenApiWriter>()), Times.Never, "V2 method should not be called");
4646
_xmlMock.Verify(c => c.SerializeAsV31(It.IsAny<IOpenApiWriter>()), Times.Never, "V31 method should not be called");
4747
}
48+
49+
[Fact]
50+
public void SerializeAsV31_UsesV31CallbackForJsonSchemaKeywords()
51+
{
52+
using var stringWriter = new StringWriter();
53+
var writer = new OpenApiJsonWriter(stringWriter);
54+
var childSchemaMock = new Mock<OpenApiSchema> { CallBase = true };
55+
childSchemaMock.Object.Type = JsonSchemaType.String;
56+
_schema.ContentSchema = childSchemaMock.Object;
57+
58+
_schema.SerializeAsV31(writer);
59+
60+
childSchemaMock.Verify(c => c.SerializeAsV31(It.IsAny<IOpenApiWriter>()), Times.AtLeastOnce);
61+
childSchemaMock.Verify(c => c.SerializeAsV32(It.IsAny<IOpenApiWriter>()), Times.Never);
62+
childSchemaMock.Verify(c => c.SerializeAsV3(It.IsAny<IOpenApiWriter>()), Times.Never);
63+
}
64+
65+
[Fact]
66+
public void SerializeAsV32_UsesV32CallbackForJsonSchemaKeywords()
67+
{
68+
using var stringWriter = new StringWriter();
69+
var writer = new OpenApiJsonWriter(stringWriter);
70+
var childSchemaMock = new Mock<OpenApiSchema> { CallBase = true };
71+
childSchemaMock.Object.Type = JsonSchemaType.String;
72+
_schema.ContentSchema = childSchemaMock.Object;
73+
74+
_schema.SerializeAsV32(writer);
75+
76+
childSchemaMock.Verify(c => c.SerializeAsV32(It.IsAny<IOpenApiWriter>()), Times.AtLeastOnce);
77+
childSchemaMock.Verify(c => c.SerializeAsV31(It.IsAny<IOpenApiWriter>()), Times.Never);
78+
childSchemaMock.Verify(c => c.SerializeAsV3(It.IsAny<IOpenApiWriter>()), Times.Never);
79+
}
4880
}
4981
}

0 commit comments

Comments
 (0)