Layouts, Widgets and Conditions.

- Moved Rules engine code to new Orchard.Conditions module.
- Refactored Layouts and Widgets to use Conditions.
- Moved Widgets element harvester to the Widgets module as a separate feature.
This commit is contained in:
Sipke Schoorstra
2015-11-19 14:02:12 +01:00
parent 3b4b3c578a
commit 5c18f49fa3
43 changed files with 959 additions and 379 deletions

View File

@@ -0,0 +1,57 @@
using System;
using Autofac;
using NUnit.Framework;
using Orchard.Caching;
using Orchard.Conditions.Services;
using Orchard.Scripting;
using Orchard.Tests.Stubs;
namespace Orchard.Tests.Modules.Conditions {
[TestFixture]
public class ConditionEvaluationTests {
private IContainer _container;
private IConditionManager _conditionManager;
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.RegisterType<ScriptExpressionEvaluator>().As<IScriptExpressionEvaluator>();
builder.RegisterType<AlwaysTrueCondition>().As<IConditionProvider>();
builder.RegisterType<ConditionManager>().As<IConditionManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
_container = builder.Build();
_conditionManager = _container.Resolve<IConditionManager>();
}
[Test]
public void ProviderGetsCalledForExpression() {
var result = _conditionManager.Matches("hello");
Assert.IsTrue(result);
}
[Test]
public void RubyExpressionIsEvaluated() {
var result = _conditionManager.Matches("not hello");
Assert.IsFalse(result);
}
[Test]
public void ArgumentsArePassedCorrectly() {
var result = _conditionManager.Matches("add(2, 3) == 5");
Assert.IsTrue(result);
}
}
public class AlwaysTrueCondition : IConditionProvider {
public void Evaluate(ConditionEvaluationContext evaluationContext) {
if (evaluationContext.FunctionName == "add") {
evaluationContext.Result = Convert.ToInt32(evaluationContext.Arguments[0]) + Convert.ToInt32(evaluationContext.Arguments[1]);
return;
}
evaluationContext.Result = true;
}
}
}

View File

