Skip to content
This repository has been archived by the owner on Nov 27, 2018. It is now read-only.

Commit

Permalink
Change the data type of VirtualPathData.VirtualPath
Browse files Browse the repository at this point in the history
Fixes #270
  • Loading branch information
pranavkm committed Jan 4, 2016
1 parent 8f850f2 commit 156016e
Show file tree
Hide file tree
Showing 11 changed files with 172 additions and 167 deletions.
49 changes: 20 additions & 29 deletions src/Microsoft.AspNet.Routing.Abstractions/VirtualPathData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using Microsoft.AspNet.Http;

namespace Microsoft.AspNet.Routing
{
Expand All @@ -13,6 +12,7 @@ namespace Microsoft.AspNet.Routing
public class VirtualPathData
{
private RouteValueDictionary _dataTokens;
private string _virtualPath;

/// <summary>
/// Initializes a new instance of the <see cref="VirtualPathData"/> class.
Expand All @@ -34,20 +34,6 @@ public VirtualPathData(
IRouter router,
string virtualPath,
RouteValueDictionary dataTokens)
: this(router, CreatePathString(virtualPath), dataTokens)
{
}

/// <summary>
/// Initializes a new instance of the <see cref="VirtualPathData"/> class.
/// </summary>
/// <param name="router">The object that is used to generate the URL.</param>
/// <param name="virtualPath">The generated URL.</param>
/// <param name="dataTokens">The collection of custom values.</param>
public VirtualPathData(
IRouter router,
PathString virtualPath,
RouteValueDictionary dataTokens)
{
if (router == null)
{
Expand Down Expand Up @@ -83,26 +69,31 @@ public RouteValueDictionary DataTokens
/// <summary>
/// Gets or sets the URL that was generated from the <see cref="Router"/>.
/// </summary>
public PathString VirtualPath { get; set; }
public string VirtualPath
{
get
{
return _virtualPath;
}
set
{
_virtualPath = NormalizePath(value);
}
}

private static PathString CreatePathString(string path)
private static string NormalizePath(string path)
{
if (!string.IsNullOrEmpty(path))
if (string.IsNullOrEmpty(path))
{
PathString pathString;
if (path.Length > 0 && !path.StartsWith("/", StringComparison.Ordinal))
{
pathString = new PathString("/" + path);
}
else
{
pathString = new PathString(path);
}
return string.Empty;
}

return pathString;
if (!path.StartsWith("/", StringComparison.Ordinal))
{
return "/" + path;
}

return PathString.Empty;
return path;
}
}
}
6 changes: 6 additions & 0 deletions src/Microsoft.AspNet.Routing/Internal/UriBuildingContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,12 @@ public void Clear()
public override string ToString()
{
// We can ignore any currently buffered segments - they are are guaranteed to be 'defaults'.
if (_uri.Length > 0 && _uri[0] != '/')
{
// Normalize generated paths so that they always contain a leading slash.
_uri.Insert(0, '/');
}

return _uri.ToString();
}

Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.AspNet.Routing/RouteCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ private VirtualPathData NormalizeVirtualPath(VirtualPathData pathData)
return pathData;
}

var url = pathData.VirtualPath.Value;
var url = pathData.VirtualPath;

if (!string.IsNullOrEmpty(url) && (_options.LowercaseUrls || _options.AppendTrailingSlash))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ public class VirtualPathDataTests
public void Constructor_CreatesEmptyDataTokensIfNull()
{
// Arrange
var router = new Mock<IRouter>().Object;
var path = new PathString("/virtual path");
var router = Mock.Of<IRouter>();
var path = "/virtual path";

// Act
var pathData = new VirtualPathData(router, path, null);
Expand All @@ -30,8 +30,8 @@ public void Constructor_CreatesEmptyDataTokensIfNull()
public void Constructor_CopiesDataTokens()
{
// Arrange
var router = new Mock<IRouter>().Object;
var path = new PathString("/virtual path");
var router = Mock.Of<IRouter>();
var path = "/virtual path";
var dataTokens = new RouteValueDictionary();
dataTokens["TestKey"] = "TestValue";

Expand All @@ -51,14 +51,14 @@ public void Constructor_CopiesDataTokens()
public void VirtualPath_ReturnsEmptyStringIfNull()
{
// Arrange
var router = new Mock<IRouter>().Object;
var router = Mock.Of<IRouter>();

// Act
var pathData = new VirtualPathData(router, virtualPath: null);

// Assert
Assert.Same(router, pathData.Router);
Assert.Equal(new PathString(string.Empty), pathData.VirtualPath);
Assert.Empty(pathData.VirtualPath);
Assert.NotNull(pathData.DataTokens);
Assert.Empty(pathData.DataTokens);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public async Task Map_MatchesRequest(
var services = CreateServices();

var context = CreateRouteContext(services);
context.HttpContext.Request.Path = new PathString("/api/5");
context.HttpContext.Request.Path = "/api/5";
requestSetup?.Invoke(context.HttpContext);

var builder = CreateRouteBuilder(services);
Expand Down Expand Up @@ -110,7 +110,7 @@ public async Task Map_DoesNotMatchRequest(
var services = CreateServices();

var context = CreateRouteContext(services);
context.HttpContext.Request.Path = new PathString("/api/5");
context.HttpContext.Request.Path = "/api/5";
requestSetup?.Invoke(context.HttpContext);

var builder = CreateRouteBuilder(services);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public static TheoryData<string, StringSegment[]> TokenizationData
public void PathTokenizer_Count(string path, StringSegment[] expectedSegments)
{
// Arrange
var tokenizer = new PathTokenizer(new PathString(path));
var tokenizer = new PathTokenizer(path);

// Act
var count = tokenizer.Count;
Expand All @@ -94,7 +94,7 @@ public void PathTokenizer_Count(string path, StringSegment[] expectedSegments)
public void PathTokenizer_Indexer(string path, StringSegment[] expectedSegments)
{
// Arrange
var tokenizer = new PathTokenizer(new PathString(path));
var tokenizer = new PathTokenizer(path);

// Act & Assert
for (var i = 0; i < expectedSegments.Length; i++)
Expand All @@ -108,7 +108,7 @@ public void PathTokenizer_Indexer(string path, StringSegment[] expectedSegments)
public void PathTokenizer_Enumerator(string path, StringSegment[] expectedSegments)
{
// Arrange
var tokenizer = new PathTokenizer(new PathString(path));
var tokenizer = new PathTokenizer(path);

// Act & Assert
Assert.Equal<StringSegment>(expectedSegments, tokenizer);
Expand Down
14 changes: 7 additions & 7 deletions test/Microsoft.AspNet.Routing.Tests/RouteCollectionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void GetVirtualPath_CanLowerCaseUrls_And_AppendTrailingSlash_BasedOnOptio
var pathData = routeCollection.GetVirtualPath(virtualPathContext);

// Assert
Assert.Equal(new PathString(expectedUrl), pathData.VirtualPath);
Assert.Equal(expectedUrl, pathData.VirtualPath);
Assert.Same(target.Object, pathData.Router);
Assert.Empty(pathData.DataTokens);
}
Expand Down Expand Up @@ -84,7 +84,7 @@ public void GetVirtualPath_DoesntLowerCaseUrls_Invariant(
var pathData = routeCollection.GetVirtualPath(virtualPathContext);

// Assert
Assert.Equal(new PathString(lowercaseUrl), pathData.VirtualPath);
Assert.Equal(lowercaseUrl, pathData.VirtualPath);
Assert.Same(target.Object, pathData.Router);
Assert.Empty(pathData.DataTokens);
}
Expand All @@ -94,7 +94,7 @@ public void GetVirtualPath_DoesntLowerCaseUrls_Invariant(
public void GetVirtualPath_ReturnsDataTokens(RouteValueDictionary dataTokens, string routerName)
{
// Arrange
var virtualPath = new PathString("/TestVirtualPath");
var virtualPath = "/TestVirtualPath";

var pathContextValues = new RouteValueDictionary { { "controller", virtualPath } };

Expand Down Expand Up @@ -217,7 +217,7 @@ public void NamedRouteTests_GetNamedRoute_ReturnsValue(bool lowercaseUrls, strin
var pathData = routeCollection.GetVirtualPath(virtualPathContext);

// Assert
Assert.Equal(new PathString(expectedUrl), pathData.VirtualPath);
Assert.Equal(expectedUrl, pathData.VirtualPath);
var namedRouter = Assert.IsAssignableFrom<INamedRouter>(pathData.Router);
Assert.Equal(virtualPathContext.RouteName, namedRouter.Name);
Assert.Empty(pathData.DataTokens);
Expand Down Expand Up @@ -251,7 +251,7 @@ public void NamedRouteTests_GetNamedRoute_AmbiguousRoutesInCollection_DoesNotThr
var pathData = routeCollection.GetVirtualPath(virtualPathContext);

// Assert
Assert.Equal(new PathString("/route1"), pathData.VirtualPath);
Assert.Equal("/route1", pathData.VirtualPath);
var namedRouter = Assert.IsAssignableFrom<INamedRouter>(pathData.Router);
Assert.Equal("Route1", namedRouter.Name);
Assert.Empty(pathData.DataTokens);
Expand Down Expand Up @@ -359,7 +359,7 @@ public void GetVirtualPath_Success(
var pathData = routeCollection.GetVirtualPath(context);

// Assert
Assert.Equal(new PathString(expectedUrl), pathData.VirtualPath);
Assert.Equal(expectedUrl, pathData.VirtualPath);
Assert.Same(route, pathData.Router);
Assert.Empty(pathData.DataTokens);
}
Expand Down Expand Up @@ -583,7 +583,7 @@ private static RouteContext CreateRouteContext(
}

var request = new Mock<HttpRequest>(MockBehavior.Strict);
request.SetupGet(r => r.Path).Returns(new PathString(requestPath));
request.SetupGet(r => r.Path).Returns(requestPath);

var optionsAccessor = new Mock<IOptions<RouteOptions>>(MockBehavior.Strict);
optionsAccessor.SetupGet(o => o.Value).Returns(options);
Expand Down
Loading

0 comments on commit 156016e

Please sign in to comment.