Skip to content
Merged
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 @@ -52,7 +52,7 @@ public ODataApiVersioningOptions( VersionedODataModelBuilder modelBuilder ) =>
/// </summary>
/// <param name="prefix">The associated OData prefix.</param>
/// <returns>The original <see cref="ODataApiVersioningOptions">options</see>.</returns>
public virtual ODataApiVersioningOptions AddRouteComponents( string prefix ) =>
public virtual ODataApiVersioningOptions AddRouteComponents( [StringSyntax( "Route" )] string prefix ) =>
AddRouteComponents( prefix, static _ => { } );

/// <summary>
Expand All @@ -70,7 +70,7 @@ public virtual ODataApiVersioningOptions AddRouteComponents( Action<IServiceColl
/// <param name="batchHandler">The <see cref="ODataBatchHandler">$batch handler</see>.</param>
/// <returns>The original <see cref="ODataApiVersioningOptions">options</see>.</returns>
[CLSCompliant( false )]
public ODataApiVersioningOptions AddRouteComponents( string prefix, ODataBatchHandler batchHandler ) =>
public ODataApiVersioningOptions AddRouteComponents( [StringSyntax( "Route" )] string prefix, ODataBatchHandler batchHandler ) =>
AddRouteComponents( prefix, builder => builder.AddSingleton( batchHandler ) );

/// <summary>
Expand All @@ -89,7 +89,7 @@ public ODataApiVersioningOptions AddRouteComponents( ODataBatchHandler batchHand
/// <param name="configureAction">The configuration <see cref="Action{T}">action</see>.</param>
/// <returns>The original <see cref="ODataApiVersioningOptions">options</see>.</returns>
public virtual ODataApiVersioningOptions AddRouteComponents(
string prefix,
[StringSyntax( "Route" )] string prefix,
Action<IServiceCollection> configureAction )
{
configurations ??= new( StringComparer.OrdinalIgnoreCase );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ public virtual void AddParameter( string name, ApiVersionParameterLocation locat
{
if ( IsApiVersionNeutral && !Options.AddApiVersionParametersWhenVersionNeutral )
{
if ( location == Path )
{
UpdateUrlSegment();
}

return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public void add_parameter_should_add_descriptor_for_path()
Name = "api-version",
RouteInfo = new()
{
Constraints = new[] { new ApiVersionRouteConstraint() },
Constraints = [new ApiVersionRouteConstraint()],
},
Source = BindingSource.Path,
};
Expand Down Expand Up @@ -119,6 +119,55 @@ public void add_parameter_should_add_descriptor_for_path()
o => o.ExcludingMissingMembers() );
}

[Fact]
public void add_parameter_should_add_descriptor_for_path_when_version_neutral()
{
// arrange
var version = new ApiVersion( 1, 0 );
var description = new ApiDescription()
{
ActionDescriptor = new ActionDescriptor() { EndpointMetadata = [ApiVersionMetadata.Neutral] },
ParameterDescriptions =
{
new()
{
Name = "api-version",
RouteInfo = new() { Constraints = [new ApiVersionRouteConstraint()] },
Source = BindingSource.Path,
},
},
};
var modelMetadata = new Mock<ModelMetadata>( ModelMetadataIdentity.ForType( typeof( string ) ) ).Object;
var options = new ApiExplorerOptions()
{
DefaultApiVersion = version,
ApiVersionParameterSource = new UrlSegmentApiVersionReader(),
};
var context = new ApiVersionParameterDescriptionContext( description, version, modelMetadata, options );

// act
context.AddParameter( "api-version", Path );

// assert
description.ParameterDescriptions.Single().Should().BeEquivalentTo(
new
{
Name = "api-version",
ModelMetadata = modelMetadata,
Source = BindingSource.Path,
DefaultValue = (object) "1.0",
IsRequired = true,
RouteInfo = new ApiParameterRouteInfo()
{
DefaultValue = "1.0",
IsOptional = false,
Constraints = description.ParameterDescriptions[0].RouteInfo.Constraints,
},
Type = typeof( string ),
},
o => o.ExcludingMissingMembers() );
}

[Fact]
public void add_parameter_should_remove_other_descriptors_after_path_parameter_is_added()
{
Expand All @@ -128,7 +177,7 @@ public void add_parameter_should_remove_other_descriptors_after_path_parameter_i
Name = "api-version",
RouteInfo = new()
{
Constraints = new[] { new ApiVersionRouteConstraint() },
Constraints = [new ApiVersionRouteConstraint()],
},
Source = BindingSource.Path,
};
Expand Down Expand Up @@ -179,7 +228,7 @@ public void add_parameter_should_not_add_query_parameter_after_path_parameter_ha
Name = "api-version",
RouteInfo = new()
{
Constraints = new[] { new ApiVersionRouteConstraint() },
Constraints = [new ApiVersionRouteConstraint()],
},
Source = BindingSource.Path,
};
Expand Down Expand Up @@ -214,7 +263,7 @@ public void add_parameter_should_add_descriptor_for_media_type_parameter()
var metadata = new ApiVersionMetadata( ApiVersionModel.Empty, new ApiVersionModel( version ) );
var description = new ApiDescription()
{
ActionDescriptor = new() { EndpointMetadata = new[] { metadata } },
ActionDescriptor = new() { EndpointMetadata = [metadata] },
SupportedRequestFormats = { new() { MediaType = Json } },
SupportedResponseTypes = { new() { ApiResponseFormats = { new() { MediaType = Json } } } },
};
Expand Down Expand Up @@ -304,7 +353,7 @@ public void add_parameter_should_make_parameters_optional_after_first_parameter(
private static ApiDescription NewApiDescription( ApiVersion apiVersion, params ApiParameterDescription[] parameters )
{
var metadata = new ApiVersionMetadata( ApiVersionModel.Empty, new ApiVersionModel( apiVersion ) );
var action = new ActionDescriptor() { EndpointMetadata = new[] { metadata } };
var action = new ActionDescriptor() { EndpointMetadata = [metadata] };
var description = new ApiDescription() { ActionDescriptor = action };

for ( var i = 0; i < parameters.Length; i++ )
Expand Down
Loading