From 752a93e5d9107c9abb51005d4e9d6322ea6687ce Mon Sep 17 00:00:00 2001 From: Raymond Masciarella Date: Sun, 26 Apr 2026 05:21:40 -0400 Subject: [PATCH] Fix missing ParameterDescriptor for form parameters in API descriptions --- .../using_form_parameters.cs | 21 +++++++++++++++++++ .../HttpChain.ApiDescription.cs | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/src/Http/Wolverine.Http.Tests/using_form_parameters.cs b/src/Http/Wolverine.Http.Tests/using_form_parameters.cs index b37311574..7fc4ce65e 100644 --- a/src/Http/Wolverine.Http.Tests/using_form_parameters.cs +++ b/src/Http/Wolverine.Http.Tests/using_form_parameters.cs @@ -6,6 +6,7 @@ using Wolverine.Runtime; using WolverineWebApi; using WolverineWebApi.Forms; +using MvcBindingSource = Microsoft.AspNetCore.Mvc.ModelBinding.BindingSource; namespace Wolverine.Http.Tests; @@ -536,4 +537,24 @@ public void trouble_shoot_form_matching() var variable = chain.TryFindOrCreateFormValue(parameter); variable!.Creator.ShouldBeOfType(); } + + [Fact] + public void form_parameter_descriptions_have_a_parameter_descriptor() + { + // Regression: ApiParameterDescription instances emitted for [FromForm] + // primitive parameters used to leave ParameterDescriptor null. ASP.NET + // Core's OpenApiDocumentService.GetFormRequestBody groups form + // parameters by ParameterDescriptor.Name and NREs when it is missing, + // taking down the entire /openapi/v1.json response for any endpoint + // that has at least one such parameter. + var chain = HttpChains.ChainFor("POST", "/form/explicit"); + var apiDescription = chain!.CreateApiDescription("POST"); + + var formParameter = apiDescription.ParameterDescriptions.Single(p => p.Name == "name"); + formParameter.Source.ShouldBe(MvcBindingSource.Form); + formParameter.Type.ShouldBe(typeof(string)); + formParameter.ParameterDescriptor.ShouldNotBeNull(); + formParameter.ParameterDescriptor.Name.ShouldBe("name"); + formParameter.ParameterDescriptor.ParameterType.ShouldBe(typeof(string)); + } } \ No newline at end of file diff --git a/src/Http/Wolverine.Http/HttpChain.ApiDescription.cs b/src/Http/Wolverine.Http/HttpChain.ApiDescription.cs index 93442505d..0050ef8fd 100644 --- a/src/Http/Wolverine.Http/HttpChain.ApiDescription.cs +++ b/src/Http/Wolverine.Http/HttpChain.ApiDescription.cs @@ -390,6 +390,11 @@ private void fillFormParameters(ApiDescription apiDescription) Name = formVariable.Name, ModelMetadata = new EndpointModelMetadata(formVariable.VariableType), Source = BindingSource.Form, + ParameterDescriptor = new ParameterDescriptor + { + Name = formVariable.Name, + ParameterType = formVariable.VariableType + }, Type = formVariable.VariableType, IsRequired = false };