Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ private ApiDescription CreateApiDescription(RouteEndpoint routeEndpoint, string

var hasBodyOrFormFileParameter = false;
var parameters = routeEndpoint.Metadata.GetOrderedMetadata<IParameterBindingMetadata>();
var remainingRouteParameters = routeEndpoint.RoutePattern.Parameters.ToDictionary(p => p.Name, StringComparer.OrdinalIgnoreCase);

foreach (var parameter in parameters)
{
Expand All @@ -122,13 +123,35 @@ private ApiDescription CreateApiDescription(RouteEndpoint routeEndpoint, string
if (parameterDescription is { })
{
apiDescription.ParameterDescriptions.Add(parameterDescription);
if (parameterDescription.Source == BindingSource.Path)
{
remainingRouteParameters.Remove(parameterDescription.Name);
}

hasBodyOrFormFileParameter |=
parameterDescription.Source == BindingSource.Body ||
parameterDescription.Source == BindingSource.FormFile;
}
}

// Add any remaining route parameters that weren't associated with a parameter in the delegate.
foreach (var remainingRouteParameter in remainingRouteParameters.Values)
{
var parameterDescription = new ApiParameterDescription
{
Name = remainingRouteParameter.Name,
Source = BindingSource.Path,
IsRequired = true,
RouteInfo = new ApiParameterRouteInfo
{
IsOptional = false,
Constraints = Array.Empty<IRouteConstraint>(),
DefaultValue = null,
},
};
apiDescription.ParameterDescriptions.Add(parameterDescription);
}

// Get IAcceptsMetadata.
var acceptsMetadata = routeEndpoint.Metadata.GetMetadata<IAcceptsMetadata>();
if (acceptsMetadata is not null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -767,6 +767,33 @@ static void AssertPathParameter(ApiDescription apiDescription)
AssertPathParameter(GetApiDescription((TryParseStringRecordStruct foo) => { }, "/{foo}"));
}

[Fact]
public void AddsFromRouteParameterAsPathWhenOmittedInHandler()
{
static void AssertPathParameter(ApiDescription apiDescription)
{
var param = Assert.Single(apiDescription.ParameterDescriptions);
Assert.Equal("foo", param.Name);
Assert.Equal(BindingSource.Path, param.Source);
}

AssertPathParameter(GetApiDescription(() => { }, "/{foo}"));
}

[Fact]
public void AddsFromRouteParameterAsPathOnceRegardlessOfCasing()
{
static void AssertPathParameter(ApiDescription apiDescription)
{
var param = Assert.Single(apiDescription.ParameterDescriptions);
Assert.Equal(typeof(int), param.Type);
Assert.Equal(typeof(int), param.ModelMetadata.ModelType);
Assert.Equal(BindingSource.Path, param.Source);
}

AssertPathParameter(GetApiDescription((int foo) => { }, "/{FOO}"));
}

[Fact]
public void AddsFromQueryParameterAsQuery()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -530,4 +530,45 @@ await SnapshotTestHelper.VerifyOpenApi(compilation, document =>
Assert.Equal("Property with only value documentation.", valueOnlyParam2.Description);
});
}

[Fact]
public async Task SupportsRouteParametersFromMinimalApis()
{
var source = """
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;

var builder = WebApplication.CreateBuilder();

builder.Services.AddOpenApi();

var app = builder.Build();

app.MapGet("/{userId}", RouteHandlerExtensionMethods.Get);

app.Run();

public static class RouteHandlerExtensionMethods
{
/// <param name="userId">The id of the user.</param>
public static string Get()
{
return "Hello, World!";
}
}
""";

var generator = new XmlCommentGenerator();
await SnapshotTestHelper.Verify(source, generator, out var compilation);
await SnapshotTestHelper.VerifyOpenApi(compilation, document =>
{
var path = document.Paths["/{userId}"].Operations[HttpMethod.Get];
Assert.NotEmpty(path.Parameters);
Assert.Equal("The id of the user.", path.Parameters[0].Description);
});
}
}
Loading
Loading