From ba13fd33625524217e527644f39a045c247ed7f9 Mon Sep 17 00:00:00 2001 From: maksim-sovkov Date: Tue, 18 Mar 2025 02:25:04 +0300 Subject: [PATCH] update parameter name even if it is taken from metadata --- .../SwaggerGenerator/SwaggerGenerator.cs | 1 + .../SwaggerGenerator/SwaggerGeneratorTests.cs | 69 +++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGenerator.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGenerator.cs index 2125075e23..1fa5c3db11 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGenerator.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGenerator.cs @@ -409,6 +409,7 @@ private async Task GenerateOpenApiOperationFromMetadataAsync(A if (apiParameter is not null) { var (parameterAndContext, filterContext) = GenerateParameterAndContext(apiParameter, schemaRepository); + parameter.Name = parameterAndContext.Name; parameter.Schema = parameterAndContext.Schema; parameter.Description ??= parameterAndContext.Description; diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/SwaggerGeneratorTests.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/SwaggerGeneratorTests.cs index b2cc53beea..3ce7d687d8 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/SwaggerGeneratorTests.cs +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/SwaggerGeneratorTests.cs @@ -1410,6 +1410,75 @@ public void GetSwagger_SupportsOption_DescribeAllParametersInCamelCase( Assert.Equal(expectedOpenApiParameterName, parameter.Name); } + [Theory] + [InlineData("SomeParam", "someParam")] + [InlineData("FooBar.SomeParam", "fooBar.someParam")] + [InlineData("A.B", "a.b")] + [InlineData("", "")] + [InlineData(null, null)] + public void GetSwagger_SupportsOption_DescribeAllParametersInCamelCase_ForParametersFromMetadata( + string parameterName, + string expectedOpenApiParameterName) + { + var methodInfo = typeof(FakeController).GetMethod(nameof(FakeController.ActionWithParameter)); + var actionDescriptor = new ActionDescriptor + { + EndpointMetadata = new List() + { + new OpenApiOperation + { + OperationId = "OperationIdSetInMetadata", + Parameters = new List() + { + new OpenApiParameter + { + Name = parameterName + } + } + } + }, + RouteValues = new Dictionary + { + ["controller"] = methodInfo.DeclaringType.Name.Replace("Controller", string.Empty) + } + }; + var subject = Subject( + apiDescriptions: new[] + { + ApiDescriptionFactory.Create( + actionDescriptor, + methodInfo, + groupName: "v1", + httpMethod: "POST", + relativePath: "resource", + parameterDescriptions: new[] + { + new ApiParameterDescription + { + Name = parameterName, + Source = BindingSource.Path, + ModelMetadata = ModelMetadataFactory.CreateForType(typeof(string)), + Type = typeof(string) + } + }), + }, + options: new SwaggerGeneratorOptions + { + SwaggerDocs = new Dictionary + { + ["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" } + }, + DescribeAllParametersInCamelCase = true + } + ); + + var document = subject.GetSwagger("v1"); + + var operation = document.Paths["/resource"].Operations[OperationType.Post]; + var parameter = Assert.Single(operation.Parameters); + Assert.Equal(expectedOpenApiParameterName, parameter.Name); + } + [Fact] public void GetSwagger_SupportsOption_Servers() {