mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Implementing shape binding abstractions and built-in strategies
--HG-- branch : mvc3p1
This commit is contained in:
@@ -1,39 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
using Orchard.DisplayManagement;
|
||||
|
||||
namespace Orchard.Tests.DisplayManagement {
|
||||
[TestFixture]
|
||||
public class DefaultShapeTableFactoryTests {
|
||||
static IShapeTableFactory CreateShapeTableFactory(Action<ContainerBuilder> config) {
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterType<DefaultShapeTableFactory>().As<IShapeTableFactory>();
|
||||
config(builder);
|
||||
var container = builder.Build();
|
||||
return container.Resolve<IShapeTableFactory>();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ShapeTableRecognizesMethodNames() {
|
||||
var stf = CreateShapeTableFactory(cfg => cfg.RegisterType<Test>().As<IShapeDriver>());
|
||||
var shapeTable = stf.CreateShapeTable();
|
||||
Assert.That(shapeTable.Entries.Count(), Is.EqualTo(2));
|
||||
Assert.That(shapeTable.Entries.ContainsKey("Pager"));
|
||||
Assert.That(shapeTable.Entries.ContainsKey("Email"));
|
||||
}
|
||||
|
||||
public class Test : IShapeDriver {
|
||||
public void Pager() {
|
||||
}
|
||||
|
||||
public void Email(string text, string address) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -0,0 +1,22 @@
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
using Orchard.Tests.Utility;
|
||||
|
||||
namespace Orchard.Tests.DisplayManagement.Descriptors {
|
||||
public class ContainerTestBase {
|
||||
|
||||
protected IContainer _container;
|
||||
|
||||
[SetUp]
|
||||
public virtual void Init() {
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterAutoMocking();
|
||||
Register(builder);
|
||||
_container = builder.Build();
|
||||
Resolve(_container);
|
||||
}
|
||||
|
||||
protected virtual void Register(ContainerBuilder builder) { }
|
||||
protected virtual void Resolve(IContainer container) { }
|
||||
}
|
||||
}
|
@@ -0,0 +1,24 @@
|
||||
using System;
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
using Orchard.DisplayManagement.Descriptors;
|
||||
|
||||
namespace Orchard.Tests.DisplayManagement.Descriptors {
|
||||
[TestFixture]
|
||||
public class DefaultShapeTableFactoryTests : ContainerTestBase {
|
||||
private IShapeTableFactory _factory;
|
||||
|
||||
protected override void Register(ContainerBuilder builder) {
|
||||
builder.RegisterType<DefaultShapeTableFactory>().As<IShapeTableFactory>();
|
||||
}
|
||||
|
||||
protected override void Resolve(IContainer container) {
|
||||
_factory = container.Resolve<IShapeTableFactory>();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FactoryIsResolved() {
|
||||
Assert.That(_factory, Is.Not.Null);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Orchard.Tests.DisplayManagement.Descriptors {
|
||||
[TestFixture]
|
||||
public class DefaultShapeTableManagerTests {
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,111 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Autofac;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Orchard.DisplayManagement;
|
||||
using Orchard.DisplayManagement.Descriptors;
|
||||
using Orchard.DisplayManagement.Descriptors.ShapeAttributeStrategy;
|
||||
using Orchard.DisplayManagement.Implementation;
|
||||
using Orchard.Environment;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
|
||||
namespace Orchard.Tests.DisplayManagement.Descriptors {
|
||||
[TestFixture]
|
||||
public class ShapeAttributeBindingStrategyTests : ContainerTestBase {
|
||||
private FeatureDescriptor _testFeature;
|
||||
|
||||
protected override void Register(Autofac.ContainerBuilder builder) {
|
||||
_testFeature = new FeatureDescriptor { Name = "Testing", Extension = new ExtensionDescriptor { Name = "Testing" } };
|
||||
builder.RegisterType<ShapeAttributeBindingStrategy>().As<IShapeDescriptorBindingStrategy>();
|
||||
builder.RegisterInstance(new TestProvider()).WithMetadata("Feature", _testFeature);
|
||||
builder.RegisterModule(new ShapeAttributeBindingModule());
|
||||
}
|
||||
|
||||
protected override void Resolve(IContainer container) {
|
||||
// implementation resorts to orchard host to resolve "current scope" services
|
||||
container.Resolve<Mock<IOrchardHostContainer>>()
|
||||
.Setup(x => x.Resolve<IComponentContext>())
|
||||
.Returns(container);
|
||||
}
|
||||
|
||||
class TestProvider {
|
||||
[Shape]
|
||||
public string Simple() {
|
||||
return "Simple";
|
||||
}
|
||||
|
||||
[Shape("Renamed")]
|
||||
public string RenamedMethod() {
|
||||
return "Renamed";
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerable<ShapeDescriptorAlteration> GetInitializers() {
|
||||
var strategy = _container.Resolve<IShapeDescriptorBindingStrategy>();
|
||||
var builder = new ShapeTableBuilder();
|
||||
strategy.Discover(builder);
|
||||
return builder.Build();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ShapeAttributeOccurrencesAreDetected() {
|
||||
var occurrences = _container.Resolve<IEnumerable<ShapeAttributeOccurrence>>();
|
||||
Assert.That(occurrences.Any(o => o.MethodInfo == typeof(TestProvider).GetMethod("Simple")));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void InitializersHaveExpectedShapeTypeNames() {
|
||||
var strategy = _container.Resolve<IShapeDescriptorBindingStrategy>();
|
||||
var builder = new ShapeTableBuilder();
|
||||
strategy.Discover(builder);
|
||||
var initializers = builder.Build();
|
||||
Assert.That(initializers.Any(i => i.ShapeType == "Simple"));
|
||||
Assert.That(initializers.Any(i => i.ShapeType == "Renamed"));
|
||||
Assert.That(initializers.Any(i => i.ShapeType == "RenamedMethod"), Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FeatureMetadataIsDetected() {
|
||||
var strategy = _container.Resolve<IShapeDescriptorBindingStrategy>();
|
||||
var builder = new ShapeTableBuilder();
|
||||
strategy.Discover(builder);
|
||||
var initializers = builder.Build();
|
||||
Assert.That(initializers.All(i => i.Feature == _testFeature));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void LifetimeScopeContainersHaveMetadata() {
|
||||
var strategy = _container.Resolve<IShapeDescriptorBindingStrategy>();
|
||||
var builder = new ShapeTableBuilder();
|
||||
strategy.Discover(builder);
|
||||
var initializers = builder.Build();
|
||||
Assert.That(initializers.Any(i => i.ShapeType == "Simple"));
|
||||
|
||||
var childContainer = _container.BeginLifetimeScope();
|
||||
|
||||
var strategy2 = childContainer.Resolve<IShapeDescriptorBindingStrategy>();
|
||||
var builder2 = new ShapeTableBuilder();
|
||||
strategy2.Discover(builder2);
|
||||
var initializers2 = builder2.Build();
|
||||
Assert.That(initializers2.Any(i => i.ShapeType == "Simple"));
|
||||
|
||||
Assert.That(strategy, Is.Not.SameAs(strategy2));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BindingProvidedByStrategyInvokesMethod() {
|
||||
var initializers = GetInitializers();
|
||||
|
||||
var shapeDescriptor = initializers.Where(i => i.ShapeType == "Simple")
|
||||
.Aggregate(new ShapeDescriptor { ShapeType = "Simple" }, (d, i) => { i.Alter(d); return d; });
|
||||
|
||||
var displayContext = new DisplayContext();
|
||||
var result = shapeDescriptor.Binding(displayContext);
|
||||
var result2 = shapeDescriptor.Binding.Invoke(displayContext);
|
||||
Assert.That(result.ToString(), Is.StringContaining("Simple"));
|
||||
Assert.That(result2.ToString(), Is.StringContaining("Simple"));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -56,7 +56,7 @@ namespace Orchard.Tests.DisplayManagement {
|
||||
|
||||
var displayHelperFactory = new DisplayHelperFactory(displayManager.Object, shapeFactory.Object);
|
||||
var display = (dynamic)displayHelperFactory.CreateHelper(viewContext, null);
|
||||
var outline = new Shape { Attributes = new ShapeAttributes { Type = "Outline" } };
|
||||
var outline = new Shape { Metadata = new ShapeMetadata { Type = "Outline" } };
|
||||
display(outline);
|
||||
|
||||
//displayManager.Verify(dm => dm.Execute(outline, viewContext, null));
|
||||
|
@@ -25,8 +25,8 @@ namespace Orchard.Tests.DisplayManagement {
|
||||
public void ShapeHasAttributesType() {
|
||||
var factory = _container.Resolve<IShapeFactory>();
|
||||
dynamic foo = factory.Create("Foo", ArgsUtility.Empty());
|
||||
ShapeAttributes attributes = foo.Attributes;
|
||||
Assert.That(attributes.Type, Is.EqualTo("Foo"));
|
||||
ShapeMetadata metadata = foo.Metadata;
|
||||
Assert.That(metadata.Type, Is.EqualTo("Foo"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
@@ -28,7 +28,7 @@ namespace Orchard.Tests.DisplayManagement {
|
||||
|
||||
var alpha = shape.Alpha();
|
||||
|
||||
Assert.That(alpha.Attributes.Type, Is.EqualTo("Alpha"));
|
||||
Assert.That(alpha.Metadata.Type, Is.EqualTo("Alpha"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -37,7 +37,7 @@ namespace Orchard.Tests.DisplayManagement {
|
||||
|
||||
var alpha = shape.Alpha(one: 1, two: "dos");
|
||||
|
||||
Assert.That(alpha.Attributes.Type, Is.EqualTo("Alpha"));
|
||||
Assert.That(alpha.Metadata.Type, Is.EqualTo("Alpha"));
|
||||
Assert.That(alpha.one, Is.EqualTo(1));
|
||||
Assert.That(alpha.two, Is.EqualTo("dos"));
|
||||
}
|
||||
@@ -48,7 +48,7 @@ namespace Orchard.Tests.DisplayManagement {
|
||||
|
||||
var alpha = shape.Alpha(new { one = 1, two = "dos" });
|
||||
|
||||
Assert.That(alpha.Attributes.Type, Is.EqualTo("Alpha"));
|
||||
Assert.That(alpha.Metadata.Type, Is.EqualTo("Alpha"));
|
||||
Assert.That(alpha.one, Is.EqualTo(1));
|
||||
Assert.That(alpha.two, Is.EqualTo("dos"));
|
||||
}
|
||||
|
@@ -5,10 +5,15 @@ using System.Text;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using Autofac;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Orchard.DisplayManagement;
|
||||
using Orchard.DisplayManagement.Descriptors;
|
||||
using Orchard.DisplayManagement.Descriptors.ShapeAttributeStrategy;
|
||||
using Orchard.DisplayManagement.Implementation;
|
||||
using Orchard.DisplayManagement.Shapes;
|
||||
using Orchard.Environment;
|
||||
using Orchard.Tests.Utility;
|
||||
|
||||
namespace Orchard.Tests.DisplayManagement {
|
||||
[TestFixture]
|
||||
@@ -18,20 +23,28 @@ namespace Orchard.Tests.DisplayManagement {
|
||||
[SetUp]
|
||||
public void Init() {
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterModule(new ShapeAttributeBindingModule());
|
||||
builder.RegisterType<ShapeAttributeBindingStrategy>().As<IShapeDescriptorBindingStrategy>();
|
||||
builder.RegisterType<DefaultDisplayManager>().As<IDisplayManager>();
|
||||
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
|
||||
builder.RegisterType<DisplayHelperFactory>().As<IDisplayHelperFactory>();
|
||||
builder.RegisterType<ShapeHelperFactory>().As<IShapeHelperFactory>();
|
||||
builder.RegisterType<DefaultShapeTableFactory>().As<IShapeTableFactory>();
|
||||
builder.RegisterType<SimpleShapes>().As<IShapeDriver>();
|
||||
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
|
||||
builder.RegisterType<SimpleShapes>();
|
||||
builder.RegisterAutoMocking(MockBehavior.Loose);
|
||||
_container = builder.Build();
|
||||
_container.Resolve<Mock<IOrchardHostContainer>>()
|
||||
.Setup(x => x.Resolve<IComponentContext>())
|
||||
.Returns(_container);
|
||||
}
|
||||
|
||||
public class SimpleShapes : IShapeDriver {
|
||||
public class SimpleShapes {
|
||||
[Shape]
|
||||
public IHtmlString Something() {
|
||||
return new HtmlString("<br/>");
|
||||
}
|
||||
|
||||
[Shape]
|
||||
public IHtmlString Pager() {
|
||||
return new HtmlString("<div>hello</div>");
|
||||
}
|
||||
|
@@ -194,7 +194,10 @@
|
||||
<Compile Include="Data\StubLocator.cs" />
|
||||
<Compile Include="DisplayManagement\ArgsUtility.cs" />
|
||||
<Compile Include="DisplayManagement\DefaultDisplayManagerTests.cs" />
|
||||
<Compile Include="DisplayManagement\DefaultShapeTableFactoryTests.cs" />
|
||||
<Compile Include="DisplayManagement\Descriptors\ContainerTestBase.cs" />
|
||||
<Compile Include="DisplayManagement\Descriptors\DefaultShapeTableFactoryTests.cs" />
|
||||
<Compile Include="DisplayManagement\Descriptors\DefaultShapeTableManagerTests.cs" />
|
||||
<Compile Include="DisplayManagement\Descriptors\ShapeAttributeBindingStrategyTests.cs" />
|
||||
<Compile Include="DisplayManagement\DisplayHelperTests.cs" />
|
||||
<Compile Include="DisplayManagement\ShapeFactoryTests.cs" />
|
||||
<Compile Include="DisplayManagement\SubsystemTests.cs" />
|
||||
|
Reference in New Issue
Block a user