From 6e5187c1ae731b09ff2bd94d65fc6c670be735f3 Mon Sep 17 00:00:00 2001 From: ivano Date: Fri, 5 Aug 2016 16:29:48 +0200 Subject: [PATCH] Using new StringRouteConstraint for area constraint --- .../Builder/MvcAreaRouteBuilderExtensions.cs | 3 +- .../MvcAreaRouteBuilderExtensionsTest.cs | 51 +++++++++++++++++-- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcAreaRouteBuilderExtensions.cs b/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcAreaRouteBuilderExtensions.cs index c7436cc749..f5db1df3b1 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcAreaRouteBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcAreaRouteBuilderExtensions.cs @@ -4,6 +4,7 @@ using System; using Microsoft.AspNetCore.Mvc.Core; using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.Routing.Constraints; namespace Microsoft.AspNetCore.Builder { @@ -131,7 +132,7 @@ namespace Microsoft.AspNetCore.Builder defaultsDictionary["area"] = defaultsDictionary["area"] ?? areaName; var constraintsDictionary = new RouteValueDictionary(constraints); - constraintsDictionary["area"] = constraintsDictionary["area"] ?? areaName; + constraintsDictionary["area"] = constraintsDictionary["area"] ?? new StringRouteConstraint(areaName); routeBuilder.MapRoute(name, template, defaultsDictionary, constraintsDictionary, dataTokens); return routeBuilder; diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/Builder/MvcAreaRouteBuilderExtensionsTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/Builder/MvcAreaRouteBuilderExtensionsTest.cs index 278cd937a3..2f8e1eb960 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/Builder/MvcAreaRouteBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/Builder/MvcAreaRouteBuilderExtensionsTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing.Constraints; using Microsoft.Extensions.DependencyInjection; @@ -33,7 +34,7 @@ namespace Microsoft.AspNetCore.Builder kvp => { Assert.Equal(kvp.Key, "area"); - Assert.IsType(kvp.Value); + Assert.IsType(kvp.Value); }); Assert.Empty(route.DataTokens); Assert.Collection( @@ -68,7 +69,7 @@ namespace Microsoft.AspNetCore.Builder kvp => { Assert.Equal(kvp.Key, "area"); - Assert.IsType(kvp.Value); + Assert.IsType(kvp.Value); }); Assert.Empty(route.DataTokens); Assert.Collection( @@ -109,7 +110,7 @@ namespace Microsoft.AspNetCore.Builder kvp => { Assert.Equal(kvp.Key, "area"); - Assert.IsType(kvp.Value); + Assert.IsType(kvp.Value); }, kvp => { @@ -156,7 +157,7 @@ namespace Microsoft.AspNetCore.Builder kvp => { Assert.Equal(kvp.Key, "area"); - Assert.IsType(kvp.Value); + Assert.IsType(kvp.Value); }, kvp => { @@ -227,6 +228,48 @@ namespace Microsoft.AspNetCore.Builder }); } + [Fact] + public void MapAreaRoute_UsesPassedInAreaNameAsIs() + { + // Arrange + var builder = CreateRouteBuilder(); + var areaName = "user.admin"; + + // Act + builder.MapAreaRoute(name: null, areaName: areaName, template: "site/Admin/"); + + // Assert + var route = Assert.IsType((Assert.Single(builder.Routes))); + + Assert.Null(route.Name); + Assert.Equal("site/Admin/", route.RouteTemplate); + Assert.Collection( + route.Constraints.OrderBy(kvp => kvp.Key), + kvp => + { + Assert.Equal(kvp.Key, "area"); + Assert.IsType(kvp.Value); + + var values = new RouteValueDictionary(new { area = areaName }); + var match = kvp.Value.Match( + httpContext: Mock.Of(), + route: new Mock().Object, + routeKey: kvp.Key, + values: values, + routeDirection: RouteDirection.UrlGeneration); + + Assert.True(match); + }); + Assert.Empty(route.DataTokens); + Assert.Collection( + route.Defaults.OrderBy(kvp => kvp.Key), + kvp => + { + Assert.Equal(kvp.Key, "area"); + Assert.Equal(kvp.Value, areaName); + }); + } + private IServiceProvider CreateServices() { var services = new ServiceCollection();