Skip to content

Commit

Permalink
TestCase added and IUrlHelper and support for RouteOptions.LowercaseUrls
Browse files Browse the repository at this point in the history
checked appliesd to the query string.
@rynowak
aspnet#518
#Issue:  aspnet/Mvc#7720
  • Loading branch information
kishan.anem committed May 31, 2018
1 parent a155e26 commit e6eb9d4
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 25 deletions.
7 changes: 4 additions & 3 deletions src/Microsoft.AspNetCore.Routing/RouteCollection.cs
Expand Up @@ -12,6 +12,7 @@ namespace Microsoft.AspNetCore.Routing
{
public class RouteCollection : IRouteCollection
{
private readonly static char[] UrlQueryDelimiters = new char[] { '?', '#' };
private readonly List<IRouter> _routes = new List<IRouter>();
private readonly List<IRouter> _unnamedRoutes = new List<IRouter>();
private readonly Dictionary<string, INamedRouter> _namedRoutes =
Expand Down Expand Up @@ -138,7 +139,7 @@ private VirtualPathData NormalizeVirtualPath(VirtualPathData pathData)

var url = pathData.VirtualPath;

if (!string.IsNullOrEmpty(url) && (_options.LowercaseUrls || _options.LowercaseQueryStrings || _options.AppendTrailingSlash))
if (!string.IsNullOrEmpty(url) && (_options.LowercaseUrls || _options.AppendTrailingSlash))
{
var indexOfSeparator = url.IndexOfAny(UrlQueryDelimiters);
var urlWithoutQueryString = url;
Expand All @@ -155,7 +156,7 @@ private VirtualPathData NormalizeVirtualPath(VirtualPathData pathData)
urlWithoutQueryString = urlWithoutQueryString.ToLowerInvariant();
}

if (_options.LowercaseQueryStrings)
if (_options.LowercaseUrls && _options.LowercaseQueryStrings)
{
queryString = queryString.ToLowerInvariant();
}
Expand All @@ -182,4 +183,4 @@ private void EnsureOptions(HttpContext context)
}
}
}
}
}
2 changes: 1 addition & 1 deletion src/Microsoft.AspNetCore.Routing/RouteOptions.cs
Expand Up @@ -15,7 +15,7 @@ public class RouteOptions
public bool LowercaseUrls { get; set; }

/// <summary>
/// Gets or sets a value indicating whether all generated QUERY STRINGS are lower-case.
/// Gets or sets a value indicating whether all generated QUERY STRINGS are lower-case. property will when LowercaseUrls true.
/// </summary>
public bool LowercaseQueryStrings { get; set; }

Expand Down
62 changes: 41 additions & 21 deletions test/Microsoft.AspNetCore.Routing.Tests/RouteCollectionTest.cs
Expand Up @@ -8,6 +8,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Extensions.ObjectPool;
using Microsoft.Extensions.Options;
Expand Down Expand Up @@ -88,6 +89,44 @@ public class RouteCollectionTest
Assert.Empty(pathData.DataTokens);
}

[Theory]
[InlineData(@"Home/Index/23?Param1=ABC&Param2=Xyz", "/Home/Index/23?Param1=ABC&Param2=Xyz", false, true, false)]
[InlineData(@"Home/Index/23?Param1=ABC&Param2=Xyz", "/Home/Index/23?Param1=ABC&Param2=Xyz", false, false, false)]
[InlineData(@"Home/Index/23?Param1=ABC&Param2=Xyz", "/home/index/23/?param1=abc&param2=xyz", true, true, true)]
[InlineData(@"Home/Index/23#Param1=ABC&Param2=Xyz", "/Home/Index/23/#Param1=ABC&Param2=Xyz", false, true, true)]
[InlineData(@"Home/Index/23#Param1=ABC&Param2=Xyz", "/home/index/23#Param1=ABC&Param2=Xyz", true, false, false)]
[InlineData(@"Home/Index/23/?Param1=ABC&Param2=Xyz", "/home/index/23/?param1=abc&param2=xyz", true, true, true)]
[InlineData(@"Home/Index/23/#Param1=ABC&Param2=Xyz", "/home/index/23/#Param1=ABC&Param2=Xyz", true, false, true)]
[InlineData(@"Home/Index/23/#Param1=ABC&Param2=Xyz", "/home/index/23/#param1=abc&param2=xyz", true, true, true)]
public void GetVirtualPath_CanLowerCaseUrls_QueryStrings_BasedOnOptions(
string returnUrl,
string expectedUrl,
bool lowercaseUrls,
bool lowercaseQueryStrings, bool appendTrailingSlash)
{
// Arrange
var target = new Mock<IRouter>(MockBehavior.Strict);
target
.Setup(e => e.GetVirtualPath(It.IsAny<VirtualPathContext>()))
.Returns(new VirtualPathData(target.Object, returnUrl));

var routeCollection = new RouteCollection();
routeCollection.Add(target.Object);
var virtualPathContext = CreateVirtualPathContext(
options: GetRouteOptions(
lowerCaseUrls: lowercaseUrls,
lowercaseQueryStrings: lowercaseQueryStrings,
appendTrailingSlash: appendTrailingSlash));

// Act
var pathData = routeCollection.GetVirtualPath(virtualPathContext);

// Assert
Assert.Equal(expectedUrl, pathData.VirtualPath);
Assert.Same(target.Object, pathData.Router);
Assert.Empty(pathData.DataTokens);
}

[Theory]
[MemberData(nameof(DataTokensTestData))]
public void GetVirtualPath_ReturnsDataTokens(RouteValueDictionary dataTokens, string routerName)
Expand Down Expand Up @@ -459,26 +498,6 @@ public static IEnumerable<object[]> DataTokensTestData
}
}

private static async Task<TestSink> SetUp(bool enabled, bool handled)
{
// Arrange
var sink = new TestSink(
TestSink.EnableWithTypeName<RouteCollection>,
TestSink.EnableWithTypeName<RouteCollection>);
var loggerFactory = new TestLoggerFactory(sink, enabled);

var routes = new RouteCollection();
var route = CreateRoute(accept: handled);
routes.Add(route.Object);

var context = CreateRouteContext("/Cool", loggerFactory);

// Act
await routes.RouteAsync(context);

return sink;
}

private static RouteCollection GetRouteCollectionWithNamedRoutes(IEnumerable<string> routeNames)
{
var routes = new RouteCollection();
Expand Down Expand Up @@ -682,12 +701,13 @@ private static INamedRouter CreateNamedRoute(string name, bool accept = false, s

private static Action<RouteOptions> GetRouteOptions(
bool lowerCaseUrls = false,
bool appendTrailingSlash = false)
bool appendTrailingSlash = false, bool lowercaseQueryStrings = false)
{
return (options) =>
{
options.LowercaseUrls = lowerCaseUrls;
options.AppendTrailingSlash = appendTrailingSlash;
options.LowercaseQueryStrings = lowercaseQueryStrings;
};
}
}
Expand Down

0 comments on commit e6eb9d4

Please sign in to comment.