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

Change the data type of VirtualPathData.VirtualPath #273

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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, '/');
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😻


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