From a1c639bd0f4df5ea4f02b27d654b9251a0c47e4c Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 15 Apr 2010 02:27:55 -0700 Subject: [PATCH] Roughing in tests around topology descriptor manager Implementation in settings module intended to live inside shell with access to current irepostory<> orm Basic tests around serial numbers and initial conditions and update behaviors Also sets expectations around event raising --HG-- branch : dev --- .../Orchard.Tests.Modules.csproj | 1 + .../TopologyDescriptorManagerTests.cs | 144 ++++++++++++++++++ src/Orchard.Web/Core/Orchard.Core.csproj | 5 +- .../Services/TopologyDescriptorManager.cs | 18 --- .../Topology/Records/TopologyFeatureRecord.cs | 7 + .../Records/TopologyParameterRecord.cs | 9 ++ .../Topology/Records/TopologyRecord.cs | 10 ++ .../Topology/TopologyDescriptorManager.cs | 36 +++++ .../Topology/ITopologyDescriptorManager.cs | 2 + 9 files changed, 213 insertions(+), 19 deletions(-) create mode 100644 src/Orchard.Tests.Modules/Settings/Topology/TopologyDescriptorManagerTests.cs delete mode 100644 src/Orchard.Web/Core/Settings/Services/TopologyDescriptorManager.cs create mode 100644 src/Orchard.Web/Core/Settings/Topology/Records/TopologyFeatureRecord.cs create mode 100644 src/Orchard.Web/Core/Settings/Topology/Records/TopologyParameterRecord.cs create mode 100644 src/Orchard.Web/Core/Settings/Topology/Records/TopologyRecord.cs create mode 100644 src/Orchard.Web/Core/Settings/Topology/TopologyDescriptorManager.cs diff --git a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj index fcb816616..b66e01c67 100644 --- a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj +++ b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj @@ -86,6 +86,7 @@ + diff --git a/src/Orchard.Tests.Modules/Settings/Topology/TopologyDescriptorManagerTests.cs b/src/Orchard.Tests.Modules/Settings/Topology/TopologyDescriptorManagerTests.cs new file mode 100644 index 000000000..60e599d2e --- /dev/null +++ b/src/Orchard.Tests.Modules/Settings/Topology/TopologyDescriptorManagerTests.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Autofac; +using NUnit.Framework; +using Orchard.Core.Settings.Topology; +using Orchard.Core.Settings.Topology.Records; +using Orchard.Environment.Topology; +using Orchard.Environment.Topology.Models; +using Orchard.Events; + +namespace Orchard.Tests.Modules.Settings.Topology { + [TestFixture] + public class TopologyDescriptorManagerTests : DatabaseEnabledTestsBase { + public override void Register(ContainerBuilder builder) { + builder.RegisterType().As(); + builder.RegisterType().As().SingleInstance(); + + } + + public class StubEventBus : IEventBus { + public string LastMessageName { get; set; } + public IDictionary LastEventData { get; set; } + + public void Notify(string messageName, IDictionary eventData) { + LastMessageName = messageName; + LastEventData = eventData; + } + } + + protected override IEnumerable DatabaseTypes { + get { + return new[] { + typeof (TopologyRecord), + typeof (TopologyFeatureRecord), + typeof (TopologyParameterRecord), + }; + } + } + + [Test] + public void TopologyShouldBeNullWhenItsNotInitialized() { + var manager = _container.Resolve(); + var topology = manager.GetTopologyDescriptor(); + Assert.That(topology, Is.Null); + } + + [Test] + public void PriorSerialNumberOfZeroIsAcceptableForInitialUpdateAndSerialNumberIsNonzeroAfterwards() { + var manager = _container.Resolve(); + manager.UpdateTopologyDescriptor( + 0, + Enumerable.Empty(), + Enumerable.Empty()); + + var topology = manager.GetTopologyDescriptor(); + Assert.That(topology, Is.Not.Null); + Assert.That(topology.SerialNumber, Is.Not.EqualTo(0)); + } + + [Test] + public void NonZeroInitialUpdateThrowsException() { + var manager = _container.Resolve(); + Assert.Throws(() => manager.UpdateTopologyDescriptor( + 1, + Enumerable.Empty(), + Enumerable.Empty())); + } + + [Test] + public void OnlyCorrectSerialNumberOnLaterUpdatesDoesNotThrowException() { + var manager = _container.Resolve(); + manager.UpdateTopologyDescriptor( + 0, + Enumerable.Empty(), + Enumerable.Empty()); + + var topology = manager.GetTopologyDescriptor(); + Assert.That(topology.SerialNumber, Is.Not.EqualTo(0)); + + Assert.Throws(() => manager.UpdateTopologyDescriptor( + 0, + Enumerable.Empty(), + Enumerable.Empty())); + + Assert.Throws(() => manager.UpdateTopologyDescriptor( + topology.SerialNumber + 665321, + Enumerable.Empty(), + Enumerable.Empty())); + + manager.UpdateTopologyDescriptor( + topology.SerialNumber, + Enumerable.Empty(), + Enumerable.Empty()); + + var topology2 = manager.GetTopologyDescriptor(); + Assert.That(topology2.SerialNumber, Is.Not.EqualTo(0)); + Assert.That(topology2.SerialNumber, Is.Not.EqualTo(topology.SerialNumber)); + + Assert.Throws(() => manager.UpdateTopologyDescriptor( + 0, + Enumerable.Empty(), + Enumerable.Empty())); + + Assert.Throws(() => manager.UpdateTopologyDescriptor( + topology.SerialNumber, + Enumerable.Empty(), + Enumerable.Empty())); + + manager.UpdateTopologyDescriptor( + topology2.SerialNumber, + Enumerable.Empty(), + Enumerable.Empty()); + + Assert.Throws(() => manager.UpdateTopologyDescriptor( + topology2.SerialNumber, + Enumerable.Empty(), + Enumerable.Empty())); + } + + [Test] + public void SuccessfulUpdateRaisesAnEvent() { + var manager = _container.Resolve(); + var eventBus = _container.Resolve() as StubEventBus; + + Assert.That(eventBus.LastMessageName, Is.Null); + + Assert.Throws(() => manager.UpdateTopologyDescriptor( + 5, + Enumerable.Empty(), + Enumerable.Empty())); + + Assert.That(eventBus.LastMessageName, Is.Null); + + manager.UpdateTopologyDescriptor( + 0, + Enumerable.Empty(), + Enumerable.Empty()); + + Assert.That(eventBus.LastMessageName, Is.EqualTo(typeof(ITopologyDescriptorManager).FullName + ".UpdateTopologyDescriptor")); + } + } +} diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 616799f63..e7bc5191b 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -124,7 +124,10 @@ - + + + + diff --git a/src/Orchard.Web/Core/Settings/Services/TopologyDescriptorManager.cs b/src/Orchard.Web/Core/Settings/Services/TopologyDescriptorManager.cs deleted file mode 100644 index 2a8d4d49d..000000000 --- a/src/Orchard.Web/Core/Settings/Services/TopologyDescriptorManager.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using Orchard.Environment.Topology; -using Orchard.Environment.Topology.Models; - -namespace Orchard.Core.Settings.Services { - public class TopologyDescriptorManager : ITopologyDescriptorManager { - public ShellTopologyDescriptor GetTopologyDescriptor() { - throw new NotImplementedException(); - } - - public void UpdateTopologyDescriptor(int priorSerialNumber, IEnumerable enabledFeatures, IEnumerable parameters) { - throw new NotImplementedException(); - } - } -} diff --git a/src/Orchard.Web/Core/Settings/Topology/Records/TopologyFeatureRecord.cs b/src/Orchard.Web/Core/Settings/Topology/Records/TopologyFeatureRecord.cs new file mode 100644 index 000000000..7df7eb52c --- /dev/null +++ b/src/Orchard.Web/Core/Settings/Topology/Records/TopologyFeatureRecord.cs @@ -0,0 +1,7 @@ +namespace Orchard.Core.Settings.Topology.Records { + public class TopologyFeatureRecord { + public virtual int Id { get; set; } + public virtual TopologyRecord TopologyRecord { get; set; } + public virtual string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Settings/Topology/Records/TopologyParameterRecord.cs b/src/Orchard.Web/Core/Settings/Topology/Records/TopologyParameterRecord.cs new file mode 100644 index 000000000..47d875631 --- /dev/null +++ b/src/Orchard.Web/Core/Settings/Topology/Records/TopologyParameterRecord.cs @@ -0,0 +1,9 @@ +namespace Orchard.Core.Settings.Topology.Records { + public class TopologyParameterRecord { + public virtual int Id { get; set; } + public virtual TopologyRecord TopologyRecord { get; set; } + public virtual string Component { get; set; } + public virtual string Name { get; set; } + public virtual string Value { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Settings/Topology/Records/TopologyRecord.cs b/src/Orchard.Web/Core/Settings/Topology/Records/TopologyRecord.cs new file mode 100644 index 000000000..daf6df51a --- /dev/null +++ b/src/Orchard.Web/Core/Settings/Topology/Records/TopologyRecord.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Orchard.Core.Settings.Topology.Records { + public class TopologyRecord { + public virtual int Id { get; set; } + public virtual int SerialNumber { get; set; } + public virtual IList EnabledFeatures { get; set; } + public virtual IList Parameters { get; set; } + } +} diff --git a/src/Orchard.Web/Core/Settings/Topology/TopologyDescriptorManager.cs b/src/Orchard.Web/Core/Settings/Topology/TopologyDescriptorManager.cs new file mode 100644 index 000000000..fa40b89f4 --- /dev/null +++ b/src/Orchard.Web/Core/Settings/Topology/TopologyDescriptorManager.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using Orchard.Core.Settings.Topology.Records; +using Orchard.Data; +using Orchard.Environment.Topology; +using Orchard.Environment.Topology.Models; +using Orchard.Events; + +namespace Orchard.Core.Settings.Topology { + public class TopologyDescriptorManager : ITopologyDescriptorManager { + private readonly IRepository _repository; + private readonly IEventBus _eventBus; + private int _serialNumber; + + public TopologyDescriptorManager( + IRepository repository, + IEventBus eventBus) { + _repository = repository; + _eventBus = eventBus; + } + + public ShellTopologyDescriptor GetTopologyDescriptor() { + return _serialNumber == 0 ? null : new ShellTopologyDescriptor { SerialNumber = _serialNumber }; + } + + public void UpdateTopologyDescriptor(int priorSerialNumber, IEnumerable enabledFeatures, IEnumerable parameters) { + if (priorSerialNumber != _serialNumber) + throw new Exception(); + + ++_serialNumber; + _eventBus.Notify( + typeof(ITopologyDescriptorManager).FullName + ".UpdateTopologyDescriptor", + null); + } + } +} diff --git a/src/Orchard/Environment/Topology/ITopologyDescriptorManager.cs b/src/Orchard/Environment/Topology/ITopologyDescriptorManager.cs index ed6180d68..769eb7cdb 100644 --- a/src/Orchard/Environment/Topology/ITopologyDescriptorManager.cs +++ b/src/Orchard/Environment/Topology/ITopologyDescriptorManager.cs @@ -23,4 +23,6 @@ namespace Orchard.Environment.Topology { IEnumerable enabledFeatures, IEnumerable parameters); } + + }