diff --git a/src/OpenApi/src/Services/OpenApiDocumentService.cs b/src/OpenApi/src/Services/OpenApiDocumentService.cs index f2b480e25006..72f3c022221c 100644 --- a/src/OpenApi/src/Services/OpenApiDocumentService.cs +++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs @@ -12,6 +12,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.ModelBinding; +using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.WebUtilities; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -140,6 +141,7 @@ private OpenApiOperation GetOperation(ApiDescription description, HashSet description.ActionDescriptor.EndpointMetadata.OfType().LastOrDefault()?.Description; + private static string? GetOperationId(ApiDescription description) + => description.ActionDescriptor.AttributeRouteInfo?.Name ?? + description.ActionDescriptor.EndpointMetadata.OfType().LastOrDefault()?.EndpointName; + private static List? GetTags(ApiDescription description) { var actionDescriptor = description.ActionDescriptor; diff --git a/src/OpenApi/test/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Operations.cs b/src/OpenApi/test/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Operations.cs index 18f5023f9b0a..8cfe2573f0f5 100644 --- a/src/OpenApi/test/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Operations.cs +++ b/src/OpenApi/test/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Operations.cs @@ -3,6 +3,8 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Routing; using Microsoft.OpenApi.Models; public partial class OpenApiDocumentServiceTests @@ -178,4 +180,58 @@ await VerifyOpenApiDocument(builder, document => }); }); } + + [Fact] + public async Task GetOpenApiOperation_CapturesEndpointNameAsOperationId() + { + // Arrange + var builder = CreateBuilder(); + + // Act + builder.MapGet("/api/todos", () => { }).WithName("GetTodos"); + + // Assert + await VerifyOpenApiDocument(builder, document => + { + var operation = document.Paths["/api/todos"].Operations[OperationType.Get]; + Assert.Equal("GetTodos", operation.OperationId); + + }); + } + + [Fact] + public async Task GetOpenApiOperation_CapturesEndpointNameAttributeAsOperationId() + { + // Arrange + var builder = CreateBuilder(); + + // Act + builder.MapGet("/api/todos", [EndpointName("GetTodos")] () => { }); + + // Assert + await VerifyOpenApiDocument(builder, document => + { + var operation = document.Paths["/api/todos"].Operations[OperationType.Get]; + Assert.Equal("GetTodos", operation.OperationId); + + }); + } + + [Fact] + public async Task GetOpenApiOperation_CapturesRouteAttributeAsOperationId() + { + // Act + var action = CreateActionDescriptor(nameof(ActionWithRouteAttributeName)); + + // Assert + await VerifyOpenApiDocument(action, document => + { + var operation = document.Paths["/api/todos"].Operations[OperationType.Get]; + Assert.Equal("GetTodos", operation.OperationId); + + }); + } + + [Route("/api/todos", Name = "GetTodos")] + private void ActionWithRouteAttributeName() { } } diff --git a/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs b/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs index 1ee85d9caab1..bb400c6e5790 100644 --- a/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs +++ b/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs @@ -189,7 +189,9 @@ public ControllerActionDescriptor CreateActionDescriptor(string methodName = nul action.AttributeRouteInfo = new() { - Template = action.MethodInfo.GetCustomAttribute()?.Template + Template = action.MethodInfo.GetCustomAttribute()?.Template, + Name = action.MethodInfo.GetCustomAttribute()?.Name, + Order = action.MethodInfo.GetCustomAttribute()?.Order ?? 0, }; action.RouteValues.Add("controller", "Test"); action.RouteValues.Add("action", action.MethodInfo.Name);