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 51bfea3
Show file tree
Hide file tree
Showing 8 changed files with 165 additions and 162 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
@@ -1,7 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using Microsoft.AspNet.Http;
using Moq;
using Xunit;

Expand All @@ -13,8 +12,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 +29,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 +50,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
15 changes: 7 additions & 8 deletions test/Microsoft.AspNet.Routing.Tests/RouteCollectionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Internal;
Expand Down Expand Up @@ -56,7 +55,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 +83,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 +93,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 +216,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 +250,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 +358,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 +582,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 51bfea3

Please sign in to comment.