mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
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:
@@ -235,7 +235,7 @@ namespace Orchard.Tests.Environment {
|
||||
|
||||
[Test]
|
||||
public void CoreRecordsAreAddedAutomatically() {
|
||||
var descriptor = Build.TopologyDescriptor();
|
||||
var descriptor = Build.TopologyDescriptor().WithFeatures("Orchard.Framework");
|
||||
|
||||
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
|
||||
var topology = compositionStrategy.Compose(descriptor);
|
||||
@@ -244,14 +244,14 @@ namespace Orchard.Tests.Environment {
|
||||
var ci = topology.Records.Single(x => x.Type == typeof (ContentItemRecord));
|
||||
var civ = topology.Records.Single(x => x.Type == typeof (ContentItemVersionRecord));
|
||||
|
||||
Assert.That(ct.Feature.Descriptor.Name, Is.EqualTo("Core"));
|
||||
Assert.That(ct.TableName, Is.EqualTo("Core_ContentTypeRecord"));
|
||||
Assert.That(ct.Feature.Descriptor.Name, Is.EqualTo("Orchard.Framework"));
|
||||
Assert.That(ct.TableName, Is.EqualTo("Orchard_Framework_ContentTypeRecord"));
|
||||
|
||||
Assert.That(ci.Feature.Descriptor.Name, Is.EqualTo("Core"));
|
||||
Assert.That(ci.TableName, Is.EqualTo("Core_ContentItemRecord"));
|
||||
|
||||
Assert.That(civ.Feature.Descriptor.Name, Is.EqualTo("Core"));
|
||||
Assert.That(civ.TableName, Is.EqualTo("Core_ContentItemVersionRecord"));
|
||||
Assert.That(ci.Feature.Descriptor.Name, Is.EqualTo("Orchard.Framework"));
|
||||
Assert.That(ci.TableName, Is.EqualTo("Orchard_Framework_ContentItemRecord"));
|
||||
|
||||
Assert.That(civ.Feature.Descriptor.Name, Is.EqualTo("Orchard.Framework"));
|
||||
Assert.That(civ.TableName, Is.EqualTo("Orchard_Framework_ContentItemVersionRecord"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
@@ -12,6 +13,7 @@ using Orchard.Environment;
|
||||
using Orchard.Environment.AutofacUtil;
|
||||
using Orchard.Environment.Configuration;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Environment.Extensions.Folders;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Environment.ShellBuilders;
|
||||
using Orchard.Environment.Topology;
|
||||
@@ -21,6 +23,7 @@ using Orchard.Mvc.ModelBinders;
|
||||
using Orchard.Mvc.Routes;
|
||||
using Orchard.Tests.Environment.TestDependencies;
|
||||
using Orchard.Tests.Stubs;
|
||||
using Orchard.Tests.Utility;
|
||||
|
||||
namespace Orchard.Tests.Environment {
|
||||
[TestFixture]
|
||||
@@ -30,32 +33,51 @@ namespace Orchard.Tests.Environment {
|
||||
private RouteCollection _routeCollection;
|
||||
private ModelBinderDictionary _modelBinderDictionary;
|
||||
private ControllerBuilder _controllerBuilder;
|
||||
private ViewEngineCollection _viewEngineCollection;
|
||||
|
||||
[SetUp]
|
||||
public void Init() {
|
||||
_controllerBuilder = new ControllerBuilder();
|
||||
_routeCollection = new RouteCollection();
|
||||
_modelBinderDictionary = new ModelBinderDictionary();
|
||||
_viewEngineCollection = new ViewEngineCollection { new WebFormViewEngine() };
|
||||
|
||||
_container = OrchardStarter.CreateHostContainer(
|
||||
builder => {
|
||||
//builder.RegisterModule(new ImplicitCollectionSupportModule());
|
||||
builder.RegisterInstance(new StubShellSettingsLoader()).As<IShellSettingsManager>();
|
||||
builder.RegisterType<StubContainerProvider>().As<IContainerProvider>().InstancePerLifetimeScope();
|
||||
builder.RegisterType<StubCompositionStrategy>().As<ICompositionStrategy>().InstancePerLifetimeScope();
|
||||
builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().SingleInstance();
|
||||
builder.RegisterType<RoutePublisher>().As<IRoutePublisher>();
|
||||
builder.RegisterType<ModelBinderPublisher>().As<IModelBinderPublisher>();
|
||||
builder.RegisterType<ShellContextFactory>().As<IShellContextFactory>();
|
||||
builder.RegisterType<ShellContextFactory>().As<IShellContextFactory>();
|
||||
builder.RegisterInstance(_controllerBuilder);
|
||||
builder.RegisterInstance(_routeCollection);
|
||||
builder.RegisterInstance(_modelBinderDictionary);
|
||||
builder.RegisterInstance(new ViewEngineCollection { new WebFormViewEngine() });
|
||||
builder.RegisterInstance(new StuExtensionManager()).As<IExtensionManager>();
|
||||
builder.RegisterInstance(new Mock<IHackInstallationGenerator>().Object);
|
||||
builder.RegisterInstance(new StubShellSettingsLoader()).As<IShellSettingsManager>();
|
||||
builder.RegisterInstance(new Mock<ITopologyDescriptorCache>().Object);
|
||||
builder.RegisterInstance(_viewEngineCollection);
|
||||
builder.RegisterAutoMocking()
|
||||
.Ignore<IExtensionFolders>()
|
||||
.Ignore<IRouteProvider>()
|
||||
.Ignore<IModelBinderProvider>();
|
||||
});
|
||||
_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();
|
||||
updater.RegisterInstance(_container).SingleInstance();
|
||||
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]
|
||||
public void HostShouldSetControllerFactory() {
|
||||
var host = _lifetime.Resolve<IOrchardHost>();
|
||||
@@ -113,11 +105,6 @@ namespace Orchard.Tests.Environment {
|
||||
Assert.That(_controllerBuilder.GetControllerFactory(), Is.TypeOf<OrchardControllerFactory>());
|
||||
}
|
||||
|
||||
public class StubCompositionStrategy : ICompositionStrategy {
|
||||
public ShellTopology Compose(ShellTopologyDescriptor descriptor) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DifferentShellInstanceShouldBeReturnedAfterEachCreate() {
|
||||
|
@@ -79,7 +79,7 @@ namespace Orchard.Tests.Environment.ShellBuilders {
|
||||
var factory = _container.Resolve<IShellContainerFactory>();
|
||||
var shellContainer = factory.CreateContainer(settings, topology);
|
||||
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.InstanceOf<TestController>());
|
||||
}
|
||||
@@ -99,7 +99,7 @@ namespace Orchard.Tests.Environment.ShellBuilders {
|
||||
var shellContainer = factory.CreateContainer(settings, topology);
|
||||
|
||||
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"));
|
||||
}
|
||||
@@ -296,9 +296,9 @@ namespace Orchard.Tests.Environment.ShellBuilders {
|
||||
Assert.That(setta, Is.Not.Null);
|
||||
Assert.That(setta, Is.SameAs(settb));
|
||||
|
||||
|
||||
var settings2 = CreateSettings();
|
||||
var topology2 = CreateTopology();
|
||||
var shellContainer2 = factory.CreateContainer(settings, topology2);
|
||||
var shellContainer2 = factory.CreateContainer(settings2, topology2);
|
||||
|
||||
var proxa2 = shellContainer2.Resolve<DynamicProxyContext>();
|
||||
var proxb2 = shellContainer2.Resolve<DynamicProxyContext>();
|
||||
|
@@ -71,7 +71,7 @@ namespace Orchard.Tests.Environment.ShellBuilders {
|
||||
var factory = _container.Resolve<IShellContextFactory>();
|
||||
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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using Autofac;
|
||||
using Autofac.Builder;
|
||||
using Autofac.Core;
|
||||
@@ -12,21 +13,25 @@ namespace Orchard.Tests.Utility {
|
||||
return container.Resolve<Mock<T>>();
|
||||
}
|
||||
|
||||
public static void RegisterAutoMocking(this ContainerBuilder builder) {
|
||||
builder.RegisterSource(new AutoMockSource(MockBehavior.Default));
|
||||
public static AutoMockSource RegisterAutoMocking(this ContainerBuilder builder) {
|
||||
var source = new AutoMockSource(MockBehavior.Strict);
|
||||
builder.RegisterSource(source);
|
||||
return source;
|
||||
}
|
||||
|
||||
public static void RegisterAutoMocking(this ContainerBuilder builder, MockBehavior behavior) {
|
||||
builder.RegisterSource(new AutoMockSource(behavior));
|
||||
}
|
||||
class AutoMockSource : IRegistrationSource {
|
||||
|
||||
public class AutoMockSource : IRegistrationSource {
|
||||
private readonly MockBehavior _behavior;
|
||||
private IEnumerable<Type> _ignore = Enumerable.Empty<Type>();
|
||||
|
||||
public AutoMockSource(MockBehavior behavior) {
|
||||
_behavior = behavior;
|
||||
}
|
||||
|
||||
public IEnumerable<IComponentRegistration> RegistrationsFor(
|
||||
IEnumerable<IComponentRegistration> IRegistrationSource.RegistrationsFor(
|
||||
Service service,
|
||||
Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor) {
|
||||
|
||||
@@ -42,6 +47,13 @@ namespace Orchard.Tests.Utility {
|
||||
.CreateRegistration();
|
||||
}
|
||||
else if (st.IsInterface) {
|
||||
if (st.IsGenericType && st.GetGenericTypeDefinition() == typeof(IEnumerable<>)) {
|
||||
yield break;
|
||||
}
|
||||
if (_ignore.Contains(st)) {
|
||||
yield break;
|
||||
}
|
||||
|
||||
yield return RegistrationBuilder.ForDelegate(
|
||||
(ctx, p) => {
|
||||
Trace.WriteLine(string.Format("Mocking {0}", st));
|
||||
@@ -52,9 +64,13 @@ namespace Orchard.Tests.Utility {
|
||||
.As(service)
|
||||
.SingleInstance()
|
||||
.CreateRegistration();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public AutoMockSource Ignore<T>() {
|
||||
_ignore = _ignore.Concat(new[]{typeof (T)});
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -113,16 +113,6 @@ namespace Orchard.Environment.Extensions {
|
||||
}
|
||||
|
||||
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;
|
||||
string extensionName = GetExtensionForFeature(featureName);
|
||||
if (extensionName == null) throw new ArgumentException(T("Feature ") + featureName + T(" was not found in any of the installed extensions"));
|
||||
|
@@ -36,6 +36,9 @@ namespace Orchard.Environment.Topology {
|
||||
|
||||
var features = _extensionManager.LoadFeatures(enabledFeatures);
|
||||
|
||||
if (topologyDescriptor.EnabledFeatures.Any(feature => feature.Name == "Orchard.Framework"))
|
||||
features = features.Concat(BuiltinFeatures());
|
||||
|
||||
return new ShellTopology {
|
||||
Modules = BuildTopology<ModuleTopology>(features, IsModule, BuildModule),
|
||||
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) {
|
||||
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>(
|
||||
IEnumerable<Feature> features,
|
||||
Func<Type, bool> predicate,
|
||||
|
Reference in New Issue
Block a user