Fixing a bug with "~/something/*" url's in the UrlRuleProvider

--HG--
branch : dev
This commit is contained in:
Nathan Heskew
2010-10-28 07:02:18 -07:00
parent 908a049b58
commit c8f90ab6c4
6 changed files with 104 additions and 8 deletions

View File

@@ -135,6 +135,7 @@
<Compile Include="Values.cs" />
<Compile Include="Users\Controllers\AdminControllerTests.cs" />
<Compile Include="Users\Services\MembershipServiceTests.cs" />
<Compile Include="Widgets\RuleEngine\UrlRuleProviderTest.cs" />
<Compile Include="Widgets\Services\WidgetsServiceTest.cs" />
<Compile Include="Widgets\WidgetsTests.cs" />
<Compile Include="XmlRpc\Controllers\HomeControllerTests.cs" />

View File

@@ -0,0 +1,65 @@
using Autofac;
using NUnit.Framework;
using Orchard.Mvc;
using Orchard.Tests.Stubs;
using Orchard.UI.Widgets;
using Orchard.Widgets.RuleEngine;
namespace Orchard.Tests.Modules.Widgets.RuleEngine {
[TestFixture]
public class UrlRuleProviderTest {
private IContainer _container;
private IRuleProvider _urlRuleProvider;
private StubHttpContextAccessor _stubContextAccessor;
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.RegisterType<UrlRuleProvider>().As<IRuleProvider>();
_stubContextAccessor = new StubHttpContextAccessor();
builder.RegisterInstance(_stubContextAccessor).As<IHttpContextAccessor>();
_container = builder.Build();
_urlRuleProvider = _container.Resolve<IRuleProvider>();
}
[Test]
public void UrlForHomePageMatchesHomePagePath() {
_stubContextAccessor.StubContext = new StubHttpContext("~/");
var context = new RuleContext {FunctionName = "url", Arguments = new[] {"~/"}};
_urlRuleProvider.Process(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForAboutPageMatchesAboutPagePath() {
_stubContextAccessor.StubContext = new StubHttpContext("~/about");
var context = new RuleContext { FunctionName = "url", Arguments = new[] { "~/about" } };
_urlRuleProvider.Process(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForBlogWithEndingWildcardMatchesBlogPostPageInSaidBlog() {
_stubContextAccessor.StubContext = new StubHttpContext("~/my-blog/my-blog-post");
var context = new RuleContext { FunctionName = "url", Arguments = new[] { "~/my-blog/*" } };
_urlRuleProvider.Process(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForHomePageDoesNotMatchAboutPagePath() {
_stubContextAccessor.StubContext = new StubHttpContext("~/about");
var context = new RuleContext { FunctionName = "url", Arguments = new[] { "~/" } };
_urlRuleProvider.Process(context);
Assert.That(context.Result, Is.False);
}
[Test]
public void UrlForAboutPageMatchesDifferentCasedAboutPagePath() {
_stubContextAccessor.StubContext = new StubHttpContext("~/About");
var context = new RuleContext { FunctionName = "url", Arguments = new[] { "~/about" } };
_urlRuleProvider.Process(context);
Assert.That(context.Result, Is.True);
}
}
}

View File

@@ -245,6 +245,7 @@
<Compile Include="Mvc\Routes\UrlPrefixTests.cs" />
<Compile Include="Records\BigRecord.cs" />
<Compile Include="Scripting\ScriptingTests.cs" />
<Compile Include="Stubs\StubHttpContextAccessor.cs" />
<Compile Include="Stubs\StubWorkContextAccessor.cs" />
<Compile Include="Stubs\StubExtensionManager.cs" />
<Compile Include="Stubs\StubReportsCoordinator.cs" />

View File

@@ -1,4 +1,3 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
@@ -28,19 +27,21 @@ namespace Orchard.Tests.Stubs {
public override HttpRequestBase Request {
get { return new StubHttpRequest(this); }
}
public override HttpResponseBase Response {
get { return new StubHttpResponse(this); }
}
public override IDictionary Items {
get { return _items; }
}
class StubHttpRequest : HttpRequestBase {
#region Nested type: StubHttpRequest
private class StubHttpRequest : HttpRequestBase {
private readonly StubHttpContext _httpContext;
private NameValueCollection _serverVariables;
private NameValueCollection _headers;
private NameValueCollection _serverVariables;
public StubHttpRequest(StubHttpContext httpContext) {
_httpContext = httpContext;
@@ -54,33 +55,45 @@ namespace Orchard.Tests.Stubs {
get { return "/"; }
}
public override string Path {
get { return _httpContext._appRelativeCurrentExecutionFilePath.TrimStart('~'); }
}
public override string PathInfo {
get { return ""; }
}
public override NameValueCollection Headers {
get {
return _headers = _headers
?? new NameValueCollection { { "Host", _httpContext._hostHeader } };
?? new NameValueCollection {{"Host", _httpContext._hostHeader}};
}
}
public override NameValueCollection ServerVariables {
get {
return _serverVariables = _serverVariables
?? new NameValueCollection { { "HTTP_HOST", _httpContext._hostHeader } };
?? new NameValueCollection {{"HTTP_HOST", _httpContext._hostHeader}};
}
}
}
class StubHttpResponse : HttpResponseBase {
#endregion
#region Nested type: StubHttpResponse
private class StubHttpResponse : HttpResponseBase {
private readonly StubHttpContext _httpContext;
public StubHttpResponse(StubHttpContext httpContext) {
_httpContext = httpContext;
}
public override string ApplyAppPathModifier(string virtualPath) {
return "~/" + virtualPath.TrimStart('/');
}
}
#endregion
}
}

View File

@@ -0,0 +1,16 @@
using System.Web;
using Orchard.Mvc;
namespace Orchard.Tests.Stubs {
public class StubHttpContextAccessor : IHttpContextAccessor {
private HttpContextBase _httpContext;
public HttpContextBase StubContext {
set { _httpContext = value; }
}
public HttpContextBase Current() {
return _httpContext;
}
}
}

View File

@@ -26,7 +26,7 @@ namespace Orchard.Widgets.RuleEngine {
if (url != "/" && !url.Contains("?") && url.EndsWith("/"))
url = url.TrimEnd('/');
ruleContext.Result = url.EndsWith("*")
? context.Request.Path.ToUpperInvariant().StartsWith(url.ToUpperInvariant())
? context.Request.Path.ToUpperInvariant().StartsWith(url.TrimEnd('*').ToUpperInvariant())
: context.Request.Path.ToUpperInvariant() == url.ToUpperInvariant();
}
}