@@ -1,87 +1,87 @@
using System;
using Autofac;
using NUnit.Framework;
using Orchard.Environment.Configuration;
using Orchard.Mvc;
using Orchard.Tests.Stubs;
using Orchard.Widgets.RuleEngine;
using Orchard.Widgets.Services;
namespace Orchard.Tests.Modules.Widgets.RuleEngine {
[TestFixture]
public class UrlRuleProviderTest {
private IContainer _container;
private IRuleProvider _urlRuleProvider;
private StubHttpContextAccessor _stubContextAccessor;
private ShellSettings _shellSettings;
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
_shellSettings = new ShellSettings { RequestUrlPrefix = String.Empty };
builder.RegisterType<UrlRuleProvider>().As<IRuleProvider>();
builder.RegisterInstance(_shellSettings);
_stubContextAccessor = new StubHttpContextAccessor();
builder.RegisterInstance(_stubContextAccessor).As<IHttpContextAccessor>();
_container = builder.Build();
_urlRuleProvider = _container.Resolve<IRuleProvider>();
}
[Test]
public void UrlForHomePageMatchesHomePagePath() {
_stubContextAccessor.Set(new StubHttpContext("~/"));
var context = new RuleContext { FunctionName = "url", Arguments = new[] { "~/" } };
_urlRuleProvider.Process(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForAboutPageMatchesAboutPagePath() {
_stubContextAccessor.Set(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.Set(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.Set(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.Set(new StubHttpContext("~/About"));
var context = new RuleContext { FunctionName = "url", Arguments = new[] { "~/about" } };
_urlRuleProvider.Process(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForAboutPageWithEndingSlashMatchesAboutPagePath() {
_stubContextAccessor.Set(new StubHttpContext("~/About/"));
var context = new RuleContext { FunctionName = "url", Arguments = new[] { "~/about" } };
_urlRuleProvider.Process(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForHomePageMatchesHomePagePathWithUrlPrefix() {
_stubContextAccessor.Set(new StubHttpContext("~/site1"));
_shellSettings.RequestUrlPrefix = "site1";
var context = new RuleContext { FunctionName = "url", Arguments = new[] { "~/" } };
_urlRuleProvider.Process(context);
Assert.That(context.Result, Is.True);
}
}
using System;
using Autofac;
using NUnit.Framework;
using Orchard.Conditions.Services;
using Orchard.Environment.Configuration;
using Orchard.Mvc;
using Orchard.Tests.Stubs;
using Orchard.Widgets.RuleEngine;
namespace Orchard.Tests.Modules.Conditions.Providers {
[TestFixture]
public class UrlRuleConditionTest {
private IContainer _container;
private IConditionProvider _urlCondition;
private StubHttpContextAccessor _stubContextAccessor;
private ShellSettings _shellSettings;
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
_shellSettings = new ShellSettings { RequestUrlPrefix = String.Empty };
builder.RegisterType<UrlCondition>().As<IConditionProvider>();
builder.RegisterInstance(_shellSettings);
_stubContextAccessor = new StubHttpContextAccessor();
builder.RegisterInstance(_stubContextAccessor).As<IHttpContextAccessor>();
_container = builder.Build();
_urlCondition = _container.Resolve<IConditionProvider>();
}
[Test]
public void UrlForHomePageMatchesHomePagePath() {
_stubContextAccessor.Set(new StubHttpContext("~/"));
var context = new ConditionEvaluationContext { FunctionName = "url", Arguments = new[] { "~/" } };
_urlCondition.Evaluate(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForAboutPageMatchesAboutPagePath() {
_stubContextAccessor.Set(new StubHttpContext("~/about"));
var context = new ConditionEvaluationContext { FunctionName = "url", Arguments = new[] { "~/about" } };
_urlCondition.Evaluate(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForBlogWithEndingWildcardMatchesBlogPostPageInSaidBlog() {
_stubContextAccessor.Set(new StubHttpContext("~/my-blog/my-blog-post"));
var context = new ConditionEvaluationContext { FunctionName = "url", Arguments = new[] { "~/my-blog/*" } };
_urlCondition.Evaluate(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForHomePageDoesNotMatchAboutPagePath() {
_stubContextAccessor.Set(new StubHttpContext("~/about"));
var context = new ConditionEvaluationContext { FunctionName = "url", Arguments = new[] { "~/" } };
_urlCondition.Evaluate(context);
Assert.That(context.Result, Is.False);
}
[Test]
public void UrlForAboutPageMatchesDifferentCasedAboutPagePath() {
_stubContextAccessor.Set(new StubHttpContext("~/About"));
var context = new ConditionEvaluationContext { FunctionName = "url", Arguments = new[] { "~/about" } };
_urlCondition.Evaluate(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForAboutPageWithEndingSlashMatchesAboutPagePath() {
_stubContextAccessor.Set(new StubHttpContext("~/About/"));
var context = new ConditionEvaluationContext { FunctionName = "url", Arguments = new[] { "~/about" } };
_urlCondition.Evaluate(context);
Assert.That(context.Result, Is.True);
}
[Test]
public void UrlForHomePageMatchesHomePagePathWithUrlPrefix() {
_stubContextAccessor.Set(new StubHttpContext("~/site1"));
_shellSettings.RequestUrlPrefix = "site1";
var context = new ConditionEvaluationContext { FunctionName = "url", Arguments = new[] { "~/" } };
_urlCondition.Evaluate(context);
Assert.That(context.Result, Is.True);
}
}
}

View File

@@ -190,9 +190,9 @@
<Compile Include="Users\Services\MembershipServiceTests.cs" />
<Compile Include="Warmup\WebDownloaderTests.cs" />
<Compile Include="Warmup\WarmupUpdaterTests.cs" />
<Compile Include="Widgets\RuleEngine\UrlRuleProviderTest.cs" />
<Compile Include="Conditions\Providers\UrlRuleConditionTest.cs" />
<Compile Include="Widgets\Services\WidgetsServiceTest.cs" />
<Compile Include="Widgets\WidgetsTests.cs" />
<Compile Include="Conditions\ConditionEvaluationTests.cs" />
<Compile Include="Workflows\Activities\WebRequestActivityTests.cs" />
<Compile Include="XmlRpc\Controllers\LiveWriterControllerTests.cs" />
<Compile Include="XmlRpc\Controllers\HomeControllerTests.cs" />
@@ -225,6 +225,10 @@
<Project>{14C049FD-B35B-415A-A824-87F26B26E7FD}</Project>
<Name>Orchard.Comments</Name>
</ProjectReference>
<ProjectReference Include="..\Orchard.Web\Modules\Orchard.Conditions\Orchard.Conditions.csproj">
<Project>{98251eae-a41b-47b2-aa91-e28b8482da70}</Project>
<Name>Orchard.Conditions</Name>
</ProjectReference>
<ProjectReference Include="..\Orchard.Web\Modules\Orchard.DesignerTools\Orchard.DesignerTools.csproj">
<Project>{4A4595EF-6C37-4F99-96ED-4AE0B9E438D3}</Project>
<Name>Orchard.DesignerTools</Name>

View File

@@ -1,58 +0,0 @@
using System;
using Autofac;
using NUnit.Framework;
using Orchard.Scripting;
using Orchard.Caching;
using Orchard.Tests.Stubs;
using Orchard.Widgets.RuleEngine;
using Orchard.Widgets.Services;
namespace Orchard.Tests.Modules.Widgets {
[TestFixture]
public class WidgetsTests {
private IContainer _container;
private IRuleManager _ruleManager;
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.RegisterType<ScriptExpressionEvaluator>().As<IScriptExpressionEvaluator>();
builder.RegisterType<AlwaysTrueRuleProvider>().As<IRuleProvider>();
builder.RegisterType<RuleManager>().As<IRuleManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
_container = builder.Build();
_ruleManager = _container.Resolve<IRuleManager>();
}
[Test]
public void ProviderGetsCalledForExpression() {
bool result = _ruleManager.Matches("hello");
Assert.IsTrue(result);
}
[Test]
public void RubyExpressionIsEvaluated() {
bool result = _ruleManager.Matches("not hello");
Assert.IsFalse(result);
}
[Test]
public void ArgumentsArePassedCorrectly() {
bool result = _ruleManager.Matches("add(2, 3) == 5");
Assert.IsTrue(result);
}
}
public class AlwaysTrueRuleProvider : IRuleProvider {
public void Process(RuleContext ruleContext) {
if (ruleContext.FunctionName == "add") {
ruleContext.Result = Convert.ToInt32(ruleContext.Arguments[0]) + Convert.ToInt32(ruleContext.Arguments[1]);
return;
}
ruleContext.Result = true;
}
}
}