10
10
using Microsoft . AspNetCore . Mvc . Infrastructure ;
11
11
using Microsoft . AspNetCore . Mvc . ModelBinding ;
12
12
using Microsoft . AspNetCore . Routing ;
13
+ using Microsoft . AspNetCore . Routing . Constraints ;
13
14
using Microsoft . AspNetCore . Routing . Patterns ;
14
15
using Microsoft . Extensions . DependencyInjection ;
15
16
using Microsoft . Extensions . FileProviders ;
@@ -502,7 +503,7 @@ public void RespectsProducesProblemExtensionMethod()
502
503
{
503
504
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
504
505
} ;
505
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
506
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
506
507
507
508
// Act
508
509
provider . OnProvidersExecuting ( context ) ;
@@ -527,7 +528,7 @@ public void RespectsProducesWithGroupNameExtensionMethod()
527
528
{
528
529
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
529
530
} ;
530
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
531
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
531
532
532
533
// Act
533
534
provider . OnProvidersExecuting ( context ) ;
@@ -552,7 +553,7 @@ public void RespectsExcludeFromDescription()
552
553
{
553
554
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
554
555
} ;
555
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
556
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
556
557
557
558
// Act
558
559
provider . OnProvidersExecuting ( context ) ;
@@ -578,7 +579,7 @@ public void HandlesProducesWithProducesProblem()
578
579
{
579
580
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
580
581
} ;
581
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
582
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
582
583
583
584
// Act
584
585
provider . OnProvidersExecuting ( context ) ;
@@ -629,7 +630,7 @@ public void HandleMultipleProduces()
629
630
{
630
631
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
631
632
} ;
632
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
633
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
633
634
634
635
// Act
635
636
provider . OnProvidersExecuting ( context ) ;
@@ -667,7 +668,7 @@ public void HandleAcceptsMetadata()
667
668
{
668
669
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
669
670
} ;
670
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
671
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
671
672
672
673
// Act
673
674
provider . OnProvidersExecuting ( context ) ;
@@ -700,7 +701,7 @@ public void HandleAcceptsMetadataWithTypeParameter()
700
701
{
701
702
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
702
703
} ;
703
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
704
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
704
705
705
706
// Act
706
707
provider . OnProvidersExecuting ( context ) ;
@@ -728,7 +729,7 @@ public void FavorsProducesMetadataOverAttribute()
728
729
{
729
730
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
730
731
} ;
731
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
732
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
732
733
733
734
// Act
734
735
provider . OnProvidersExecuting ( context ) ;
@@ -763,7 +764,7 @@ public void HandleDefaultIAcceptsMetadataForRequiredBodyParameter()
763
764
{
764
765
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
765
766
} ;
766
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
767
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
767
768
768
769
// Act
769
770
provider . OnProvidersExecuting ( context ) ;
@@ -801,7 +802,7 @@ public void HandleDefaultIAcceptsMetadataForOptionalBodyParameter()
801
802
{
802
803
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
803
804
} ;
804
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
805
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
805
806
806
807
// Act
807
808
provider . OnProvidersExecuting ( context ) ;
@@ -839,7 +840,7 @@ public void HandleIAcceptsMetadataWithConsumesAttributeAndInferredOptionalFromBo
839
840
{
840
841
ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
841
842
} ;
842
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
843
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
843
844
844
845
// Act
845
846
provider . OnProvidersExecuting ( context ) ;
@@ -860,6 +861,73 @@ public void HandleIAcceptsMetadataWithConsumesAttributeAndInferredOptionalFromBo
860
861
861
862
#nullable restore
862
863
864
+ [ Fact ]
865
+ public void ProducesRouteInfoOnlyForRouteParameters ( )
866
+ {
867
+ var builder = CreateBuilder ( ) ;
868
+ string GetName ( int fromQuery , string name = "default" ) => $ "Hello { name } !";
869
+ builder . MapGet ( "/api/todos/{name}" , GetName ) ;
870
+ var context = new ApiDescriptionProviderContext ( Array . Empty < ActionDescriptor > ( ) ) ;
871
+
872
+ var endpointDataSource = builder . DataSources . OfType < EndpointDataSource > ( ) . Single ( ) ;
873
+ var hostEnvironment = new HostEnvironment
874
+ {
875
+ ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
876
+ } ;
877
+ var provider = new EndpointMetadataApiDescriptionProvider (
878
+ endpointDataSource ,
879
+ hostEnvironment ,
880
+ new DefaultParameterPolicyFactory ( Options . Create ( new RouteOptions ( ) ) , new TestServiceProvider ( ) ) ,
881
+ new ServiceProviderIsService ( ) ) ;
882
+
883
+ // Act
884
+ provider . OnProvidersExecuting ( context ) ;
885
+
886
+ // Assert
887
+ var apiDescription = Assert . Single ( context . Results ) ;
888
+ Assert . Collection ( apiDescription . ParameterDescriptions ,
889
+ parameter =>
890
+ {
891
+ Assert . Equal ( "fromQuery" , parameter . Name ) ;
892
+ Assert . Null ( parameter . RouteInfo ) ;
893
+ } ,
894
+ parameter =>
895
+ {
896
+ Assert . Equal ( "name" , parameter . Name ) ;
897
+ Assert . NotNull ( parameter . RouteInfo ) ;
898
+ Assert . Empty ( parameter . RouteInfo ! . Constraints ) ;
899
+ Assert . True ( parameter . RouteInfo ! . IsOptional ) ;
900
+ Assert . Equal ( "default" , parameter . RouteInfo ! . DefaultValue ) ;
901
+ } ) ;
902
+ }
903
+
904
+ [ Fact ]
905
+ public void HandlesEndpointWithRouteConstraints ( )
906
+ {
907
+ var builder = CreateBuilder ( ) ;
908
+ builder . MapGet ( "/api/todos/{name:minlength(8):guid:maxlength(20)}" , ( string name ) => "" ) ;
909
+ var context = new ApiDescriptionProviderContext ( Array . Empty < ActionDescriptor > ( ) ) ;
910
+
911
+ var endpointDataSource = builder . DataSources . OfType < EndpointDataSource > ( ) . Single ( ) ;
912
+ var hostEnvironment = new HostEnvironment
913
+ {
914
+ ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
915
+ } ;
916
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
917
+
918
+ // Act
919
+ provider . OnProvidersExecuting ( context ) ;
920
+
921
+ // Assert
922
+ var apiDescription = Assert . Single ( context . Results ) ;
923
+ var parameter = Assert . Single ( apiDescription . ParameterDescriptions ) ;
924
+ Assert . NotNull ( parameter . RouteInfo ) ;
925
+ Assert . Collection ( parameter . RouteInfo ! . Constraints ,
926
+ constraint => Assert . IsType < MinLengthRouteConstraint > ( constraint ) ,
927
+ constraint => Assert . IsType < GuidRouteConstraint > ( constraint ) ,
928
+ constraint => Assert . IsType < MaxLengthRouteConstraint > ( constraint ) ) ;
929
+ }
930
+
863
931
private static IEnumerable < string > GetSortedMediaTypes ( ApiResponseType apiResponseType )
864
932
{
865
933
return apiResponseType . ApiResponseFormats
@@ -884,19 +952,21 @@ private static IList<ApiDescription> GetApiDescriptions(
884
952
885
953
var endpoint = new RouteEndpoint ( httpContext => Task . CompletedTask , routePattern , 0 , endpointMetadata , displayName ) ;
886
954
var endpointDataSource = new DefaultEndpointDataSource ( endpoint ) ;
887
- var hostEnvironment = new HostEnvironment
888
- {
889
- ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest )
890
- } ;
891
955
892
- var provider = new EndpointMetadataApiDescriptionProvider ( endpointDataSource , hostEnvironment , new ServiceProviderIsService ( ) ) ;
956
+ var provider = CreateEndpointMetadataApiDescriptionProvider ( endpointDataSource ) ;
893
957
894
958
provider . OnProvidersExecuting ( context ) ;
895
959
provider . OnProvidersExecuted ( context ) ;
896
960
897
961
return context . Results ;
898
962
}
899
963
964
+ private static EndpointMetadataApiDescriptionProvider CreateEndpointMetadataApiDescriptionProvider ( EndpointDataSource endpointDataSource ) => new EndpointMetadataApiDescriptionProvider (
965
+ endpointDataSource ,
966
+ new HostEnvironment { ApplicationName = nameof ( EndpointMetadataApiDescriptionProviderTest ) } ,
967
+ new DefaultParameterPolicyFactory ( Options . Create ( new RouteOptions ( ) ) , new TestServiceProvider ( ) ) ,
968
+ new ServiceProviderIsService ( ) ) ;
969
+
900
970
private static TestEndpointRouteBuilder CreateBuilder ( ) =>
901
971
new TestEndpointRouteBuilder ( new ApplicationBuilder ( new TestServiceProvider ( ) ) ) ;
902
972
0 commit comments