diff --git a/eng/Versions.props b/eng/Versions.props
index 7f3069f1a8c2..9f0a4999f349 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -188,8 +188,8 @@
$(XunitVersion)
3.1.3
5.2.2
- 2.0.0
- 2.0.0
+ 3.0.0
+ 3.0.0
6.0.322601
1.10.93
diff --git a/src/OpenApi/gen/XmlCommentGenerator.Emitter.cs b/src/OpenApi/gen/XmlCommentGenerator.Emitter.cs
index b7bff6ff1282..fa7063a5b42b 100644
--- a/src/OpenApi/gen/XmlCommentGenerator.Emitter.cs
+++ b/src/OpenApi/gen/XmlCommentGenerator.Emitter.cs
@@ -415,7 +415,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
}
foreach (var mediaType in content)
{
- mediaType.Example = jsonString.Parse();
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = jsonString.Parse();
+ }
}
}
}
@@ -476,7 +479,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
var parsedExample = jsonString.Parse();
foreach (var mediaType in content)
{
- mediaType.Example = parsedExample;
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = parsedExample;
+ }
}
}
}
diff --git a/src/OpenApi/src/Services/OpenApiDocumentService.cs b/src/OpenApi/src/Services/OpenApiDocumentService.cs
index f342f5b7943b..fed0591099c2 100644
--- a/src/OpenApi/src/Services/OpenApiDocumentService.cs
+++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs
@@ -412,7 +412,7 @@ private async Task GetResponseAsync(
var response = new OpenApiResponse
{
Description = apiResponseType.Description ?? ReasonPhrases.GetReasonPhrase(statusCode),
- Content = new Dictionary()
+ Content = new Dictionary()
};
// ApiResponseFormats aggregates information about the supported response content types
@@ -570,7 +570,7 @@ private async Task GetFormRequestBody(
// serializing a form collection from an empty body. Instead, requiredness
// must be set on a per-parameter basis. See below.
Required = true,
- Content = new Dictionary()
+ Content = new Dictionary()
};
var schema = new OpenApiSchema { Type = JsonSchemaType.Object, Properties = new Dictionary() };
@@ -744,7 +744,7 @@ private async Task GetJsonRequestBody(
var requestBody = new OpenApiRequestBody
{
Required = IsRequired(bodyParameter),
- Content = new Dictionary(),
+ Content = new Dictionary(),
Description = GetParameterDescriptionFromAttribute(bodyParameter)
};
diff --git a/src/OpenApi/src/Services/OpenApiGenerator.cs b/src/OpenApi/src/Services/OpenApiGenerator.cs
index 6257f7fa2fea..db8a1ba35ec1 100644
--- a/src/OpenApi/src/Services/OpenApiGenerator.cs
+++ b/src/OpenApi/src/Services/OpenApiGenerator.cs
@@ -197,7 +197,7 @@ private static OpenApiResponses GetOpenApiResponses(MethodInfo method, EndpointM
// TODO: Use the discarded response Type for schema generation
var (_, contentTypes) = annotation.Value;
- var responseContent = new Dictionary();
+ var responseContent = new Dictionary();
foreach (var contentType in contentTypes)
{
@@ -269,7 +269,7 @@ private static void GenerateDefaultResponses(Dictionary();
- var requestBodyContent = new Dictionary();
+ var requestBodyContent = new Dictionary();
if (acceptsMetadata is not null)
{
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AddOpenApiTests.CanInterceptAddOpenApi#OpenApiXmlCommentSupport.generated.verified.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AddOpenApiTests.CanInterceptAddOpenApi#OpenApiXmlCommentSupport.generated.verified.cs
index ce2763fd112a..033b9d53a57b 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AddOpenApiTests.CanInterceptAddOpenApi#OpenApiXmlCommentSupport.generated.verified.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AddOpenApiTests.CanInterceptAddOpenApi#OpenApiXmlCommentSupport.generated.verified.cs
@@ -397,7 +397,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
}
foreach (var mediaType in content)
{
- mediaType.Example = jsonString.Parse();
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = jsonString.Parse();
+ }
}
}
}
@@ -458,7 +461,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
var parsedExample = jsonString.Parse();
foreach (var mediaType in content)
{
- mediaType.Example = parsedExample;
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = parsedExample;
+ }
}
}
}
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AdditionalTextsTests.CanHandleXmlForSchemasInAdditionalTexts#OpenApiXmlCommentSupport.generated.verified.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AdditionalTextsTests.CanHandleXmlForSchemasInAdditionalTexts#OpenApiXmlCommentSupport.generated.verified.cs
index 42aff6ae7205..e6e7931fe493 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AdditionalTextsTests.CanHandleXmlForSchemasInAdditionalTexts#OpenApiXmlCommentSupport.generated.verified.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AdditionalTextsTests.CanHandleXmlForSchemasInAdditionalTexts#OpenApiXmlCommentSupport.generated.verified.cs
@@ -426,7 +426,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
}
foreach (var mediaType in content)
{
- mediaType.Example = jsonString.Parse();
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = jsonString.Parse();
+ }
}
}
}
@@ -487,7 +490,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
var parsedExample = jsonString.Parse();
foreach (var mediaType in content)
{
- mediaType.Example = parsedExample;
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = parsedExample;
+ }
}
}
}
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/CompletenessTests.SupportsAllXmlTagsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/CompletenessTests.SupportsAllXmlTagsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs
index 03379781d78f..f8bb6647f9e8 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/CompletenessTests.SupportsAllXmlTagsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/CompletenessTests.SupportsAllXmlTagsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs
@@ -524,7 +524,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
}
foreach (var mediaType in content)
{
- mediaType.Example = jsonString.Parse();
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = jsonString.Parse();
+ }
}
}
}
@@ -585,7 +588,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
var parsedExample = jsonString.Parse();
foreach (var mediaType in content)
{
- mediaType.Example = parsedExample;
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = parsedExample;
+ }
}
}
}
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromControllers#OpenApiXmlCommentSupport.generated.verified.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromControllers#OpenApiXmlCommentSupport.generated.verified.cs
index 0c2836cc9f2f..610720f3362c 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromControllers#OpenApiXmlCommentSupport.generated.verified.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromControllers#OpenApiXmlCommentSupport.generated.verified.cs
@@ -401,7 +401,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
}
foreach (var mediaType in content)
{
- mediaType.Example = jsonString.Parse();
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = jsonString.Parse();
+ }
}
}
}
@@ -462,7 +465,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
var parsedExample = jsonString.Parse();
foreach (var mediaType in content)
{
- mediaType.Example = parsedExample;
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = parsedExample;
+ }
}
}
}
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromMinimalApis#OpenApiXmlCommentSupport.generated.verified.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromMinimalApis#OpenApiXmlCommentSupport.generated.verified.cs
index c8da228d94d8..ddb87970b03b 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromMinimalApis#OpenApiXmlCommentSupport.generated.verified.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromMinimalApis#OpenApiXmlCommentSupport.generated.verified.cs
@@ -445,7 +445,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
}
foreach (var mediaType in content)
{
- mediaType.Example = jsonString.Parse();
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = jsonString.Parse();
+ }
}
}
}
@@ -506,7 +509,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
var parsedExample = jsonString.Parse();
foreach (var mediaType in content)
{
- mediaType.Example = parsedExample;
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = parsedExample;
+ }
}
}
}
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/SchemaTests.SupportsXmlCommentsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/SchemaTests.SupportsXmlCommentsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs
index e192067879b7..0d5fbc656928 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/SchemaTests.SupportsXmlCommentsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/SchemaTests.SupportsXmlCommentsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs
@@ -427,7 +427,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
}
foreach (var mediaType in content)
{
- mediaType.Example = jsonString.Parse();
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = jsonString.Parse();
+ }
}
}
}
@@ -488,7 +491,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
var parsedExample = jsonString.Parse();
foreach (var mediaType in content)
{
- mediaType.Example = parsedExample;
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = parsedExample;
+ }
}
}
}
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/SchemaTests.XmlCommentsOnPropertiesShouldApplyToSchemaReferences#OpenApiXmlCommentSupport.generated.verified.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/SchemaTests.XmlCommentsOnPropertiesShouldApplyToSchemaReferences#OpenApiXmlCommentSupport.generated.verified.cs
index 62eca1ce5fa6..de647759ac65 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/SchemaTests.XmlCommentsOnPropertiesShouldApplyToSchemaReferences#OpenApiXmlCommentSupport.generated.verified.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/SchemaTests.XmlCommentsOnPropertiesShouldApplyToSchemaReferences#OpenApiXmlCommentSupport.generated.verified.cs
@@ -406,7 +406,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
}
foreach (var mediaType in content)
{
- mediaType.Example = jsonString.Parse();
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = jsonString.Parse();
+ }
}
}
}
@@ -467,7 +470,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
var parsedExample = jsonString.Parse();
foreach (var mediaType in content)
{
- mediaType.Example = parsedExample;
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = parsedExample;
+ }
}
}
}
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/XmlCommentDocumentationIdTests.CanMergeXmlCommentsWithDifferentDocumentationIdFormats#OpenApiXmlCommentSupport.generated.verified.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/XmlCommentDocumentationIdTests.CanMergeXmlCommentsWithDifferentDocumentationIdFormats#OpenApiXmlCommentSupport.generated.verified.cs
index 2bea3547fc7b..4f4b2eba4adb 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/XmlCommentDocumentationIdTests.CanMergeXmlCommentsWithDifferentDocumentationIdFormats#OpenApiXmlCommentSupport.generated.verified.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/XmlCommentDocumentationIdTests.CanMergeXmlCommentsWithDifferentDocumentationIdFormats#OpenApiXmlCommentSupport.generated.verified.cs
@@ -398,7 +398,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
}
foreach (var mediaType in content)
{
- mediaType.Example = jsonString.Parse();
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = jsonString.Parse();
+ }
}
}
}
@@ -459,7 +462,10 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
var parsedExample = jsonString.Parse();
foreach (var mediaType in content)
{
- mediaType.Example = parsedExample;
+ if (mediaType is OpenApiMediaType concrete)
+ {
+ concrete.Example = parsedExample;
+ }
}
}
}
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Extensions/OpenApiEndpointRouteBuilderExtensionsTests.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Extensions/OpenApiEndpointRouteBuilderExtensionsTests.cs
index 1df8c8647ba5..010d3e874408 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Extensions/OpenApiEndpointRouteBuilderExtensionsTests.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Extensions/OpenApiEndpointRouteBuilderExtensionsTests.cs
@@ -100,7 +100,7 @@ public async Task MapOpenApi_ReturnsDefaultDocumentIfNoNameProvided(string expec
Assert.Equal(expectedContentType, context.Response.ContentType);
var responseString = Encoding.UTF8.GetString(responseBodyStream.ToArray());
// String check to validate that generated document starts with YAML syntax
- Assert.Equal(isYaml, responseString.StartsWith("openapi: '3.1.1'", StringComparison.OrdinalIgnoreCase));
+ Assert.Equal(isYaml, responseString.StartsWith("openapi: '3.1.2'", StringComparison.OrdinalIgnoreCase));
responseBodyStream.Position = 0;
await ValidateOpenApiDocumentAsync(responseBodyStream, document =>
{
@@ -221,7 +221,7 @@ public async Task MapOpenApi_ReturnsDocumentIfNameProvidedInQuery(string expecte
Assert.Equal(expectedContentType, context.Response.ContentType);
var responseString = Encoding.UTF8.GetString(responseBodyStream.ToArray());
// String check to validate that generated document starts with YAML syntax
- Assert.Equal(isYaml, responseString.StartsWith("openapi: '3.1.1'", StringComparison.OrdinalIgnoreCase));
+ Assert.Equal(isYaml, responseString.StartsWith("openapi: '3.1.2'", StringComparison.OrdinalIgnoreCase));
responseBodyStream.Position = 0;
await ValidateOpenApiDocumentAsync(responseBodyStream, document =>
{
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/OpenApiDocumentIntegrationTests.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/OpenApiDocumentIntegrationTests.cs
index 47540c6a10b2..19d9bfa48d53 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/OpenApiDocumentIntegrationTests.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/OpenApiDocumentIntegrationTests.cs
@@ -16,6 +16,7 @@ public static TheoryData OpenApiDocuments()
[
OpenApiSpecVersion.OpenApi3_0,
OpenApiSpecVersion.OpenApi3_1,
+ OpenApiSpecVersion.OpenApi3_2,
];
var testCases = new TheoryData();
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt
index 54815495aa78..36fa03d8e378 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt
@@ -1,5 +1,5 @@
{
- "openapi": "3.1.1",
+ "openapi": "3.1.2",
"info": {
"title": "Sample | controllers",
"version": "1.0.0"
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=forms.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=forms.verified.txt
index c68e4d17c64d..aba205890ede 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=forms.verified.txt
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=forms.verified.txt
@@ -1,5 +1,5 @@
{
- "openapi": "3.1.1",
+ "openapi": "3.1.2",
"info": {
"title": "Sample | forms",
"version": "1.0.0"
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=responses.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=responses.verified.txt
index 45a4660aa78c..4ecf3886a25f 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=responses.verified.txt
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=responses.verified.txt
@@ -1,5 +1,5 @@
{
- "openapi": "3.1.1",
+ "openapi": "3.1.2",
"info": {
"title": "Sample | responses",
"version": "1.0.0"
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=schemas-by-ref.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=schemas-by-ref.verified.txt
index 61d0527bc80f..798fd4126407 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=schemas-by-ref.verified.txt
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=schemas-by-ref.verified.txt
@@ -1,5 +1,5 @@
{
- "openapi": "3.1.1",
+ "openapi": "3.1.2",
"info": {
"title": "Sample | schemas-by-ref",
"version": "1.0.0"
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v1.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v1.verified.txt
index abbe8732d74f..c1b8af2ebde4 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v1.verified.txt
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v1.verified.txt
@@ -1,5 +1,5 @@
{
- "openapi": "3.1.1",
+ "openapi": "3.1.2",
"info": {
"title": "Sample | v1",
"version": "1.0.0"
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v2.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v2.verified.txt
index fed56ba97790..6098355a6009 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v2.verified.txt
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v2.verified.txt
@@ -1,5 +1,5 @@
{
- "openapi": "3.1.1",
+ "openapi": "3.1.2",
"info": {
"title": "Sample | v2",
"contact": {
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=xml.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=xml.verified.txt
index 7a4b01a03316..c2d9ef8c8393 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=xml.verified.txt
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_1/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=xml.verified.txt
@@ -1,5 +1,5 @@
{
- "openapi": "3.1.1",
+ "openapi": "3.1.2",
"info": {
"title": "Sample | xml",
"version": "1.0.0"
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt
new file mode 100644
index 000000000000..e37a837ab7d0
--- /dev/null
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt
@@ -0,0 +1,169 @@
+{
+ "openapi": "3.2.0",
+ "info": {
+ "title": "Sample | controllers",
+ "version": "1.0.0"
+ },
+ "paths": {
+ "/getbyidandname/{id}/{name}": {
+ "get": {
+ "tags": [
+ "Test"
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ {
+ "name": "name",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "minLength": 5,
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "text/plain": {
+ "schema": {
+ "type": "string"
+ }
+ },
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ },
+ "text/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gettypedresult": {
+ "get": {
+ "tags": [
+ "Test"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/MvcTodo"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forms": {
+ "post": {
+ "tags": [
+ "Test"
+ ],
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "Title": {
+ "type": "string"
+ },
+ "Description": {
+ "type": "string"
+ },
+ "IsCompleted": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/getcultureinvariant": {
+ "get": {
+ "tags": [
+ "Test"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CurrentWeather"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "CurrentWeather": {
+ "type": "object",
+ "properties": {
+ "temperature": {
+ "maximum": 100.5,
+ "minimum": -100.5,
+ "type": "number",
+ "format": "float",
+ "default": 0.1
+ }
+ }
+ },
+ "MvcTodo": {
+ "required": [
+ "title",
+ "description",
+ "isCompleted"
+ ],
+ "type": "object",
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "isCompleted": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ {
+ "name": "Test"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=forms.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=forms.verified.txt
new file mode 100644
index 000000000000..05774d38b2a7
--- /dev/null
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=forms.verified.txt
@@ -0,0 +1,227 @@
+{
+ "openapi": "3.2.0",
+ "info": {
+ "title": "Sample | forms",
+ "version": "1.0.0"
+ },
+ "paths": {
+ "/forms/form-file": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "required": [
+ "resume"
+ ],
+ "type": "object",
+ "properties": {
+ "resume": {
+ "$ref": "#/components/schemas/IFormFile"
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/forms/form-files": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "required": [
+ "files"
+ ],
+ "type": "object",
+ "properties": {
+ "files": {
+ "$ref": "#/components/schemas/IFormFileCollection"
+ }
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/forms/form-file-multiple": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "required": [
+ "resume",
+ "files"
+ ],
+ "type": "object",
+ "allOf": [
+ {
+ "type": "object",
+ "properties": {
+ "resume": {
+ "$ref": "#/components/schemas/IFormFile"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "properties": {
+ "files": {
+ "$ref": "#/components/schemas/IFormFileCollection"
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/forms/form-todo": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "$ref": "#/components/schemas/Todo"
+ }
+ },
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "$ref": "#/components/schemas/Todo"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/forms/forms-pocos-and-files": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "required": [
+ "file"
+ ],
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Todo"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "file": {
+ "$ref": "#/components/schemas/IFormFile"
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "IFormFile": {
+ "type": "string",
+ "format": "binary"
+ },
+ "IFormFileCollection": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IFormFile"
+ }
+ },
+ "Todo": {
+ "required": [
+ "id",
+ "title",
+ "completed",
+ "createdAt"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The unique identifier of the to-do item.",
+ "format": "int32"
+ },
+ "title": {
+ "type": "string",
+ "description": "The title of the to-do item."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Indicates whether the to-do item is completed."
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "The date and time when the to-do item was created.",
+ "format": "date-time"
+ }
+ },
+ "description": "Represents a to-do item."
+ }
+ }
+ },
+ "tags": [
+ {
+ "name": "Sample"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=responses.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=responses.verified.txt
new file mode 100644
index 000000000000..b4766a0d2cbf
--- /dev/null
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=responses.verified.txt
@@ -0,0 +1,208 @@
+{
+ "openapi": "3.2.0",
+ "info": {
+ "title": "Sample | responses",
+ "version": "1.0.0"
+ },
+ "paths": {
+ "/responses/200-add-xml": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Todo"
+ }
+ },
+ "text/xml": {
+ "schema": {
+ "$ref": "#/components/schemas/Todo"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/responses/200-only-xml": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "text/xml": {
+ "schema": {
+ "$ref": "#/components/schemas/Todo"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/responses/triangle": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Triangle"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/responses/shape": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Shape"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "Shape": {
+ "required": [
+ "$type"
+ ],
+ "type": "object",
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ShapeTriangle"
+ },
+ {
+ "$ref": "#/components/schemas/ShapeSquare"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "$type",
+ "mapping": {
+ "triangle": "#/components/schemas/ShapeTriangle",
+ "square": "#/components/schemas/ShapeSquare"
+ }
+ }
+ },
+ "ShapeSquare": {
+ "properties": {
+ "$type": {
+ "enum": [
+ "square"
+ ],
+ "type": "string"
+ },
+ "area": {
+ "type": "number",
+ "format": "double"
+ },
+ "color": {
+ "type": "string"
+ },
+ "sides": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "ShapeTriangle": {
+ "properties": {
+ "$type": {
+ "enum": [
+ "triangle"
+ ],
+ "type": "string"
+ },
+ "hypotenuse": {
+ "type": "number",
+ "format": "double"
+ },
+ "color": {
+ "type": "string"
+ },
+ "sides": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "Todo": {
+ "required": [
+ "id",
+ "title",
+ "completed",
+ "createdAt"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The unique identifier of the to-do item.",
+ "format": "int32"
+ },
+ "title": {
+ "type": "string",
+ "description": "The title of the to-do item."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Indicates whether the to-do item is completed."
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "The date and time when the to-do item was created.",
+ "format": "date-time"
+ }
+ },
+ "description": "Represents a to-do item."
+ },
+ "Triangle": {
+ "type": "object",
+ "properties": {
+ "hypotenuse": {
+ "type": "number",
+ "format": "double"
+ },
+ "color": {
+ "type": "string"
+ },
+ "sides": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ {
+ "name": "Sample"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=schemas-by-ref.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=schemas-by-ref.verified.txt
new file mode 100644
index 000000000000..f998e65c457f
--- /dev/null
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=schemas-by-ref.verified.txt
@@ -0,0 +1,1639 @@
+{
+ "openapi": "3.2.0",
+ "info": {
+ "title": "Sample | schemas-by-ref",
+ "version": "1.0.0"
+ },
+ "paths": {
+ "/schemas-by-ref/typed-results": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Triangle"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/multiple-results": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Triangle"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not Found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/iresult-no-produces": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/iresult-with-produces": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "text/xml": {
+ "schema": {
+ "$ref": "#/components/schemas/Triangle"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/primitives": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "query",
+ "description": "The ID associated with the Todo item.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ {
+ "name": "size",
+ "in": "query",
+ "description": "The number of Todos to fetch",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/product": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Product"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Product"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/account": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Account"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Account"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/array-of-ints": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/list-of-ints": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/ienumerable-of-ints": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/dictionary-of-ints": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/frozen-dictionary-of-ints": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/shape": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Shape"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/weatherforecastbase": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/WeatherForecastBase"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/person": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Person"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/category": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Category"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/container": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ContainerType"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/root": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Root"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/location": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LocationContainer"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/parent": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ParentObject"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/child": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ChildObject"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/json-patch": {
+ "patch": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json-patch+json": {
+ "schema": {
+ "$ref": "#/components/schemas/JsonPatchDocument"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/json-patch-generic": {
+ "patch": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json-patch+json": {
+ "schema": {
+ "$ref": "#/components/schemas/JsonPatchDocument"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/custom-iresult": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CustomIResultImplementor"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/config-with-generic-lists": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Config"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/project-response": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProjectResponse"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/subscription": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Subscription"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/nullable-response": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NullableResponseModel"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/nullable-return-type": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/NullableResponseModel"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/nullable-request": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/NullableRequestModel"
+ }
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/complex-nullable-hierarchy": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ComplexHierarchyModel"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/nullable-array-elements": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NullableArrayModel"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/optional-with-default": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ModelWithDefaults"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/schemas-by-ref/nullable-enum-response": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EnumNullableModel"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "Account": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "AddressDto": {
+ "required": [
+ "relatedLocation"
+ ],
+ "type": "object",
+ "properties": {
+ "relatedLocation": {
+ "$ref": "#/components/schemas/LocationDto"
+ }
+ }
+ },
+ "Category": {
+ "required": [
+ "name",
+ "parent"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "parent": {
+ "$ref": "#/components/schemas/Category"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Tag"
+ }
+ }
+ }
+ },
+ "ChildObject": {
+ "required": [
+ "parent"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "parent": {
+ "$ref": "#/components/schemas/ParentObject"
+ }
+ }
+ },
+ "CityResponse": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "ComplexHierarchyModel": {
+ "required": [
+ "id",
+ "requiredNested"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "optionalNested": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/NestedModel"
+ }
+ ]
+ },
+ "requiredNested": {
+ "$ref": "#/components/schemas/NestedModel"
+ },
+ "nullableListWithNullableItems": {
+ "type": [
+ "null",
+ "array"
+ ],
+ "items": {
+ "$ref": "#/components/schemas/NestedModel"
+ }
+ }
+ }
+ },
+ "ComplexType": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "timestamp": {
+ "type": [
+ "null",
+ "string"
+ ],
+ "format": "date-time"
+ }
+ }
+ },
+ "Config": {
+ "type": "object",
+ "properties": {
+ "items1": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConfigItem"
+ }
+ },
+ "items2": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConfigItem"
+ }
+ }
+ }
+ },
+ "ConfigItem": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": [
+ "null",
+ "integer"
+ ],
+ "format": "int32"
+ },
+ "lang": {
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "words": {
+ "type": [
+ "null",
+ "object"
+ ]
+ },
+ "break": {
+ "type": [
+ "null",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "willBeGood": {
+ "type": [
+ "null",
+ "string"
+ ]
+ }
+ }
+ },
+ "ContainerType": {
+ "type": "object",
+ "properties": {
+ "seq1": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "seq2": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "CustomIResultImplementor": {
+ "required": [
+ "content"
+ ],
+ "type": "object",
+ "properties": {
+ "content": {
+ "type": "string"
+ }
+ }
+ },
+ "EnumNullableModel": {
+ "required": [
+ "requiredEnum"
+ ],
+ "type": "object",
+ "properties": {
+ "requiredEnum": {
+ "$ref": "#/components/schemas/TestEnum"
+ },
+ "nullableEnum": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/TestEnum"
+ }
+ ]
+ },
+ "listOfNullableEnums": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TestEnum"
+ }
+ }
+ }
+ },
+ "Item": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "value": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "JsonPatchDocument": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "oneOf": [
+ {
+ "required": [
+ "op",
+ "path",
+ "value"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "enum": [
+ "add",
+ "replace",
+ "test"
+ ],
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ },
+ "value": { }
+ },
+ "additionalProperties": false
+ },
+ {
+ "required": [
+ "op",
+ "path",
+ "from"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "enum": [
+ "move",
+ "copy"
+ ],
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ },
+ "from": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "required": [
+ "op",
+ "path"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "enum": [
+ "remove"
+ ],
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ }
+ },
+ "LocationContainer": {
+ "required": [
+ "location"
+ ],
+ "type": "object",
+ "properties": {
+ "location": {
+ "$ref": "#/components/schemas/LocationDto"
+ }
+ }
+ },
+ "LocationDto": {
+ "required": [
+ "address"
+ ],
+ "type": "object",
+ "properties": {
+ "address": {
+ "$ref": "#/components/schemas/AddressDto"
+ }
+ }
+ },
+ "ModelWithDefaults": {
+ "type": "object",
+ "properties": {
+ "propertyWithDefault": {
+ "type": "string"
+ },
+ "nullableWithNull": {
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "numberWithDefault": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "boolWithDefault": {
+ "type": "boolean"
+ }
+ }
+ },
+ "NestedModel": {
+ "required": [
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "optionalValue": {
+ "type": [
+ "null",
+ "integer"
+ ],
+ "format": "int32"
+ },
+ "deepNested": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/ComplexType"
+ }
+ ]
+ }
+ }
+ },
+ "NullableArrayModel": {
+ "type": "object",
+ "properties": {
+ "nullableArray": {
+ "type": [
+ "null",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "listWithNullableElements": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "nullableDictionaryWithNullableValues": {
+ "type": [
+ "null",
+ "object"
+ ],
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "NullableRequestModel": {
+ "required": [
+ "requiredField"
+ ],
+ "type": "object",
+ "properties": {
+ "requiredField": {
+ "type": "string"
+ },
+ "optionalField": {
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "nullableList": {
+ "type": [
+ "null",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "nullableDictionary": {
+ "type": [
+ "null",
+ "object"
+ ],
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "NullableResponseModel": {
+ "required": [
+ "requiredProperty"
+ ],
+ "type": "object",
+ "properties": {
+ "requiredProperty": {
+ "type": "string"
+ },
+ "nullableProperty": {
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "nullableComplexProperty": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/ComplexType"
+ }
+ ]
+ }
+ }
+ },
+ "ParentObject": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "children": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ChildObject"
+ }
+ }
+ }
+ },
+ "Person": {
+ "required": [
+ "discriminator"
+ ],
+ "type": "object",
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/PersonStudent"
+ },
+ {
+ "$ref": "#/components/schemas/PersonTeacher"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "discriminator",
+ "mapping": {
+ "student": "#/components/schemas/PersonStudent",
+ "teacher": "#/components/schemas/PersonTeacher"
+ }
+ }
+ },
+ "PersonStudent": {
+ "properties": {
+ "discriminator": {
+ "enum": [
+ "student"
+ ],
+ "type": "string"
+ },
+ "gpa": {
+ "type": "number",
+ "format": "double"
+ }
+ }
+ },
+ "PersonTeacher": {
+ "required": [
+ "subject"
+ ],
+ "properties": {
+ "discriminator": {
+ "enum": [
+ "teacher"
+ ],
+ "type": "string"
+ },
+ "subject": {
+ "type": "string"
+ }
+ }
+ },
+ "Product": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "ProjectAddressResponse": {
+ "required": [
+ "city"
+ ],
+ "type": "object",
+ "properties": {
+ "city": {
+ "$ref": "#/components/schemas/CityResponse"
+ }
+ }
+ },
+ "ProjectBuilderResponse": {
+ "required": [
+ "city"
+ ],
+ "type": "object",
+ "properties": {
+ "city": {
+ "$ref": "#/components/schemas/CityResponse"
+ }
+ }
+ },
+ "ProjectResponse": {
+ "required": [
+ "address",
+ "builder"
+ ],
+ "type": "object",
+ "properties": {
+ "address": {
+ "$ref": "#/components/schemas/ProjectAddressResponse"
+ },
+ "builder": {
+ "$ref": "#/components/schemas/ProjectBuilderResponse"
+ }
+ }
+ },
+ "RefProfile": {
+ "required": [
+ "user"
+ ],
+ "type": "object",
+ "properties": {
+ "user": {
+ "$ref": "#/components/schemas/RefUser"
+ }
+ }
+ },
+ "RefUser": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string"
+ }
+ }
+ },
+ "Root": {
+ "type": "object",
+ "properties": {
+ "item1": {
+ "$ref": "#/components/schemas/Item"
+ },
+ "item2": {
+ "$ref": "#/components/schemas/Item"
+ }
+ }
+ },
+ "Shape": {
+ "required": [
+ "$type"
+ ],
+ "type": "object",
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ShapeTriangle"
+ },
+ {
+ "$ref": "#/components/schemas/ShapeSquare"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "$type",
+ "mapping": {
+ "triangle": "#/components/schemas/ShapeTriangle",
+ "square": "#/components/schemas/ShapeSquare"
+ }
+ }
+ },
+ "ShapeSquare": {
+ "properties": {
+ "$type": {
+ "enum": [
+ "square"
+ ],
+ "type": "string"
+ },
+ "area": {
+ "type": "number",
+ "format": "double"
+ },
+ "color": {
+ "type": "string"
+ },
+ "sides": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "ShapeTriangle": {
+ "properties": {
+ "$type": {
+ "enum": [
+ "triangle"
+ ],
+ "type": "string"
+ },
+ "hypotenuse": {
+ "type": "number",
+ "format": "double"
+ },
+ "color": {
+ "type": "string"
+ },
+ "sides": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "Subscription": {
+ "required": [
+ "id",
+ "primaryUser"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "primaryUser": {
+ "$ref": "#/components/schemas/RefProfile"
+ },
+ "secondaryUser": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/RefProfile"
+ }
+ ]
+ }
+ }
+ },
+ "Tag": {
+ "required": [
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "TestEnum": {
+ "type": "integer"
+ },
+ "Triangle": {
+ "type": "object",
+ "properties": {
+ "hypotenuse": {
+ "type": "number",
+ "format": "double"
+ },
+ "color": {
+ "type": "string"
+ },
+ "sides": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ },
+ "WeatherForecastBase": {
+ "required": [
+ "$type"
+ ],
+ "type": "object",
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/WeatherForecastBaseWeatherForecastWithCity"
+ },
+ {
+ "$ref": "#/components/schemas/WeatherForecastBaseWeatherForecastWithTimeSeries"
+ },
+ {
+ "$ref": "#/components/schemas/WeatherForecastBaseWeatherForecastWithLocalNews"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "$type",
+ "mapping": {
+ "0": "#/components/schemas/WeatherForecastBaseWeatherForecastWithCity",
+ "1": "#/components/schemas/WeatherForecastBaseWeatherForecastWithTimeSeries",
+ "2": "#/components/schemas/WeatherForecastBaseWeatherForecastWithLocalNews"
+ }
+ }
+ },
+ "WeatherForecastBaseWeatherForecastWithCity": {
+ "required": [
+ "city"
+ ],
+ "properties": {
+ "$type": {
+ "enum": [
+ 0
+ ],
+ "type": "integer"
+ },
+ "city": {
+ "type": "string"
+ }
+ }
+ },
+ "WeatherForecastBaseWeatherForecastWithLocalNews": {
+ "required": [
+ "news"
+ ],
+ "properties": {
+ "$type": {
+ "enum": [
+ 2
+ ],
+ "type": "integer"
+ },
+ "news": {
+ "type": "string"
+ }
+ }
+ },
+ "WeatherForecastBaseWeatherForecastWithTimeSeries": {
+ "required": [
+ "summary"
+ ],
+ "properties": {
+ "$type": {
+ "enum": [
+ 1
+ ],
+ "type": "integer"
+ },
+ "date": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "temperatureC": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "summary": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ {
+ "name": "Sample"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v1.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v1.verified.txt
new file mode 100644
index 000000000000..aa09fe7a58f9
--- /dev/null
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v1.verified.txt
@@ -0,0 +1,208 @@
+{
+ "openapi": "3.2.0",
+ "info": {
+ "title": "Sample | v1",
+ "version": "1.0.0"
+ },
+ "paths": {
+ "/v1/array-of-guids": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "parameters": [
+ {
+ "name": "guids",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ },
+ {
+ "name": "X-Version",
+ "in": "header",
+ "schema": {
+ "type": "string",
+ "default": "1.0"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/todos": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "summary": "Creates a new todo item.",
+ "parameters": [
+ {
+ "name": "X-Version",
+ "in": "header",
+ "schema": {
+ "type": "string",
+ "default": "1.0"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Todo"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/v1/todos/{id}": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "description": "Returns a specific todo item.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ {
+ "name": "X-Version",
+ "in": "header",
+ "schema": {
+ "type": "string",
+ "default": "1.0"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TodoWithDueDate"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "Todo": {
+ "required": [
+ "id",
+ "title",
+ "completed",
+ "createdAt"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The unique identifier of the to-do item.",
+ "format": "int32"
+ },
+ "title": {
+ "type": "string",
+ "description": "The title of the to-do item."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Indicates whether the to-do item is completed."
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "The date and time when the to-do item was created.",
+ "format": "date-time"
+ }
+ },
+ "description": "Represents a to-do item."
+ },
+ "TodoWithDueDate": {
+ "required": [
+ "dueDate",
+ "id",
+ "title",
+ "completed",
+ "createdAt"
+ ],
+ "type": "object",
+ "properties": {
+ "dueDate": {
+ "type": "string",
+ "description": "The due date of the to-do item.",
+ "format": "date-time"
+ },
+ "id": {
+ "type": "integer",
+ "description": "The unique identifier of the to-do item.",
+ "format": "int32"
+ },
+ "title": {
+ "type": "string",
+ "description": "The title of the to-do item."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Indicates whether the to-do item is completed."
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "The date and time when the to-do item was created.",
+ "format": "date-time"
+ }
+ },
+ "description": "Represents a to-do item with a due date."
+ }
+ },
+ "securitySchemes": {
+ "Bearer": {
+ "type": "http",
+ "scheme": "bearer",
+ "bearerFormat": "Json Web Token"
+ }
+ }
+ },
+ "tags": [
+ {
+ "name": "Sample"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v2.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v2.verified.txt
new file mode 100644
index 000000000000..f7bab54b47b9
--- /dev/null
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=v2.verified.txt
@@ -0,0 +1,69 @@
+{
+ "openapi": "3.2.0",
+ "info": {
+ "title": "Sample | v2",
+ "contact": {
+ "name": "OpenAPI Enthusiast",
+ "email": "iloveopenapi@example.com"
+ },
+ "license": {
+ "name": "MIT"
+ },
+ "version": "1.0.0"
+ },
+ "paths": {
+ "/v2/users": {
+ "get": {
+ "tags": [
+ "users"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "externalDocs": {
+ "description": "Documentation for this OpenAPI schema",
+ "url": "https://example.com/api/docs/schemas/string"
+ }
+ },
+ "externalDocs": {
+ "description": "Documentation for this OpenAPI schema",
+ "url": "https://example.com/api/docs/schemas/array"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "externalDocs": {
+ "description": "Documentation for this OpenAPI endpoint",
+ "url": "https://example.com/api/docs/operations/CreateUser"
+ },
+ "operationId": "CreateUser",
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ {
+ "name": "users"
+ },
+ {
+ "name": "Sample"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=xml.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=xml.verified.txt
new file mode 100644
index 000000000000..74aff7eb39d0
--- /dev/null
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_2/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=xml.verified.txt
@@ -0,0 +1,397 @@
+{
+ "openapi": "3.2.0",
+ "info": {
+ "title": "Sample | xml",
+ "version": "1.0.0"
+ },
+ "paths": {
+ "/xml/type-with-examples": {
+ "get": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TypeWithExamples"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TypeWithExamples"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/xml/todo": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TodoFomInterface"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/xml/project": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Project"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/xml/board": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BoardItem"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/xml/project-record": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProjectRecord"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/xml/todo-with-description": {
+ "post": {
+ "tags": [
+ "Sample"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TodoWithDescription"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/Xml": {
+ "get": {
+ "tags": [
+ "Xml"
+ ],
+ "parameters": [
+ {
+ "name": "name",
+ "in": "query",
+ "description": "The name of the person.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Returns the greeting.",
+ "content": {
+ "text/plain": {
+ "schema": {
+ "type": "string"
+ }
+ },
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ },
+ "text/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "Xml"
+ ],
+ "requestBody": {
+ "description": "The todo to insert into the database.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Todo"
+ }
+ },
+ "text/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Todo"
+ }
+ },
+ "application/*+json": {
+ "schema": {
+ "$ref": "#/components/schemas/Todo"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "text/plain": {
+ "schema": {
+ "type": "string"
+ }
+ },
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ },
+ "text/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "BoardItem": {
+ "required": [
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ }
+ },
+ "description": "An item on the board."
+ },
+ "Project": {
+ "required": [
+ "name",
+ "description"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ }
+ },
+ "description": "The project that contains Todo items."
+ },
+ "ProjectRecord": {
+ "required": [
+ "name",
+ "description"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the project."
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the project."
+ }
+ },
+ "description": "The project that contains Todo items."
+ },
+ "Todo": {
+ "required": [
+ "id",
+ "title",
+ "completed"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "title": {
+ "type": "string"
+ },
+ "completed": {
+ "type": "boolean"
+ }
+ }
+ },
+ "TodoFomInterface": {
+ "required": [
+ "name",
+ "description"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The identifier of the todo.",
+ "format": "int32"
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the todo."
+ },
+ "description": {
+ "type": "string",
+ "description": "A description of the todo."
+ }
+ },
+ "description": "This is a todo item."
+ },
+ "TodoWithDescription": {
+ "required": [
+ "name",
+ "description"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The identifier of the todo, overridden.",
+ "format": "int32"
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the todo, overridden."
+ },
+ "description": {
+ "type": "string",
+ "description": "A description of the the todo.\nAnother description of the todo."
+ }
+ }
+ },
+ "TypeWithExamples": {
+ "type": "object",
+ "properties": {
+ "booleanType": {
+ "type": "boolean",
+ "example": true
+ },
+ "integerType": {
+ "type": "integer",
+ "format": "int32",
+ "example": 42
+ },
+ "longType": {
+ "type": "integer",
+ "format": "int64",
+ "example": 1234567890123456789
+ },
+ "doubleType": {
+ "type": "number",
+ "format": "double",
+ "example": 3.14
+ },
+ "floatType": {
+ "type": "number",
+ "format": "float",
+ "example": 3.14
+ },
+ "dateTimeType": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-01T00:00:00Z"
+ },
+ "dateOnlyType": {
+ "type": "string",
+ "format": "date",
+ "example": "2022-01-01"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ {
+ "name": "Sample"
+ },
+ {
+ "name": "Xml"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApiDocumentLocalizationTests.VerifyOpenApiDocumentIsInvariant.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApiDocumentLocalizationTests.VerifyOpenApiDocumentIsInvariant.verified.txt
index eec2cfe16702..638ebc42a6c2 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApiDocumentLocalizationTests.VerifyOpenApiDocumentIsInvariant.verified.txt
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApiDocumentLocalizationTests.VerifyOpenApiDocumentIsInvariant.verified.txt
@@ -1,5 +1,5 @@
{
- "openapi": "3.1.1",
+ "openapi": "3.1.2",
"info": {
"title": "Sample | localized",
"description": "This is a localized OpenAPI document for français (France).",
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/CustomSchemaTransformerTests.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/CustomSchemaTransformerTests.cs
index 1de9451beec0..be74d233af06 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/CustomSchemaTransformerTests.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/CustomSchemaTransformerTests.cs
@@ -30,7 +30,7 @@ public async Task CustomSchemaTransformer_CanInsertSchemaIntoDocumentFromOperati
operation.Responses["500"] = new OpenApiResponse
{
Description = "Error",
- Content = new Dictionary()
+ Content = new Dictionary()
{
["application/problem+json"] = new OpenApiMediaType
{
@@ -97,7 +97,7 @@ public async Task GetOrCreateSchema_AddsSchemasForMultipleResponseTypes()
operation.Responses["200"] = new OpenApiResponse
{
Description = "Success",
- Content = new Dictionary()
+ Content = new Dictionary()
{
["application/json"] = new OpenApiMediaType
{
@@ -109,7 +109,7 @@ public async Task GetOrCreateSchema_AddsSchemasForMultipleResponseTypes()
operation.Responses["400"] = new OpenApiResponse
{
Description = "Bad Request",
- Content = new Dictionary()
+ Content = new Dictionary()
{
["application/problem+json"] = new OpenApiMediaType
{
@@ -260,7 +260,7 @@ public async Task GetOrCreateSchema_WorksWithNestedTypes()
["200"] = new OpenApiResponse
{
Description = "Success",
- Content = new Dictionary()
+ Content = new Dictionary()
{
["application/json"] = new OpenApiMediaType
{
@@ -346,7 +346,7 @@ public async Task GetOrCreateSchemaAsync_AppliesOtherSchemaTransformers()
operation.Responses["200"] = new OpenApiResponse
{
Description = "A product",
- Content = new Dictionary()
+ Content = new Dictionary()
{
["application/json"] = new OpenApiMediaType
{
@@ -414,7 +414,7 @@ public async Task GetOrCreateSchemaAsync_HandlesConcurrentRequests()
operation.Responses["200"] = new OpenApiResponse
{
Description = "Concurrent schema generation test",
- Content = new Dictionary()
+ Content = new Dictionary()
{
["application/json"] = new OpenApiMediaType
{
@@ -467,7 +467,7 @@ public async Task GetOrCreateSchemaAsync_RespectsJsonSerializerOptions()
operation.Responses["200"] = new OpenApiResponse
{
Description = "User with custom JSON options",
- Content = new Dictionary()
+ Content = new Dictionary()
{
["application/json"] = new OpenApiMediaType
{