From 4748366766199aef742952f969cad2004db6e789 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 17 Mar 2014 20:59:31 +1100 Subject: [PATCH 1/3] Fixes up some more test attributes --- src/Umbraco.Tests/BusinessLogic/ApplicationTreeTest.cs | 1 - src/Umbraco.Tests/Services/ContentTypeServiceTests.cs | 2 +- src/Umbraco.Tests/Services/DataTypeServiceTests.cs | 2 +- src/Umbraco.Tests/Services/MediaServiceTests.cs | 2 +- src/Umbraco.Tests/Services/MemberServiceTests.cs | 2 +- src/Umbraco.Tests/Services/MemberTypeServiceTests.cs | 2 +- src/Umbraco.Tests/Services/PackagingServiceTests.cs | 2 +- src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs | 2 +- src/Umbraco.Tests/Services/UserServiceTests.cs | 2 +- 9 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Tests/BusinessLogic/ApplicationTreeTest.cs b/src/Umbraco.Tests/BusinessLogic/ApplicationTreeTest.cs index 0bb4e455dd..109e8178cf 100644 --- a/src/Umbraco.Tests/BusinessLogic/ApplicationTreeTest.cs +++ b/src/Umbraco.Tests/BusinessLogic/ApplicationTreeTest.cs @@ -12,7 +12,6 @@ namespace Umbraco.Tests.BusinessLogic ///to contain all ApplicationTreeTest Unit Tests /// [TestFixture()] - [TestFixture()] public class ApplicationTreeTest : BaseTest { diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs index a6d27ad7ba..9ac45cfc61 100644 --- a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs @@ -10,7 +10,7 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Services { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] public class ContentTypeServiceTests : BaseServiceTest { diff --git a/src/Umbraco.Tests/Services/DataTypeServiceTests.cs b/src/Umbraco.Tests/Services/DataTypeServiceTests.cs index 8238fa4c7b..ad161cfa54 100644 --- a/src/Umbraco.Tests/Services/DataTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/DataTypeServiceTests.cs @@ -11,7 +11,7 @@ namespace Umbraco.Tests.Services /// /// Tests covering the DataTypeService /// - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] public class DataTypeServiceTests : BaseServiceTest { diff --git a/src/Umbraco.Tests/Services/MediaServiceTests.cs b/src/Umbraco.Tests/Services/MediaServiceTests.cs index d6a3fe82c9..10dfc6790b 100644 --- a/src/Umbraco.Tests/Services/MediaServiceTests.cs +++ b/src/Umbraco.Tests/Services/MediaServiceTests.cs @@ -9,7 +9,7 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Services { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] public class MediaServiceTests : BaseServiceTest { diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index fdfd003b9a..73b312e2bf 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -13,7 +13,7 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Services { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] public class MemberServiceTests : BaseServiceTest { diff --git a/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs b/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs index e4b891ac2e..3335d298b8 100644 --- a/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs @@ -11,7 +11,7 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Services { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] public class MemberTypeServiceTests : BaseServiceTest { diff --git a/src/Umbraco.Tests/Services/PackagingServiceTests.cs b/src/Umbraco.Tests/Services/PackagingServiceTests.cs index d11c2ad157..9f12ff71ef 100644 --- a/src/Umbraco.Tests/Services/PackagingServiceTests.cs +++ b/src/Umbraco.Tests/Services/PackagingServiceTests.cs @@ -8,7 +8,7 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Services { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] public class PackagingServiceTests : BaseServiceTest { diff --git a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs index 931dae13f4..18aee609a5 100644 --- a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs +++ b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs @@ -18,7 +18,7 @@ using umbraco.interfaces; namespace Umbraco.Tests.Services { - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] public class ThreadSafetyServiceTest : BaseDatabaseFactoryTest { diff --git a/src/Umbraco.Tests/Services/UserServiceTests.cs b/src/Umbraco.Tests/Services/UserServiceTests.cs index 2bdebb8a51..b658d46ef0 100644 --- a/src/Umbraco.Tests/Services/UserServiceTests.cs +++ b/src/Umbraco.Tests/Services/UserServiceTests.cs @@ -15,7 +15,7 @@ namespace Umbraco.Tests.Services /// /// Tests covering the UserService /// - [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] + [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] public class UserServiceTests : BaseServiceTest { From 217267bf94acc19c3f180905b40a5a49fe15213c Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 17 Mar 2014 22:22:44 +1100 Subject: [PATCH 2/3] Supercharges integration tests - now running at a great speed. --- src/Umbraco.Core/EnumerableExtensions.cs | 23 +++++--------- src/Umbraco.Core/TypeFinder.cs | 10 ++++++- .../Services/ContentTypeServiceTests.cs | 4 +-- .../TestHelpers/BaseDatabaseFactoryTest.cs | 30 +++++++++++++++---- 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Core/EnumerableExtensions.cs b/src/Umbraco.Core/EnumerableExtensions.cs index 349c374bb7..525f75e709 100644 --- a/src/Umbraco.Core/EnumerableExtensions.cs +++ b/src/Umbraco.Core/EnumerableExtensions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; +using Umbraco.Core.Logging; namespace Umbraco.Core { @@ -14,7 +15,7 @@ namespace Umbraco.Core public static IEnumerable> InGroupsOf(this IEnumerable source, int groupSize) { if (source == null) - throw new NullReferenceException("source"); + throw new NullReferenceException("source"); // enumerate the source only once! return new InGroupsEnumerator(source, groupSize).Groups(); @@ -125,23 +126,13 @@ namespace Umbraco.Core } /// The flatten list. - /// The items. - /// The select child. - /// Item type + /// The items. + /// The select child. + /// Item type /// list of TItem - [SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "By design")] - public static IEnumerable FlattenList(this IEnumerable items, Func> selectChild) + public static IEnumerable FlattenList(this IEnumerable e, Func> f) { - IEnumerable children = items != null && items.Any() - ? items.SelectMany(selectChild).FlattenList(selectChild) - : Enumerable.Empty(); - - if (items != null) - { - return items.Concat(children); - } - - return null; + return e.SelectMany(c => f(c).FlattenList(f)).Concat(e); } /// diff --git a/src/Umbraco.Core/TypeFinder.cs b/src/Umbraco.Core/TypeFinder.cs index 36a5deff75..14795e146d 100644 --- a/src/Umbraco.Core/TypeFinder.cs +++ b/src/Umbraco.Core/TypeFinder.cs @@ -290,7 +290,15 @@ namespace Umbraco.Core "HtmlAgilityPack.", "TidyNet.", "ICSharpCode.", - "CookComputing." + "CookComputing.", + "AutoMapper,", + "HtmlAgilityPack,", + "itextsharp,", + "MiniProfiler,", + "Moq,", + "nunit.framework,", + "TidyNet,", + "WebDriver," }; /// diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs index 9ac45cfc61..467bb35250 100644 --- a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs @@ -394,7 +394,7 @@ namespace Umbraco.Tests.Services return contentType; } - private IEnumerable CreateContentTypeHierarchy() + private IContentType[] CreateContentTypeHierarchy() { //create the master type var masterContentType = MockedContentTypes.CreateSimpleContentType("masterContentType", "MasterContentType"); @@ -413,7 +413,7 @@ namespace Umbraco.Tests.Services list.Add(contentType); } - return list; + return list.ToArray(); } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 582e5ad94f..05d3198b80 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -49,6 +49,10 @@ namespace Umbraco.Tests.TestHelpers private ApplicationContext _appContext; + private string _dbPath; + //used to store (globally) the pre-built db with schema and initial data + private static Byte[] _dbBytes; + [SetUp] public override void Initialize() { @@ -135,7 +139,7 @@ namespace Umbraco.Tests.TestHelpers Core.Configuration.GlobalSettings.UmbracoConnectionName, GetDbConnectionString()); - string dbFilePath = string.Concat(path, "\\UmbracoPetaPocoTests.sdf"); + _dbPath = string.Concat(path, "\\UmbracoPetaPocoTests.sdf"); //create a new database file if // - is the first test in the session @@ -144,7 +148,7 @@ namespace Umbraco.Tests.TestHelpers // - _isFirstTestInFixture + DbInitBehavior.NewDbFileAndSchemaPerFixture //if this is the first test in the session, always ensure a new db file is created - if (_isFirstRunInTestSession || !File.Exists(dbFilePath) + if (_isFirstRunInTestSession || File.Exists(_dbPath) == false || DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerTest || (_isFirstTestInFixture && DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerFixture)) { @@ -163,8 +167,15 @@ namespace Umbraco.Tests.TestHelpers //Create the Sql CE database using (DisposableTimer.TraceDuration("Create database file")) { - var engine = new SqlCeEngine(settings.ConnectionString); - engine.CreateDatabase(); + if (_dbBytes != null) + { + File.WriteAllBytes(_dbPath, _dbBytes); + } + else + { + var engine = new SqlCeEngine(settings.ConnectionString); + engine.CreateDatabase(); + } } } @@ -210,12 +221,19 @@ namespace Umbraco.Tests.TestHelpers // - NewDbFileAndSchemaPerTest // - _isFirstTestInFixture + DbInitBehavior.NewDbFileAndSchemaPerFixture - if (_isFirstRunInTestSession + if (_dbBytes == null && + (_isFirstRunInTestSession || DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerTest - || (_isFirstTestInFixture && DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerFixture)) + || (_isFirstTestInFixture && DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerFixture))) { //Create the umbraco database and its base data DatabaseContext.Database.CreateDatabaseSchema(false); + + //close the connections, we're gonna read this baby in as a byte array so we don't have to re-initialize the + // damn db for each test + CloseDbConnections(); + + _dbBytes = File.ReadAllBytes(_dbPath); } } From a4a0de3503dce5e0f43f43ecfa343e5a76a84839 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 17 Mar 2014 15:25:25 +0100 Subject: [PATCH 3/3] U4-4373, U4-4374 - finalize fixes --- .../PublishedContent/RootNodeTests.cs | 76 +++++++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + .../CompatibilityHelper.cs | 2 +- .../umbraco/nodeFactory/Node.cs | 7 +- .../RazorDynamicNode/DynamicBackingItem.cs | 10 +-- 5 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 src/Umbraco.Tests/PublishedContent/RootNodeTests.cs diff --git a/src/Umbraco.Tests/PublishedContent/RootNodeTests.cs b/src/Umbraco.Tests/PublishedContent/RootNodeTests.cs new file mode 100644 index 0000000000..ceefbbc847 --- /dev/null +++ b/src/Umbraco.Tests/PublishedContent/RootNodeTests.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using umbraco; +using umbraco.MacroEngines; +using Umbraco.Web; +using Umbraco.Web.Models; +using Umbraco.Web.Security; + +namespace Umbraco.Tests.PublishedContent +{ + [TestFixture] + public class RootNodeTests : PublishedContentTestBase + { + [Test] + public void PublishedContentHasNoRootNode() + { + var ctx = GetUmbracoContext("/test", 1234); + + // there is no content node with ID -1 + var content = ctx.ContentCache.GetById(-1); + Assert.IsNull(content); + + // content at root has null parent + content = ctx.ContentCache.GetById(1046); + Assert.IsNotNull(content); + Assert.AreEqual(1, content.Level); + Assert.IsNull(content.Parent); + + // and yet is has siblings, etc. + var siblings = content.Siblings(); + Assert.AreEqual(2, siblings.Count()); + + // non-existing content is null + content = ctx.ContentCache.GetById(666); + Assert.IsNull(content); + } + + [Test] + public void LegacyDynamicNodeSortOfHasRootNode() + { + // there is a node with ID -1 + var node = new DynamicNode(-1); + Assert.IsNotNull(node); + Assert.AreEqual(-1, node.Id); + + // content at root + node = new DynamicNode(1046); + Assert.IsNotNull(node); + Assert.AreEqual(1, node.Level); + + // has no parent + // (confirmed in 4.7 and 6.1) + Assert.IsNull(node.Parent); + + // has siblings etc - no idea how we're supposed to get them? + //var siblings = node.Parent.Children; + //Assert.AreEqual(2, siblings.Count()); + + // non-existing content is "zero node" + node = new DynamicNode(666, DynamicBackingItemType.Content); // set type to avoid Examine in tests + Assert.IsNotNull(node); + Assert.AreEqual(0, node.Id); + } + + [Test] + public void Fix_U4_4374() + { + var node = new DynamicNode(-1); + var id = node.DescendantsOrSelf().First().Id; + Assert.AreEqual(-1, id); + } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index ce971d35a0..7521a2ea66 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -222,6 +222,7 @@ + diff --git a/src/Umbraco.Web/umbraco.presentation/CompatibilityHelper.cs b/src/Umbraco.Web/umbraco.presentation/CompatibilityHelper.cs index a2166e82c0..e30fcedabe 100644 --- a/src/Umbraco.Web/umbraco.presentation/CompatibilityHelper.cs +++ b/src/Umbraco.Web/umbraco.presentation/CompatibilityHelper.cs @@ -57,7 +57,7 @@ namespace Umbraco.Web.umbraco.presentation public INode Parent { - get { return ConvertToNode(_doc.Parent); } + get { return _doc.Parent == null ? null : ConvertToNode(_doc.Parent); } } public int Id { get; private set; } public int template { get; private set; } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Node.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Node.cs index e0cf298d5d..7d614795bc 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Node.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Node.cs @@ -300,7 +300,12 @@ namespace umbraco.NodeFactory _pageXmlNode = ((IHasXmlNode)library.GetXmlNodeById(NodeId.ToString()).Current).GetNode(); else { - if (presentation.UmbracoContext.Current != null) + if (UmbracoContext.Current != null) + { + var cache = UmbracoContext.Current.ContentCache.InnerCache as Umbraco.Web.PublishedCache.XmlPublishedCache.PublishedContentCache; + _pageXmlNode = cache.GetXml(UmbracoContext.Current, false).DocumentElement; + } + else if (presentation.UmbracoContext.Current != null) { _pageXmlNode = umbraco.presentation.UmbracoContext.Current.GetXml().DocumentElement; } diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicBackingItem.cs b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicBackingItem.cs index ded21a3119..d841f9ce3a 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/DynamicBackingItem.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/DynamicBackingItem.cs @@ -34,9 +34,8 @@ namespace umbraco.MacroEngines { if (Id == -1) { - //this is a special check, previously passing in -1 would return a real node, the root node. Though - // it has no properties (defaults apply), you could access descendants, children, etc... - //This is how this used to work before a large refactor - which I think may have broken other legacy logic too :( + // passing in -1 needs to return a real node, the "root" node, which has no + // properties (defaults apply) but can be used to access descendants, children, etc. this.content = new NodeFactory.Node(Id); return; @@ -69,9 +68,8 @@ namespace umbraco.MacroEngines { if (Id == -1) { - //this is a special check, previously passing in -1 would return a real node, the root node. Though - // it has no properties (defaults apply), you could access descendants, children, etc... - //This is how this used to work before a large refactor - which I think may have broken other legacy logic too :( + // passing in -1 needs to return a real node, the "root" node, which has no + // properties (defaults apply) but can be used to access descendants, children, etc. this.content = new NodeFactory.Node(Id); }