Added tests related to generating urls with route name
This commit is contained in:
parent
6a8f015d34
commit
630aeade07
|
|
@ -16,6 +16,83 @@ namespace Microsoft.AspNetCore.Mvc.Routing
|
||||||
{
|
{
|
||||||
public class GlobalRoutingUrlHelperTest : UrlHelperTestBase
|
public class GlobalRoutingUrlHelperTest : UrlHelperTestBase
|
||||||
{
|
{
|
||||||
|
[Fact]
|
||||||
|
public void RouteUrl_WithRouteName_GeneratesUrl_UsingDefaults()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var endpoint1 = CreateEndpoint(
|
||||||
|
"api/orders/{id}",
|
||||||
|
defaults: new { controller = "Orders", action = "GetById" },
|
||||||
|
requiredValues: new { controller = "Orders", action = "GetById" },
|
||||||
|
routeName: "OrdersApi");
|
||||||
|
var endpoint2 = CreateEndpoint(
|
||||||
|
"api/orders",
|
||||||
|
defaults: new { controller = "Orders", action = "GetAll" },
|
||||||
|
requiredValues: new { controller = "Orders", action = "GetAll" },
|
||||||
|
routeName: "OrdersApi");
|
||||||
|
var urlHelper = CreateUrlHelper(new[] { endpoint1, endpoint2 });
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var url = urlHelper.RouteUrl(
|
||||||
|
routeName: "OrdersApi",
|
||||||
|
values: new { });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("/" + endpoint2.RoutePattern.RawText, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void RouteUrl_WithRouteName_UsesAmbientValues()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var endpoint1 = CreateEndpoint(
|
||||||
|
"api/orders/{id}",
|
||||||
|
defaults: new { controller = "Orders", action = "GetById" },
|
||||||
|
requiredValues: new { controller = "Orders", action = "GetById" },
|
||||||
|
routeName: "OrdersApi");
|
||||||
|
var endpoint2 = CreateEndpoint(
|
||||||
|
"api/orders",
|
||||||
|
defaults: new { controller = "Orders", action = "GetAll" },
|
||||||
|
requiredValues: new { controller = "Orders", action = "GetAll" },
|
||||||
|
routeName: "OrdersApi");
|
||||||
|
var urlHelper = CreateUrlHelper(new[] { endpoint1, endpoint2 });
|
||||||
|
urlHelper.ActionContext.RouteData.Values["id"] = "500";
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var url = urlHelper.RouteUrl(
|
||||||
|
routeName: "OrdersApi",
|
||||||
|
values: new { });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("/api/orders/500", url);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void RouteUrl_WithRouteName_UsesSuppliedValue_OverridingAmbientValue()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var endpoint1 = CreateEndpoint(
|
||||||
|
"api/orders/{id}",
|
||||||
|
defaults: new { controller = "Orders", action = "GetById" },
|
||||||
|
requiredValues: new { controller = "Orders", action = "GetById" },
|
||||||
|
routeName: "OrdersApi");
|
||||||
|
var endpoint2 = CreateEndpoint(
|
||||||
|
"api/orders",
|
||||||
|
defaults: new { controller = "Orders", action = "GetAll" },
|
||||||
|
requiredValues: new { controller = "Orders", action = "GetAll" },
|
||||||
|
routeName: "OrdersApi");
|
||||||
|
var urlHelper = CreateUrlHelper(new[] { endpoint1, endpoint2 });
|
||||||
|
urlHelper.ActionContext.RouteData.Values["id"] = "500";
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var url = urlHelper.RouteUrl(
|
||||||
|
routeName: "OrdersApi",
|
||||||
|
values: new { id = "10" });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("/api/orders/10", url);
|
||||||
|
}
|
||||||
|
|
||||||
protected override IUrlHelper CreateUrlHelper(string appRoot, string host, string protocol)
|
protected override IUrlHelper CreateUrlHelper(string appRoot, string host, string protocol)
|
||||||
{
|
{
|
||||||
return CreateUrlHelper(Enumerable.Empty<MatcherEndpoint>(), appRoot, host, protocol);
|
return CreateUrlHelper(Enumerable.Empty<MatcherEndpoint>(), appRoot, host, protocol);
|
||||||
|
|
@ -84,6 +161,14 @@ namespace Microsoft.AspNetCore.Mvc.Routing
|
||||||
return CreateUrlHelper(actionContext);
|
return CreateUrlHelper(actionContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IUrlHelper CreateUrlHelper(IEnumerable<MatcherEndpoint> endpoints, ActionContext actionContext = null)
|
||||||
|
{
|
||||||
|
var serviceProvider = CreateServices(endpoints);
|
||||||
|
var httpContext = CreateHttpContext(serviceProvider, null, null, "http");
|
||||||
|
actionContext = actionContext ?? CreateActionContext(httpContext);
|
||||||
|
return CreateUrlHelper(actionContext);
|
||||||
|
}
|
||||||
|
|
||||||
private IUrlHelper CreateUrlHelper(
|
private IUrlHelper CreateUrlHelper(
|
||||||
IEnumerable<MatcherEndpoint> endpoints,
|
IEnumerable<MatcherEndpoint> endpoints,
|
||||||
string appRoot,
|
string appRoot,
|
||||||
|
|
@ -99,33 +184,98 @@ namespace Microsoft.AspNetCore.Mvc.Routing
|
||||||
private List<MatcherEndpoint> GetDefaultEndpoints()
|
private List<MatcherEndpoint> GetDefaultEndpoints()
|
||||||
{
|
{
|
||||||
var endpoints = new List<MatcherEndpoint>();
|
var endpoints = new List<MatcherEndpoint>();
|
||||||
endpoints.Add(CreateEndpoint(null, "home/newaction/{id}", new { id = "defaultid", controller = "home", action = "newaction" }, 1));
|
endpoints.Add(
|
||||||
endpoints.Add(CreateEndpoint(null, "home/contact/{id}", new { id = "defaultid", controller = "home", action = "contact" }, 2));
|
CreateEndpoint(
|
||||||
endpoints.Add(CreateEndpoint(null, "home2/newaction/{id}", new { id = "defaultid", controller = "home2", action = "newaction" }, 3));
|
"home/newaction/{id}",
|
||||||
endpoints.Add(CreateEndpoint(null, "home2/contact/{id}", new { id = "defaultid", controller = "home2", action = "contact" }, 4));
|
defaults: new { id = "defaultid", controller = "home", action = "newaction" },
|
||||||
endpoints.Add(CreateEndpoint(null, "home3/contact/{id}", new { id = "defaultid", controller = "home3", action = "contact" }, 5));
|
requiredValues: new { controller = "home", action = "newaction" },
|
||||||
endpoints.Add(CreateEndpoint("namedroute", "named/home/newaction/{id}", new { id = "defaultid", controller = "home", action = "newaction" }, 6));
|
order: 1));
|
||||||
endpoints.Add(CreateEndpoint("namedroute", "named/home2/newaction/{id}", new { id = "defaultid", controller = "home2", action = "newaction" }, 7));
|
endpoints.Add(
|
||||||
endpoints.Add(CreateEndpoint("namedroute", "named/home/contact/{id}", new { id = "defaultid", controller = "home", action = "contact" }, 8));
|
CreateEndpoint(
|
||||||
endpoints.Add(CreateEndpoint("MyRouteName", "any/url", new { }, 9));
|
"home/contact/{id}",
|
||||||
|
defaults: new { id = "defaultid", controller = "home", action = "contact" },
|
||||||
|
requiredValues: new { controller = "home", action = "contact" },
|
||||||
|
order: 2));
|
||||||
|
endpoints.Add(
|
||||||
|
CreateEndpoint(
|
||||||
|
"home2/newaction/{id}",
|
||||||
|
defaults: new { id = "defaultid", controller = "home2", action = "newaction" },
|
||||||
|
requiredValues: new { controller = "home2", action = "newaction" },
|
||||||
|
order: 3));
|
||||||
|
endpoints.Add(
|
||||||
|
CreateEndpoint(
|
||||||
|
"home2/contact/{id}",
|
||||||
|
defaults: new { id = "defaultid", controller = "home2", action = "contact" },
|
||||||
|
requiredValues: new { controller = "home2", action = "contact" },
|
||||||
|
order: 4));
|
||||||
|
endpoints.Add(
|
||||||
|
CreateEndpoint(
|
||||||
|
"home3/contact/{id}",
|
||||||
|
defaults: new { id = "defaultid", controller = "home3", action = "contact" },
|
||||||
|
requiredValues: new { controller = "home3", action = "contact" },
|
||||||
|
order: 5));
|
||||||
|
endpoints.Add(
|
||||||
|
CreateEndpoint(
|
||||||
|
"named/home/newaction/{id}",
|
||||||
|
defaults: new { id = "defaultid", controller = "home", action = "newaction" },
|
||||||
|
requiredValues: new { controller = "home", action = "newaction" },
|
||||||
|
order: 6,
|
||||||
|
routeName: "namedroute"));
|
||||||
|
endpoints.Add(
|
||||||
|
CreateEndpoint(
|
||||||
|
"named/home2/newaction/{id}",
|
||||||
|
defaults: new { id = "defaultid", controller = "home2", action = "newaction" },
|
||||||
|
requiredValues: new { controller = "home2", action = "newaction" },
|
||||||
|
order: 7,
|
||||||
|
routeName: "namedroute"));
|
||||||
|
endpoints.Add(
|
||||||
|
CreateEndpoint(
|
||||||
|
"named/home/contact/{id}",
|
||||||
|
defaults: new { id = "defaultid", controller = "home", action = "contact" },
|
||||||
|
requiredValues: new { controller = "home", action = "contact" },
|
||||||
|
order: 8,
|
||||||
|
routeName: "namedroute"));
|
||||||
|
endpoints.Add(
|
||||||
|
CreateEndpoint(
|
||||||
|
"any/url",
|
||||||
|
defaults: new { },
|
||||||
|
requiredValues: new { },
|
||||||
|
order: 9,
|
||||||
|
routeName: "MyRouteName"));
|
||||||
|
endpoints.Add(
|
||||||
|
CreateEndpoint(
|
||||||
|
"api/orders/{id}",
|
||||||
|
defaults: new { controller = "Orders", action = "GetById" },
|
||||||
|
requiredValues: new { controller = "Orders", action = "GetById" },
|
||||||
|
order: 10,
|
||||||
|
routeName: "OrdersApi"));
|
||||||
return endpoints;
|
return endpoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MatcherEndpoint CreateEndpoint(string routeName, string template, object defaults, int order)
|
private MatcherEndpoint CreateEndpoint(
|
||||||
|
string template,
|
||||||
|
object defaults = null,
|
||||||
|
object requiredValues = null,
|
||||||
|
int order = 0,
|
||||||
|
string routeName = null,
|
||||||
|
EndpointMetadataCollection metadataCollection = null)
|
||||||
{
|
{
|
||||||
var metadata = EndpointMetadataCollection.Empty;
|
if (metadataCollection == null)
|
||||||
if (!string.IsNullOrEmpty(routeName))
|
|
||||||
{
|
{
|
||||||
metadata = new EndpointMetadataCollection(new[] { new RouteNameMetadata(routeName) });
|
metadataCollection = EndpointMetadataCollection.Empty;
|
||||||
|
if (!string.IsNullOrEmpty(routeName))
|
||||||
|
{
|
||||||
|
metadataCollection = new EndpointMetadataCollection(new[] { new RouteNameMetadata(routeName) });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new MatcherEndpoint(
|
return new MatcherEndpoint(
|
||||||
next => (httpContext) => Task.CompletedTask,
|
next => (httpContext) => Task.CompletedTask,
|
||||||
RoutePatternFactory.Parse(template, defaults, constraints: null),
|
RoutePatternFactory.Parse(template, defaults, constraints: null),
|
||||||
new RouteValueDictionary(),
|
new RouteValueDictionary(requiredValues),
|
||||||
order,
|
order,
|
||||||
metadata,
|
metadataCollection,
|
||||||
"DisplayName");
|
null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IServiceProvider CreateServices(IEnumerable<Endpoint> endpoints)
|
private IServiceProvider CreateServices(IEnumerable<Endpoint> endpoints)
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,11 @@ namespace Microsoft.AspNetCore.Mvc.Routing
|
||||||
.Returns<VirtualPathContext>(context => null);
|
.Returns<VirtualPathContext>(context => null);
|
||||||
routeBuilder.DefaultHandler = target.Object;
|
routeBuilder.DefaultHandler = target.Object;
|
||||||
|
|
||||||
|
routeBuilder.MapRoute(
|
||||||
|
"OrdersApi",
|
||||||
|
"api/orders/{id}",
|
||||||
|
new RouteValueDictionary(new { controller = "Orders", action = "GetById" }));
|
||||||
|
|
||||||
routeBuilder.MapRoute(
|
routeBuilder.MapRoute(
|
||||||
string.Empty,
|
string.Empty,
|
||||||
"{controller}/{action}/{id}",
|
"{controller}/{action}/{id}",
|
||||||
|
|
|
||||||
|
|
@ -457,6 +457,36 @@ namespace Microsoft.AspNetCore.Mvc.Routing
|
||||||
Assert.Equal("https://pingüino/app/named/home2/newaction/someid", url);
|
Assert.Equal("https://pingüino/app/named/home2/newaction/someid", url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void RouteUrl_GeneratesUrl_WithRouteName_UsingDefaultValues_WhenExplicitOrAmbientValues_NotPresent()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var urlHelper = CreateUrlHelperWithDefaultRoutes();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var url = urlHelper.RouteUrl(
|
||||||
|
routeName: "OrdersApi",
|
||||||
|
values: new { id = "500" });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("/app/api/orders/500", url);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void RouteUrl_WithRouteName_DoesNotGenerateUrl_WhenRequiredValueForParameter_NotPresent()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var urlHelper = CreateUrlHelperWithDefaultRoutes();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var url = urlHelper.RouteUrl(
|
||||||
|
routeName: "OrdersApi",
|
||||||
|
values: new { });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Null(url);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void RouteUrlWithRouteNameAndDictionary()
|
public void RouteUrlWithRouteNameAndDictionary()
|
||||||
{
|
{
|
||||||
|
|
@ -922,7 +952,6 @@ namespace Microsoft.AspNetCore.Mvc.Routing
|
||||||
Assert.Equal("/b/Store/Checkout", url);
|
Assert.Equal("/b/Store/Checkout", url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected abstract IServiceProvider CreateServices();
|
protected abstract IServiceProvider CreateServices();
|
||||||
|
|
||||||
protected abstract IUrlHelper CreateUrlHelper(ActionContext actionContext);
|
protected abstract IUrlHelper CreateUrlHelper(ActionContext actionContext);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue