Skip to content

Commit 24c2a0b

Browse files
baywetCopilot
andcommitted
chore(library): add v3 contains extension deserialization
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 7927d30 commit 24c2a0b

3 files changed

Lines changed: 70 additions & 0 deletions

File tree

src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,32 @@ internal static partial class OpenApiV3Deserializer
316316
OpenApiConstants.ContentSchemaExtension,
317317
(o, n, doc, c) => o.ContentSchema = LoadSchema(n, doc, c)
318318
},
319+
{
320+
OpenApiConstants.ContainsExtension,
321+
(o, n, doc, c) => o.Contains = LoadSchema(n, doc, c)
322+
},
323+
{
324+
OpenApiConstants.MaxContainsExtension,
325+
(o, n, _, _) =>
326+
{
327+
var maxContains = n.GetScalarValue();
328+
if (maxContains != null)
329+
{
330+
o.MaxContains = uint.Parse(maxContains, CultureInfo.InvariantCulture);
331+
}
332+
}
333+
},
334+
{
335+
OpenApiConstants.MinContainsExtension,
336+
(o, n, _, _) =>
337+
{
338+
var minContains = n.GetScalarValue();
339+
if (minContains != null)
340+
{
341+
o.MinContains = uint.Parse(minContains, CultureInfo.InvariantCulture);
342+
}
343+
}
344+
},
319345
{
320346
OpenApiConstants.PropertyNamesExtension,
321347
(o, n, doc, c) => o.PropertyNames = LoadSchema(n, doc, c)

test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,11 @@ public void ParseSchemaWithOaiCompatibilityKeywordsShouldSucceed()
189189
""x-jsonschema-contentSchema"": {
190190
""type"": ""array""
191191
},
192+
""x-jsonschema-contains"": {
193+
""type"": ""string""
194+
},
195+
""x-jsonschema-maxContains"": 5,
196+
""x-jsonschema-minContains"": 1,
192197
""x-jsonschema-propertyNames"": {
193198
""pattern"": ""^[a-z]+$""
194199
},
@@ -216,6 +221,9 @@ public void ParseSchemaWithOaiCompatibilityKeywordsShouldSucceed()
216221
Assert.Equal("base64", missingProperties.ContentEncoding);
217222
Assert.Equal("application/jwt", missingProperties.ContentMediaType);
218223
Assert.Equal(JsonSchemaType.Array, missingProperties.ContentSchema?.Type);
224+
Assert.Equal(JsonSchemaType.String, missingProperties.Contains?.Type);
225+
Assert.Equal((uint?)5, missingProperties.MaxContains);
226+
Assert.Equal((uint?)1, missingProperties.MinContains);
219227
Assert.Equal("^[a-z]+$", missingProperties.PropertyNames?.Pattern);
220228
Assert.Equal(JsonSchemaType.String, missingProperties.DependentSchemas?["token"].Type);
221229
Assert.NotNull(missingProperties.If?.Required);

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1817,6 +1817,42 @@ public void DeserializePatternPropertiesExtensionInV3AssignsPatternPropertiesPro
18171817
Assert.True(schema.Extensions is null || !schema.Extensions.ContainsKey("x-jsonschema-patternProperties"));
18181818
}
18191819

1820+
[Fact]
1821+
public void DeserializeContainsExtensionsInV3AssignsContainsProperties()
1822+
{
1823+
var jsonContent = """
1824+
{
1825+
"openapi": "3.0.0",
1826+
"info": { "title": "Test", "version": "1.0" },
1827+
"paths": {},
1828+
"components": {
1829+
"schemas": {
1830+
"TestSchema": {
1831+
"type": "array",
1832+
"x-jsonschema-contains": {
1833+
"type": "string"
1834+
},
1835+
"x-jsonschema-maxContains": 5,
1836+
"x-jsonschema-minContains": 1
1837+
}
1838+
}
1839+
}
1840+
}
1841+
""";
1842+
1843+
var readResult = OpenApiDocument.Parse(jsonContent, "json");
1844+
1845+
Assert.Empty(readResult.Diagnostic.Errors);
1846+
var schema = readResult.Document.Components.Schemas["TestSchema"];
1847+
var missingProperties = Assert.IsAssignableFrom<IOpenApiSchemaMissingProperties>(schema);
1848+
Assert.Equal(JsonSchemaType.String, missingProperties.Contains?.Type);
1849+
Assert.Equal((uint?)5, missingProperties.MaxContains);
1850+
Assert.Equal((uint?)1, missingProperties.MinContains);
1851+
Assert.True(schema.Extensions is null || !schema.Extensions.ContainsKey(OpenApiConstants.ContainsExtension));
1852+
Assert.True(schema.Extensions is null || !schema.Extensions.ContainsKey(OpenApiConstants.MaxContainsExtension));
1853+
Assert.True(schema.Extensions is null || !schema.Extensions.ContainsKey(OpenApiConstants.MinContainsExtension));
1854+
}
1855+
18201856
internal class SchemaVisitor : OpenApiVisitorBase
18211857
{
18221858
public List<string> Titles = new();

0 commit comments

Comments
 (0)