@@ -99,7 +99,7 @@ public void MapGet_BuildsEndpointWithCorrectMethod()
9999 Assert . Equal ( "GET" , method ) ;
100100
101101 var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
102- Assert . Equal ( "/ HTTP: GET" , routeEndpointBuilder . DisplayName ) ;
102+ Assert . Equal ( "HTTP: GET / " , routeEndpointBuilder . DisplayName ) ;
103103 Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
104104 }
105105
@@ -125,7 +125,7 @@ public async Task MapGetWithRouteParameter_BuildsEndpointWithRouteSpecificBindin
125125 Assert . Equal ( "GET" , method ) ;
126126
127127 var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
128- Assert . Equal ( "/{id} HTTP: GET" , routeEndpointBuilder . DisplayName ) ;
128+ Assert . Equal ( "HTTP: GET /{id} " , routeEndpointBuilder . DisplayName ) ;
129129 Assert . Equal ( "/{id}" , routeEndpointBuilder . RoutePattern . RawText ) ;
130130
131131 // Assert that we don't fallback to the query string
@@ -163,7 +163,7 @@ public async Task MapGetWithoutRouteParameter_BuildsEndpointWithQuerySpecificBin
163163 Assert . Equal ( "GET" , method ) ;
164164
165165 var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
166- Assert . Equal ( "/ HTTP: GET" , routeEndpointBuilder . DisplayName ) ;
166+ Assert . Equal ( "HTTP: GET / " , routeEndpointBuilder . DisplayName ) ;
167167 Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
168168
169169 // Assert that we don't fallback to the route values
@@ -205,7 +205,7 @@ public async Task MapVerbWithExplicitRouteParameterIsCaseInsensitive(Action<IEnd
205205 Assert . Equal ( expectedMethod , method ) ;
206206
207207 var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
208- Assert . Equal ( $ "/{{ID}} HTTP: { expectedMethod } ", routeEndpointBuilder . DisplayName ) ;
208+ Assert . Equal ( $ "HTTP: { expectedMethod } /{{ID} }", routeEndpointBuilder . DisplayName ) ;
209209 Assert . Equal ( $ "/{{ID}}", routeEndpointBuilder . RoutePattern . RawText ) ;
210210
211211 var httpContext = new DefaultHttpContext ( ) ;
@@ -241,7 +241,7 @@ public async Task MapVerbWithRouteParameterDoesNotFallbackToQuery(Action<IEndpoi
241241 Assert . Equal ( expectedMethod , method ) ;
242242
243243 var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
244- Assert . Equal ( $ "/{{ID}} HTTP: { expectedMethod } ", routeEndpointBuilder . DisplayName ) ;
244+ Assert . Equal ( $ "HTTP: { expectedMethod } /{{ID} }", routeEndpointBuilder . DisplayName ) ;
245245 Assert . Equal ( $ "/{{ID}}", routeEndpointBuilder . RoutePattern . RawText ) ;
246246
247247 // Assert that we don't fallback to the query string
@@ -281,7 +281,7 @@ public void MapPost_BuildsEndpointWithCorrectMethod()
281281 Assert . Equal ( "POST" , method ) ;
282282
283283 var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
284- Assert . Equal ( "/ HTTP: POST" , routeEndpointBuilder . DisplayName ) ;
284+ Assert . Equal ( "HTTP: POST / " , routeEndpointBuilder . DisplayName ) ;
285285 Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
286286 }
287287
@@ -301,7 +301,7 @@ public void MapPut_BuildsEndpointWithCorrectMethod()
301301 Assert . Equal ( "PUT" , method ) ;
302302
303303 var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
304- Assert . Equal ( "/ HTTP: PUT" , routeEndpointBuilder . DisplayName ) ;
304+ Assert . Equal ( "HTTP: PUT / " , routeEndpointBuilder . DisplayName ) ;
305305 Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
306306 }
307307
@@ -321,7 +321,7 @@ public void MapDelete_BuildsEndpointWithCorrectMethod()
321321 Assert . Equal ( "DELETE" , method ) ;
322322
323323 var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
324- Assert . Equal ( "/ HTTP: DELETE" , routeEndpointBuilder . DisplayName ) ;
324+ Assert . Equal ( "HTTP: DELETE / " , routeEndpointBuilder . DisplayName ) ;
325325 Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
326326 }
327327
@@ -359,6 +359,106 @@ public void MapFallbackWithoutPath_BuildsEndpointWithLowestRouteOrder()
359359 Assert . Equal ( int . MaxValue , routeEndpointBuilder . Order ) ;
360360 }
361361
362+ [ Fact ]
363+ // This test scenario simulates methods defined in a top-level program
364+ // which are compiler generated. We currently do some manually parsing leveraging
365+ // code in Roslyn to support this scenario. More info at https://github.com/dotnet/roslyn/issues/55651.
366+ public void MapMethod_DoesNotEndpointNameForInnerMethod ( )
367+ {
368+ var name = "InnerGetString" ;
369+ var builder = new DefaultEndpointRouteBuilder ( new ApplicationBuilder ( new EmptyServiceProvdier ( ) ) ) ;
370+ string InnerGetString ( ) => "TestString" ;
371+ _ = builder . MapDelete ( "/" , InnerGetString ) ;
372+
373+ var dataSource = GetBuilderEndpointDataSource ( builder ) ;
374+ // Trigger Endpoint build by calling getter.
375+ var endpoint = Assert . Single ( dataSource . Endpoints ) ;
376+
377+ var endpointName = endpoint . Metadata . GetMetadata < IEndpointNameMetadata > ( ) ;
378+ var routeName = endpoint . Metadata . GetMetadata < IRouteNameMetadata > ( ) ;
379+ var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
380+ Assert . Equal ( name , endpointName ? . EndpointName ) ;
381+ Assert . Equal ( name , routeName ? . RouteName ) ;
382+ Assert . Equal ( "HTTP: DELETE / => InnerGetString" , routeEndpointBuilder . DisplayName ) ;
383+ }
384+
385+ [ Fact ]
386+ public void MapMethod_DoesNotEndpointNameForInnerMethodWithTarget ( )
387+ {
388+ var name = "InnerGetString" ;
389+ var builder = new DefaultEndpointRouteBuilder ( new ApplicationBuilder ( new EmptyServiceProvdier ( ) ) ) ;
390+ var testString = "TestString" ;
391+ string InnerGetString ( ) => testString ;
392+ _ = builder . MapDelete ( "/" , InnerGetString ) ;
393+
394+ var dataSource = GetBuilderEndpointDataSource ( builder ) ;
395+ // Trigger Endpoint build by calling getter.
396+ var endpoint = Assert . Single ( dataSource . Endpoints ) ;
397+
398+ var endpointName = endpoint . Metadata . GetMetadata < IEndpointNameMetadata > ( ) ;
399+ var routeName = endpoint . Metadata . GetMetadata < IRouteNameMetadata > ( ) ;
400+ var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
401+ Assert . Equal ( name , endpointName ? . EndpointName ) ;
402+ Assert . Equal ( name , routeName ? . RouteName ) ;
403+ Assert . Equal ( "HTTP: DELETE / => InnerGetString" , routeEndpointBuilder . DisplayName ) ;
404+ }
405+
406+
407+ [ Fact ]
408+ public void MapMethod_SetsEndpointNameForMethodGroup ( )
409+ {
410+ var name = "GetString" ;
411+ var builder = new DefaultEndpointRouteBuilder ( new ApplicationBuilder ( new EmptyServiceProvdier ( ) ) ) ;
412+ _ = builder . MapDelete ( "/" , GetString ) ;
413+
414+ var dataSource = GetBuilderEndpointDataSource ( builder ) ;
415+ // Trigger Endpoint build by calling getter.
416+ var endpoint = Assert . Single ( dataSource . Endpoints ) ;
417+
418+ var endpointName = endpoint . Metadata . GetMetadata < IEndpointNameMetadata > ( ) ;
419+ var routeName = endpoint . Metadata . GetMetadata < IRouteNameMetadata > ( ) ;
420+ var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
421+ Assert . Equal ( name , endpointName ? . EndpointName ) ;
422+ Assert . Equal ( name , routeName ? . RouteName ) ;
423+ Assert . Equal ( "HTTP: DELETE / => GetString" , routeEndpointBuilder . DisplayName ) ;
424+ }
425+
426+ [ Fact ]
427+ public void WithNameOverridesDefaultEndpointName ( )
428+ {
429+ var name = "SomeCustomName" ;
430+ var builder = new DefaultEndpointRouteBuilder ( new ApplicationBuilder ( new EmptyServiceProvdier ( ) ) ) ;
431+ _ = builder . MapDelete ( "/" , GetString ) . WithName ( name ) ;
432+
433+ var dataSource = GetBuilderEndpointDataSource ( builder ) ;
434+ // Trigger Endpoint build by calling getter.
435+ var endpoint = Assert . Single ( dataSource . Endpoints ) ;
436+
437+ var endpointName = endpoint . Metadata . GetMetadata < IEndpointNameMetadata > ( ) ;
438+ var routeName = endpoint . Metadata . GetMetadata < IRouteNameMetadata > ( ) ;
439+ var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
440+ Assert . Equal ( name , endpointName ? . EndpointName ) ;
441+ Assert . Equal ( name , routeName ? . RouteName ) ;
442+ // Will still use the original method name, not the custom endpoint name
443+ Assert . Equal ( "HTTP: DELETE / => GetString" , routeEndpointBuilder . DisplayName ) ;
444+ }
445+
446+ private string GetString ( ) => "TestString" ;
447+
448+ [ Fact ]
449+ public void MapMethod_DoesNotSetEndpointNameForLambda ( )
450+ {
451+ var builder = new DefaultEndpointRouteBuilder ( new ApplicationBuilder ( new EmptyServiceProvdier ( ) ) ) ;
452+ _ = builder . MapDelete ( "/" , ( ) => { } ) ;
453+
454+ var dataSource = GetBuilderEndpointDataSource ( builder ) ;
455+ // Trigger Endpoint build by calling getter.
456+ var endpoint = Assert . Single ( dataSource . Endpoints ) ;
457+
458+ var endpointName = endpoint . Metadata . GetMetadata < IEndpointNameMetadata > ( ) ;
459+ Assert . Null ( endpointName ) ;
460+ }
461+
362462 class FromRoute : Attribute , IFromRouteMetadata
363463 {
364464 public string ? Name { get ; set ; }
0 commit comments