@@ -99,7 +99,7 @@ public void MapGet_BuildsEndpointWithCorrectMethod()
99
99
Assert . Equal ( "GET" , method ) ;
100
100
101
101
var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
102
- Assert . Equal ( "/ HTTP: GET" , routeEndpointBuilder . DisplayName ) ;
102
+ Assert . Equal ( "HTTP: GET / " , routeEndpointBuilder . DisplayName ) ;
103
103
Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
104
104
}
105
105
@@ -125,7 +125,7 @@ public async Task MapGetWithRouteParameter_BuildsEndpointWithRouteSpecificBindin
125
125
Assert . Equal ( "GET" , method ) ;
126
126
127
127
var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
128
- Assert . Equal ( "/{id} HTTP: GET" , routeEndpointBuilder . DisplayName ) ;
128
+ Assert . Equal ( "HTTP: GET /{id} " , routeEndpointBuilder . DisplayName ) ;
129
129
Assert . Equal ( "/{id}" , routeEndpointBuilder . RoutePattern . RawText ) ;
130
130
131
131
// Assert that we don't fallback to the query string
@@ -163,7 +163,7 @@ public async Task MapGetWithoutRouteParameter_BuildsEndpointWithQuerySpecificBin
163
163
Assert . Equal ( "GET" , method ) ;
164
164
165
165
var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
166
- Assert . Equal ( "/ HTTP: GET" , routeEndpointBuilder . DisplayName ) ;
166
+ Assert . Equal ( "HTTP: GET / " , routeEndpointBuilder . DisplayName ) ;
167
167
Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
168
168
169
169
// Assert that we don't fallback to the route values
@@ -205,7 +205,7 @@ public async Task MapVerbWithExplicitRouteParameterIsCaseInsensitive(Action<IEnd
205
205
Assert . Equal ( expectedMethod , method ) ;
206
206
207
207
var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
208
- Assert . Equal ( $ "/{{ID}} HTTP: { expectedMethod } ", routeEndpointBuilder . DisplayName ) ;
208
+ Assert . Equal ( $ "HTTP: { expectedMethod } /{{ID} }", routeEndpointBuilder . DisplayName ) ;
209
209
Assert . Equal ( $ "/{{ID}}", routeEndpointBuilder . RoutePattern . RawText ) ;
210
210
211
211
var httpContext = new DefaultHttpContext ( ) ;
@@ -241,7 +241,7 @@ public async Task MapVerbWithRouteParameterDoesNotFallbackToQuery(Action<IEndpoi
241
241
Assert . Equal ( expectedMethod , method ) ;
242
242
243
243
var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
244
- Assert . Equal ( $ "/{{ID}} HTTP: { expectedMethod } ", routeEndpointBuilder . DisplayName ) ;
244
+ Assert . Equal ( $ "HTTP: { expectedMethod } /{{ID} }", routeEndpointBuilder . DisplayName ) ;
245
245
Assert . Equal ( $ "/{{ID}}", routeEndpointBuilder . RoutePattern . RawText ) ;
246
246
247
247
// Assert that we don't fallback to the query string
@@ -281,7 +281,7 @@ public void MapPost_BuildsEndpointWithCorrectMethod()
281
281
Assert . Equal ( "POST" , method ) ;
282
282
283
283
var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
284
- Assert . Equal ( "/ HTTP: POST" , routeEndpointBuilder . DisplayName ) ;
284
+ Assert . Equal ( "HTTP: POST / " , routeEndpointBuilder . DisplayName ) ;
285
285
Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
286
286
}
287
287
@@ -301,7 +301,7 @@ public void MapPut_BuildsEndpointWithCorrectMethod()
301
301
Assert . Equal ( "PUT" , method ) ;
302
302
303
303
var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
304
- Assert . Equal ( "/ HTTP: PUT" , routeEndpointBuilder . DisplayName ) ;
304
+ Assert . Equal ( "HTTP: PUT / " , routeEndpointBuilder . DisplayName ) ;
305
305
Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
306
306
}
307
307
@@ -321,7 +321,7 @@ public void MapDelete_BuildsEndpointWithCorrectMethod()
321
321
Assert . Equal ( "DELETE" , method ) ;
322
322
323
323
var routeEndpointBuilder = GetRouteEndpointBuilder ( builder ) ;
324
- Assert . Equal ( "/ HTTP: DELETE" , routeEndpointBuilder . DisplayName ) ;
324
+ Assert . Equal ( "HTTP: DELETE / " , routeEndpointBuilder . DisplayName ) ;
325
325
Assert . Equal ( "/" , routeEndpointBuilder . RoutePattern . RawText ) ;
326
326
}
327
327
@@ -359,6 +359,106 @@ public void MapFallbackWithoutPath_BuildsEndpointWithLowestRouteOrder()
359
359
Assert . Equal ( int . MaxValue , routeEndpointBuilder . Order ) ;
360
360
}
361
361
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
+
362
462
class FromRoute : Attribute , IFromRouteMetadata
363
463
{
364
464
public string ? Name { get ; set ; }
0 commit comments