From 50b05d25f58b73c7d93e42ef8f1e2b5b092e8b86 Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Wed, 13 Mar 2013 18:31:07 +0400 Subject: [PATCH] Added BaseUmbracoApplicationTests and fixed up dispose on the ApplicationContext to ensure the db object is disposed and doesn't reset the PluginManager (as this shouldn't really need to be done). Cleaned up all unit tests so they follow the same structure and uses this base class where necessary and eliminates a lot of duplicate code. --- src/Umbraco.Core/ApplicationContext.cs | 10 +- src/Umbraco.Core/TypeFinder.cs | 38 +++++++- src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs | 27 +----- .../CodeFirst/TypeInheritanceTest.cs | 6 +- src/Umbraco.Tests/LibraryTests.cs | 16 ++-- src/Umbraco.Tests/Models/ContentXmlTest.cs | 28 ++---- src/Umbraco.Tests/Models/MediaXmlTest.cs | 32 ++----- .../Repositories/ContentRepositoryTest.cs | 18 +--- .../Repositories/MediaRepositoryTest.cs | 19 +--- .../Repositories/RelationRepositoryTest.cs | 19 +--- .../PublishedContent/DynamicNodeTests.cs | 2 +- .../PublishedContentTestBase.cs | 5 +- .../Publishing/PublishingStrategyTests.cs | 30 +----- .../Routing/NiceUrlProviderTests.cs | 11 ++- .../NiceUrlsProviderWithDomainsTests.cs | 8 +- .../Routing/RenderRouteHandlerTests.cs | 29 +++--- .../Routing/UmbracoModuleTests.cs | 3 - .../Routing/UrlsWithNestedDomains.cs | 6 +- .../Routing/uQueryGetNodeIdByUrlTests.cs | 5 + src/Umbraco.Tests/Services/BaseServiceTest.cs | 20 +--- .../Services/ThreadSafetyServiceTest.cs | 19 +--- .../TestHelpers/BaseDatabaseFactoryTest.cs | 70 +++++--------- .../TestHelpers/BaseUmbracoApplicationTest.cs | 91 +++++++++++++++++++ .../TestHelpers/BaseUsingSqlCeSyntax.cs | 20 ---- src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + 25 files changed, 231 insertions(+), 302 deletions(-) create mode 100644 src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs diff --git a/src/Umbraco.Core/ApplicationContext.cs b/src/Umbraco.Core/ApplicationContext.cs index 8dae18b028..1bb34ba62e 100644 --- a/src/Umbraco.Core/ApplicationContext.cs +++ b/src/Umbraco.Core/ApplicationContext.cs @@ -216,14 +216,16 @@ namespace Umbraco.Core ResolverCollection.ResetAll(); //reset resolution itself (though this should be taken care of by resetting any of the resolvers above) Resolution.Reset(); - //reset the plugin manager - PluginManager.Current = null; - + //reset the instance objects this.ApplicationCache = null; + if (DatabaseContext != null) + { + DatabaseContext.Database.Dispose(); + } this.DatabaseContext = null; this.Services = null; - this.IsReady = false; + this._isReady = false; //set the internal field // Indicate that the instance has been disposed. _disposed = true; diff --git a/src/Umbraco.Core/TypeFinder.cs b/src/Umbraco.Core/TypeFinder.cs index 6b7627e257..b21913051d 100644 --- a/src/Umbraco.Core/TypeFinder.cs +++ b/src/Umbraco.Core/TypeFinder.cs @@ -62,7 +62,6 @@ namespace Umbraco.Core if (isHosted) { assemblies = new List(BuildManager.GetReferencedAssemblies().Cast()); - //_allAssemblies = new ReadOnlyCollection(BuildManager.GetReferencedAssemblies().Cast().ToList()); } } catch (InvalidOperationException e) @@ -71,8 +70,41 @@ namespace Umbraco.Core throw; } - assemblies = assemblies ?? new List(AppDomain.CurrentDomain.GetAssemblies().ToList()); - //_allAssemblies = _allAssemblies ?? new ReadOnlyCollection(AppDomain.CurrentDomain.GetAssemblies().ToList()); + + if (assemblies == null) + { + //NOTE: we cannot use AppDomain.CurrentDomain.GetAssemblies() because this only returns assemblies that have + // already been loaded in to the app domain, instead we will look directly into the bin folder and load each one. + var binFolder = Assembly.GetExecutingAssembly().GetAssemblyFile().Directory; + var binAssemblyFiles = Directory.GetFiles(binFolder.FullName, "*.dll", SearchOption.TopDirectoryOnly).ToList(); + assemblies = new List(); + foreach (var a in binAssemblyFiles) + { + try + { + var assName = AssemblyName.GetAssemblyName(a); + var ass = Assembly.Load(assName); + assemblies.Add(ass); + } + catch (Exception e) + { + if (e is SecurityException || e is BadImageFormatException) + { + //swallow these exceptions + } + else + { + throw; + } + } + } + } + + //if for some reason they are still no assemblies, then use the AppDomain to load in already loaded assemblies. + if (!assemblies.Any()) + { + assemblies.AddRange(AppDomain.CurrentDomain.GetAssemblies().ToList()); + } //here we are trying to get the App_Code assembly var fileExtensions = new[] {".cs", ".vb"}; //only vb and cs files are supported diff --git a/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs b/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs index 0272523fdc..647a8fd307 100644 --- a/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs +++ b/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs @@ -6,6 +6,7 @@ using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.ObjectResolution; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Serialization; using Umbraco.Tests.CodeFirst.Definitions; using Umbraco.Tests.CodeFirst.TestModels; @@ -24,21 +25,7 @@ namespace Umbraco.Tests.CodeFirst public override void Initialize() { UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); - - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly, - typeof (ContentTypeBase).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + base.Initialize(); var serviceStackSerializer = new ServiceStackJsonSerializer(); @@ -230,17 +217,7 @@ namespace Umbraco.Tests.CodeFirst { base.TearDown(); - //reset the app context - DataTypesResolver.Reset(); - ApplicationContext.Current = null; - PluginManager.Current = null; - - string path = TestHelper.CurrentAssemblyDirectory; - AppDomain.CurrentDomain.SetData("DataDirectory", null); - SerializationService = null; - - UmbracoSettings.ResetSetters(); } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/CodeFirst/TypeInheritanceTest.cs b/src/Umbraco.Tests/CodeFirst/TypeInheritanceTest.cs index e3248cf339..5973714649 100644 --- a/src/Umbraco.Tests/CodeFirst/TypeInheritanceTest.cs +++ b/src/Umbraco.Tests/CodeFirst/TypeInheritanceTest.cs @@ -24,9 +24,9 @@ namespace Umbraco.Tests.CodeFirst //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] - { - typeof (ContentTypeBase).Assembly - }; + { + typeof (ContentTypeBase).Assembly + }; } [Test] diff --git a/src/Umbraco.Tests/LibraryTests.cs b/src/Umbraco.Tests/LibraryTests.cs index ef0d6a2aaa..38ea6da5f1 100644 --- a/src/Umbraco.Tests/LibraryTests.cs +++ b/src/Umbraco.Tests/LibraryTests.cs @@ -18,11 +18,7 @@ namespace Umbraco.Tests public class LibraryTests : BaseRoutingTest { public override void Initialize() - { - //set the current umbraco context and a published content store - PublishedContentStoreResolver.Current = new PublishedContentStoreResolver( - new DefaultPublishedContentStore()); - + { base.Initialize(); var routingContext = GetRoutingContext("/test", 1234); @@ -40,11 +36,19 @@ namespace Umbraco.Tests Core.Configuration.UmbracoSettings.SettingsFilePath = Core.IO.IOHelper.MapPath(Core.IO.SystemDirectories.Config + Path.DirectorySeparatorChar, false); } + protected override void FreezeResolution() + { + //set the current umbraco context and a published content store + PublishedContentStoreResolver.Current = new PublishedContentStoreResolver( + new DefaultPublishedContentStore()); + + base.FreezeResolution(); + } + public override void TearDown() { base.TearDown(); UmbracoContext.Current = null; - PublishedContentStoreResolver.Reset(); } protected override bool RequiresDbSetup diff --git a/src/Umbraco.Tests/Models/ContentXmlTest.cs b/src/Umbraco.Tests/Models/ContentXmlTest.cs index da20c0a9e0..b43545523f 100644 --- a/src/Umbraco.Tests/Models/ContentXmlTest.cs +++ b/src/Umbraco.Tests/Models/ContentXmlTest.cs @@ -17,34 +17,20 @@ namespace Umbraco.Tests.Models { [SetUp] public override void Initialize() - { - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - - UrlSegmentProviderResolver.Reset(); - UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(typeof(DefaultUrlSegmentProvider)); - + { base.Initialize(); } + protected override void FreezeResolution() + { + UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(typeof(DefaultUrlSegmentProvider)); + base.FreezeResolution(); + } + [TearDown] public override void TearDown() { base.TearDown(); - - //reset the app context - DataTypesResolver.Reset(); - UrlSegmentProviderResolver.Reset(); } [Test] public void Can_Generate_Xml_Representation_Of_Content() diff --git a/src/Umbraco.Tests/Models/MediaXmlTest.cs b/src/Umbraco.Tests/Models/MediaXmlTest.cs index f7ab0cd7ff..c2567d0535 100644 --- a/src/Umbraco.Tests/Models/MediaXmlTest.cs +++ b/src/Umbraco.Tests/Models/MediaXmlTest.cs @@ -17,38 +17,22 @@ namespace Umbraco.Tests.Models { [SetUp] public override void Initialize() - { - Resolution.Reset(); - - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Reset(); - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - - UrlSegmentProviderResolver.Reset(); - UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(typeof(DefaultUrlSegmentProvider)); - + { base.Initialize(); } + protected override void FreezeResolution() + { + UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(typeof(DefaultUrlSegmentProvider)); + base.FreezeResolution(); + } + [TearDown] public override void TearDown() { base.TearDown(); - - //reset the app context - DataTypesResolver.Reset(); - UrlSegmentProviderResolver.Reset(); } + [Test] public void Can_Generate_Xml_Representation_Of_Media() { diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index e85edb33f8..1c09e3f25c 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; @@ -20,20 +21,6 @@ namespace Umbraco.Tests.Persistence.Repositories [SetUp] public override void Initialize() { - //NOTE The DataTypesResolver is only necessary because we are using the Save method in the ContentService - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - base.Initialize(); CreateTestData(); @@ -42,9 +29,6 @@ namespace Umbraco.Tests.Persistence.Repositories [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - base.TearDown(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs index 12f9ab5b32..b022b0ff97 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs @@ -20,21 +20,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [SetUp] public override void Initialize() - { - //NOTE The DataTypesResolver is only necessary because we are using the Save method in the MediaService - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + { base.Initialize(); CreateTestData(); @@ -305,9 +291,6 @@ namespace Umbraco.Tests.Persistence.Repositories [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - base.TearDown(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs index f72b47f985..2250cdecf0 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs @@ -19,21 +19,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [SetUp] public override void Initialize() - { - //NOTE The DataTypesResolver is only necessary because we are using the Save method in the ContentService - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + { base.Initialize(); CreateTestData(); @@ -254,9 +240,6 @@ namespace Umbraco.Tests.Persistence.Repositories [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - base.TearDown(); } diff --git a/src/Umbraco.Tests/PublishedContent/DynamicNodeTests.cs b/src/Umbraco.Tests/PublishedContent/DynamicNodeTests.cs index 68bca138c2..3368dc7330 100644 --- a/src/Umbraco.Tests/PublishedContent/DynamicNodeTests.cs +++ b/src/Umbraco.Tests/PublishedContent/DynamicNodeTests.cs @@ -3,9 +3,9 @@ using System.IO; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Configuration; +using Umbraco.Core.IO; using Umbraco.Tests.TestHelpers; using Umbraco.Web; -using umbraco.IO; using umbraco.MacroEngines; using umbraco.NodeFactory; using System.Linq; diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs index cb2f69de02..e8229d4f24 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs @@ -54,10 +54,7 @@ namespace Umbraco.Tests.PublishedContent public override void TearDown() { base.TearDown(); - - PropertyEditorValueConvertersResolver.Reset(); - PublishedContentStoreResolver.Reset(); - PublishedMediaStoreResolver.Reset(); + UmbracoContext.Current = null; } } diff --git a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs index 30292fb183..85b6ec9fd0 100644 --- a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs +++ b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs @@ -24,23 +24,9 @@ namespace Umbraco.Tests.Publishing [SetUp] public override void Initialize() { - UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); - - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - base.Initialize(); + UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); } [TearDown] @@ -49,19 +35,7 @@ namespace Umbraco.Tests.Publishing base.TearDown(); //ensure event handler is gone - PublishingStrategy.Publishing -= PublishingStrategyPublishing; - - //TestHelper.ClearDatabase(); - - //reset the app context - DataTypesResolver.Reset(); - RepositoryResolver.Reset(); - ApplicationContext.Current = null; - - string path = TestHelper.CurrentAssemblyDirectory; - AppDomain.CurrentDomain.SetData("DataDirectory", null); - - UmbracoSettings.ResetSetters(); + PublishingStrategy.Publishing -= PublishingStrategyPublishing; } private IContent _homePage; diff --git a/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs b/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs index 73d42a1d7d..9d61f315ce 100644 --- a/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs +++ b/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs @@ -26,12 +26,15 @@ namespace Umbraco.Tests.Routing true); SettingsForTests.SettingsFilePath = Core.IO.IOHelper.MapPath(Core.IO.SystemDirectories.Config + Path.DirectorySeparatorChar, false); - - SiteDomainHelperResolver.Reset(); - SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); - FreezeResolution(); } + protected override void FreezeResolution() + { + SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); + + base.FreezeResolution(); + } + internal override IRoutesCache GetRoutesCache() { return new DefaultRoutesCache(false); diff --git a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs index e899f930c9..6eb981fb22 100644 --- a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs @@ -19,11 +19,13 @@ namespace Umbraco.Tests.Routing base.Initialize(); // ensure we can create them although the content is not in the database - TestHelper.DropForeignKeys("umbracoDomains"); + TestHelper.DropForeignKeys("umbracoDomains"); + } - SiteDomainHelperResolver.Reset(); + protected override void FreezeResolution() + { SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); - FreezeResolution(); + base.FreezeResolution(); } internal override IRoutesCache GetRoutesCache() diff --git a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs index 7cb29a0ff8..cbb8b161e9 100644 --- a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs +++ b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs @@ -19,17 +19,7 @@ namespace Umbraco.Tests.Routing public class RenderRouteHandlerTests : BaseRoutingTest { public override void Initialize() - { - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - SurfaceControllerResolver.Current = new SurfaceControllerResolver( - PluginManager.Current.ResolveSurfaceControllers()); - UmbracoApiControllerResolver.Current = new UmbracoApiControllerResolver( - PluginManager.Current.ResolveUmbracoApiControllers()); - - ShortStringHelperResolver.Current = new ShortStringHelperResolver(new LegacyShortStringHelper()); - + { base.Initialize(); SettingsForTests.UmbracoPath = "~/umbraco"; @@ -41,15 +31,22 @@ namespace Umbraco.Tests.Routing webBoot.CreateRoutes(); } + protected override void FreezeResolution() + { + SurfaceControllerResolver.Current = new SurfaceControllerResolver( + PluginManager.Current.ResolveSurfaceControllers()); + UmbracoApiControllerResolver.Current = new UmbracoApiControllerResolver( + PluginManager.Current.ResolveUmbracoApiControllers()); + ShortStringHelperResolver.Current = new ShortStringHelperResolver(new LegacyShortStringHelper()); + + base.FreezeResolution(); + } + public override void TearDown() { base.TearDown(); UmbracoContext.Current = null; - RouteTable.Routes.Clear(); - SurfaceControllerResolver.Reset(); - UmbracoApiControllerResolver.Reset(); - ShortStringHelperResolver.Reset(); - PluginManager.Current = null; + RouteTable.Routes.Clear(); } Template CreateTemplate(string alias) diff --git a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs index bdfa78ae61..c12538a723 100644 --- a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs +++ b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs @@ -25,9 +25,6 @@ namespace Umbraco.Tests.Routing { base.Initialize(); - //the module requires that the singleton is setup - ApplicationContext.Current = ApplicationContext; - //create the module _module = new UmbracoModule(); diff --git a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs index 5deee2f194..a329e0d4d3 100644 --- a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs +++ b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs @@ -69,10 +69,12 @@ namespace Umbraco.Tests.Routing // ensure we can create them although the content is not in the database TestHelper.DropForeignKeys("umbracoDomains"); + } - SiteDomainHelperResolver.Reset(); + protected override void FreezeResolution() + { SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); - FreezeResolution(); + base.FreezeResolution(); } internal override IRoutesCache GetRoutesCache() diff --git a/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs b/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs index 575f354429..52ef0a944b 100644 --- a/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs +++ b/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs @@ -51,6 +51,11 @@ namespace Umbraco.Tests.Routing Umbraco.Web.UmbracoContext.Current = routingContext.UmbracoContext; } + public override void TearDown() + { + Umbraco.Web.UmbracoContext.Current = null; + base.TearDown(); + } [TestCase(1046, "/home")] [TestCase(1173, "/home/sub1")] diff --git a/src/Umbraco.Tests/Services/BaseServiceTest.cs b/src/Umbraco.Tests/Services/BaseServiceTest.cs index 799309db75..56b94dcbf1 100644 --- a/src/Umbraco.Tests/Services/BaseServiceTest.cs +++ b/src/Umbraco.Tests/Services/BaseServiceTest.cs @@ -14,21 +14,7 @@ namespace Umbraco.Tests.Services { [SetUp] public override void Initialize() - { - - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + { base.Initialize(); CreateTestData(); @@ -37,10 +23,6 @@ namespace Umbraco.Tests.Services [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - PluginManager.Current = null; - base.TearDown(); } diff --git a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs index a6c2f418cc..bb44827ffa 100644 --- a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs +++ b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs @@ -26,21 +26,7 @@ namespace Umbraco.Tests.Services [SetUp] public override void Initialize() - { - //NOTE The DataTypesResolver is only necessary because we are using the Save method in the MediaService - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + { base.Initialize(); //we need to use our own custom IDatabaseFactory for the DatabaseContext because we MUST ensure that @@ -63,9 +49,6 @@ namespace Umbraco.Tests.Services [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - _error = null; //dispose! diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index bcf51b4236..1a5c0d24c1 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -31,19 +31,16 @@ namespace Umbraco.Tests.TestHelpers /// The PetaPoco Database class should be used through the . /// [TestFixture, RequiresSTA] - public abstract class BaseDatabaseFactoryTest + public abstract class BaseDatabaseFactoryTest : BaseUmbracoApplicationTest { [SetUp] - public virtual void Initialize() + public override void Initialize() { - TestHelper.SetupLog4NetForTests(); - TestHelper.InitializeContentDirectories(); + base.Initialize(); - string path = TestHelper.CurrentAssemblyDirectory; + var path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", path); - PluginManager.Current = new PluginManager(false); - //Ensure that any database connections from a previous test is disposed. This is really just double safety as its also done in the TearDown. if(ApplicationContext != null && DatabaseContext != null) DatabaseContext.Database.Dispose(); @@ -65,18 +62,7 @@ namespace Umbraco.Tests.TestHelpers TearDown(); throw; } - - RepositoryResolver.Current = new RepositoryResolver( - new RepositoryFactory()); - - SqlSyntaxProvidersResolver.Current = new SqlSyntaxProvidersResolver( - new List{ typeof(MySqlSyntaxProvider), typeof(SqlCeSyntaxProvider), typeof(SqlServerSyntaxProvider) }) { CanResolveBeforeFrozen = true}; - - var asdf = typeof (ContentMapper); - - MappingResolver.Current = new MappingResolver( - () => PluginManager.Current.ResolveAssignedMapperTypes()); - + //Get the connectionstring settings from config var settings = ConfigurationManager.ConnectionStrings[Core.Configuration.GlobalSettings.UmbracoConnectionName]; ConfigurationManager.AppSettings.Set(Core.Configuration.GlobalSettings.UmbracoConnectionName, @"datalayer=SQLCE4Umbraco.SqlCEHelper,SQLCE4Umbraco;data source=|DataDirectory|\UmbracoPetaPocoTests.sdf"); @@ -90,18 +76,31 @@ namespace Umbraco.Tests.TestHelpers new DatabaseContext(new DefaultDatabaseFactory()), //assign the service context new ServiceContext(new PetaPocoUnitOfWorkProvider(), new FileUnitOfWorkProvider(), new PublishingStrategy())) { IsReady = true }; - - FreezeResolution(); - + InitializeDatabase(); //ensure the configuration matches the current version for tests SettingsForTests.ConfigurationStatus = UmbracoVersion.Current.ToString(3); } - protected virtual void FreezeResolution() + /// + /// sets up resolvers before resolution is frozen + /// + protected override void FreezeResolution() { - Resolution.Freeze(); + DataTypesResolver.Current = new DataTypesResolver( + () => PluginManager.Current.ResolveDataTypes()); + + RepositoryResolver.Current = new RepositoryResolver( + new RepositoryFactory()); + + SqlSyntaxProvidersResolver.Current = new SqlSyntaxProvidersResolver( + new List { typeof(MySqlSyntaxProvider), typeof(SqlCeSyntaxProvider), typeof(SqlServerSyntaxProvider) }) { CanResolveBeforeFrozen = true }; + + MappingResolver.Current = new MappingResolver( + () => PluginManager.Current.ResolveAssignedMapperTypes()); + + base.FreezeResolution(); } protected virtual void InitializeDatabase() @@ -113,31 +112,17 @@ namespace Umbraco.Tests.TestHelpers } [TearDown] - public virtual void TearDown() + public override void TearDown() { - DatabaseContext.Database.Dispose(); - //reset the app context - ApplicationContext.ApplicationCache.ClearAllCache(); + base.TearDown(); SqlSyntaxContext.SqlSyntaxProvider = null; //legacy API database connection close - because a unit test using PetaPoco db-layer can trigger the usage of SqlHelper we need to ensure that a possible connection is closed. SqlCeContextGuardian.CloseBackgroundConnection(); - ApplicationContext.Current = null; - MappingResolver.Reset(); - RepositoryResolver.Reset(); - SqlSyntaxProvidersResolver.Reset(); - Resolution.Reset(); - - TestHelper.CleanContentDirectories(); - string path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", null); - - PluginManager.Current = null; - SettingsForTests.Reset(); - UmbracoSettings.ResetSetters(); try { @@ -156,11 +141,6 @@ namespace Umbraco.Tests.TestHelpers } - protected ApplicationContext ApplicationContext - { - get { return ApplicationContext.Current; } - } - protected ServiceContext ServiceContext { get { return ApplicationContext.Services; } diff --git a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs new file mode 100644 index 0000000000..e5532a5f8c --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs @@ -0,0 +1,91 @@ +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Configuration; +using Umbraco.Core.ObjectResolution; + +namespace Umbraco.Tests.TestHelpers +{ + /// + /// A base test class used for umbraco tests whcih sets up the logging, plugin manager any base resolvers, etc... and + /// ensures everything is torn down properly. + /// + [TestFixture] + public abstract class BaseUmbracoApplicationTest + { + [SetUp] + public virtual void Initialize() + { + TestHelper.SetupLog4NetForTests(); + TestHelper.InitializeContentDirectories(); + SetupPluginManager(); + + FreezeResolution(); + } + + [TearDown] + public virtual void TearDown() + { + //reset settings + SettingsForTests.Reset(); + UmbracoSettings.ResetSetters(); + TestHelper.CleanContentDirectories(); + //reset the app context, this should reset most things that require resetting like ALL resolvers + ApplicationContext.Current.DisposeIfDisposable(); + ApplicationContext.Current = null; + ResetPluginManager(); + } + + /// + /// By default this returns false which means the plugin manager will not be reset so it doesn't need to re-scan + /// all of the assemblies. Inheritors can override this if plugin manager resetting is required, generally needs + /// to be set to true if the SetupPluginManager has been overridden. + /// + protected virtual bool PluginManagerResetRequired + { + get { return false; } + } + + /// + /// Inheritors can resset the plugin manager if they choose to on teardown + /// + protected virtual void ResetPluginManager() + { + if (PluginManagerResetRequired) + { + PluginManager.Current = null; + } + } + + /// + /// Inheritors can override this if they wish to create a custom application context + /// + protected virtual void SetupApplicationContext() + { + ApplicationContext.Current = new ApplicationContext {IsReady = true}; + } + + /// + /// Inheritors can override this if they wish to setup the plugin manager differenty (i.e. specify certain assemblies to load) + /// + protected virtual void SetupPluginManager() + { + if (PluginManager.Current == null || PluginManagerResetRequired) + { + PluginManager.Current = new PluginManager(false); + } + } + + /// + /// Inheritors can override this to setup any resolvers before resolution is frozen + /// + protected virtual void FreezeResolution() + { + Resolution.Freeze(); + } + + protected ApplicationContext ApplicationContext + { + get { return ApplicationContext.Current; } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs index 2af1e1bf4e..797e935c08 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs @@ -17,26 +17,6 @@ namespace Umbraco.Tests.TestHelpers MappingResolver.Current = new MappingResolver( () => PluginManager.Current.ResolveAssignedMapperTypes()); - //MappingResolver.Current = new MappingResolver( - // new[] - // { - // typeof(ContentMapper), - // typeof(ContentTypeMapper), - // typeof(DataTypeDefinitionMapper), - // typeof(DictionaryMapper), - // typeof(DictionaryTranslationMapper), - // typeof(LanguageMapper), - // typeof(MediaMapper), - // typeof(MediaTypeMapper), - // typeof(PropertyGroupMapper), - // typeof(PropertyMapper), - // typeof(PropertyTypeMapper), - // typeof(RelationMapper), - // typeof(RelationTypeMapper), - // typeof(ServerRegistrationMapper), - // typeof(UserMapper), - // typeof(UserTypeMapper) - // }); Resolution.Freeze(); SetUp(); } diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 98fd3385d6..1fa8603804 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -301,6 +301,7 @@ +