public async Task RouteAsync_MergesExistingRouteData_IfRouteMatches() { // Arrange var template = "{controller}/{action}/{id:int}"; var context = CreateRouteContext("/Home/Index/5"); var originalRouteDataValues = context.RouteData.Values; originalRouteDataValues.Add("country", "USA"); var originalDataTokens = context.RouteData.DataTokens; originalDataTokens.Add("company", "Contoso"); IDictionary<string, object> routeValues = null; var mockTarget = new Mock<IRouter>(MockBehavior.Strict); mockTarget .Setup(s => s.RouteAsync(It.IsAny<RouteContext>())) .Callback<RouteContext>(ctx => { routeValues = ctx.RouteData.Values; ctx.Handler = NullHandler; }) .Returns(Task.FromResult(true)); var route = new Route( mockTarget.Object, template, defaults: null, constraints: null, dataTokens: new RouteValueDictionary(new { today = "Friday" }), inlineConstraintResolver: _inlineConstraintResolver); // Act await route.RouteAsync(context); // Assert Assert.NotNull(routeValues); Assert.True(routeValues.ContainsKey("country")); Assert.Equal("USA", routeValues["country"]); Assert.True(routeValues.ContainsKey("id")); Assert.Equal("5", routeValues["id"]); Assert.True(context.RouteData.Values.ContainsKey("country")); Assert.Equal("USA", context.RouteData.Values["country"]); Assert.True(context.RouteData.Values.ContainsKey("id")); Assert.Equal("5", context.RouteData.Values["id"]); Assert.Same(originalRouteDataValues, context.RouteData.Values); Assert.Equal("Contoso", context.RouteData.DataTokens["company"]); Assert.Equal("Friday", context.RouteData.DataTokens["today"]); Assert.Same(originalDataTokens, context.RouteData.DataTokens); }
/// <summary> /// Adds a route to the <see cref="IRouteBuilder"/> for the given <paramref name="template"/>, and /// <paramref name="handler"/>. /// </summary> /// <param name="builder">The <see cref="IRouteBuilder"/>.</param> /// <param name="template">The route template.</param> /// <param name="handler">The <see cref="RequestDelegate"/> route handler.</param> /// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns> public static IRouteBuilder MapRoute(this IRouteBuilder builder, string template, RequestDelegate handler) { var route = new Route( new RouteHandler(handler), template, defaults: null, constraints: null, dataTokens: null, inlineConstraintResolver: GetConstraintResolver(builder)); builder.Routes.Add(route); return builder; }
public static IRouteBuilder MapLocaleRoute( this IRouteBuilder routeBuilder, string locale, string routeTemplate, object defaults) { var defaultsDictionary = new RouteValueDictionary(defaults); defaultsDictionary.Add("locale", locale); var constraintResolver = routeBuilder.ServiceProvider.GetService<IInlineConstraintResolver>(); var route = new Route( target: routeBuilder.DefaultHandler, routeTemplate: routeTemplate, defaults: defaultsDictionary, constraints: null, dataTokens: null, inlineConstraintResolver: constraintResolver); routeBuilder.Routes.Add(route); return routeBuilder; }
public async Task RouteAsync_InlineConstraint_OptionalParameter_ConstraintFails() { // Arrange var template = "{controller}/{action}/{id:range(1,20)?}"; var context = CreateRouteContext("/Home/Index/100"); IDictionary<string, object> routeValues = null; var mockTarget = new Mock<IRouter>(MockBehavior.Strict); mockTarget .Setup(s => s.RouteAsync(It.IsAny<RouteContext>())) .Callback<RouteContext>(ctx => { routeValues = ctx.RouteData.Values; ctx.Handler = NullHandler; }) .Returns(Task.FromResult(true)); var route = new Route( mockTarget.Object, template, defaults: null, constraints: null, dataTokens: null, inlineConstraintResolver: _inlineConstraintResolver); Assert.NotEmpty(route.Constraints); Assert.IsType<OptionalRouteConstraint>(route.Constraints["id"]); // Act await route.RouteAsync(context); // Assert Assert.Null(context.Handler); }
public async Task RouteAsync_InlineConstraint_OptionalParameter_WithInConstructorConstraint() { // Arrange var template = "{controller}/{action}/{id:int?}"; var context = CreateRouteContext("/Home/Index/5"); IDictionary<string, object> routeValues = null; var mockTarget = new Mock<IRouter>(MockBehavior.Strict); mockTarget .Setup(s => s.RouteAsync(It.IsAny<RouteContext>())) .Callback<RouteContext>(ctx => { routeValues = ctx.RouteData.Values; ctx.Handler = NullHandler; }) .Returns(Task.FromResult(true)); var constraints = new Dictionary<string, object>(); constraints.Add("id", new RangeRouteConstraint(1, 20)); var route = new Route( mockTarget.Object, template, defaults: null, constraints: constraints, dataTokens: null, inlineConstraintResolver: _inlineConstraintResolver); Assert.NotEmpty(route.Constraints); Assert.IsType<OptionalRouteConstraint>(route.Constraints["id"]); var innerConstraint = ((OptionalRouteConstraint)route.Constraints["id"]).InnerConstraint; Assert.IsType<CompositeRouteConstraint>(innerConstraint); var compositeConstraint = (CompositeRouteConstraint)innerConstraint; Assert.Equal(compositeConstraint.Constraints.Count<IRouteConstraint>(), 2); Assert.Single(compositeConstraint.Constraints, c => c is IntRouteConstraint); Assert.Single(compositeConstraint.Constraints, c => c is RangeRouteConstraint); // Act await route.RouteAsync(context); // Assert Assert.NotNull(context.Handler); Assert.True(routeValues.ContainsKey("id")); Assert.Equal("5", routeValues["id"]); Assert.True(context.RouteData.Values.ContainsKey("id")); Assert.Equal("5", context.RouteData.Values["id"]); }
public async Task RouteAsync_InlineConstraint_Regex() { // Arrange var template = @"{controller}/{action}/{ssn:regex(^\d{{3}}-\d{{3}}-\d{{4}}$)}"; var context = CreateRouteContext("/Home/Index/123-456-7890"); IDictionary<string, object> routeValues = null; var mockTarget = new Mock<IRouter>(MockBehavior.Strict); mockTarget .Setup(s => s.RouteAsync(It.IsAny<RouteContext>())) .Callback<RouteContext>(ctx => { routeValues = ctx.RouteData.Values; ctx.Handler = NullHandler; }) .Returns(Task.FromResult(true)); var route = new Route( mockTarget.Object, template, defaults: null, constraints: null, dataTokens: null, inlineConstraintResolver: _inlineConstraintResolver); Assert.NotEmpty(route.Constraints); Assert.IsType<RegexInlineRouteConstraint>(route.Constraints["ssn"]); // Act await route.RouteAsync(context); // Assert Assert.NotNull(context.Handler); Assert.True(routeValues.ContainsKey("ssn")); Assert.Equal("123-456-7890", routeValues["ssn"]); Assert.True(context.RouteData.Values.ContainsKey("ssn")); Assert.Equal("123-456-7890", context.RouteData.Values["ssn"]); }
/// <summary> /// Adds a route to the <see cref="IRouteBuilder"/> that only matches HTTP requests for the given /// <paramref name="verb"/>, <paramref name="template"/>, and <paramref name="handler"/>. /// </summary> /// <param name="builder">The <see cref="IRouteBuilder"/>.</param> /// <param name="verb">The HTTP verb allowed by the route.</param> /// <param name="template">The route template.</param> /// <param name="handler">The <see cref="RequestDelegate"/> route handler.</param> /// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns> public static IRouteBuilder MapVerb( this IRouteBuilder builder, string verb, string template, RequestDelegate handler) { var route = new Route( new RouteHandler(handler), template, defaults: null, constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint(verb) }), dataTokens: null, inlineConstraintResolver: GetConstraintResolver(builder)); builder.Routes.Add(route); return builder; }