diff --git a/src/OpenApi/sample/Controllers/TestController.cs b/src/OpenApi/sample/Controllers/TestController.cs index c3c011c61385..43a1e22250f9 100644 --- a/src/OpenApi/sample/Controllers/TestController.cs +++ b/src/OpenApi/sample/Controllers/TestController.cs @@ -60,10 +60,10 @@ public class HttpFoo() : HttpMethodAttribute(["FOO"]); public class RouteParamsContainer { - [FromRoute] + [FromRoute(Name = "id")] public int Id { get; set; } - [FromRoute] + [FromRoute(Name = "name")] [MinLength(5)] [UnconditionalSuppressMessage("Trimming", "IL2026:RequiresUnreferencedCode", Justification = "MinLengthAttribute works without reflection on string properties.")] public string? Name { get; set; } diff --git a/src/OpenApi/src/Extensions/ApiDescriptionExtensions.cs b/src/OpenApi/src/Extensions/ApiDescriptionExtensions.cs index 20c19c02a258..40757002dc2d 100644 --- a/src/OpenApi/src/Extensions/ApiDescriptionExtensions.cs +++ b/src/OpenApi/src/Extensions/ApiDescriptionExtensions.cs @@ -28,7 +28,7 @@ internal static class ApiDescriptionExtensions "HEAD" => HttpMethod.Head, "OPTIONS" => HttpMethod.Options, "TRACE" => HttpMethod.Trace, - "QUERY" => HttpMethod.Query, + "QUERY" => null, // OpenAPI as of 3.1 does not yet support HTTP QUERY _ => null, }; 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 1ce73bd3e57c..e9b5441087a2 100644 --- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/OpenApiDocumentIntegrationTests.cs +++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/OpenApiDocumentIntegrationTests.cs @@ -36,10 +36,7 @@ public static TheoryData OpenApiDocuments() [MemberData(nameof(OpenApiDocuments))] public async Task VerifyOpenApiDocument(string documentName, OpenApiSpecVersion version) { - var documentService = fixture.Services.GetRequiredKeyedService(documentName); - var scopedServiceProvider = fixture.Services.CreateScope(); - var document = await documentService.GetOpenApiDocumentAsync(scopedServiceProvider.ServiceProvider); - var json = await document.SerializeAsJsonAsync(version); + var json = await GetOpenApiDocument(documentName, version); var baseSnapshotsDirectory = SkipOnHelixAttribute.OnHelix() ? Path.Combine(Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT"), "Integration", "snapshots") : "snapshots"; @@ -48,4 +45,32 @@ await Verify(json) .UseDirectory(outputDirectory) .UseParameters(documentName); } + + [Theory] + [MemberData(nameof(OpenApiDocuments))] + public async Task OpenApiDocumentIsValid(string documentName, OpenApiSpecVersion version) + { + var json = await GetOpenApiDocument(documentName, version); + + var actual = OpenApiDocument.Parse(json, format: "json"); + + Assert.NotNull(actual); + Assert.NotNull(actual.Document); + Assert.NotNull(actual.Diagnostic); + Assert.NotNull(actual.Diagnostic.Errors); + Assert.Empty(actual.Diagnostic.Errors); + + var ruleSet = ValidationRuleSet.GetDefaultRuleSet(); + + var errors = actual.Document.Validate(ruleSet); + Assert.Empty(errors); + } + + private async Task GetOpenApiDocument(string documentName, OpenApiSpecVersion version) + { + var documentService = fixture.Services.GetRequiredKeyedService(documentName); + var scopedServiceProvider = fixture.Services.CreateScope(); + var document = await documentService.GetOpenApiDocumentAsync(scopedServiceProvider.ServiceProvider); + return await document.SerializeAsJsonAsync(version); + } } diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_0/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_0/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt index 5f9f4d1dd9e6..07aaa0b07c41 100644 --- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_0/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt +++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Integration/snapshots/OpenApi3_0/OpenApiDocumentIntegrationTests.VerifyOpenApiDocument_documentName=controllers.verified.txt @@ -12,7 +12,7 @@ ], "parameters": [ { - "name": "Id", + "name": "id", "in": "path", "required": true, "schema": { @@ -21,7 +21,7 @@ } }, { - "name": "Name", + "name": "name", "in": "path", "required": true, "schema": { @@ -124,35 +124,6 @@ } } } - }, - "/query": { - "query": { - "tags": [ - "Test" - ], - "responses": { - "200": { - "description": "OK", - "content": { - "text/plain": { - "schema": { - "$ref": "#/components/schemas/CurrentWeather" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/CurrentWeather" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/CurrentWeather" - } - } - } - } - } - } } }, "components": { 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 f41a4ddb6a43..54815495aa78 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 @@ -12,7 +12,7 @@ ], "parameters": [ { - "name": "Id", + "name": "id", "in": "path", "required": true, "schema": { @@ -21,7 +21,7 @@ } }, { - "name": "Name", + "name": "name", "in": "path", "required": true, "schema": { @@ -124,35 +124,6 @@ } } } - }, - "/query": { - "query": { - "tags": [ - "Test" - ], - "responses": { - "200": { - "description": "OK", - "content": { - "text/plain": { - "schema": { - "$ref": "#/components/schemas/CurrentWeather" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/CurrentWeather" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/CurrentWeather" - } - } - } - } - } - } } }, "components": { 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 f7870bc2fe95..4c8502f366b3 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 @@ -1165,7 +1165,7 @@ ], "parameters": [ { - "name": "Id", + "name": "id", "in": "path", "required": true, "schema": { @@ -1174,7 +1174,7 @@ } }, { - "name": "Name", + "name": "name", "in": "path", "required": true, "schema": { @@ -1277,35 +1277,6 @@ } } } - }, - "/query": { - "query": { - "tags": [ - "Test" - ], - "responses": { - "200": { - "description": "OK", - "content": { - "text/plain": { - "schema": { - "$ref": "#/components/schemas/CurrentWeather" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/CurrentWeather" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/CurrentWeather" - } - } - } - } - } - } } }, "components": {