Cleaning up and fixing some tests. Refactoring.

Using auto mocking instead of some null stubs. Unclear if that practice will be adopted.
Builtin Orchard.Framework feature definition moved from ExtensioManager to CompositionStrategy

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-04-19 12:25:53 -07:00
parent 3509843b48
commit 7c793f4e0a
7 changed files with 82 additions and 73 deletions

View File

@@ -235,7 +235,7 @@ namespace Orchard.Tests.Environment {
[Test] [Test]
public void CoreRecordsAreAddedAutomatically() { public void CoreRecordsAreAddedAutomatically() {
var descriptor = Build.TopologyDescriptor(); var descriptor = Build.TopologyDescriptor().WithFeatures("Orchard.Framework");
var compositionStrategy = _container.Resolve<ICompositionStrategy>(); var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(descriptor); var topology = compositionStrategy.Compose(descriptor);
@@ -244,14 +244,14 @@ namespace Orchard.Tests.Environment {
var ci = topology.Records.Single(x => x.Type == typeof (ContentItemRecord)); var ci = topology.Records.Single(x => x.Type == typeof (ContentItemRecord));
var civ = topology.Records.Single(x => x.Type == typeof (ContentItemVersionRecord)); var civ = topology.Records.Single(x => x.Type == typeof (ContentItemVersionRecord));
Assert.That(ct.Feature.Descriptor.Name, Is.EqualTo("Core")); Assert.That(ct.Feature.Descriptor.Name, Is.EqualTo("Orchard.Framework"));
Assert.That(ct.TableName, Is.EqualTo("Core_ContentTypeRecord")); Assert.That(ct.TableName, Is.EqualTo("Orchard_Framework_ContentTypeRecord"));
Assert.That(ci.Feature.Descriptor.Name, Is.EqualTo("Core")); Assert.That(ci.Feature.Descriptor.Name, Is.EqualTo("Orchard.Framework"));
Assert.That(ci.TableName, Is.EqualTo("Core_ContentItemRecord")); Assert.That(ci.TableName, Is.EqualTo("Orchard_Framework_ContentItemRecord"));
Assert.That(civ.Feature.Descriptor.Name, Is.EqualTo("Core")); Assert.That(civ.Feature.Descriptor.Name, Is.EqualTo("Orchard.Framework"));
Assert.That(civ.TableName, Is.EqualTo("Core_ContentItemVersionRecord")); Assert.That(civ.TableName, Is.EqualTo("Orchard_Framework_ContentItemVersionRecord"));
} }
} }
} }

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Web.Mvc; using System.Web.Mvc;
@@ -12,6 +13,7 @@ using Orchard.Environment;
using Orchard.Environment.AutofacUtil; using Orchard.Environment.AutofacUtil;
using Orchard.Environment.Configuration; using Orchard.Environment.Configuration;
using Orchard.Environment.Extensions; using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Folders;
using Orchard.Environment.Extensions.Models; using Orchard.Environment.Extensions.Models;
using Orchard.Environment.ShellBuilders; using Orchard.Environment.ShellBuilders;
using Orchard.Environment.Topology; using Orchard.Environment.Topology;
@@ -21,6 +23,7 @@ using Orchard.Mvc.ModelBinders;
using Orchard.Mvc.Routes; using Orchard.Mvc.Routes;
using Orchard.Tests.Environment.TestDependencies; using Orchard.Tests.Environment.TestDependencies;
using Orchard.Tests.Stubs; using Orchard.Tests.Stubs;
using Orchard.Tests.Utility;
namespace Orchard.Tests.Environment { namespace Orchard.Tests.Environment {
[TestFixture] [TestFixture]
@@ -30,18 +33,19 @@ namespace Orchard.Tests.Environment {
private RouteCollection _routeCollection; private RouteCollection _routeCollection;
private ModelBinderDictionary _modelBinderDictionary; private ModelBinderDictionary _modelBinderDictionary;
private ControllerBuilder _controllerBuilder; private ControllerBuilder _controllerBuilder;
private ViewEngineCollection _viewEngineCollection;
[SetUp] [SetUp]
public void Init() { public void Init() {
_controllerBuilder = new ControllerBuilder(); _controllerBuilder = new ControllerBuilder();
_routeCollection = new RouteCollection(); _routeCollection = new RouteCollection();
_modelBinderDictionary = new ModelBinderDictionary(); _modelBinderDictionary = new ModelBinderDictionary();
_viewEngineCollection = new ViewEngineCollection { new WebFormViewEngine() };
_container = OrchardStarter.CreateHostContainer( _container = OrchardStarter.CreateHostContainer(
builder => { builder => {
//builder.RegisterModule(new ImplicitCollectionSupportModule()); builder.RegisterInstance(new StubShellSettingsLoader()).As<IShellSettingsManager>();
builder.RegisterType<StubContainerProvider>().As<IContainerProvider>().InstancePerLifetimeScope(); builder.RegisterType<StubContainerProvider>().As<IContainerProvider>().InstancePerLifetimeScope();
builder.RegisterType<StubCompositionStrategy>().As<ICompositionStrategy>().InstancePerLifetimeScope();
builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().SingleInstance(); builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().SingleInstance();
builder.RegisterType<RoutePublisher>().As<IRoutePublisher>(); builder.RegisterType<RoutePublisher>().As<IRoutePublisher>();
builder.RegisterType<ModelBinderPublisher>().As<IModelBinderPublisher>(); builder.RegisterType<ModelBinderPublisher>().As<IModelBinderPublisher>();
@@ -49,13 +53,31 @@ namespace Orchard.Tests.Environment {
builder.RegisterInstance(_controllerBuilder); builder.RegisterInstance(_controllerBuilder);
builder.RegisterInstance(_routeCollection); builder.RegisterInstance(_routeCollection);
builder.RegisterInstance(_modelBinderDictionary); builder.RegisterInstance(_modelBinderDictionary);
builder.RegisterInstance(new ViewEngineCollection { new WebFormViewEngine() }); builder.RegisterInstance(_viewEngineCollection);
builder.RegisterInstance(new StuExtensionManager()).As<IExtensionManager>(); builder.RegisterAutoMocking()
builder.RegisterInstance(new Mock<IHackInstallationGenerator>().Object); .Ignore<IExtensionFolders>()
builder.RegisterInstance(new StubShellSettingsLoader()).As<IShellSettingsManager>(); .Ignore<IRouteProvider>()
builder.RegisterInstance(new Mock<ITopologyDescriptorCache>().Object); .Ignore<IModelBinderProvider>();
}); });
_lifetime = _container.BeginLifetimeScope(); _lifetime = _container.BeginLifetimeScope();
_container.Mock<IContainerProvider>()
.SetupGet(cp=>cp.ApplicationContainer).Returns(_container);
_container.Mock<IContainerProvider>()
.SetupGet(cp => cp.RequestLifetime).Returns(_lifetime);
_container.Mock<IContainerProvider>()
.Setup(cp => cp.EndRequestLifetime()).Callback(() => _lifetime.Dispose());
_container.Mock<ITopologyDescriptorManager>()
.Setup(cp => cp.GetTopologyDescriptor()).Returns(new ShellTopologyDescriptor());
var temp = Path.GetTempFileName();
File.Delete(temp);
Directory.CreateDirectory(temp);
_container.Resolve<IAppDataFolder>()
.SetBasePath(temp);
var updater = new ContainerUpdater(); var updater = new ContainerUpdater();
updater.RegisterInstance(_container).SingleInstance(); updater.RegisterInstance(_container).SingleInstance();
updater.Update(_lifetime); updater.Update(_lifetime);
@@ -74,36 +96,6 @@ namespace Orchard.Tests.Environment {
} }
} }
public class StuExtensionManager : IExtensionManager {
public IEnumerable<ExtensionDescriptor> AvailableExtensions() {
return Enumerable.Empty<ExtensionDescriptor>();
}
public IEnumerable<Feature> LoadFeatures(IEnumerable<FeatureDescriptor> features) {
throw new NotImplementedException();
}
public Feature LoadFeature(FeatureDescriptor featureDescriptor) {
throw new NotImplementedException();
}
public IEnumerable<ExtensionEntry> ActiveExtensions_Obsolete() {
return Enumerable.Empty<ExtensionEntry>();
}
public Feature LoadFeature(string featureName) {
throw new NotImplementedException();
}
public void InstallExtension(string extensionType, HttpPostedFileBase extensionBundle) {
throw new NotImplementedException();
}
public void UninstallExtension(string extensionType, string extensionName) {
throw new NotImplementedException();
}
}
[Test] [Test]
public void HostShouldSetControllerFactory() { public void HostShouldSetControllerFactory() {
var host = _lifetime.Resolve<IOrchardHost>(); var host = _lifetime.Resolve<IOrchardHost>();
@@ -113,11 +105,6 @@ namespace Orchard.Tests.Environment {
Assert.That(_controllerBuilder.GetControllerFactory(), Is.TypeOf<OrchardControllerFactory>()); Assert.That(_controllerBuilder.GetControllerFactory(), Is.TypeOf<OrchardControllerFactory>());
} }
public class StubCompositionStrategy : ICompositionStrategy {
public ShellTopology Compose(ShellTopologyDescriptor descriptor) {
throw new NotImplementedException();
}
}
[Test] [Test]
public void DifferentShellInstanceShouldBeReturnedAfterEachCreate() { public void DifferentShellInstanceShouldBeReturnedAfterEachCreate() {

View File

@@ -79,7 +79,7 @@ namespace Orchard.Tests.Environment.ShellBuilders {
var factory = _container.Resolve<IShellContainerFactory>(); var factory = _container.Resolve<IShellContainerFactory>();
var shellContainer = factory.CreateContainer(settings, topology); var shellContainer = factory.CreateContainer(settings, topology);
var controllers = shellContainer.Resolve<IIndex<string, IController>>(); var controllers = shellContainer.Resolve<IIndex<string, IController>>();
var controller = controllers["foo|bar"]; var controller = controllers["foo/bar"];
Assert.That(controller, Is.Not.Null); Assert.That(controller, Is.Not.Null);
Assert.That(controller, Is.InstanceOf<TestController>()); Assert.That(controller, Is.InstanceOf<TestController>());
} }
@@ -99,7 +99,7 @@ namespace Orchard.Tests.Environment.ShellBuilders {
var shellContainer = factory.CreateContainer(settings, topology); var shellContainer = factory.CreateContainer(settings, topology);
var controllerMetas = shellContainer.Resolve<IIndex<string, Meta<IController>>>(); var controllerMetas = shellContainer.Resolve<IIndex<string, Meta<IController>>>();
var metadata = controllerMetas["foo|bar"].Metadata; var metadata = controllerMetas["foo/bar"].Metadata;
Assert.That(metadata["Hello"], Is.EqualTo("World")); Assert.That(metadata["Hello"], Is.EqualTo("World"));
} }
@@ -296,9 +296,9 @@ namespace Orchard.Tests.Environment.ShellBuilders {
Assert.That(setta, Is.Not.Null); Assert.That(setta, Is.Not.Null);
Assert.That(setta, Is.SameAs(settb)); Assert.That(setta, Is.SameAs(settb));
var settings2 = CreateSettings();
var topology2 = CreateTopology(); var topology2 = CreateTopology();
var shellContainer2 = factory.CreateContainer(settings, topology2); var shellContainer2 = factory.CreateContainer(settings2, topology2);
var proxa2 = shellContainer2.Resolve<DynamicProxyContext>(); var proxa2 = shellContainer2.Resolve<DynamicProxyContext>();
var proxb2 = shellContainer2.Resolve<DynamicProxyContext>(); var proxb2 = shellContainer2.Resolve<DynamicProxyContext>();

View File

@@ -71,7 +71,7 @@ namespace Orchard.Tests.Environment.ShellBuilders {
var factory = _container.Resolve<IShellContextFactory>(); var factory = _container.Resolve<IShellContextFactory>();
var context = factory.Create(null); var context = factory.Create(null);
Assert.That(context.TopologyDescriptor.EnabledFeatures, Has.Some.With.Property("Name").EqualTo("Setup")); Assert.That(context.TopologyDescriptor.EnabledFeatures, Has.Some.With.Property("Name").EqualTo("Orchard.Setup"));
} }
} }
} }

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using Autofac; using Autofac;
using Autofac.Builder; using Autofac.Builder;
using Autofac.Core; using Autofac.Core;
@@ -12,21 +13,25 @@ namespace Orchard.Tests.Utility {
return container.Resolve<Mock<T>>(); return container.Resolve<Mock<T>>();
} }
public static void RegisterAutoMocking(this ContainerBuilder builder) { public static AutoMockSource RegisterAutoMocking(this ContainerBuilder builder) {
builder.RegisterSource(new AutoMockSource(MockBehavior.Default)); var source = new AutoMockSource(MockBehavior.Strict);
builder.RegisterSource(source);
return source;
} }
public static void RegisterAutoMocking(this ContainerBuilder builder, MockBehavior behavior) { public static void RegisterAutoMocking(this ContainerBuilder builder, MockBehavior behavior) {
builder.RegisterSource(new AutoMockSource(behavior)); builder.RegisterSource(new AutoMockSource(behavior));
} }
class AutoMockSource : IRegistrationSource {
public class AutoMockSource : IRegistrationSource {
private readonly MockBehavior _behavior; private readonly MockBehavior _behavior;
private IEnumerable<Type> _ignore = Enumerable.Empty<Type>();
public AutoMockSource(MockBehavior behavior) { public AutoMockSource(MockBehavior behavior) {
_behavior = behavior; _behavior = behavior;
} }
public IEnumerable<IComponentRegistration> RegistrationsFor( IEnumerable<IComponentRegistration> IRegistrationSource.RegistrationsFor(
Service service, Service service,
Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor) { Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor) {
@@ -42,6 +47,13 @@ namespace Orchard.Tests.Utility {
.CreateRegistration(); .CreateRegistration();
} }
else if (st.IsInterface) { else if (st.IsInterface) {
if (st.IsGenericType && st.GetGenericTypeDefinition() == typeof(IEnumerable<>)) {
yield break;
}
if (_ignore.Contains(st)) {
yield break;
}
yield return RegistrationBuilder.ForDelegate( yield return RegistrationBuilder.ForDelegate(
(ctx, p) => { (ctx, p) => {
Trace.WriteLine(string.Format("Mocking {0}", st)); Trace.WriteLine(string.Format("Mocking {0}", st));
@@ -52,9 +64,13 @@ namespace Orchard.Tests.Utility {
.As(service) .As(service)
.SingleInstance() .SingleInstance()
.CreateRegistration(); .CreateRegistration();
} }
} }
public AutoMockSource Ignore<T>() {
_ignore = _ignore.Concat(new[]{typeof (T)});
return this;
}
} }
} }

View File

@@ -113,16 +113,6 @@ namespace Orchard.Environment.Extensions {
} }
public Feature LoadFeature(FeatureDescriptor featureDescriptor) { public Feature LoadFeature(FeatureDescriptor featureDescriptor) {
if (featureDescriptor.Name == "Orchard.Framework") {
return new Feature {
Descriptor = featureDescriptor,
ExportedTypes =
typeof(OrchardStarter).Assembly.GetExportedTypes()
.Where(t => t.IsClass && !t.IsAbstract)
.ToArray()
};
}
var featureName = featureDescriptor.Name; var featureName = featureDescriptor.Name;
string extensionName = GetExtensionForFeature(featureName); string extensionName = GetExtensionForFeature(featureName);
if (extensionName == null) throw new ArgumentException(T("Feature ") + featureName + T(" was not found in any of the installed extensions")); if (extensionName == null) throw new ArgumentException(T("Feature ") + featureName + T(" was not found in any of the installed extensions"));

View File

@@ -36,6 +36,9 @@ namespace Orchard.Environment.Topology {
var features = _extensionManager.LoadFeatures(enabledFeatures); var features = _extensionManager.LoadFeatures(enabledFeatures);
if (topologyDescriptor.EnabledFeatures.Any(feature => feature.Name == "Orchard.Framework"))
features = features.Concat(BuiltinFeatures());
return new ShellTopology { return new ShellTopology {
Modules = BuildTopology<ModuleTopology>(features, IsModule, BuildModule), Modules = BuildTopology<ModuleTopology>(features, IsModule, BuildModule),
Dependencies = BuildTopology(features, IsDependency, (t, f) => BuildDependency(t, f, topologyDescriptor)), Dependencies = BuildTopology(features, IsDependency, (t, f) => BuildDependency(t, f, topologyDescriptor)),
@@ -44,12 +47,25 @@ namespace Orchard.Environment.Topology {
}; };
} }
private static bool IsFeatureEnabledInTopology(FeatureDescriptor featureDescriptor, ShellTopologyDescriptor topologyDescriptor) { private static bool IsFeatureEnabledInTopology(FeatureDescriptor featureDescriptor, ShellTopologyDescriptor topologyDescriptor) {
return topologyDescriptor.EnabledFeatures.Any(topologyFeature => topologyFeature.Name == featureDescriptor.Name); return topologyDescriptor.EnabledFeatures.Any(topologyFeature => topologyFeature.Name == featureDescriptor.Name);
} }
private static IEnumerable<Feature> BuiltinFeatures() {
yield return new Feature {
Descriptor = new FeatureDescriptor {
Name = "Orchard.Framework",
Extension = new ExtensionDescriptor {
Name = "Orchard.Framework"
}
},
ExportedTypes =
typeof(OrchardStarter).Assembly.GetExportedTypes()
.Where(t => t.IsClass && !t.IsAbstract)
.ToArray()
};
}
private static IEnumerable<T> BuildTopology<T>( private static IEnumerable<T> BuildTopology<T>(
IEnumerable<Feature> features, IEnumerable<Feature> features,
Func<Type, bool> predicate, Func<Type, bool> predicate,