diff --git a/src/Umbraco.Compat7/Compat7Component.cs b/src/Umbraco.Compat7/Compat7Component.cs index 10ee481b16..79ac57eb7c 100644 --- a/src/Umbraco.Compat7/Compat7Component.cs +++ b/src/Umbraco.Compat7/Compat7Component.cs @@ -28,8 +28,12 @@ namespace Umbraco.Compat7 var pluginManager = container.GetInstance(); var handlerTypes = pluginManager.ResolveTypes(); + _handlers = handlerTypes.Select(Activator.CreateInstance).Cast().ToList(); + foreach (var handler in _handlers) + logger.Debug($"ADding ApplicationEventHandler {handler.GetType().FullName}."); + foreach (var handler in _handlers) handler.OnApplicationInitialized(_app, ApplicationContext.Current); diff --git a/src/Umbraco.Compat7/Umbraco.Compat7.csproj b/src/Umbraco.Compat7/Umbraco.Compat7.csproj index 6098b6c0ed..702c99f66f 100644 --- a/src/Umbraco.Compat7/Umbraco.Compat7.csproj +++ b/src/Umbraco.Compat7/Umbraco.Compat7.csproj @@ -83,6 +83,7 @@ + diff --git a/src/Umbraco.Compat7/Web/UmbracoHelperExtensions.cs b/src/Umbraco.Compat7/Web/UmbracoHelperExtensions.cs new file mode 100644 index 0000000000..60f7cb5a4a --- /dev/null +++ b/src/Umbraco.Compat7/Web/UmbracoHelperExtensions.cs @@ -0,0 +1,13 @@ +using Umbraco.Core.Models.PublishedContent; + +// ReSharper disable once CheckNamespace +namespace Umbraco.Web +{ + public static class UmbracoHelperExtensions + { + // fixme - missing many more + + public static IPublishedContent TypedMedia(this UmbracoHelper helper, int id) + => helper.Media(id); + } +} diff --git a/src/Umbraco.Core/CoreRuntime.cs b/src/Umbraco.Core/CoreRuntime.cs index aa6679b8c9..b9d096bee7 100644 --- a/src/Umbraco.Core/CoreRuntime.cs +++ b/src/Umbraco.Core/CoreRuntime.cs @@ -13,7 +13,6 @@ using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Plugins; using Umbraco.Core.Services; @@ -129,7 +128,8 @@ namespace Umbraco.Core } } - private void DetermineRuntimeLevel(IServiceFactory container) + // internal for tests + internal void DetermineRuntimeLevel(IServiceFactory container) { using (var timer = ProfilingLogger.DebugDuration("Determining runtime level.", "Determined.")) { @@ -199,10 +199,11 @@ namespace Umbraco.Core container.Register("SqlCeSyntaxProvider"); container.Register("SqlServerSyntaxProvider"); - // register persistence mappers - means the only place the collection can be modified - // is in a runtime - afterwards it has been frozen and it is too late - container.RegisterCollectionBuilder() - .Add(f => f.GetInstance().ResolveAssignedMapperTypes()); + // fixme explain + //// register persistence mappers - means the only place the collection can be modified + //// is in a runtime - afterwards it has been frozen and it is too late + //container.RegisterCollectionBuilder() + // .Add(f => f.GetInstance().ResolveAssignedMapperTypes()); // register database factory // will be initialized with syntax providers and a logger, and will try to configure diff --git a/src/Umbraco.Core/DI/RepositoryCompositionRoot.cs b/src/Umbraco.Core/DI/RepositoryCompositionRoot.cs index 070ea2605f..68e7e71dd7 100644 --- a/src/Umbraco.Core/DI/RepositoryCompositionRoot.cs +++ b/src/Umbraco.Core/DI/RepositoryCompositionRoot.cs @@ -5,7 +5,6 @@ using Umbraco.Core.IO; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Plugins; @@ -20,24 +19,6 @@ namespace Umbraco.Core.DI public void Compose(IServiceRegistry container) { - // fixme - moved these to CoreRuntime - /* - // register syntax providers - container.Register("MySqlSyntaxProvider"); - container.Register("SqlCeSyntaxProvider"); - container.Register("SqlServerSyntaxProvider"); - - // register database factory - // will be initialized with syntax providers and a logger, and will try to configure - // from the default connection string name, if possible, else will remain non-configured - // until the database context configures it properly (eg when installing) - container.RegisterSingleton(); - - // register a database accessor - will be replaced - fixme - what does this mean? - // by HybridUmbracoDatabaseAccessor in the web project - so what? - container.RegisterSingleton(); - */ - // register database context container.RegisterSingleton(); @@ -121,10 +102,11 @@ namespace Umbraco.Core.DI var serviceContainer = container as IServiceContainer; if (serviceContainer == null) throw new Exception("Container is not IServiceContainer."); - // fixme fixme fixme more + // fixme fixme fixme more - wtf? + // has moved to core runtime, why? // register persistence mappers - //MapperCollectionBuilder.Register(serviceContainer) - // .AddProducer(f => f.GetInstance().ResolveAssignedMapperTypes()); + serviceContainer.RegisterCollectionBuilder() + .Add(f => f.GetInstance().ResolveAssignedMapperTypes()); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/DI/ServicesCompositionRoot.cs b/src/Umbraco.Core/DI/ServicesCompositionRoot.cs index a1d0cae9ad..8e18659133 100644 --- a/src/Umbraco.Core/DI/ServicesCompositionRoot.cs +++ b/src/Umbraco.Core/DI/ServicesCompositionRoot.cs @@ -14,7 +14,7 @@ namespace Umbraco.Core.DI { public void Compose(IServiceRegistry container) { - // register a transient messages factory, which will be replaced byt the web + // register a transient messages factory, which will be replaced by the web // boot manager when running in a web context container.Register(); diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs index e7967dc795..4c0434becd 100644 --- a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs @@ -102,10 +102,17 @@ namespace Umbraco.Core.Persistence return NPoco.Sql.BuilderFor(new SqlContext(this)).Append(sql, args); } + //protected override void OnConnectionClosing(DbConnection conn) + //{ + // base.OnConnectionClosing(conn); + //} + protected override DbConnection OnConnectionOpened(DbConnection connection) { if (connection == null) throw new ArgumentNullException(nameof(connection)); + // fixme could we avoid re-wrapping all of the time if the underlying cnx object does not change? (does it?) (should it?) + // wrap the connection with a profiling connection that tracks timings connection = new StackExchange.Profiling.Data.ProfiledDbConnection(connection, MiniProfiler.Current); diff --git a/src/Umbraco.Tests/ApplicationContextTests.cs b/src/Umbraco.Tests/ApplicationContextTests.cs deleted file mode 100644 index 19b0ac6136..0000000000 --- a/src/Umbraco.Tests/ApplicationContextTests.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Configuration; -using Moq; -using NUnit.Framework; -using Semver; -using Umbraco.Core; -using Umbraco.Core.Cache; -using Umbraco.Core.Configuration; -using Umbraco.Core.Logging; -using Umbraco.Core.Models; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Profiling; -using Umbraco.Core.Services; -using Umbraco.Tests.TestHelpers; - -namespace Umbraco.Tests -{ - [TestFixture] - public class ApplicationContextTests - { - [Test] - public void Is_Configured() - { - ConfigurationManager.AppSettings.Set("umbracoConfigurationStatus", UmbracoVersion.SemanticVersion.ToSemanticString()); - - var migrationEntryService = new Mock(); - migrationEntryService.Setup(x => x.FindEntry(It.IsAny(), It.IsAny())) - .Returns(Mock.Of()); - - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(); - var logger = Mock.Of(); - var dbCtx = new Mock(databaseFactory, logger); - - //var appCtx = new ApplicationContext( - // dbCtx.Object, - // new ServiceContext(migrationEntryService:migrationEntryService.Object), - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(logger, Mock.Of())); - - //Assert.IsTrue(appCtx.IsConfigured); - Assert.Fail("Must rewrite the test with Runtime!"); - } - - [Test] - public void Is_Not_Configured_By_Migration_Not_Found() - { - ConfigurationManager.AppSettings.Set("umbracoConfigurationStatus", UmbracoVersion.SemanticVersion.ToSemanticString()); - - var migrationEntryService = new Mock(); - migrationEntryService.Setup(x => x.FindEntry(It.IsAny(), It.IsAny())) - .Returns((IMigrationEntry)null); - - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(); - var logger = Mock.Of(); - var dbCtx = new Mock(databaseFactory, logger); - - //var appCtx = new ApplicationContext( - // dbCtx.Object, - // new ServiceContext(migrationEntryService: migrationEntryService.Object), - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(logger, Mock.Of())); - - //Assert.IsFalse(appCtx.IsConfigured); - Assert.Fail("Must rewrite the test with Runtime!"); - } - - [Test] - public void Is_Not_Configured_By_Configuration() - { - ConfigurationManager.AppSettings.Set("umbracoConfigurationStatus", new SemVersion(UmbracoVersion.Current.Major - 1, 0, 0).ToString()); - - var migrationEntryService = new Mock(); - - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(); - var logger = Mock.Of(); - var dbCtx = new Mock(databaseFactory, logger); - - //var appCtx = new ApplicationContext( - // dbCtx.Object, - // new ServiceContext(migrationEntryService: migrationEntryService.Object), - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(logger, Mock.Of())); - - //Assert.IsFalse(appCtx.IsConfigured); - Assert.Fail("Must rewrite the test with Runtime!"); - } - - [Test] - public void Is_Not_Configured_By_Database_Not_Configured() - { - ConfigurationManager.AppSettings.Set("umbracoConfigurationStatus", new SemVersion(UmbracoVersion.Current.Major - 1, 0, 0).ToString()); - - var migrationEntryService = new Mock(); - - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(false); - var logger = Mock.Of(); - var dbCtx = new Mock(databaseFactory, logger); - - //var appCtx = new ApplicationContext( - // dbCtx.Object, - // new ServiceContext(migrationEntryService: migrationEntryService.Object), - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - - //Assert.IsFalse(appCtx.IsConfigured); - Assert.Fail("Must rewrite the test with Runtime!"); - } - - [Test] - public void Is_Not_Configured_By_Database_Cannot_Connect() - { - ConfigurationManager.AppSettings.Set("umbracoConfigurationStatus", new SemVersion(UmbracoVersion.Current.Major - 1, 0, 0).ToString()); - - var migrationEntryService = new Mock(); - - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(true, false); - var logger = Mock.Of(); - var dbCtx = new Mock(databaseFactory, logger); - - //var appCtx = new ApplicationContext( - // dbCtx.Object, - // new ServiceContext(migrationEntryService: migrationEntryService.Object), - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - - //Assert.IsFalse(appCtx.IsConfigured); - Assert.Fail("Must rewrite the test with Runtime!"); - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Tests/ApplicationUrlHelperTests.cs b/src/Umbraco.Tests/ApplicationUrlHelperTests.cs index a225d77047..56a0049097 100644 --- a/src/Umbraco.Tests/ApplicationUrlHelperTests.cs +++ b/src/Umbraco.Tests/ApplicationUrlHelperTests.cs @@ -1,17 +1,13 @@ using System; using System.Configuration; -using System.IO; using System.Linq; using LightInject; using Moq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Cache; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; -using Umbraco.Core.Profiling; using Umbraco.Core.Sync; -using Umbraco.Tests.TestHelpers; using Umbraco.Core.DI; namespace Umbraco.Tests @@ -19,24 +15,17 @@ namespace Umbraco.Tests [TestFixture] public class ApplicationUrlHelperTests { - private ILogger _logger; private IServerRegistrar _registrar; // note: in tests, read appContext._umbracoApplicationUrl and not the property, // because reading the property does run some code, as long as the field is null. - [TestFixtureSetUp] - public void InitializeFixture() - { - _logger = new Logger(new FileInfo(TestHelper.MapPathForTest("~/unit-test-log4net.config"))); - } - private void Initialize(IUmbracoSettingsSection settings) { _registrar = new ConfigServerRegistrar(settings.DistributedCall); var container = new ServiceContainer(); container.ConfigureUmbracoCore(); - container.Register(_ => _registrar); + container.Register(_ => _registrar); } [TearDown] @@ -48,9 +37,6 @@ namespace Umbraco.Tests [Test] public void NoApplicationUrlByDefault() { - //var appCtx = new ApplicationContext(CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - //Assert.IsNull(appCtx._umbracoApplicationUrl); var state = new RuntimeState(Mock.Of(), new Lazy(Mock.Of), new Lazy(Mock.Of)); Assert.IsNull(state.ApplicationUrl); } @@ -70,15 +56,12 @@ namespace Umbraco.Tests Initialize(settings); var state = new RuntimeState(Mock.Of(), new Lazy(Mock.Of), new Lazy(Mock.Of)); - //var appCtx = new ApplicationContext(CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); ConfigurationManager.AppSettings.Set("umbracoUseSSL", "true"); // does not make a diff here - //ApplicationUrlHelper.EnsureApplicationUrl(appCtx, settings: settings); state.EnsureApplicationUrl(settings: settings); - Assert.AreEqual("http://server1.com/umbraco", state.ApplicationUrl); + Assert.AreEqual("http://server1.com/umbraco", state.ApplicationUrl.ToString()); } [Test] @@ -108,7 +91,7 @@ namespace Umbraco.Tests // first server is master server var settings = Mock.Of(section => - section.DistributedCall == Mock.Of(callSection => callSection.Enabled == true && callSection.Servers == new IServer[] + section.DistributedCall == Mock.Of(callSection => callSection.Enabled && callSection.Servers == new[] { Mock.Of(server => server.ServerName == NetworkHelper.MachineName && server.ServerAddress == "server1.com"), Mock.Of(server => server.ServerName == "ANOTHERNAME" && server.ServerAddress == "server2.com"), @@ -135,7 +118,7 @@ namespace Umbraco.Tests // other servers are slave servers var settings = Mock.Of(section => - section.DistributedCall == Mock.Of(callSection => callSection.Enabled == true && callSection.Servers == new IServer[] + section.DistributedCall == Mock.Of(callSection => callSection.Enabled && callSection.Servers == new[] { Mock.Of(server => server.ServerName == "ANOTHERNAME" && server.ServerAddress == "server2.com"), Mock.Of(server => server.ServerName == NetworkHelper.MachineName && server.ServerAddress == "server1.com"), @@ -162,7 +145,7 @@ namespace Umbraco.Tests // cannot set if not enabled var settings = Mock.Of(section => - section.DistributedCall == Mock.Of(callSection => callSection.Enabled == false && callSection.Servers == new IServer[] + section.DistributedCall == Mock.Of(callSection => callSection.Enabled == false && callSection.Servers == new[] { Mock.Of(server => server.ServerName == "ANOTHERNAME" && server.ServerAddress == "server2.com"), Mock.Of(server => server.ServerName == NetworkHelper.MachineName && server.ServerAddress == "server1.com"), @@ -204,7 +187,7 @@ namespace Umbraco.Tests // distributed call enabled but missing servers, unknown server var settings = Mock.Of(section => - section.DistributedCall == Mock.Of(callSection => callSection.Enabled == true && callSection.Servers == Enumerable.Empty()) + section.DistributedCall == Mock.Of(callSection => callSection.Enabled && callSection.Servers == Enumerable.Empty()) && section.WebRouting == Mock.Of(wrSection => wrSection.UmbracoApplicationUrl == (string)null) && section.ScheduledTasks == Mock.Of(tasksSection => tasksSection.BaseUrl == (string)null)); @@ -220,7 +203,7 @@ namespace Umbraco.Tests // distributed call enabled, cannot find server, assume it's an undeclared slave var settings = Mock.Of(section => - section.DistributedCall == Mock.Of(callSection => callSection.Enabled == true && callSection.Servers == new IServer[] + section.DistributedCall == Mock.Of(callSection => callSection.Enabled && callSection.Servers == new[] { Mock.Of(server => server.ServerName == "ANOTHERNAME" && server.ServerAddress == "server2.com"), }) diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs index c6a4ad7aae..860d428583 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs @@ -47,10 +47,9 @@ namespace Umbraco.Tests.Cache.PublishedCache "; } - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); _httpContextFactory = new FakeHttpContextFactory("~/Home"); diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs index 567ff5d53a..e42a72d4e3 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs @@ -4,21 +4,12 @@ using System.Collections.Generic; using System.Linq; using System.Xml; using Examine; -using LightInject; -using Lucene.Net.Documents; -using Moq; using NUnit.Framework; -using umbraco.BusinessLogic; using Umbraco.Core; using Umbraco.Core.Cache; -using Umbraco.Core.Logging; -using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Strings; -using Umbraco.Tests.PublishedContent; using Umbraco.Tests.TestHelpers; -using Umbraco.Web; -using Umbraco.Web.PublishedCache; using Umbraco.Web.PublishedCache.XmlPublishedCache; using Umbraco.Core.DI; using Current = Umbraco.Web.Current; @@ -29,12 +20,12 @@ namespace Umbraco.Tests.Cache.PublishedCache [TestFixture] public class PublishMediaCacheTests : BaseWebTest { - protected override void FreezeResolution() + protected override void MoreSetUp() { Container.RegisterCollectionBuilder() .Append(); - base.FreezeResolution(); + base.MoreSetUp(); } //NOTE: This is "Without_Examine" too diff --git a/src/Umbraco.Tests/Components/ComponentTests.cs b/src/Umbraco.Tests/Components/ComponentTests.cs index ade2ab2451..85df5b97c6 100644 --- a/src/Umbraco.Tests/Components/ComponentTests.cs +++ b/src/Umbraco.Tests/Components/ComponentTests.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using LightInject; using Moq; using NUnit.Framework; @@ -10,21 +7,16 @@ using Umbraco.Core; using Umbraco.Core.Components; using Umbraco.Core.DI; using Umbraco.Core.Logging; +using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Components { [TestFixture] - public class ComponentTests + public class ComponentTests : BaseTestBase { private static readonly List Composed = new List(); private static readonly List Initialized = new List(); - [TearDown] - public void TearDown() - { - Current.Reset(); - } - [Test] public void Boot() { diff --git a/src/Umbraco.Tests/Configurations/GlobalSettingsTests.cs b/src/Umbraco.Tests/Configurations/GlobalSettingsTests.cs index 0f671de08e..df07366ece 100644 --- a/src/Umbraco.Tests/Configurations/GlobalSettingsTests.cs +++ b/src/Umbraco.Tests/Configurations/GlobalSettingsTests.cs @@ -10,21 +10,20 @@ namespace Umbraco.Tests.Configurations [TestFixture] public class GlobalSettingsTests : BaseWebTest { - - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); + SettingsForTests.UmbracoPath = "~/umbraco"; } public override void TearDown() { + base.TearDown(); + //ensure this is reset SystemDirectories.Root = null; SettingsForTests.UmbracoPath = "~/umbraco"; - //reset the app config - base.TearDown(); - } [Test] diff --git a/src/Umbraco.Tests/CoreXml/NavigableNavigatorTests.cs b/src/Umbraco.Tests/CoreXml/NavigableNavigatorTests.cs index d74725610a..0279763e0e 100644 --- a/src/Umbraco.Tests/CoreXml/NavigableNavigatorTests.cs +++ b/src/Umbraco.Tests/CoreXml/NavigableNavigatorTests.cs @@ -15,7 +15,7 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.CoreXml { [TestFixture] - public class NavigableNavigatorTests : BaseUmbracoConfigurationTest + public class NavigableNavigatorTests : TestWithSettingsBase { [Test] public void NewNavigatorIsAtRoot() diff --git a/src/Umbraco.Tests/Integration/ContentEventsTests.cs b/src/Umbraco.Tests/Integration/ContentEventsTests.cs index e5783d2c14..992304dd86 100644 --- a/src/Umbraco.Tests/Integration/ContentEventsTests.cs +++ b/src/Umbraco.Tests/Integration/ContentEventsTests.cs @@ -25,9 +25,9 @@ namespace Umbraco.Tests.Integration { #region Setup - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); _h1 = new CacheRefresherComponent(); _h1.AddHandlers(); @@ -48,9 +48,9 @@ namespace Umbraco.Tests.Integration ServiceContext.ContentTypeService.Save(_contentType); } - protected override void ConfigureContainer() + protected override void Compose() { - base.ConfigureContainer(); + base.Compose(); Container.Register(_ => new DistributedCacheTests.TestServerRegistrar()); // localhost-only Container.Register(new PerContainerLifetime()); diff --git a/src/Umbraco.Tests/Integration/GetCultureTests.cs b/src/Umbraco.Tests/Integration/GetCultureTests.cs index 31f33220d5..8d85193347 100644 --- a/src/Umbraco.Tests/Integration/GetCultureTests.cs +++ b/src/Umbraco.Tests/Integration/GetCultureTests.cs @@ -19,7 +19,7 @@ namespace Umbraco.Tests.Integration [TestFixture, RequiresSTA] public class GetCultureTests : BaseServiceTest { - protected override void FreezeResolution() + protected override void MoreSetUp() { Container.Register(); } diff --git a/src/Umbraco.Tests/LibraryTests.cs b/src/Umbraco.Tests/LibraryTests.cs index 79fc5fc3c1..8d96e3cff4 100644 --- a/src/Umbraco.Tests/LibraryTests.cs +++ b/src/Umbraco.Tests/LibraryTests.cs @@ -27,9 +27,9 @@ namespace Umbraco.Tests [TestFixture] public class LibraryTests : BaseWebTest { - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); // need to specify a custom callback for unit tests // AutoPublishedContentTypes generates properties automatically @@ -54,12 +54,12 @@ namespace Umbraco.Tests /// /// sets up resolvers before resolution is frozen /// - protected override void FreezeResolution() + protected override void MoreSetUp() { // required so we can access property.Value Container.RegisterCollectionBuilder(); - base.FreezeResolution(); + base.MoreSetUp(); } [Test] diff --git a/src/Umbraco.Tests/Macros/MacroTests.cs b/src/Umbraco.Tests/Macros/MacroTests.cs index 3d1428583d..c26da1de08 100644 --- a/src/Umbraco.Tests/Macros/MacroTests.cs +++ b/src/Umbraco.Tests/Macros/MacroTests.cs @@ -39,14 +39,6 @@ namespace Umbraco.Tests.Macros UmbracoConfig.For.SetUmbracoSettings(SettingsForTests.GetDefault()); } - [TearDown] - public void TearDown() - { - Current.ApplicationCache.RuntimeCache.ClearAllCache(); - //Current.ApplicationContext.DisposeIfDisposable(); - Current.Reset(); - } - [TestCase("123", "IntProp", typeof(int))] [TestCase("Hello", "StringProp", typeof(string))] [TestCase("123456789.01", "DoubleProp", typeof(double))] diff --git a/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs b/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs index 6522e3f78f..01bf02c35d 100644 --- a/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs +++ b/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs @@ -19,7 +19,7 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Migrations { [TestFixture] - public class FindingMigrationsTest : BaseDatabaseFactoryTest + public class FindingMigrationsTest : TestWithDatabaseBase { [Test] diff --git a/src/Umbraco.Tests/Migrations/MigrationIssuesTests.cs b/src/Umbraco.Tests/Migrations/MigrationIssuesTests.cs index 227fe1c47b..f2bb1e2a8f 100644 --- a/src/Umbraco.Tests/Migrations/MigrationIssuesTests.cs +++ b/src/Umbraco.Tests/Migrations/MigrationIssuesTests.cs @@ -18,7 +18,7 @@ namespace Umbraco.Tests.Migrations { [TestFixture] [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] - public class MigrationIssuesTests : BaseDatabaseFactoryTest + public class MigrationIssuesTests : TestWithDatabaseBase { [Test] public void Issue8370Test() diff --git a/src/Umbraco.Tests/MockTests.cs b/src/Umbraco.Tests/MockTests.cs index 81d74d140f..f4f5d0b69d 100644 --- a/src/Umbraco.Tests/MockTests.cs +++ b/src/Umbraco.Tests/MockTests.cs @@ -1,22 +1,17 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; using System.Web; using System.Web.Security; +using LightInject; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; using Umbraco.Core.Dictionary; -using Umbraco.Core.Models; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Persistence.UnitOfWork; -using Umbraco.Core.Profiling; using Umbraco.Core.Services; using Moq; using Umbraco.Core.Cache; +using Umbraco.Core.DI; using Umbraco.Core.Models.PublishedContent; using Umbraco.Tests.TestHelpers; using Umbraco.Web; @@ -28,136 +23,85 @@ using Current = Umbraco.Web.Current; namespace Umbraco.Tests { [TestFixture] - public class MockTests + public class MockTests : BaseTestBase { [SetUp] - public void Setup() + public override void SetUp() { + base.SetUp(); + Current.UmbracoContextAccessor = new TestUmbracoContextAccessor(); } - [TearDown] - public void TearDown() - { - Current.Reset(); - } - [Test] - public void Can_Create_Empty_App_Context() + public void Can_Mock_Service_Context() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - //Assert.Pass(); - } - - [Test] - public void Can_Create_Service_Context() - { - var svcCtx = TestObjects.GetServiceContextMock(); + // ReSharper disable once UnusedVariable + var serviceContext = TestObjects.GetServiceContextMock(); Assert.Pass(); } [Test] - public void Can_Create_Db_Context() + public void Can_Mock_Database_Context() { - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(); + var databaseFactory = TestObjects.GetDatabaseFactoryMock(); var logger = Mock.Of(); - var dbCtx = new DatabaseContext(databaseFactory, logger, Mock.Of(), Mock.Of()); + var runtimeState = Mock.Of(); + var migrationEntryService = Mock.Of(); + + // ReSharper disable once UnusedVariable + var databaseContext = new DatabaseContext(databaseFactory, logger, runtimeState, migrationEntryService); Assert.Pass(); } [Test] - public void Can_Get_Umbraco_Context() + public void Can_Mock_Umbraco_Context() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - - var umbCtx = UmbracoContext.EnsureContext( - Mock.Of(), - Mock.Of(), - new Mock(null, null).Object, - Mock.Of(), - Enumerable.Empty(), - true); - - Assert.AreEqual(umbCtx, UmbracoContext.Current); + var umbracoContext = TestObjects.GetUmbracoContextMock(); + Assert.AreEqual(umbracoContext, UmbracoContext.Current); } [Test] public void Can_Mock_Umbraco_Helper() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); + var umbracoContext = TestObjects.GetUmbracoContextMock(); - var facade = new Mock(); - facade.Setup(x => x.MemberCache).Returns(Mock.Of()); - var facadeService = new Mock(); - facadeService.Setup(x => x.CreateFacade(It.IsAny())).Returns(facade.Object); + var container = new ServiceContainer(); + container.ConfigureUmbracoCore(); - var umbCtx = UmbracoContext.EnsureContext( - Mock.Of(), - facadeService.Object, - new Mock(null, null).Object, - Mock.Of(), - Enumerable.Empty(), - true); + // unless we can inject them in MembershipHelper, we need need this + container.Register(_ => Mock.Of()); + container.Register(_ => Mock.Of()); + container.Register(_ => CacheHelper.CreateDisabledCacheHelper()); + container.Register(); - var helper = new UmbracoHelper(umbCtx, + // ReSharper disable once UnusedVariable + var helper = new UmbracoHelper(umbracoContext, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), - new UrlProvider(umbCtx, new[] {Mock.Of()}, UrlProviderMode.Auto), Mock.Of(), + Mock.Of(), Mock.Of(), - new MembershipHelper(umbCtx, Mock.Of(), Mock.Of()), + new MembershipHelper(umbracoContext, Mock.Of(), Mock.Of()), new ServiceContext(), CacheHelper.CreateDisabledCacheHelper()); - Assert.Pass(); } [Test] - public void Can_Mock_Umbraco_Helper_Get_Url() + public void Can_Mock_UrlProvider() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); + var umbracoContext = TestObjects.GetUmbracoContextMock(); - var facade = new Mock(); - facade.Setup(x => x.MemberCache).Returns(Mock.Of()); - var facadeService = new Mock(); - facadeService.Setup(x => x.CreateFacade(It.IsAny())).Returns(facade.Object); - - var umbCtx = UmbracoContext.EnsureContext( - Mock.Of(), - facadeService.Object, - new Mock(null, null).Object, - Mock.Of(), - Enumerable.Empty(), - true); - - var urlHelper = new Mock(); - urlHelper.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + var urlProviderMock = new Mock(); + urlProviderMock.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns("/hello/world/1234"); + var urlProvider = urlProviderMock.Object; - var helper = new UmbracoHelper(umbCtx, - Mock.Of(), - Mock.Of(), - Mock.Of(), - Mock.Of(), - new UrlProvider(umbCtx, new[] - { - urlHelper.Object - }, UrlProviderMode.Auto), Mock.Of(), - Mock.Of(), - new MembershipHelper(umbCtx, Mock.Of(), Mock.Of()), - new ServiceContext(), - CacheHelper.CreateDisabledCacheHelper()); - - Assert.AreEqual("/hello/world/1234", helper.Url(1234)); + var theUrlProvider = new UrlProvider(umbracoContext, new [] { urlProvider }); + + Assert.AreEqual("/hello/world/1234", theUrlProvider.GetUrl(1234)); } } } diff --git a/src/Umbraco.Tests/Models/Collections/PropertyCollectionTests.cs b/src/Umbraco.Tests/Models/Collections/PropertyCollectionTests.cs index eaaa36504b..8cb323c4f9 100644 --- a/src/Umbraco.Tests/Models/Collections/PropertyCollectionTests.cs +++ b/src/Umbraco.Tests/Models/Collections/PropertyCollectionTests.cs @@ -9,7 +9,7 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Models.Collections { [TestFixture] - public class PropertyCollectionTests : BaseUmbracoConfigurationTest + public class PropertyCollectionTests : TestWithSettingsBase { [Test] public void Property_Adds_Case_Insensitive_Compare() diff --git a/src/Umbraco.Tests/Models/ContentExtensionsTests.cs b/src/Umbraco.Tests/Models/ContentExtensionsTests.cs index 530e2e05bd..2ab6129687 100644 --- a/src/Umbraco.Tests/Models/ContentExtensionsTests.cs +++ b/src/Umbraco.Tests/Models/ContentExtensionsTests.cs @@ -8,7 +8,7 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Models { [TestFixture] - public class ContentExtensionsTests : BaseUmbracoConfigurationTest + public class ContentExtensionsTests : TestWithSettingsBase { #region RequiresSaving diff --git a/src/Umbraco.Tests/Models/ContentTests.cs b/src/Umbraco.Tests/Models/ContentTests.cs index e775e35734..62b6da09ec 100644 --- a/src/Umbraco.Tests/Models/ContentTests.cs +++ b/src/Umbraco.Tests/Models/ContentTests.cs @@ -22,7 +22,7 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Models { [TestFixture] - public class ContentTests : BaseUmbracoConfigurationTest + public class ContentTests : TestWithSettingsBase { [SetUp] public void Init() diff --git a/src/Umbraco.Tests/Models/ContentTypeTests.cs b/src/Umbraco.Tests/Models/ContentTypeTests.cs index 5742521f9b..79eef89a57 100644 --- a/src/Umbraco.Tests/Models/ContentTypeTests.cs +++ b/src/Umbraco.Tests/Models/ContentTypeTests.cs @@ -13,7 +13,7 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Models { [TestFixture] - public class ContentTypeTests : BaseUmbracoConfigurationTest + public class ContentTypeTests : TestWithSettingsBase { diff --git a/src/Umbraco.Tests/Models/ContentXmlTest.cs b/src/Umbraco.Tests/Models/ContentXmlTest.cs index 501e70ebbc..e4c4361952 100644 --- a/src/Umbraco.Tests/Models/ContentXmlTest.cs +++ b/src/Umbraco.Tests/Models/ContentXmlTest.cs @@ -11,24 +11,8 @@ namespace Umbraco.Tests.Models { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] [TestFixture] - public class ContentXmlTest : BaseDatabaseFactoryTest + public class ContentXmlTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - protected override void FreezeResolution() - { - base.FreezeResolution(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } [Test] public void Can_Generate_Xml_Representation_Of_Content() { diff --git a/src/Umbraco.Tests/Models/Mapping/AutoMapperTests.cs b/src/Umbraco.Tests/Models/Mapping/AutoMapperTests.cs index 7eb25117bf..226ed0b05e 100644 --- a/src/Umbraco.Tests/Models/Mapping/AutoMapperTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/AutoMapperTests.cs @@ -16,11 +16,11 @@ namespace Umbraco.Tests.Models.Mapping { [RequiresAutoMapperMappings] [TestFixture] - public class AutoMapperTests : BaseUmbracoApplicationTest + public class AutoMapperTests : TestWithApplicationBase { - protected override void ConfigureContainer() + protected override void Compose() { - base.ConfigureContainer(); + base.Compose(); var manifestBuilder = new ManifestBuilder( CacheHelper.CreateDisabledCacheHelper().RuntimeCache, diff --git a/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs index 2cbfe60f92..c65ffc843d 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs @@ -1,21 +1,14 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using AutoMapper; -using LightInject; using Moq; using NUnit.Framework; -using umbraco; -using umbraco.cms.presentation; using Umbraco.Core; using Umbraco.Core.Cache; +using Umbraco.Core.DI; using Umbraco.Core.Logging; -using Umbraco.Core.Manifest; using Umbraco.Core.Models; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Profiling; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; @@ -27,22 +20,23 @@ using Umbraco.Web.PropertyEditors; namespace Umbraco.Tests.Models.Mapping { [TestFixture] - public class ContentTypeModelMappingTests : BaseUmbracoConfigurationTest + public class ContentTypeModelMappingTests : TestWithApplicationBase { - //Mocks of services that can be setup on a test by test basis to return whatever we want + // mocks of services that can be setup on a test by test basis to return whatever we want private readonly Mock _contentTypeService = new Mock(); private readonly Mock _contentService = new Mock(); private readonly Mock _dataTypeService = new Mock(); private readonly Mock _entityService = new Mock(); private readonly Mock _fileService = new Mock(); - [SetUp] - public void Setup() + public override void SetUp() { - var nullCacheHelper = CacheHelper.CreateDisabledCacheHelper(); - var logger = Mock.Of(); + base.SetUp(); - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(); + //var nullCacheHelper = CacheHelper.CreateDisabledCacheHelper(); + //var logger = Mock.Of(); + + //var databaseFactory = TestObjects.GetDatabaseFactoryMock(); ////Create an app context using mocks //var appContext = new ApplicationContext( @@ -68,13 +62,24 @@ namespace Umbraco.Tests.Models.Mapping Mapper.Initialize(configuration => { //initialize our content type mapper - var mapper = new ContentTypeModelMapper(editorsMock.Object, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of()); + var mapper = new ContentTypeModelMapper(editorsMock.Object, _dataTypeService.Object, _fileService.Object, _contentTypeService.Object, Mock.Of()); mapper.ConfigureMappings(configuration); var entityMapper = new EntityModelMapper(); entityMapper.ConfigureMappings(configuration); }); } + protected override void Compose() + { + base.Compose(); + + Container.RegisterSingleton(_ => _contentTypeService.Object); + Container.RegisterSingleton(_ => _contentService.Object); + Container.RegisterSingleton(_ => _dataTypeService.Object); + Container.RegisterSingleton(_ => _entityService.Object); + Container.RegisterSingleton(_ => _fileService.Object); + } + [Test] public void MemberTypeSave_To_IMemberType() { diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index 560c36e94b..0849c195d9 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -20,13 +20,13 @@ namespace Umbraco.Tests.Models.Mapping [RequiresAutoMapperMappings] [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] [TestFixture] - public class ContentWebModelMappingTests : BaseDatabaseFactoryTest + public class ContentWebModelMappingTests : TestWithDatabaseBase { - protected override void FreezeResolution() + protected override void MoreSetUp() { Container.RegisterSingleton(_ => Mock.Of()); - base.FreezeResolution(); + base.MoreSetUp(); } [PropertyEditor("Test.Test", "Test", "~/Test.html")] diff --git a/src/Umbraco.Tests/Models/MediaXmlTest.cs b/src/Umbraco.Tests/Models/MediaXmlTest.cs index dbf7b67de9..98a5ebee42 100644 --- a/src/Umbraco.Tests/Models/MediaXmlTest.cs +++ b/src/Umbraco.Tests/Models/MediaXmlTest.cs @@ -11,25 +11,8 @@ namespace Umbraco.Tests.Models { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] [TestFixture] - public class MediaXmlTest : BaseDatabaseFactoryTest + public class MediaXmlTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - protected override void FreezeResolution() - { - base.FreezeResolution(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Can_Generate_Xml_Representation_Of_Media() { diff --git a/src/Umbraco.Tests/Models/PropertyGroupTests.cs b/src/Umbraco.Tests/Models/PropertyGroupTests.cs index 683b9b2adf..a33a47ed57 100644 --- a/src/Umbraco.Tests/Models/PropertyGroupTests.cs +++ b/src/Umbraco.Tests/Models/PropertyGroupTests.cs @@ -8,7 +8,7 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Models { [TestFixture] - public class PropertyGroupTests : BaseUmbracoConfigurationTest + public class PropertyGroupTests : TestWithSettingsBase { [Test] public void Can_Deep_Clone() diff --git a/src/Umbraco.Tests/Models/PropertyTypeTests.cs b/src/Umbraco.Tests/Models/PropertyTypeTests.cs index 82c7521554..57a49e2eec 100644 --- a/src/Umbraco.Tests/Models/PropertyTypeTests.cs +++ b/src/Umbraco.Tests/Models/PropertyTypeTests.cs @@ -8,7 +8,7 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Models { [TestFixture] - public class PropertyTypeTests : BaseUmbracoConfigurationTest + public class PropertyTypeTests : TestWithSettingsBase { [Test] public void Can_Deep_Clone() diff --git a/src/Umbraco.Tests/Models/TemplateTests.cs b/src/Umbraco.Tests/Models/TemplateTests.cs index e279851b77..ef81cdc880 100644 --- a/src/Umbraco.Tests/Models/TemplateTests.cs +++ b/src/Umbraco.Tests/Models/TemplateTests.cs @@ -10,7 +10,7 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Models { [TestFixture] - public class TemplateTests : BaseUmbracoConfigurationTest + public class TemplateTests : TestWithSettingsBase { [Test] public void Can_Deep_Clone() diff --git a/src/Umbraco.Tests/Persistence/NPocoExtensionsTest.cs b/src/Umbraco.Tests/Persistence/NPocoExtensionsTest.cs index 45a98ed3c7..b38fa96d0c 100644 --- a/src/Umbraco.Tests/Persistence/NPocoExtensionsTest.cs +++ b/src/Umbraco.Tests/Persistence/NPocoExtensionsTest.cs @@ -12,20 +12,8 @@ namespace Umbraco.Tests.Persistence // [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class NPocoExtensionsTest : BaseDatabaseFactoryTest + public class NPocoExtensionsTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Can_Bulk_Insert() { diff --git a/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs b/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs index 006d2dc659..bc7bbd9ff6 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs @@ -17,7 +17,7 @@ namespace Umbraco.Tests.Persistence.Querying { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class ContentTypeSqlMappingTests : BaseDatabaseFactoryTest + public class ContentTypeSqlMappingTests : TestWithDatabaseBase { [Test] public void Can_Map_Content_Type_Templates_And_Allowed_Types() diff --git a/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs index 872de57ce1..7c4481578e 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs @@ -10,7 +10,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class AuditRepositoryTest : BaseDatabaseFactoryTest + public class AuditRepositoryTest : TestWithDatabaseBase { [Test] public void Can_Add_Audit_Entry() diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index bb22406cf8..9613af3c7d 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -27,22 +27,15 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class ContentRepositoryTest : BaseDatabaseFactoryTest + public class ContentRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); CreateTestData(); } - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - private ContentRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository, out DataTypeDefinitionRepository dtdRepository) { TemplateRepository tr; diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs index c06c9ab5db..cc30799907 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs @@ -26,22 +26,15 @@ namespace Umbraco.Tests.Persistence.Repositories [RequiresAutoMapperMappings] [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class ContentTypeRepositoryTest : BaseDatabaseFactoryTest + public class ContentTypeRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); CreateTestData(); } - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - private ContentRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository) { var templateRepository = new TemplateRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, Mock.Of(), Mock.Of(), Mock.Of(), Mappers); diff --git a/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs index 5b7de3f020..3add643bdb 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs @@ -27,14 +27,8 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class DataTypeDefinitionRepositoryTest : BaseDatabaseFactoryTest + public class DataTypeDefinitionRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - protected override CacheHelper CreateCacheHelper() { // hackish, but it works diff --git a/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs index 573a895518..0a5cfdf49d 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs @@ -17,12 +17,11 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class DictionaryRepositoryTest : BaseDatabaseFactoryTest + public class DictionaryRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); CreateTestData(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs index a4da78ce80..8291bcfa00 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs @@ -15,7 +15,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class DomainRepositoryTest : BaseDatabaseFactoryTest + public class DomainRepositoryTest : TestWithDatabaseBase { private DomainRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository, out ContentRepository contentRepository, out LanguageRepository languageRepository) { diff --git a/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs index 0f0ffedf51..22c01e458f 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs @@ -17,12 +17,11 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class LanguageRepositoryTest : BaseDatabaseFactoryTest + public class LanguageRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); CreateTestData(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs index 8a7068c9eb..f4cebb5af7 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs @@ -17,12 +17,11 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class MacroRepositoryTest : BaseDatabaseFactoryTest + public class MacroRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); CreateTestData(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs index a78db388a5..5810842a14 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs @@ -19,16 +19,11 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class MediaRepositoryTest : BaseDatabaseFactoryTest + public class MediaRepositoryTest : TestWithDatabaseBase { - public MediaRepositoryTest() + public override void SetUp() { - } - - [SetUp] - public override void Initialize() - { - base.Initialize(); + base.SetUp(); CreateTestData(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaTypeRepositoryTest.cs index d632fc3185..abd0d61c94 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaTypeRepositoryTest.cs @@ -18,14 +18,8 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class MediaTypeRepositoryTest : BaseDatabaseFactoryTest + public class MediaTypeRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - private MediaTypeRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { return new MediaTypeRepository(unitOfWork, DisabledCache, Logger, Mappers); diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs index a909170b6c..fa74baa3aa 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs @@ -22,20 +22,8 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class MemberRepositoryTest : BaseDatabaseFactoryTest + public class MemberRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - private MemberRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out MemberTypeRepository memberTypeRepository, out MemberGroupRepository memberGroupRepository) { memberTypeRepository = new MemberTypeRepository(unitOfWork, DisabledCache, Logger, Mappers); diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs index 93ca645f70..c5acb91374 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberTypeRepositoryTest.cs @@ -17,20 +17,8 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class MemberTypeRepositoryTest : BaseDatabaseFactoryTest + public class MemberTypeRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - private MemberTypeRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { return new MemberTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), Mappers); diff --git a/src/Umbraco.Tests/Persistence/Repositories/NotificationsRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/NotificationsRepositoryTest.cs index 6ed5919203..ec86ad80ba 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/NotificationsRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/NotificationsRepositoryTest.cs @@ -15,7 +15,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class NotificationsRepositoryTest : BaseDatabaseFactoryTest + public class NotificationsRepositoryTest : TestWithDatabaseBase { [Test] public void CreateNotification() diff --git a/src/Umbraco.Tests/Persistence/Repositories/PartialViewRepositoryTests.cs b/src/Umbraco.Tests/Persistence/Repositories/PartialViewRepositoryTests.cs index 643cc66991..2b80270a1b 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/PartialViewRepositoryTests.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/PartialViewRepositoryTests.cs @@ -14,14 +14,13 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Persistence.Repositories { [TestFixture] - public class PartialViewRepositoryTests : BaseUmbracoApplicationTest + public class PartialViewRepositoryTests : TestWithApplicationBase { private IFileSystem _fileSystem; - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); _fileSystem = new PhysicalFileSystem(SystemDirectories.MvcViews + "/Partials/"); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs index 7b102b5858..4a4e8c02cb 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs @@ -18,7 +18,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class PublicAccessRepositoryTest : BaseDatabaseFactoryTest + public class PublicAccessRepositoryTest : TestWithDatabaseBase { [Test] public void Can_Delete() diff --git a/src/Umbraco.Tests/Persistence/Repositories/RedirectUrlRepositoryTests.cs b/src/Umbraco.Tests/Persistence/Repositories/RedirectUrlRepositoryTests.cs index d71b465b25..0a2a4a05f0 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RedirectUrlRepositoryTests.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RedirectUrlRepositoryTests.cs @@ -12,19 +12,13 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class RedirectUrlRepositoryTests : BaseDatabaseFactoryTest + public class RedirectUrlRepositoryTests : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); - CreateTestData(); - } + base.SetUp(); - [TearDown] - public override void TearDown() - { - base.TearDown(); + CreateTestData(); } [Test] diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs index aa6f2c194b..3dcdc843e6 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs @@ -19,12 +19,11 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class RelationRepositoryTest : BaseDatabaseFactoryTest + public class RelationRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); CreateTestData(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs index 71258925b2..6e5464a4c1 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs @@ -18,12 +18,11 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class RelationTypeRepositoryTest : BaseDatabaseFactoryTest + public class RelationTypeRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); CreateTestData(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs index 51bae37c4d..5b2d54592a 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs @@ -14,14 +14,13 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Persistence.Repositories { [TestFixture] - public class ScriptRepositoryTest : BaseUmbracoApplicationTest + public class ScriptRepositoryTest : TestWithApplicationBase { private IFileSystem _fileSystem; - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); _fileSystem = new PhysicalFileSystem(SystemDirectories.Scripts); using (var stream = CreateStream("Umbraco.Sys.registerNamespace(\"Umbraco.Utils\");")) diff --git a/src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs index 90b362d9a0..0f51c9014e 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ServerRegistrationRepositoryTest.cs @@ -17,14 +17,13 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class ServerRegistrationRepositoryTest : BaseDatabaseFactoryTest + public class ServerRegistrationRepositoryTest : TestWithDatabaseBase { private CacheHelper _cacheHelper; - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); _cacheHelper = new CacheHelper(); CreateTestData(); diff --git a/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs index fff6e8a483..23ce88bffb 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs @@ -16,14 +16,13 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] [TestFixture] - public class StylesheetRepositoryTest : BaseDatabaseFactoryTest + public class StylesheetRepositoryTest : TestWithDatabaseBase { private IFileSystem _fileSystem; - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); _fileSystem = new PhysicalFileSystem(SystemDirectories.Css); var stream = CreateStream("body {background:#EE7600; color:#FFF;}"); diff --git a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs index 568dd45ea6..ba88528333 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs @@ -19,20 +19,8 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class TagRepositoryTest : BaseDatabaseFactoryTest + public class TagRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - private TagRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { var tagRepository = new TagRepository(unitOfWork, DisabledCache, Logger, Mappers); diff --git a/src/Umbraco.Tests/Persistence/Repositories/TaskRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TaskRepositoryTest.cs index 3de328403c..336064f66a 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TaskRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TaskRepositoryTest.cs @@ -11,7 +11,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class TaskRepositoryTest : BaseDatabaseFactoryTest + public class TaskRepositoryTest : TestWithDatabaseBase { [Test] public void Can_Delete() diff --git a/src/Umbraco.Tests/Persistence/Repositories/TaskTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TaskTypeRepositoryTest.cs index 494b785468..fc079c5021 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TaskTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TaskTypeRepositoryTest.cs @@ -10,7 +10,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class TaskTypeRepositoryTest : BaseDatabaseFactoryTest + public class TaskTypeRepositoryTest : TestWithDatabaseBase { [Test] public void Can_Delete() diff --git a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs index ab3fe272cc..b26b32ecdf 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs @@ -23,7 +23,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class TemplateRepositoryTest : BaseDatabaseFactoryTest + public class TemplateRepositoryTest : TestWithDatabaseBase { private IFileSystem _masterPageFileSystem; private IFileSystem _viewsFileSystem; @@ -34,10 +34,9 @@ namespace Umbraco.Tests.Persistence.Repositories templatesSection ?? Mock.Of(t => t.DefaultRenderingEngine == RenderingEngine.Mvc), Mappers); } - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); _masterPageFileSystem = new PhysicalFileSystem(SystemDirectories.Masterpages); _viewsFileSystem = new PhysicalFileSystem(SystemDirectories.MvcViews); diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs index 58e69b1f18..67ced24ade 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs @@ -19,20 +19,8 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class UserRepositoryTest : BaseDatabaseFactoryTest + public class UserRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - private UserRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out UserTypeRepository userTypeRepository) { userTypeRepository = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), Mappers); diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs index 0728ae9bb5..571acbdb74 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs @@ -17,20 +17,8 @@ namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class UserTypeRepositoryTest : BaseDatabaseFactoryTest + public class UserTypeRepositoryTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - private UserTypeRepository CreateRepository(IDatabaseUnitOfWork unitOfWork) { return new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), Mappers); diff --git a/src/Umbraco.Tests/Persistence/SchemaValidationTest.cs b/src/Umbraco.Tests/Persistence/SchemaValidationTest.cs index 23d1e70354..5f005da7ab 100644 --- a/src/Umbraco.Tests/Persistence/SchemaValidationTest.cs +++ b/src/Umbraco.Tests/Persistence/SchemaValidationTest.cs @@ -10,20 +10,8 @@ namespace Umbraco.Tests.Persistence { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] [TestFixture] - public class SchemaValidationTest : BaseDatabaseFactoryTest + public class SchemaValidationTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void DatabaseSchemaCreation_Produces_DatabaseSchemaResult_With_Zero_Errors() { diff --git a/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs b/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs index a06354c513..1a71b256a0 100644 --- a/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs +++ b/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs @@ -7,7 +7,7 @@ namespace Umbraco.Tests.Persistence { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class SqlCeTableByTableTest : BaseDatabaseFactoryTest + public class SqlCeTableByTableTest : TestWithDatabaseBase { private DatabaseSchemaHelper _schemaHelper; @@ -16,18 +16,6 @@ namespace Umbraco.Tests.Persistence get { return _schemaHelper ?? (_schemaHelper = new DatabaseSchemaHelper(DatabaseContext.Database, Logger)); } } - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Can_Create_umbracoNode_Table() { diff --git a/src/Umbraco.Tests/Persistence/UnitOfWorkTests.cs b/src/Umbraco.Tests/Persistence/UnitOfWorkTests.cs index 4875d0b6e7..bc2eda432c 100644 --- a/src/Umbraco.Tests/Persistence/UnitOfWorkTests.cs +++ b/src/Umbraco.Tests/Persistence/UnitOfWorkTests.cs @@ -12,7 +12,7 @@ namespace Umbraco.Tests.Persistence { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class UnitOfWorkTests : BaseDatabaseFactoryTest + public class UnitOfWorkTests : TestWithDatabaseBase { [Test] public void ReadLockNonExisting() diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs index 1bbf39c84f..ac4d4a2586 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs @@ -17,9 +17,9 @@ namespace Umbraco.Tests.PublishedContent [TestFixture] public class PublishedContentDataTableTests : BaseWebTest { - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); // need to specify a different callback for testing PublishedContentExtensions.GetPropertyAliasesAndNames = (services, alias) => diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs index fdb973d2a1..6d5d34ac2c 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs @@ -14,6 +14,7 @@ using Umbraco.Web.PublishedCache; using Umbraco.Web.Routing; using Umbraco.Web.Security; using Umbraco.Core.DI; +using Umbraco.Tests.TestHelpers; using Current = Umbraco.Core.DI.Current; namespace Umbraco.Tests.PublishedContent @@ -28,9 +29,9 @@ namespace Umbraco.Tests.PublishedContent private PluginManager _pluginManager; - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); // this is so the model factory looks into the test assembly _pluginManager = Current.PluginManager; @@ -43,14 +44,14 @@ namespace Umbraco.Tests.PublishedContent InitializeUmbracoContext(); } - protected override void FreezeResolution() + protected override void MoreSetUp() { Container.RegisterCollectionBuilder(); var types = Current.PluginManager.ResolveTypes(); Container.RegisterSingleton(_ => new PublishedContentModelFactory(types)); - base.FreezeResolution(); + base.MoreSetUp(); } private void InitializeUmbracoContext() @@ -63,14 +64,14 @@ namespace Umbraco.Tests.PublishedContent facadeService.Setup(x => x.CreateFacade(It.IsAny())).Returns(facade); var httpContext = GetHttpContextFactory("http://umbraco.local/", routeData).HttpContext; - var ctx = UmbracoContext.CreateContext( + var umbracoContext = UmbracoContext.CreateContext( httpContext, facadeService.Object, new WebSecurity(httpContext, Current.Services.UserService), - Mock.Of(), + TestObjects.GetUmbracoSettings(), Enumerable.Empty()); - Umbraco.Web.Current.SetUmbracoContext(ctx, true); + Umbraco.Web.Current.SetUmbracoContext(umbracoContext, true); } public override void TearDown() diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs index d11eb4a645..fc7dc7a00d 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs @@ -13,9 +13,9 @@ namespace Umbraco.Tests.PublishedContent /// public abstract class PublishedContentTestBase : BaseWebTest { - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); // need to specify a custom callback for unit tests var propertyTypes = new[] @@ -30,7 +30,7 @@ namespace Umbraco.Tests.PublishedContent Umbraco.Web.Current.SetUmbracoContext(umbracoContext, true); } - protected override void FreezeResolution() + protected override void MoreSetUp() { // fixme - what about the if (PropertyValueConvertersResolver.HasCurrent == false) ?? // can we risk double - registering and then, what happens? @@ -39,7 +39,7 @@ namespace Umbraco.Tests.PublishedContent .Append() .Append(); - base.FreezeResolution(); + base.MoreSetUp(); } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs index ad98f6a3a8..10cee2072c 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs @@ -22,12 +22,12 @@ namespace Umbraco.Tests.PublishedContent { private PluginManager _pluginManager; - public override void Initialize() + public override void SetUp() { // required so we can access property.Value //PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver(); - base.Initialize(); + base.SetUp(); // this is so the model factory looks into the test assembly _pluginManager = Current.PluginManager; @@ -64,12 +64,12 @@ namespace Umbraco.Tests.PublishedContent Core.DI.Current.Reset(); } - protected override void FreezeResolution() + protected override void MoreSetUp() { var types = Current.PluginManager.ResolveTypes(); Container.RegisterSingleton(_ => new PublishedContentModelFactory(types)); - base.FreezeResolution(); + base.MoreSetUp(); } protected override string GetXmlContent(int templateId) diff --git a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs index acad140448..ac9cb7081f 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs @@ -32,12 +32,12 @@ namespace Umbraco.Tests.PublishedContent /// /// sets up resolvers before resolution is frozen /// - protected override void FreezeResolution() + protected override void MoreSetUp() { Container.RegisterCollectionBuilder() .Append(); - base.FreezeResolution(); + base.MoreSetUp(); } /// diff --git a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs index 50f5542de3..40714fbae2 100644 --- a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs +++ b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs @@ -12,12 +12,11 @@ namespace Umbraco.Tests.Publishing { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] - public class PublishingStrategyTests : BaseDatabaseFactoryTest + public class PublishingStrategyTests : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); //LegacyUmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); } diff --git a/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs index 5eb4a8f788..7f3c1fde8e 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs @@ -1,6 +1,4 @@ -using Moq; using NUnit.Framework; -using Umbraco.Core.Logging; using Umbraco.Web.Routing; namespace Umbraco.Tests.Routing @@ -9,9 +7,6 @@ namespace Umbraco.Tests.Routing [TestFixture] public class ContentFinderByAliasWithDomainsTests : ContentFinderByAliasTests { - - - [TestCase("http://domain1.com/this/is/my/alias", "de-DE", -1001)] // alias to domain's page fails - no alias on domain's home [TestCase("http://domain1.com/page2/alias", "de-DE", 10011)] // alias to sub-page works [TestCase("http://domain1.com/en/flux", "en-US", -10011)] // alias to domain's page fails - no alias on domain's home diff --git a/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlAndTemplateTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlAndTemplateTests.cs index 6b62dd4bb5..75ecede0ef 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlAndTemplateTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlAndTemplateTests.cs @@ -1,9 +1,6 @@ -using Moq; using NUnit.Framework; -using Umbraco.Core.Logging; using Umbraco.Tests.TestHelpers; using Umbraco.Web.Routing; -using umbraco.BusinessLogic; using Umbraco.Core.Models; using Current = Umbraco.Web.Current; @@ -28,8 +25,9 @@ namespace Umbraco.Tests.Routing [TestCase("/home/Sub1.aspx/blah")] public void Match_Document_By_Url_With_Template(string urlAsString) { - var template = CreateTemplate("test"); - var umbracoContext = GetUmbracoContext(urlAsString, template.Id); + var template1 = CreateTemplate("test"); + var template2 = CreateTemplate("blah"); + var umbracoContext = GetUmbracoContext(urlAsString, template1.Id); var facadeRouter = CreateFacadeRouter(); var frequest = facadeRouter.CreateRequest(umbracoContext); var lookup = new ContentFinderByNiceUrlAndTemplate(Logger); diff --git a/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs index 512979ab17..8165af45be 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByNiceUrlWithDomainsTests.cs @@ -126,7 +126,7 @@ namespace Umbraco.Tests.Routing SettingsForTests.HideTopLevelNodeFromPath = true; var umbracoContext = GetUmbracoContext(url); - var facadeRouter = CreateFacadeRouter(); + var facadeRouter = CreateFacadeRouter(Container); var frequest = facadeRouter.CreateRequest(umbracoContext); // must lookup domain else lookup by url fails @@ -167,7 +167,7 @@ namespace Umbraco.Tests.Routing SettingsForTests.HideTopLevelNodeFromPath = true; var umbracoContext = GetUmbracoContext(url); - var facadeRouter = CreateFacadeRouter(); + var facadeRouter = CreateFacadeRouter(Container); var frequest = facadeRouter.CreateRequest(umbracoContext); // must lookup domain else lookup by url fails diff --git a/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs index 075d534729..faa0286cc7 100644 --- a/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs +++ b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs @@ -16,9 +16,9 @@ namespace Umbraco.Tests.Routing [TestFixture] internal class DomainsAndCulturesTests : UrlRoutingTestBase { - protected override void FreezeResolution() + protected override void MoreSetUp() { - base.FreezeResolution(); + base.MoreSetUp(); Container.Register(); } @@ -270,7 +270,7 @@ namespace Umbraco.Tests.Routing SetDomains1(); var umbracoContext = GetUmbracoContext(inputUrl); - var facadeRouter = CreateFacadeRouter(); + var facadeRouter = CreateFacadeRouter(Container); var frequest = facadeRouter.CreateRequest(umbracoContext); // lookup domain @@ -317,7 +317,7 @@ namespace Umbraco.Tests.Routing expectedCulture = expectedCulture ?? System.Threading.Thread.CurrentThread.CurrentUICulture.Name; var umbracoContext = GetUmbracoContext(inputUrl); - var facadeRouter = CreateFacadeRouter(); + var facadeRouter = CreateFacadeRouter(Container); var frequest = facadeRouter.CreateRequest(umbracoContext); // lookup domain diff --git a/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs b/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs index 7346e85069..02ff579104 100644 --- a/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs +++ b/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs @@ -14,17 +14,17 @@ namespace Umbraco.Tests.Routing [TestFixture] public class NiceUrlProviderTests : BaseWebTest { - protected override void FreezeResolution() + protected override void MoreSetUp() { - base.FreezeResolution(); + base.MoreSetUp(); Container.Register(); } private IUmbracoSettingsSection _umbracoSettings; - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); //generate new mock settings and assign so we can configure in individual tests _umbracoSettings = SettingsForTests.GenerateMockSettings(); @@ -38,7 +38,7 @@ namespace Umbraco.Tests.Routing [Test] public void Ensure_Cache_Is_Correct() { - var umbracoContext = GetUmbracoContext("/test", 1111); + var umbracoContext = GetUmbracoContext("/test", 1111, urlProviders: new [] { new DefaultUrlProvider(_umbracoSettings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; @@ -102,7 +102,7 @@ namespace Umbraco.Tests.Routing [TestCase(1172, "/test-page/")] public void Get_Nice_Url_Not_Hiding_Top_Level(int nodeId, string niceUrlMatch) { - var umbracoContext = GetUmbracoContext("/test", 1111); + var umbracoContext = GetUmbracoContext("/test", 1111, urlProviders: new[] { new DefaultUrlProvider(_umbracoSettings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; @@ -126,7 +126,7 @@ namespace Umbraco.Tests.Routing [TestCase(1172, "/test-page/")] // not hidden because not first root public void Get_Nice_Url_Hiding_Top_Level(int nodeId, string niceUrlMatch) { - var umbracoContext = GetUmbracoContext("/test", 1111); + var umbracoContext = GetUmbracoContext("/test", 1111, urlProviders: new[] { new DefaultUrlProvider(_umbracoSettings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = true; @@ -145,7 +145,7 @@ namespace Umbraco.Tests.Routing var requestMock = Mock.Get(_umbracoSettings.RequestHandler); requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); - var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, umbracoSettings: _umbracoSettings); + var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, umbracoSettings: _umbracoSettings, urlProviders: new[] { new DefaultUrlProvider(_umbracoSettings.RequestHandler, Logger) }); Assert.AreEqual("/home/sub1/custom-sub-1/", umbracoContext.UrlProvider.GetUrl(1177)); @@ -160,7 +160,7 @@ namespace Umbraco.Tests.Routing [Test] public void Get_Nice_Url_Unpublished() { - var umbracoContext = GetUmbracoContext("http://example.com/test", 1111); + var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, urlProviders: new[] { new DefaultUrlProvider(_umbracoSettings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; diff --git a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs index 407bd13380..495f1cbea5 100644 --- a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs @@ -1,32 +1,35 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using Moq; using NUnit.Framework; -using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models; +using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; -using Umbraco.Web.PublishedCache; using Umbraco.Web.PublishedCache.XmlPublishedCache; using Umbraco.Web.Routing; -using umbraco.cms.businesslogic.web; -using System.Configuration; +using Umbraco.Core.DI; + namespace Umbraco.Tests.Routing { [TestFixture] public class NiceUrlsProviderWithDomainsTests : UrlRoutingTestBase { - protected override void FreezeResolution() + protected override void Compose() { - base.FreezeResolution(); + base.Compose(); + + Container.RegisterSingleton(_ => Mock.Of()); + } + + protected override void MoreSetUp() + { + base.MoreSetUp(); Container.Register(); } - void SetDomains1() { - SetupDomainServiceMock(new[] { new UmbracoDomain("domain1.com") {Id = 1, LanguageId = LangFrId, RootContentId = 1001, LanguageIsoCode = "fr-FR"} @@ -179,7 +182,7 @@ namespace Umbraco.Tests.Routing var request = Mock.Get(settings.RequestHandler); request.Setup(x => x.UseDomainPrefixes).Returns(false); - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings); + var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] { new DefaultUrlProvider(settings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains @@ -210,7 +213,7 @@ namespace Umbraco.Tests.Routing var request = Mock.Get(settings.RequestHandler); request.Setup(x => x.UseDomainPrefixes).Returns(false); - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings); + var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] { new DefaultUrlProvider(settings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains @@ -233,7 +236,7 @@ namespace Umbraco.Tests.Routing var request = Mock.Get(settings.RequestHandler); request.Setup(x => x.UseDomainPrefixes).Returns(false); - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings); + var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] { new DefaultUrlProvider(settings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains @@ -262,7 +265,7 @@ namespace Umbraco.Tests.Routing var request = Mock.Get(settings.RequestHandler); request.Setup(x => x.UseDomainPrefixes).Returns(false); - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings); + var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] { new DefaultUrlProvider(settings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains @@ -281,7 +284,7 @@ namespace Umbraco.Tests.Routing var request = Mock.Get(settings.RequestHandler); request.Setup(x => x.UseDomainPrefixes).Returns(false); - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings); + var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] { new DefaultUrlProvider(settings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; // ignored w/domains @@ -344,7 +347,7 @@ namespace Umbraco.Tests.Routing var requestMock = Mock.Get(settings.RequestHandler); requestMock.Setup(x => x.UseDomainPrefixes).Returns(false); - var umbracoContext = GetUmbracoContext("http://domain1.com/test", 1111, umbracoSettings: settings); + var umbracoContext = GetUmbracoContext("http://domain1.com/test", 1111, umbracoSettings: settings, urlProviders: new[] { new DefaultUrlProvider(settings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; @@ -370,7 +373,7 @@ namespace Umbraco.Tests.Routing public void Get_Nice_Url_Alternate() { var settings = SettingsForTests.GenerateMockSettings(); - var umbracoContext = GetUmbracoContext("http://domain1.com/en/test", 1111, umbracoSettings: settings); + var umbracoContext = GetUmbracoContext("http://domain1.com/en/test", 1111, umbracoSettings: settings, urlProviders: new[] { new DefaultUrlProvider(settings.RequestHandler, Logger) }); SettingsForTests.UseDirectoryUrls = true; SettingsForTests.HideTopLevelNodeFromPath = false; diff --git a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs index f0bdecd8fb..afd6a01629 100644 --- a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs +++ b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs @@ -25,9 +25,9 @@ namespace Umbraco.Tests.Routing [TestFixture] public class RenderRouteHandlerTests : BaseWebTest { - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); SettingsForTests.UmbracoPath = "~/umbraco"; @@ -56,7 +56,7 @@ namespace Umbraco.Tests.Routing } } - protected override void FreezeResolution() + protected override void MoreSetUp() { // set the default RenderMvcController Current.DefaultRenderMvcControllerType = typeof(RenderMvcController); // fixme WRONG! @@ -69,7 +69,7 @@ namespace Umbraco.Tests.Routing Container.RegisterSingleton(_ => new DefaultShortStringHelper(SettingsForTests.GetDefault())); - base.FreezeResolution(); + base.MoreSetUp(); } public override void TearDown() diff --git a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs index 26a96e7d1f..eb61d02a6b 100644 --- a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs +++ b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs @@ -1,11 +1,14 @@ using System; using System.IO; +using Moq; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Tests.TestHelpers; using Umbraco.Web; using Umbraco.Core.IO; +using Umbraco.Core.Logging; +using Umbraco.Core.Sync; namespace Umbraco.Tests.Routing { @@ -14,13 +17,19 @@ namespace Umbraco.Tests.Routing { private UmbracoModule _module; - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); //create the module _module = new UmbracoModule(); + // test + _module.Logger = Mock.Of(); + var runtime = new RuntimeState(_module.Logger, new Lazy(), new Lazy()); + _module.Runtime = runtime; + runtime.Level = RuntimeLevel.Run; + SettingsForTests.ConfigurationStatus = UmbracoVersion.SemanticVersion.ToSemanticString(); //SettingsForTests.ReservedPaths = "~/umbraco,~/install/"; //SettingsForTests.ReservedUrls = "~/config/splashes/booting.aspx,~/install/default.aspx,~/config/splashes/noNodes.aspx,~/VSEnterpriseHelper.axd"; diff --git a/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs b/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs index c169ccfc8d..f14e4d4a5d 100644 --- a/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs +++ b/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs @@ -2,8 +2,7 @@ using System.Collections.Generic; using System.Linq; using Moq; using NUnit.Framework; -using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.Logging; +using Umbraco.Core.DI; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; @@ -15,7 +14,7 @@ namespace Umbraco.Tests.Routing public abstract class UrlRoutingTestBase : BaseWebTest { /// - /// Sets up the mock domain service + /// Sets up the mock domain service /// /// protected IDomainService SetupDomainServiceMock(IEnumerable allDomains) @@ -29,13 +28,20 @@ namespace Umbraco.Tests.Routing return domainService.Object; } - protected ServiceContext GetServiceContext(IUmbracoSettingsSection umbracoSettings, ILogger logger) + protected override void Compose() { - //get the mocked service context to get the mocked domain service - var svcCtx = TestObjects.GetServiceContextMock(); + base.Compose(); + + Container.RegisterSingleton(_ => GetServiceContext()); + } + + protected ServiceContext GetServiceContext() + { + // get the mocked service context to get the mocked domain service + var serviceContext = TestObjects.GetServiceContextMock(Container); - var domainService = Mock.Get(svcCtx.DomainService); //setup mock domain service + var domainService = Mock.Get(serviceContext.DomainService); domainService.Setup(service => service.GetAll(It.IsAny())) .Returns((bool incWildcards) => new[] { @@ -44,7 +50,7 @@ namespace Umbraco.Tests.Routing new UmbracoDomain("domain1.com/fr"){Id = 1, LanguageId = LangFrId, RootContentId = 10012, LanguageIsoCode = "fr-FR"} }); - return svcCtx; + return serviceContext; } public const int LangDeId = 333; @@ -53,19 +59,5 @@ namespace Umbraco.Tests.Routing public const int LangCzId = 336; public const int LangNlId = 337; public const int LangDkId = 338; - - //protected override ApplicationContext CreateApplicationContext() - //{ - // var settings = SettingsForTests.GetDefault(); - // var databaseFactory = TestObjects.GetIDatabaseFactoryMock(); - // return new ApplicationContext( - // new DatabaseContext(databaseFactory, Logger, Mock.Of(), Mock.Of()), - // GetServiceContext(settings, Logger), - // CacheHelper, - // ProfilingLogger) - // { - // //IsReady = true - // }; - //} } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs index dd33dbf052..467e1eb4c5 100644 --- a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs +++ b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs @@ -1,18 +1,12 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using Moq; using NUnit.Framework; -using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; -using Umbraco.Web.PublishedCache; using Umbraco.Web.PublishedCache.XmlPublishedCache; using Umbraco.Web.Routing; -using umbraco.cms.businesslogic.web; -using System.Configuration; -using Umbraco.Web; +using Umbraco.Core.Services; +using Umbraco.Core.DI; namespace Umbraco.Tests.Routing { @@ -24,7 +18,13 @@ namespace Umbraco.Tests.Routing // using the closest domain to the node - here we test that if we request // a non-canonical route, it is not cached / the cache is not polluted - [Test] + protected override void Compose() + { + base.Compose(); + Container.RegisterSingleton(_ => Mock.Of()); + } + + [Test] public void DoNotPolluteCache() { SettingsForTests.UseDirectoryUrls = true; @@ -36,11 +36,10 @@ namespace Umbraco.Tests.Routing SetDomains1(); - UmbracoContext umbracoContext; - string url = "http://domain1.com/1001-1/1001-1-1"; + const string url = "http://domain1.com/1001-1/1001-1-1"; // get the nice url for 100111 - umbracoContext = GetUmbracoContext(url, 9999, umbracoSettings: settings); + var umbracoContext = GetUmbracoContext(url, 9999, umbracoSettings: settings, urlProviders: new [] { new DefaultUrlProvider(settings.RequestHandler, Logger) }); Assert.AreEqual("http://domain2.com/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111, true)); // check that the proper route has been cached @@ -72,9 +71,9 @@ namespace Umbraco.Tests.Routing //Assert.AreEqual("http://domain1.com/1001-1/1001-1-1", routingContext.NiceUrlProvider.GetNiceUrl(100111, true)); // bad } - protected override void FreezeResolution() + protected override void MoreSetUp() { - base.FreezeResolution(); + base.MoreSetUp(); Container.Register(); } diff --git a/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs b/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs index 73b88f52fa..b2dfac9ee5 100644 --- a/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs +++ b/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs @@ -6,7 +6,6 @@ using NUnit.Framework; using Semver; using Umbraco.Core; using Umbraco.Core.Components; -using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.DI; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; @@ -17,20 +16,20 @@ using UmbracoExamine; namespace Umbraco.Tests.Runtimes { [TestFixture] - public class CoreRuntimeTests : BaseUmbracoConfigurationTest + public class CoreRuntimeTests : TestWithSettingsBase { - public override void Initialize() // fixme SetUp! + public override void SetUp() { - base.Initialize(); + base.SetUp(); + TestComponent.Reset(); } - [TearDown] // fixme TearDown is INHERITED public override void TearDown() { base.TearDown(); + TestComponent.Reset(); - Current.Reset(); } [Test] diff --git a/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs b/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs index 75cb0a4576..d70dec36cb 100644 --- a/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs +++ b/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs @@ -6,12 +6,7 @@ using Microsoft.Owin; using Moq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Cache; using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.Logging; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Profiling; using Umbraco.Tests.TestHelpers; using Umbraco.Web; using Umbraco.Web.PublishedCache; @@ -22,7 +17,7 @@ using Umbraco.Web.Security.Identity; namespace Umbraco.Tests.Security { [TestFixture] - public class BackOfficeCookieManagerTests + public class BackOfficeCookieManagerTests : TestWithApplicationBase { [Test] public void ShouldAuthenticateRequest_When_Not_Configured() @@ -30,22 +25,14 @@ namespace Umbraco.Tests.Security //should force app ctx to show not-configured ConfigurationManager.AppSettings.Set("umbracoConfigurationStatus", ""); - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(false); - //var dbCtx = new Mock(databaseFactory, Mock.Of()); - - //var appCtx = new ApplicationContext( - // dbCtx.Object, - // TestObjects.GetServiceContextMock(), - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - - var umbCtx = UmbracoContext.CreateContext( + var umbracoContext = UmbracoContext.CreateContext( Mock.Of(), Mock.Of(), new WebSecurity(Mock.Of(), Current.Services.UserService), - Mock.Of(), new List()); + TestObjects.GetUmbracoSettings(), new List()); - var mgr = new BackOfficeCookieManager(Mock.Of(accessor => accessor.UmbracoContext == umbCtx), Mock.Of()); + var runtime = Mock.Of(x => x.Level == RuntimeLevel.Install); + var mgr = new BackOfficeCookieManager(Mock.Of(accessor => accessor.UmbracoContext == umbracoContext), runtime); var result = mgr.ShouldAuthenticateRequest(Mock.Of(), new Uri("http://localhost/umbraco")); @@ -55,22 +42,14 @@ namespace Umbraco.Tests.Security [Test] public void ShouldAuthenticateRequest_When_Configured() { - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(); - var dbCtx = new Mock(databaseFactory, Mock.Of()); - - //var appCtx = new ApplicationContext( - // dbCtx.Object, - // TestObjects.GetServiceContextMock(), - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - var umbCtx = UmbracoContext.CreateContext( Mock.Of(), Mock.Of(), new WebSecurity(Mock.Of(), Current.Services.UserService), - Mock.Of(), new List()); + TestObjects.GetUmbracoSettings(), new List()); - var mgr = new BackOfficeCookieManager(Mock.Of(accessor => accessor.UmbracoContext == umbCtx), Mock.Of()); + var runtime = Mock.Of(x => x.Level == RuntimeLevel.Run); + var mgr = new BackOfficeCookieManager(Mock.Of(accessor => accessor.UmbracoContext == umbCtx), runtime); var request = new Mock(); request.Setup(owinRequest => owinRequest.Uri).Returns(new Uri("http://localhost/umbraco")); diff --git a/src/Umbraco.Tests/Services/BaseServiceTest.cs b/src/Umbraco.Tests/Services/BaseServiceTest.cs index 281fd33760..2a2ff736fa 100644 --- a/src/Umbraco.Tests/Services/BaseServiceTest.cs +++ b/src/Umbraco.Tests/Services/BaseServiceTest.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using NUnit.Framework; using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; @@ -7,20 +8,13 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Services { [TestFixture, RequiresSTA] - public abstract class BaseServiceTest : BaseDatabaseFactoryTest + public abstract class BaseServiceTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); - CreateTestData(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); + CreateTestData(); } public virtual void CreateTestData() diff --git a/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs b/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs index f1cde2c002..0513cc82b4 100644 --- a/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs +++ b/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs @@ -19,19 +19,18 @@ namespace Umbraco.Tests.Services { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, NUnit.Framework.Ignore] - public class ContentServicePerformanceTest : BaseDatabaseFactoryTest + public class ContentServicePerformanceTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); CreateTestData(); } - protected override void FreezeResolution() + protected override void MoreSetUp() { Container.Register(); - base.FreezeResolution(); + base.MoreSetUp(); } [Test] diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index 92a1ec7166..cb84c21da3 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -5,17 +5,16 @@ using System.Linq; using System.Threading; using Moq; using NUnit.Framework; -using Umbraco.Core; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.DI; using Umbraco.Core.IO; -using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; @@ -32,21 +31,18 @@ namespace Umbraco.Tests.Services [TestSetup.FacadeService(EnableRepositoryEvents = true)] public class ContentServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - //TODO Add test to verify there is only ONE newest document/content in cmsDocument table after updating. //TODO Add test to delete specific version (with and without deleting prior versions) and versions by date. + protected override void Compose() + { + base.Compose(); + + // fixme - do it differently + Container.RegisterCollectionBuilder(); + Container.Register(factory => factory.GetInstance().TextService); + } + [Test] public void Remove_Scheduled_Publishing_Date() { diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceExtensionsTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceExtensionsTests.cs index ed29cb2108..6779c523f8 100644 --- a/src/Umbraco.Tests/Services/ContentTypeServiceExtensionsTests.cs +++ b/src/Umbraco.Tests/Services/ContentTypeServiceExtensionsTests.cs @@ -11,7 +11,7 @@ using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Services { [TestFixture] - public class ContentTypeServiceExtensionsTests : BaseUmbracoApplicationTest + public class ContentTypeServiceExtensionsTests : TestWithApplicationBase { [Test] public void GetAvailableCompositeContentTypes_No_Overlap_By_Content_Type_And_Property_Type_Alias() diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs index 34866be8b9..8774bef524 100644 --- a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs @@ -19,18 +19,6 @@ namespace Umbraco.Tests.Services [TestSetup.FacadeService(EnableRepositoryEvents = true)] public class ContentTypeServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Deleting_PropertyType_Removes_The_Property_From_Content() { diff --git a/src/Umbraco.Tests/Services/DataTypeServiceTests.cs b/src/Umbraco.Tests/Services/DataTypeServiceTests.cs index 9793b04837..85236bd1ae 100644 --- a/src/Umbraco.Tests/Services/DataTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/DataTypeServiceTests.cs @@ -16,20 +16,6 @@ namespace Umbraco.Tests.Services [TestFixture, RequiresSTA] public class DataTypeServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - - - [Test] public void DataTypeService_Can_Persist_New_DataTypeDefinition() { diff --git a/src/Umbraco.Tests/Services/EntityServiceTests.cs b/src/Umbraco.Tests/Services/EntityServiceTests.cs index 34ac48e373..db2416a67e 100644 --- a/src/Umbraco.Tests/Services/EntityServiceTests.cs +++ b/src/Umbraco.Tests/Services/EntityServiceTests.cs @@ -15,18 +15,6 @@ namespace Umbraco.Tests.Services [TestFixture, RequiresSTA] public class EntityServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void EntityService_Can_Find_All_Content_By_UmbracoObjectTypes() { diff --git a/src/Umbraco.Tests/Services/FileServiceTests.cs b/src/Umbraco.Tests/Services/FileServiceTests.cs index 38f93c9195..85e3aa981c 100644 --- a/src/Umbraco.Tests/Services/FileServiceTests.cs +++ b/src/Umbraco.Tests/Services/FileServiceTests.cs @@ -13,19 +13,6 @@ namespace Umbraco.Tests.Services [TestFixture, RequiresSTA] public class FileServiceTests : BaseServiceTest { - - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Create_Template_Then_Assign_Child() { diff --git a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs index 59000afe14..5c503d9f24 100644 --- a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs +++ b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs @@ -15,18 +15,6 @@ namespace Umbraco.Tests.Services.Importing [TestFixture, RequiresSTA] public class PackageImportTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void PackagingService_Can_Import_uBlogsy_ContentTypes_And_Verify_Structure() { diff --git a/src/Umbraco.Tests/Services/LocalizationServiceTests.cs b/src/Umbraco.Tests/Services/LocalizationServiceTests.cs index 4e2e744660..1b218212b5 100644 --- a/src/Umbraco.Tests/Services/LocalizationServiceTests.cs +++ b/src/Umbraco.Tests/Services/LocalizationServiceTests.cs @@ -25,18 +25,6 @@ namespace Umbraco.Tests.Services private int _danishLangId; private int _englishLangId; - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Can_Get_Root_Dictionary_Items() { diff --git a/src/Umbraco.Tests/Services/MacroServiceTests.cs b/src/Umbraco.Tests/Services/MacroServiceTests.cs index c2c1f24352..8fe9a0a850 100644 --- a/src/Umbraco.Tests/Services/MacroServiceTests.cs +++ b/src/Umbraco.Tests/Services/MacroServiceTests.cs @@ -16,12 +16,6 @@ namespace Umbraco.Tests.Services [TestFixture, RequiresSTA] public class MacroServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - public override void CreateTestData() { base.CreateTestData(); diff --git a/src/Umbraco.Tests/Services/MediaServiceTests.cs b/src/Umbraco.Tests/Services/MediaServiceTests.cs index b8b78298b0..2855d22669 100644 --- a/src/Umbraco.Tests/Services/MediaServiceTests.cs +++ b/src/Umbraco.Tests/Services/MediaServiceTests.cs @@ -19,18 +19,6 @@ namespace Umbraco.Tests.Services [TestSetup.FacadeService(EnableRepositoryEvents = true)] public class MediaServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Can_Move_Media() { diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index bc87dd506f..13de4c3952 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -23,18 +23,6 @@ namespace Umbraco.Tests.Services [TestSetup.FacadeService(EnableRepositoryEvents = true)] public class MemberServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Can_Create_Role() { diff --git a/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs b/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs index 947d0eafff..18b6c1f6f0 100644 --- a/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs @@ -16,18 +16,6 @@ namespace Umbraco.Tests.Services [TestSetup.FacadeService(EnableRepositoryEvents = true)] public class MemberTypeServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Member_Cannot_Edit_Property() { diff --git a/src/Umbraco.Tests/Services/PackagingServiceTests.cs b/src/Umbraco.Tests/Services/PackagingServiceTests.cs index 5b3db6c05e..2096e0d876 100644 --- a/src/Umbraco.Tests/Services/PackagingServiceTests.cs +++ b/src/Umbraco.Tests/Services/PackagingServiceTests.cs @@ -17,18 +17,6 @@ namespace Umbraco.Tests.Services [TestFixture] public class PackagingServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void PackagingService_Can_Export_Macro() { diff --git a/src/Umbraco.Tests/Services/PerformanceTests.cs b/src/Umbraco.Tests/Services/PerformanceTests.cs index 173dca66a2..a561be8d6f 100644 --- a/src/Umbraco.Tests/Services/PerformanceTests.cs +++ b/src/Umbraco.Tests/Services/PerformanceTests.cs @@ -31,14 +31,8 @@ namespace Umbraco.Tests.Services [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] [NUnit.Framework.Ignore("These should not be run by the server, only directly as they are only benchmark tests")] - public class PerformanceTests : BaseDatabaseFactoryTest + public class PerformanceTests : TestWithDatabaseBase { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - protected override string GetDbConnectionString() { return @"server=.\SQLEXPRESS;database=UmbTest;user id=sa;password=test"; diff --git a/src/Umbraco.Tests/Services/PublicAccessServiceTests.cs b/src/Umbraco.Tests/Services/PublicAccessServiceTests.cs index 57fe377262..9ac2a99b67 100644 --- a/src/Umbraco.Tests/Services/PublicAccessServiceTests.cs +++ b/src/Umbraco.Tests/Services/PublicAccessServiceTests.cs @@ -12,18 +12,6 @@ namespace Umbraco.Tests.Services [TestFixture, RequiresSTA] public class PublicAccessServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Can_Add_New_Entry() { diff --git a/src/Umbraco.Tests/Services/RelationServiceTests.cs b/src/Umbraco.Tests/Services/RelationServiceTests.cs index d98ff2b128..93eedf3da9 100644 --- a/src/Umbraco.Tests/Services/RelationServiceTests.cs +++ b/src/Umbraco.Tests/Services/RelationServiceTests.cs @@ -10,18 +10,6 @@ namespace Umbraco.Tests.Services [TestFixture, RequiresSTA] public class RelationServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void Can_Create_RelationType_Without_Name() { diff --git a/src/Umbraco.Tests/Services/TagServiceTests.cs b/src/Umbraco.Tests/Services/TagServiceTests.cs index 4a98584bb7..06344d2172 100644 --- a/src/Umbraco.Tests/Services/TagServiceTests.cs +++ b/src/Umbraco.Tests/Services/TagServiceTests.cs @@ -16,18 +16,6 @@ namespace Umbraco.Tests.Services [TestFixture, RequiresSTA] public class TagServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void TagList_Contains_NodeCount() { diff --git a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs index f3dd0751eb..6bda8311de 100644 --- a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs +++ b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs @@ -6,87 +6,85 @@ using System.Data.Common; using System.Diagnostics; using System.Linq; using System.Threading; -using Moq; using NPoco; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Services; -using Umbraco.Core.Strings; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; -using Umbraco.Core.Events; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; -using Current = Umbraco.Core.DI.Current; +using Umbraco.Core.DI; namespace Umbraco.Tests.Services { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture, RequiresSTA] - public class ThreadSafetyServiceTest : BaseDatabaseFactoryTest + public class ThreadSafetyServiceTest : TestWithDatabaseBase { - private IDatabaseUnitOfWorkProvider _uowProvider; - private PerThreadSqlCeDatabaseFactory _dbFactory; - private DatabaseContext _dbContext; - private ServiceContext _services; + //private IDatabaseUnitOfWorkProvider _uowProvider; + //private PerThreadSqlCeDatabaseFactory _dbFactory; + private IUmbracoDatabaseAccessor _accessor; + // private DatabaseContext _dbContext; + // private ServiceContext _services; - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); - //we need to use our own custom IDatabaseFactory for the DatabaseContext because we MUST ensure that - //a Database instance is created per thread, whereas the default implementation which will work in an HttpContext - //threading environment, or a single apartment threading environment will not work for this test because - //it is multi-threaded. - _dbFactory = new PerThreadSqlCeDatabaseFactory(Logger, Mock.Of()); - var repositoryFactory = new RepositoryFactory(Container); - _uowProvider = new NPocoUnitOfWorkProvider(_dbFactory, repositoryFactory); + // //we need to use our own custom IDatabaseFactory for the DatabaseContext because we MUST ensure that + // //a Database instance is created per thread, whereas the default implementation which will work in an HttpContext + // //threading environment, or a single apartment threading environment will not work for this test because + // //it is multi-threaded. + // _dbFactory = new PerThreadSqlCeDatabaseFactory(Logger, Mock.Of()); + // var repositoryFactory = new RepositoryFactory(Container); + // _uowProvider = new NPocoUnitOfWorkProvider(_dbFactory, repositoryFactory); - // overwrite the local object - _dbContext = new DatabaseContext(_dbFactory, Logger, Mock.Of(), Mock.Of()); + // // overwrite the local object + // _dbContext = new DatabaseContext(_dbFactory, Logger, Mock.Of(), Mock.Of()); - //disable cache - var cacheHelper = CacheHelper.CreateDisabledCacheHelper(); + // //disable cache + // var cacheHelper = CacheHelper.CreateDisabledCacheHelper(); - //here we are going to override the ServiceContext because normally with our test cases we use a - //global Database object but this is NOT how it should work in the web world or in any multi threaded scenario. - //we need a new Database object for each thread. - var evtMsgs = new TransientEventMessagesFactory(); - _services = TestObjects.GetServiceContext( - repositoryFactory, - _uowProvider, - new FileUnitOfWorkProvider(), - cacheHelper, - Logger, - evtMsgs, - Enumerable.Empty()); + ////here we are going to override the ServiceContext because normally with our test cases we use a + ////global Database object but this is NOT how it should work in the web world or in any multi threaded scenario. + ////we need a new Database object for each thread. + // var evtMsgs = new TransientEventMessagesFactory(); + // _services = TestObjects.GetServiceContext( + // repositoryFactory, + // _uowProvider, + // new FileUnitOfWorkProvider(), + // cacheHelper, + // Logger, + // evtMsgs, + // Enumerable.Empty()); CreateTestData(); } - protected override void ConfigureContainer() + protected override void Compose() { - base.ConfigureContainer(); + base.Compose(); //replace some services - Container.Register(factory => _dbFactory); + //Container.Register(factory => _dbFactory); + //Container.Register(f => _dbFactory = new PerThreadSqlCeDatabaseFactory(f.GetInstance(), f.GetInstance())); + Container.RegisterSingleton(f => _accessor = new ThreadStaticUmbracoDatabaseAccessor()); // per-thread database - Container.Register(factory => _dbContext); - Container.Register(factory => _services); + //Container.Register(factory => _dbContext); + //Container.Register(factory => _services); } - [TearDown] public override void TearDown() { // dispose! - _dbFactory?.Dispose(); + // _dbFactory?.Dispose(); + _accessor.UmbracoDatabase?.Dispose(); base.TearDown(); } @@ -96,55 +94,58 @@ namespace Umbraco.Tests.Services [Test] public void Ensure_All_Threads_Execute_Successfully_Content_Service() { - //we will mimick the ServiceContext in that each repository in a service (i.e. ContentService) is a singleton - var contentService = (ContentService)ServiceContext.ContentService; + var contentService = (ContentService) ServiceContext.ContentService; var threads = new List(); var exceptions = new List(); - Debug.WriteLine("Starting test..."); + Debug.WriteLine("Starting test"); - for (var i = 0; i < MaxThreadCount; i++) + for (var i = 0; i < MaxThreadCount; i++) { var t = new Thread(() => + { + try { - try - { - //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Create 1st content."); - var content1 = contentService.CreateContent("test" + Guid.NewGuid(), -1, "umbTextpage", 0); + //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Create 1st content."); + var content1 = contentService.CreateContent("test" + Guid.NewGuid(), -1, "umbTextpage", 0); - //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Save 1st content."); - contentService.Save(content1); - //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Saved 1st content."); + //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Save 1st content."); + contentService.Save(content1); + //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Saved 1st content."); - Thread.Sleep(100); //quick pause for maximum overlap! + Thread.Sleep(100); //quick pause for maximum overlap! - //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Create 2nd content."); - var content2 = contentService.CreateContent("test" + Guid.NewGuid(), -1, "umbTextpage", 0); + //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Create 2nd content."); + var content2 = contentService.CreateContent("test" + Guid.NewGuid(), -1, "umbTextpage", 0); - //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Save 2nd content."); - contentService.Save(content2); - //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Saved 2nd content."); - } - catch (Exception e) - { - //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Exception!"); - lock (exceptions) { exceptions.Add(e); } - } - }); + //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Save 2nd content."); + contentService.Save(content2); + //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Saved 2nd content."); + } + catch (Exception e) + { + //Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ({DateTime.Now.ToString("HH:mm:ss,FFF")}) Exception!"); + lock (exceptions) { exceptions.Add(e); } + } + }); threads.Add(t); } - //start all threads - threads.ForEach(x => x.Start()); + // start all threads + Debug.WriteLine("Starting threads"); + threads.ForEach(x => x.Start()); - //wait for all to complete - threads.ForEach(x => x.Join()); + // wait for all to complete + Debug.WriteLine("Joining threads"); + threads.ForEach(x => x.Join()); - //kill them all - threads.ForEach(x => x.Abort()); + // kill them all + // uh? no! + //threads.ForEach(x => x.Abort()); - if (exceptions.Count == 0) + Debug.WriteLine("Checking exceptions"); + if (exceptions.Count == 0) { //now look up all items, there should be 40! var items = contentService.GetRootContent(); @@ -154,7 +155,6 @@ namespace Umbraco.Tests.Services { throw new Exception("Exceptions!", exceptions.First()); // rethrow the first one... } - } [Test] @@ -203,7 +203,8 @@ namespace Umbraco.Tests.Services threads.ForEach(x => x.Join()); //kill them all - threads.ForEach(x => x.Abort()); + // uh? no! + //threads.ForEach(x => x.Abort()); if (exceptions.Count == 0) { diff --git a/src/Umbraco.Tests/Services/UserServiceTests.cs b/src/Umbraco.Tests/Services/UserServiceTests.cs index 0ca0f11ebf..3ba0981249 100644 --- a/src/Umbraco.Tests/Services/UserServiceTests.cs +++ b/src/Umbraco.Tests/Services/UserServiceTests.cs @@ -18,18 +18,6 @@ namespace Umbraco.Tests.Services [TestFixture, RequiresSTA] public class UserServiceTests : BaseServiceTest { - [SetUp] - public override void Initialize() - { - base.Initialize(); - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - } - [Test] public void UserService_Get_User_Permissions_For_Unassigned_Permission_Nodes() { diff --git a/src/Umbraco.Tests/Strings/CmsHelperCasingTests.cs b/src/Umbraco.Tests/Strings/CmsHelperCasingTests.cs index dc39650baa..eaa01da9ba 100644 --- a/src/Umbraco.Tests/Strings/CmsHelperCasingTests.cs +++ b/src/Umbraco.Tests/Strings/CmsHelperCasingTests.cs @@ -6,7 +6,7 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Strings { [TestFixture] - public class CmsHelperCasingTests + public class CmsHelperCasingTests : BaseTestBase { [SetUp] public void Setup() diff --git a/src/Umbraco.Tests/Strings/DefaultShortStringHelperTests.cs b/src/Umbraco.Tests/Strings/DefaultShortStringHelperTests.cs index 0467ca9a16..630bc4c8b7 100644 --- a/src/Umbraco.Tests/Strings/DefaultShortStringHelperTests.cs +++ b/src/Umbraco.Tests/Strings/DefaultShortStringHelperTests.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; @@ -17,13 +16,13 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Strings { [TestFixture] - public class DefaultShortStringHelperTests + public class DefaultShortStringHelperTests : BaseTestBase { private DefaultShortStringHelper _helper; - [SetUp] - public void Initialize() + public override void SetUp() { + base.SetUp(); // NOTE: it is not possible to configure the helper once it has been assigned // to the resolver and resolution has frozen. but, obviously, it is possible @@ -80,13 +79,7 @@ namespace Umbraco.Tests.Strings container.Register(_ => _helper); } - [TearDown] - public void TearDown() - { - Current.Reset(); - } - - static readonly Regex FrenchElisionsRegex = new Regex("\\b(c|d|j|l|m|n|qu|s|t)('|\u8217)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex FrenchElisionsRegex = new Regex("\\b(c|d|j|l|m|n|qu|s|t)('|\u8217)", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static string FilterFrenchElisions(string s) { diff --git a/src/Umbraco.Tests/Strings/StringExtensionsTests.cs b/src/Umbraco.Tests/Strings/StringExtensionsTests.cs index 9a31934bf9..6ac9a5c47a 100644 --- a/src/Umbraco.Tests/Strings/StringExtensionsTests.cs +++ b/src/Umbraco.Tests/Strings/StringExtensionsTests.cs @@ -6,26 +6,22 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.DI; using Umbraco.Core.Strings; +using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Strings { [TestFixture] - public class StringExtensionsTests + public class StringExtensionsTests : BaseTestBase { - [SetUp] - public void Setup() + public override void SetUp() { + base.SetUp(); + var container = new ServiceContainer(); container.ConfigureUmbracoCore(); container.RegisterSingleton(_ => new MockShortStringHelper()); } - [TearDown] - public void TearDown() - { - Current.Reset(); - } - [Test] public void CurrentHelper() { diff --git a/src/Umbraco.Tests/Strings/StringValidationTests.cs b/src/Umbraco.Tests/Strings/StringValidationTests.cs index c1261a570e..b887c96ec0 100644 --- a/src/Umbraco.Tests/Strings/StringValidationTests.cs +++ b/src/Umbraco.Tests/Strings/StringValidationTests.cs @@ -1,10 +1,11 @@ using System.ComponentModel.DataAnnotations; using NUnit.Framework; +using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Strings { [TestFixture] - public class StringValidationTests + public class StringValidationTests : BaseTestBase { [Test] public void Validate_Email_Address() diff --git a/src/Umbraco.Tests/Strings/StylesheetHelperTests.cs b/src/Umbraco.Tests/Strings/StylesheetHelperTests.cs index fcb6e237e3..ecfce1351b 100644 --- a/src/Umbraco.Tests/Strings/StylesheetHelperTests.cs +++ b/src/Umbraco.Tests/Strings/StylesheetHelperTests.cs @@ -3,11 +3,12 @@ using System.Text; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Strings.Css; +using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Strings { [TestFixture] - public class StylesheetHelperTests + public class StylesheetHelperTests : BaseTestBase { [Test] public void Replace_Rule() diff --git a/src/Umbraco.Tests/TestHelpers/BaseTestBase.cs b/src/Umbraco.Tests/TestHelpers/BaseTestBase.cs new file mode 100644 index 0000000000..e506ec29cd --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/BaseTestBase.cs @@ -0,0 +1,29 @@ +using NUnit.Framework; +using Umbraco.Core.DI; + +namespace Umbraco.Tests.TestHelpers +{ + /// + /// Provides the top-level base class for all Umbraco tests. + /// + /// + /// Ensures that Current is properly resetted before and after each test executes. + /// Defines the SetUp and TearDown methods with proper attributes (not needed on overrides). + /// + public abstract class BaseTestBase + { + [SetUp] + public virtual void SetUp() + { + // should not need this if all other tests were clean + // but hey, never know, better avoid garbage-in + Current.Reset(); + } + + [TearDown] + public virtual void TearDown() + { + Current.Reset(); + } + } +} diff --git a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs deleted file mode 100644 index 0ee9dfa27b..0000000000 --- a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs +++ /dev/null @@ -1,287 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Reflection; -using AutoMapper; -using LightInject; -using Moq; -using NUnit.Framework; -using Umbraco.Core; -using Umbraco.Core.Cache; -using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.IO; -using Umbraco.Core.Logging; -using Umbraco.Core.Models.Mapping; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Persistence.UnitOfWork; -using Umbraco.Core.Profiling; -using Umbraco.Core.PropertyEditors; -using Umbraco.Core.Strings; -using Umbraco.Web; -using Umbraco.Core.DI; -using Umbraco.Core.Persistence.Mappers; -using Umbraco.Core.Events; -using Umbraco.Core.Models.PublishedContent; -using Umbraco.Core.Plugins; -using Umbraco.Core.Services; -using Umbraco.Web.DependencyInjection; -using UmbracoExamine; -using Current = Umbraco.Web.Current; - -namespace Umbraco.Tests.TestHelpers -{ - /// - /// Provides a base class for Umbraco application tests. - /// - /// Sets logging, pluging manager, application context, base resolvers... - [TestFixture] - public abstract class BaseUmbracoApplicationTest : BaseUmbracoConfigurationTest - { - [TestFixtureSetUp] - public void InitializeFixture() - { - var logger = new Logger(new FileInfo(TestHelper.MapPathForTest("~/unit-test-log4net.config"))); - ProfilingLogger = new ProfilingLogger(logger, new LogProfiler(logger)); - } - - [SetUp] - public override void Initialize() - { - base.Initialize(); - - var container = new ServiceContainer(); - container.ConfigureUmbracoCore(); - Container = container; - - TestHelper.InitializeContentDirectories(); - - SetupCacheHelper(); - - InitializeLegacyMappingsForCoreEditors(); - - SetupPluginManager(); - - ConfigureContainer(); - - SetupApplicationContext(); - - InitializeMappers(); - - FreezeResolution(); - - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); - - // reset settings - SettingsForTests.Reset(); - TestHelper.CleanContentDirectories(); - TestHelper.CleanUmbracoSettingsConfig(); - - // reset the app context, this should reset most things that require resetting like ALL resolvers - Core.DI.Current.Reset(); - - // reset plugin manager - ResetPluginManager(); - Container.Dispose(); - - Core.DI.Current.Reset(); - } - - protected virtual void ConfigureContainer() - { - // oh no! should not use a container in unit tests? - var settings = SettingsForTests.GetDefault(); - - //register mappers - Container.RegisterFrom(); - Container.RegisterFrom(); - - Container.Register(factory => Container); - var pluginManager = new PluginManager(CacheHelper.RuntimeCache, ProfilingLogger); //? - Container.RegisterInstance(pluginManager); - - //Default Datalayer/Repositories/SQL/Database/etc... - Container.RegisterFrom(); - - //register basic stuff that might need to be there for some container resolvers to work, we can - // add more to this in base classes in resolution freezing - Container.RegisterSingleton(factory => Logger); - Container.Register(factory => CacheHelper); - Container.Register(factory => ProfilingLogger); - Container.RegisterSingleton(factory => SettingsForTests.GetDefault()); - Container.RegisterSingleton(factory => settings.Content); - Container.RegisterSingleton(factory => settings.Templates); - Container.Register(factory => CacheHelper.RuntimeCache); - Container.Register(); - Container.Register(factory => new MediaFileSystem(Mock.Of())); - Container.RegisterSingleton(); - - //replace some stuff - Container.RegisterSingleton(factory => Mock.Of(), "ScriptFileSystem"); - Container.RegisterSingleton(factory => Mock.Of(), "PartialViewFileSystem"); - Container.RegisterSingleton(factory => Mock.Of(), "PartialViewMacroFileSystem"); - Container.RegisterSingleton(factory => Mock.Of(), "StylesheetFileSystem"); - - // need real file systems here as templates content is on-disk only - //Container.RegisterSingleton(factory => Mock.Of(), "MasterpageFileSystem"); - //Container.RegisterSingleton(factory => Mock.Of(), "ViewFileSystem"); - Container.RegisterSingleton(factory => new PhysicalFileSystem("Views", "/views"), "ViewFileSystem"); - Container.RegisterSingleton(factory => new PhysicalFileSystem("MasterPages", "/masterpages"), "MasterpageFileSystem"); - - // no factory (noop) - Container.RegisterSingleton(); - } - - private static readonly object Locker = new object(); - - protected IMapperCollection Mappers => Container.GetInstance(); - - private static void InitializeLegacyMappingsForCoreEditors() - { - lock (Locker) - { - if (LegacyPropertyEditorIdToAliasConverter.Count() == 0) - { - // create the legacy prop-eds mapping - LegacyPropertyEditorIdToAliasConverter.CreateMappingsForCoreEditors(); - } - } - } - - /// - /// If this class requires auto-mapper mapping initialization then init them - /// - /// - /// This is an opt-in option because initializing the mappers takes about 500ms which equates to quite a lot - /// of time with every test. - /// - private void InitializeMappers() - { - if (GetType().GetCustomAttribute(false) != null) - { - Mapper.Initialize(configuration => - { - var mappers = Container.GetAllInstances(); - foreach (var mapper in mappers) - { - mapper.ConfigureMappings(configuration); - } - }); - } - } - - /// - /// 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) - { - Core.DI.Current.PluginManager = null; - } - } - - private void SetupCacheHelper() - { - CacheHelper = CreateCacheHelper(); - } - - protected virtual CacheHelper CreateCacheHelper() - { - return CacheHelper.CreateDisabledCacheHelper(); - } - - private void SetupApplicationContext() - { - //var applicationContext = CreateApplicationContext(); - //Container.Register(_ => applicationContext); - } - - /// - /// Inheritors can override this if they wish to create a custom application context - /// - //protected virtual ApplicationContext CreateApplicationContext() - //{ - // var evtMsgs = new TransientEventMessagesFactory(); - // var dbFactory = new DefaultDatabaseFactory( - // Core.Configuration.GlobalSettings.UmbracoConnectionName, - // TestObjects.GetDefaultSqlSyntaxProviders(Logger), - // Logger, new TestUmbracoDatabaseAccessor(), - // Mock.Of()); - // dbFactory.ResetForTests(); - // var applicationContext = new ApplicationContext( - // // assign the db context - // new DatabaseContext(dbFactory, Logger, Mock.Of(), Mock.Of()), - // // assign the service context - // TestObjects.GetServiceContext( - // Container.GetInstance(), - // TestObjects.GetDatabaseUnitOfWorkProvider(Logger), - // new FileUnitOfWorkProvider(), - // CacheHelper, - // Logger, - // evtMsgs, - // Enumerable.Empty()), - // CacheHelper, - // ProfilingLogger) - // { - // //IsReady = true - // }; - // return applicationContext; - //} - - /// - /// Inheritors can override this if they wish to setup the plugin manager differenty (i.e. specify certain assemblies to load) - /// - protected virtual void SetupPluginManager() - { - // fixme - oops - if (/*PluginManager.Current == null ||*/ PluginManagerResetRequired) - { - Core.DI.Current.PluginManager = new PluginManager(CacheHelper.RuntimeCache, ProfilingLogger, false) - { - AssembliesToScan = new[] - { - Assembly.Load("Umbraco.Core"), - Assembly.Load("umbraco"), - Assembly.Load("Umbraco.Tests"), - Assembly.Load("cms"), - Assembly.Load("controls"), - } - }; - } - } - - /// - /// Inheritors can override this to setup any resolvers before resolution is frozen - /// - protected virtual void FreezeResolution() - { } - - protected ILogger Logger => ProfilingLogger.Logger; - - protected ProfilingLogger ProfilingLogger { get; private set; } - - protected CacheHelper CacheHelper { get; private set; } - - //I know tests shouldn't use IoC, but for all these tests inheriting from this class are integration tests - // and the number of these will hopefully start getting greatly reduced now that most things are mockable. - internal IServiceContainer Container { get; private set; } - - protected virtual ISqlSyntaxProvider SqlSyntax => new SqlCeSyntaxProvider(); - } -} \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs b/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs deleted file mode 100644 index 380457bbae..0000000000 --- a/src/Umbraco.Tests/TestHelpers/BaseUmbracoConfigurationTest.cs +++ /dev/null @@ -1,29 +0,0 @@ -using NUnit.Framework; -using Umbraco.Core.DI; -using Current = Umbraco.Web.Current; - -namespace Umbraco.Tests.TestHelpers -{ - /// - /// A base test class that ensures that the umbraco configuration is mocked - /// - [TestFixture] - public abstract class BaseUmbracoConfigurationTest - { - - - [SetUp] - public virtual void Initialize() - { - SettingsForTests.Reset(); - Current.UmbracoContextAccessor = new TestUmbracoContextAccessor(); - } - - [TearDown] - public virtual void TearDown() - { - SettingsForTests.Reset(); - Current.Reset(); - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs index e4dba34b8d..f5b2420c44 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs @@ -1,34 +1,29 @@ +using System.Collections.Generic; using System.Linq; +using LightInject; using Moq; using NUnit.Framework; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Services; using Umbraco.Tests.PublishedContent; using Umbraco.Tests.TestHelpers.Stubs; -using Umbraco.Web; using Umbraco.Web.Routing; namespace Umbraco.Tests.TestHelpers { [TestFixture, RequiresSTA] - public abstract class BaseWebTest : BaseDatabaseFactoryTest + public abstract class BaseWebTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); // need to specify a custom callback for unit tests // AutoPublishedContentTypes generates properties automatically var type = new AutoPublishedContentType(0, "anything", new PublishedPropertyType[] {}); - ContentTypesCache.GetPublishedContentTypeByAlias = (alias) => type; - } - - [TearDown] - public override void TearDown() - { - base.TearDown(); + ContentTypesCache.GetPublishedContentTypeByAlias = alias => type; } protected override string GetXmlContent(int templateId) @@ -66,13 +61,13 @@ namespace Umbraco.Tests.TestHelpers "; } - internal static FacadeRouter CreateFacadeRouter() + internal static FacadeRouter CreateFacadeRouter(IServiceContainer container = null, ContentFinderCollection contentFinders = null) { return new FacadeRouter( - Mock.Of(), - Enumerable.Empty(), + TestObjects.GetUmbracoSettings().WebRouting, + contentFinders ?? new ContentFinderCollection(Enumerable.Empty()), new FakeLastChanceFinder(), - null, + container?.TryGetInstance() ?? new ServiceContext(), new ProfilingLogger(Mock.Of(), Mock.Of())); } } diff --git a/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs b/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs index a9a391dd09..0e26ab4d50 100644 --- a/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs +++ b/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs @@ -158,7 +158,7 @@ namespace Umbraco.Tests.TestHelpers { var config = new FileInfo(TestHelper.MapPathForTest("~/Configurations/UmbracoSettings/web.config")); - var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = config.FullName }; + var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = config.FullName }; var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); _defaultSettings = configuration.GetSection("umbracoConfiguration/defaultSettings") as UmbracoSettingsSection; } diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs index 4ac8f9cf9d..f5aa36431c 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs @@ -1,13 +1,18 @@ using System; -using System.Collections.Generic; using System.Data; using System.Data.Common; -using Examine; +using System.Linq; +using System.Web; +using LightInject; using Moq; +using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Core.Services; -using UmbracoExamine; +using Umbraco.Web; +using Umbraco.Web.PublishedCache; +using Umbraco.Web.Routing; +using Umbraco.Web.Security; namespace Umbraco.Tests.TestHelpers { @@ -23,7 +28,7 @@ namespace Umbraco.Tests.TestHelpers /// A value indicating whether the factory is configured. /// A value indicating whether the factory can connect to the database. /// This is just a void factory that has no actual database. - public static IDatabaseFactory GetIDatabaseFactoryMock(bool configured = true, bool canConnect = true) + public static IDatabaseFactory GetDatabaseFactoryMock(bool configured = true, bool canConnect = true) { var databaseFactoryMock = new Mock(); databaseFactoryMock.Setup(x => x.Configured).Returns(configured); @@ -40,32 +45,38 @@ namespace Umbraco.Tests.TestHelpers /// Gets a mocked service context built with mocked services. /// /// A ServiceContext. - public static ServiceContext GetServiceContextMock() + public static ServiceContext GetServiceContextMock(IServiceFactory container = null) { return new ServiceContext( - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object); + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService(), + MockService()); + } + + private static T MockService(IServiceFactory container = null) + where T : class + { + return container?.TryGetInstance() ?? new Mock().Object; } /// @@ -78,10 +89,46 @@ namespace Umbraco.Tests.TestHelpers { return new MockDbConnection(); } - + + /// + /// Gets an Umbraco context. + /// + /// An Umbraco context. + /// This should be the minimum Umbraco context. + public static UmbracoContext GetUmbracoContextMock() + { + var httpContext = Mock.Of(); + + //var facadeService = Mock.Of(); + var facadeMock = new Mock(); + facadeMock.Setup(x => x.MemberCache).Returns(Mock.Of()); + var facade = facadeMock.Object; + var facadeServiceMock = new Mock(); + facadeServiceMock.Setup(x => x.CreateFacade(It.IsAny())).Returns(facade); + var facadeService = facadeServiceMock.Object; + + var webSecurity = new Mock(null, null).Object; + var settings = GetUmbracoSettings(); + var urlProviders = Enumerable.Empty(); + + // fixme + // sort out Create vs New vs Ensure... + + return UmbracoContext.EnsureContext(httpContext, facadeService, webSecurity, settings, urlProviders, true); + } + + public static IUmbracoSettingsSection GetUmbracoSettings() + { + var umbracoSettingsMock = new Mock(); + var webRoutingSectionMock = new Mock(); + webRoutingSectionMock.Setup(x => x.UrlProviderMode).Returns(UrlProviderMode.Auto.ToString()); + umbracoSettingsMock.Setup(x => x.WebRouting).Returns(webRoutingSectionMock.Object); + return umbracoSettingsMock.Object; + } + #region Inner classes - + private class MockDbConnection : DbConnection { diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index a4b29e1191..e7f4c8a2b2 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -1,12 +1,10 @@ using System; using System.Collections.Generic; -using System.Data.Common; using System.IO; using System.Linq; using LightInject; using Moq; using NPoco; -using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; using Umbraco.Core.Events; @@ -25,7 +23,7 @@ namespace Umbraco.Tests.TestHelpers /// /// Provides objects for tests. /// - static partial class TestObjects + internal static partial class TestObjects { /// /// Gets the default ISqlSyntaxProvider objects. @@ -53,7 +51,7 @@ namespace Umbraco.Tests.TestHelpers public static UmbracoDatabase GetUmbracoSqlCeDatabase(ILogger logger) { var syntax = new SqlCeSyntaxProvider(); - var connection = TestObjects.GetDbConnection(); + var connection = GetDbConnection(); return new UmbracoDatabase(connection, syntax, DatabaseType.SQLCe, logger); } @@ -67,10 +65,13 @@ namespace Umbraco.Tests.TestHelpers public static UmbracoDatabase GetUmbracoSqlServerDatabase(ILogger logger) { var syntax = new SqlServerSyntaxProvider(new Lazy(() => null)); // do NOT try to get the server's version! - var connection = TestObjects.GetDbConnection(); + var connection = GetDbConnection(); return new UmbracoDatabase(connection, syntax, DatabaseType.SqlServer2008, logger); } + public static void RegisterServices(IServiceContainer container) + { } + /// /// Gets a ServiceContext. /// @@ -81,6 +82,7 @@ namespace Umbraco.Tests.TestHelpers /// A logger. /// An event messages factory. /// Some url segment providers. + /// A container. /// A ServiceContext. /// Should be used sparingly for integration tests only - for unit tests /// just mock the services to be passed to the ctor of the ServiceContext. @@ -90,7 +92,8 @@ namespace Umbraco.Tests.TestHelpers CacheHelper cache, ILogger logger, IEventMessagesFactory eventMessagesFactory, - IEnumerable urlSegmentProviders) + IEnumerable urlSegmentProviders, + IServiceFactory container = null) { if (repositoryFactory == null) throw new ArgumentNullException(nameof(repositoryFactory)); if (dbUnitOfWorkProvider == null) throw new ArgumentNullException(nameof(dbUnitOfWorkProvider)); @@ -102,14 +105,14 @@ namespace Umbraco.Tests.TestHelpers var provider = dbUnitOfWorkProvider; var fileProvider = fileUnitOfWorkProvider; - var migrationEntryService = new Lazy(() => new MigrationEntryService(provider, logger, eventMessagesFactory)); - var externalLoginService = new Lazy(() => new ExternalLoginService(provider, logger, eventMessagesFactory)); - var publicAccessService = new Lazy(() => new PublicAccessService(provider, logger, eventMessagesFactory)); - var taskService = new Lazy(() => new TaskService(provider, logger, eventMessagesFactory)); - var domainService = new Lazy(() => new DomainService(provider, logger, eventMessagesFactory)); - var auditService = new Lazy(() => new AuditService(provider, logger, eventMessagesFactory)); + var migrationEntryService = GetLazyService(container, () => new MigrationEntryService(provider, logger, eventMessagesFactory)); + var externalLoginService = GetLazyService(container, () => new ExternalLoginService(provider, logger, eventMessagesFactory)); + var publicAccessService = GetLazyService(container, () => new PublicAccessService(provider, logger, eventMessagesFactory)); + var taskService = GetLazyService(container, () => new TaskService(provider, logger, eventMessagesFactory)); + var domainService = GetLazyService(container, () => new DomainService(provider, logger, eventMessagesFactory)); + var auditService = GetLazyService(container, () => new AuditService(provider, logger, eventMessagesFactory)); - var localizedTextService = new Lazy(() => new LocalizedTextService( + var localizedTextService = GetLazyService(container, () => new LocalizedTextService( new Lazy(() => { var mainLangFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Umbraco + "/config/lang/")); @@ -141,33 +144,33 @@ namespace Umbraco.Tests.TestHelpers }), logger)); - var userService = new Lazy(() => new UserService(provider, logger, eventMessagesFactory)); - var dataTypeService = new Lazy(() => new DataTypeService(provider, logger, eventMessagesFactory)); - var contentService = new Lazy(() => new ContentService(provider, logger, eventMessagesFactory)); - var notificationService = new Lazy(() => new NotificationService(provider, userService.Value, contentService.Value, logger)); - var serverRegistrationService = new Lazy(() => new ServerRegistrationService(provider, logger, eventMessagesFactory)); - var memberGroupService = new Lazy(() => new MemberGroupService(provider, logger, eventMessagesFactory)); - var memberService = new Lazy(() => new MemberService(provider, logger, eventMessagesFactory, memberGroupService.Value)); - var mediaService = new Lazy(() => new MediaService(provider, logger, eventMessagesFactory)); - var contentTypeService = new Lazy(() => new ContentTypeService(provider, logger, eventMessagesFactory, contentService.Value)); - var mediaTypeService = new Lazy(() => new MediaTypeService(provider, logger, eventMessagesFactory, mediaService.Value)); - var fileService = new Lazy(() => new FileService(fileProvider, provider, logger, eventMessagesFactory)); - var localizationService = new Lazy(() => new LocalizationService(provider, logger, eventMessagesFactory)); + var userService = GetLazyService(container, () => new UserService(provider, logger, eventMessagesFactory)); + var dataTypeService = GetLazyService(container, () => new DataTypeService(provider, logger, eventMessagesFactory)); + var contentService = GetLazyService(container, () => new ContentService(provider, logger, eventMessagesFactory)); + var notificationService = GetLazyService(container, () => new NotificationService(provider, userService.Value, contentService.Value, logger)); + var serverRegistrationService = GetLazyService(container, () => new ServerRegistrationService(provider, logger, eventMessagesFactory)); + var memberGroupService = GetLazyService(container, () => new MemberGroupService(provider, logger, eventMessagesFactory)); + var memberService = GetLazyService(container, () => new MemberService(provider, logger, eventMessagesFactory, memberGroupService.Value)); + var mediaService = GetLazyService(container, () => new MediaService(provider, logger, eventMessagesFactory)); + var contentTypeService = GetLazyService(container, () => new ContentTypeService(provider, logger, eventMessagesFactory, contentService.Value)); + var mediaTypeService = GetLazyService(container, () => new MediaTypeService(provider, logger, eventMessagesFactory, mediaService.Value)); + var fileService = GetLazyService(container, () => new FileService(fileProvider, provider, logger, eventMessagesFactory)); + var localizationService = GetLazyService(container, () => new LocalizationService(provider, logger, eventMessagesFactory)); - var memberTypeService = new Lazy(() => new MemberTypeService(provider, logger, eventMessagesFactory, memberService.Value)); - var entityService = new Lazy(() => new EntityService( + var memberTypeService = GetLazyService(container, () => new MemberTypeService(provider, logger, eventMessagesFactory, memberService.Value)); + var entityService = GetLazyService(container, () => new EntityService( provider, logger, eventMessagesFactory, contentService.Value, contentTypeService.Value, mediaService.Value, mediaTypeService.Value, dataTypeService.Value, memberService.Value, memberTypeService.Value, //TODO: Consider making this an isolated cache instead of using the global one cache.RuntimeCache)); - var macroService = new Lazy(() => new MacroService(provider, logger, eventMessagesFactory)); - var packagingService = new Lazy(() => new PackagingService(logger, contentService.Value, contentTypeService.Value, mediaService.Value, macroService.Value, dataTypeService.Value, fileService.Value, localizationService.Value, entityService.Value, userService.Value, repositoryFactory, provider, urlSegmentProviders)); - var relationService = new Lazy(() => new RelationService(provider, logger, eventMessagesFactory, entityService.Value)); - var treeService = new Lazy(() => new ApplicationTreeService(logger, cache)); - var tagService = new Lazy(() => new TagService(provider, logger, eventMessagesFactory)); - var sectionService = new Lazy(() => new SectionService(userService.Value, treeService.Value, provider, cache)); - var redirectUrlService = new Lazy(() => new RedirectUrlService(provider, logger, eventMessagesFactory)); + var macroService = GetLazyService(container, () => new MacroService(provider, logger, eventMessagesFactory)); + var packagingService = GetLazyService(container, () => new PackagingService(logger, contentService.Value, contentTypeService.Value, mediaService.Value, macroService.Value, dataTypeService.Value, fileService.Value, localizationService.Value, entityService.Value, userService.Value, repositoryFactory, provider, urlSegmentProviders)); + var relationService = GetLazyService(container, () => new RelationService(provider, logger, eventMessagesFactory, entityService.Value)); + var treeService = GetLazyService(container, () => new ApplicationTreeService(logger, cache)); + var tagService = GetLazyService(container, () => new TagService(provider, logger, eventMessagesFactory)); + var sectionService = GetLazyService(container, () => new SectionService(userService.Value, treeService.Value, provider, cache)); + var redirectUrlService = GetLazyService(container, () => new RedirectUrlService(provider, logger, eventMessagesFactory)); return new ServiceContext( migrationEntryService, @@ -200,12 +203,21 @@ namespace Umbraco.Tests.TestHelpers redirectUrlService); } - public static IDatabaseUnitOfWorkProvider GetDatabaseUnitOfWorkProvider(ILogger logger) + private static Lazy GetLazyService(IServiceFactory container, Func ctor) + where T : class { - var adapter = new TestUmbracoDatabaseAccessor(); - var mappers = Mock.Of(); - var databaseFactory = new DefaultDatabaseFactory(GlobalSettings.UmbracoConnectionName, GetDefaultSqlSyntaxProviders(logger), logger, adapter, mappers); - var repositoryFactory = new RepositoryFactory(Mock.Of()); + return new Lazy(() => container?.TryGetInstance() ?? ctor()); + } + + public static IDatabaseUnitOfWorkProvider GetDatabaseUnitOfWorkProvider(ILogger logger, IDatabaseFactory databaseFactory = null, RepositoryFactory repositoryFactory = null) + { + if (databaseFactory == null) + { + var accessor = new TestUmbracoDatabaseAccessor(); + var mappers = Mock.Of(); + databaseFactory = new DefaultDatabaseFactory(GlobalSettings.UmbracoConnectionName, GetDefaultSqlSyntaxProviders(logger), logger, accessor, mappers); + } + repositoryFactory = repositoryFactory ?? new RepositoryFactory(Mock.Of()); return new NPocoUnitOfWorkProvider(databaseFactory, repositoryFactory); } } diff --git a/src/Umbraco.Tests/TestHelpers/TestWithApplicationBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithApplicationBase.cs new file mode 100644 index 0000000000..399f356a28 --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/TestWithApplicationBase.cs @@ -0,0 +1,227 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using AutoMapper; +using LightInject; +using Moq; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Cache; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; +using Umbraco.Core.Models.Mapping; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Strings; +using Umbraco.Core.DI; +using Umbraco.Core.Persistence.Mappers; +using Umbraco.Core.Events; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Plugins; +using Umbraco.Core.Services; +using Umbraco.Web.DependencyInjection; +using Umbraco.Web.Services; +using UmbracoExamine; + +namespace Umbraco.Tests.TestHelpers +{ + /// + /// Provides a base class for all Umbraco tests that require the Umbraco application. + /// + /// + /// Sets the Umbraco application DI container. + /// Defines the Compose method for DI composition. + /// Sets all sorts of things such as logging, plugin manager, base services, database factory & context... + /// Does *not* create a database. + /// + [TestFixture] + public abstract class TestWithApplicationBase : TestWithSettingsBase + { + private static PluginManager _pluginManager; + + // tests shouldn't use IoC, but for all these tests inheriting from this class are integration tests + // and the number of these will hopefully start getting greatly reduced now that most things are mockable. + protected IServiceContainer Container { get; private set; } + + protected ILogger Logger { get; private set; } + + protected IProfiler Profiler { get; private set; } + + protected ProfilingLogger ProfilingLogger { get; private set; } + + protected CacheHelper CacheHelper { get; private set; } + + protected virtual ISqlSyntaxProvider SqlSyntax => new SqlCeSyntaxProvider(); + + protected IMapperCollection Mappers => Container.GetInstance(); + + /// + /// Gets a value indicating whether the plugin manager should be resetted before and after each test. + /// + /// + /// False by default, so the plugin manager does not need to re-scan all of the assemblies and tests run faster. + /// Can be overriden if the plugin manager does need to reset, usually when SetupPluginManager has been overriden. + /// + protected virtual bool PluginManagerResetRequired => false; + + [TestFixtureSetUp] + public void InitializeFixture() + { + Logger = new Logger(new FileInfo(TestHelper.MapPathForTest("~/unit-test-log4net.config"))); + Profiler = new LogProfiler(Logger); + ProfilingLogger = new ProfilingLogger(Logger, Profiler); + } + + public override void SetUp() + { + base.SetUp(); + + var container = new ServiceContainer(); + container.ConfigureUmbracoCore(); + Container = container; + + TestHelper.InitializeContentDirectories(); + CacheHelper = CreateCacheHelper(); + InitializeLegacyMappingsForCoreEditors(); + SetupPluginManager(); + Compose(); + InitializeAutoMapper(); + MoreSetUp(); + } + + public override void TearDown() + { + base.TearDown(); + + TestHelper.CleanContentDirectories(); + TestHelper.CleanUmbracoSettingsConfig(); + + ResetPluginManager(); + Container.Dispose(); + } + + protected virtual void Compose() + { + var settings = SettingsForTests.GetDefault(); + + // basic things + Container.RegisterSingleton(factory => Logger); + Container.RegisterSingleton(factory => Profiler); + Container.RegisterSingleton(factory => ProfilingLogger); + + Container.Register(factory => CacheHelper); + Container.Register(factory => CacheHelper.RuntimeCache); + + // register mappers + Container.RegisterFrom(); + Container.RegisterFrom(); + + Container.RegisterInstance(_pluginManager); + + // default Datalayer/Repositories/SQL/Database/etc... + Container.RegisterFrom(); + + // register basic stuff that might need to be there for some container resolvers to work + Container.RegisterSingleton(factory => SettingsForTests.GetDefault()); + Container.RegisterSingleton(factory => settings.Content); + Container.RegisterSingleton(factory => settings.Templates); + Container.Register(); + Container.Register(factory => new MediaFileSystem(Mock.Of())); + Container.RegisterSingleton(); + + // replace some stuff + Container.RegisterSingleton(factory => Mock.Of(), "ScriptFileSystem"); + Container.RegisterSingleton(factory => Mock.Of(), "PartialViewFileSystem"); + Container.RegisterSingleton(factory => Mock.Of(), "PartialViewMacroFileSystem"); + Container.RegisterSingleton(factory => Mock.Of(), "StylesheetFileSystem"); + + // need real file systems here as templates content is on-disk only + //Container.RegisterSingleton(factory => Mock.Of(), "MasterpageFileSystem"); + //Container.RegisterSingleton(factory => Mock.Of(), "ViewFileSystem"); + Container.RegisterSingleton(factory => new PhysicalFileSystem("Views", "/views"), "ViewFileSystem"); + Container.RegisterSingleton(factory => new PhysicalFileSystem("MasterPages", "/masterpages"), "MasterpageFileSystem"); + + // no factory (noop) + Container.RegisterSingleton(); + + // register application stuff (database factory & context, services...) + Container.RegisterSingleton(_ => new TransientEventMessagesFactory()); + Container.RegisterSingleton(); + Container.RegisterSingleton(f => new DefaultDatabaseFactory( + Core.Configuration.GlobalSettings.UmbracoConnectionName, + TestObjects.GetDefaultSqlSyntaxProviders(Logger), + Logger, f.GetInstance(), + Mock.Of())); + Container.RegisterSingleton(f => new DatabaseContext( + f.GetInstance(), + Logger, + Mock.Of(), + Mock.Of())); + + Container.RegisterCollectionBuilder(); // empty + Container.Register(factory + => TestObjects.GetDatabaseUnitOfWorkProvider(factory.GetInstance(), factory.TryGetInstance(), factory.TryGetInstance())); + + Container.RegisterFrom(); + // composition root is doing weird things, fix + Container.RegisterSingleton(); + Container.RegisterSingleton(); + } + + private static void InitializeLegacyMappingsForCoreEditors() + { + // create the legacy prop-eds mapping + if (LegacyPropertyEditorIdToAliasConverter.Count() == 0) + LegacyPropertyEditorIdToAliasConverter.CreateMappingsForCoreEditors(); + } + + // initialize automapper if required - takes time so don't do it unless required + private void InitializeAutoMapper() + { + if (GetType().GetCustomAttribute(false) == null) return; + + Mapper.Initialize(configuration => + { + var mappers = Container.GetAllInstances(); + foreach (var mapper in mappers) + mapper.ConfigureMappings(configuration); + }); + } + + protected virtual void ResetPluginManager() + { + if (PluginManagerResetRequired) + _pluginManager = null; + } + + protected virtual CacheHelper CreateCacheHelper() + { + return CacheHelper.CreateDisabledCacheHelper(); + } + + protected virtual void SetupPluginManager() + { + if (_pluginManager == null || PluginManagerResetRequired) + { + _pluginManager = new PluginManager(CacheHelper.RuntimeCache, ProfilingLogger, false) + { + AssembliesToScan = new[] + { + Assembly.Load("Umbraco.Core"), + Assembly.Load("umbraco"), + Assembly.Load("Umbraco.Tests"), + Assembly.Load("cms"), + Assembly.Load("controls"), + } + }; + } + } + + // fixme - rename & refactor + protected virtual void MoreSetUp() + { } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs similarity index 76% rename from src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs rename to src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index 44839dd869..0f247d91f6 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -1,499 +1,485 @@ -using System; -using System.Configuration; -using System.Data.SqlServerCe; -using System.IO; -using System.Linq; -using System.Web.Routing; -using System.Xml; -using Moq; -using NUnit.Framework; -using SQLCE4Umbraco; -using Umbraco.Core; -using Umbraco.Core.Cache; -using Umbraco.Core.Configuration; -using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.IO; -using Umbraco.Core.Logging; -using Umbraco.Core.Manifest; -using Umbraco.Core.Models.PublishedContent; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Persistence.UnitOfWork; -using Umbraco.Core.PropertyEditors; -using Umbraco.Core.Services; -using Umbraco.Core.Strings; -using Umbraco.Web; -using Umbraco.Web.PublishedCache; -using Umbraco.Web.PublishedCache.XmlPublishedCache; -using Umbraco.Web.Security; -using Umbraco.Core.Events; -using Umbraco.Core.Plugins; -using Umbraco.Web.Routing; -using File = System.IO.File; -using Umbraco.Core.DI; - -namespace Umbraco.Tests.TestHelpers -{ - /// - /// Provides a base class for Umbraco application tests that require a database. - /// - /// Can provide a SqlCE database populated with the Umbraco schema. The database should be accessed - /// through the . - [TestFixture, RequiresSTA] - public abstract class BaseDatabaseFactoryTest : BaseUmbracoApplicationTest - { - protected PublishedContentTypeCache ContentTypesCache; - - //This is used to indicate that this is the first test to run in the test session, if so, we always - //ensure a new database file is used. - private static volatile bool _firstRunInTestSession = true; - private static readonly object Locker = new object(); - private bool _firstTestInFixture = true; - - //Used to flag if its the first test in the current session - private bool _isFirstRunInTestSession; - //Used to flag if its the first test in the current fixture - private bool _isFirstTestInFixture; - - //private ApplicationContext _appContext; - private IFacadeService _facadeService; - private IDatabaseUnitOfWorkProvider _uowProvider; - - 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() - { - InitializeFirstRunFlags(); - - var path = TestHelper.CurrentAssemblyDirectory; - AppDomain.CurrentDomain.SetData("DataDirectory", path); - - base.Initialize(); - } - - protected override void ConfigureContainer() - { - base.ConfigureContainer(); - - Container.Register(); - Container.Register(factory => _facadeService); - - var manifestBuilder = new ManifestBuilder( - new NullCacheProvider(), - new ManifestParser(Logger, new DirectoryInfo(IOHelper.MapPath("~/App_Plugins")), new NullCacheProvider())); - Container.Register(_ => manifestBuilder); - - Container.RegisterCollectionBuilder() - .Add(() => Core.DI.Current.PluginManager.ResolvePropertyEditors()); - } - - private CacheHelper _disabledCacheHelper; - protected CacheHelper DisabledCache => _disabledCacheHelper ?? (_disabledCacheHelper = CacheHelper.CreateDisabledCacheHelper()); - - protected IDatabaseUnitOfWorkProvider UowProvider => _uowProvider; - - //protected override ApplicationContext CreateApplicationContext() - //{ - // var sqlSyntaxProviders = new[] { new SqlCeSyntaxProvider() }; - - // // create the database if required - // // note: must do before instanciating the database factory else it will - // // not find the database and will remain un-configured. - // using (ProfilingLogger.TraceDuration("Create database.")) - // { - // //TODO make it faster - // CreateSqlCeDatabase(); - // } - - // // ensure the configuration matches the current version for tests - // SettingsForTests.ConfigurationStatus = UmbracoVersion.Current.ToString(3); - - // // create the database factory - if the test does not require an actual database, - // // use a mock factory; otherwise use a real factory. - // IDatabaseFactory databaseFactory; - // if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture) - // { - // databaseFactory = TestObjects.GetIDatabaseFactoryMock(); - // } - // else - // { - // var f = new DefaultDatabaseFactory(GetDbConnectionString(), GetDbProviderName(), sqlSyntaxProviders, Logger, new TestUmbracoDatabaseAccessor(), Mappers); - // f.ResetForTests(); - // databaseFactory = f; - // } - - // // so, using the above code to create a mock IDatabaseFactory if we don't have a real database - // // but, that will NOT prevent _appContext from NOT being configured, because it cannot connect - // // to the database to check the migrations ;-( - - // var evtMsgs = new TransientEventMessagesFactory(); - // var databaseContext = new DatabaseContext(databaseFactory, Logger, Mock.Of(), Mock.Of()); - // var repositoryFactory = Container.GetInstance(); - // var serviceContext = TestObjects.GetServiceContext( - // repositoryFactory, - // _uowProvider = new NPocoUnitOfWorkProvider(databaseFactory, repositoryFactory), - // new FileUnitOfWorkProvider(), - // CacheHelper, - // Logger, - // evtMsgs, - // Enumerable.Empty()); - - // // if the test does not require an actual database, or runs with an empty database, the application - // // context will not be able to check the migration status in the database, so we have to force it - // // to think it is configured. - // var appContextMock = new Mock(databaseContext, serviceContext, CacheHelper, ProfilingLogger); - // //if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture // no db at all - // // || DatabaseTestBehavior == DatabaseBehavior.EmptyDbFilePerTest) // empty db - // // appContextMock.Setup(x => x.IsConfigured).Returns(true); - // _appContext = appContextMock.Object; - - // // initialize the database if required - // // note: must do after creating the application context as - // // it is using it - // using (ProfilingLogger.TraceDuration("Initialize database.")) - // { - // // TODO make it faster - // InitializeDatabase(_appContext); - // } - - // // application is ready - // //_appContext.IsReady = true; - - // return _appContext; - //} - - /// - /// The database behavior to use for the test/fixture - /// - protected DatabaseBehavior DatabaseTestBehavior - { - get - { - var att = GetType().GetCustomAttribute(false); - return att?.Behavior ?? DatabaseBehavior.NoDatabasePerFixture; - } - } - - protected virtual ISqlSyntaxProvider SqlSyntax => GetSyntaxProvider(); - - protected virtual ISqlSyntaxProvider GetSyntaxProvider() - { - return new SqlCeSyntaxProvider(); - } - - protected virtual string GetDbProviderName() - { - return Constants.DbProviderNames.SqlCe; - } - - /// - /// Get the db conn string - /// - protected virtual string GetDbConnectionString() - { - return @"Datasource=|DataDirectory|UmbracoNPocoTests.sdf;Flush Interval=1;"; - } - - /// - /// Creates the SqlCe database if required - /// - protected virtual void CreateSqlCeDatabase() - { - if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture) - return; - - var path = TestHelper.CurrentAssemblyDirectory; - - //Get the connectionstring settings from config - var settings = ConfigurationManager.ConnectionStrings[Core.Configuration.GlobalSettings.UmbracoConnectionName]; - ConfigurationManager.AppSettings.Set( - Core.Configuration.GlobalSettings.UmbracoConnectionName, - GetDbConnectionString()); - - _dbPath = string.Concat(path, "\\UmbracoNPocoTests.sdf"); - - //create a new database file if - // - is the first test in the session - // - the database file doesn't exist - // - NewDbFileAndSchemaPerTest - // - _isFirstTestInFixture + DbInitBehavior.NewDbFileAndSchemaPerFixture - - //if this is the first test in the session, always ensure a new db file is created - if (_isFirstRunInTestSession || File.Exists(_dbPath) == false - || (DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerTest || DatabaseTestBehavior == DatabaseBehavior.EmptyDbFilePerTest) - || (_isFirstTestInFixture && DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerFixture)) - { - - using (ProfilingLogger.TraceDuration("Remove database file")) - { - RemoveDatabaseFile(null, ex => - { - //if this doesn't work we have to make sure everything is reset! otherwise - // well run into issues because we've already set some things up - TearDown(); - throw ex; - }); - } - - //Create the Sql CE database - using (ProfilingLogger.TraceDuration("Create database file")) - { - if (DatabaseTestBehavior != DatabaseBehavior.EmptyDbFilePerTest && _dbBytes != null) - { - File.WriteAllBytes(_dbPath, _dbBytes); - } - else - { - using (var engine = new SqlCeEngine(settings.ConnectionString)) - { - engine.CreateDatabase(); - } - } - } - - } - - } - - /// - /// sets up resolvers before resolution is frozen - /// - protected override void FreezeResolution() - { - // fixme - what about if (PropertyValueConvertersResolver.HasCurrent == false) ?? - Container.RegisterCollectionBuilder(); - - // ensure we have a FacadeService - if (_facadeService == null) - { - var behavior = GetType().GetCustomAttribute(false); - var cache = new NullCacheProvider(); - - var enableRepositoryEvents = behavior != null && behavior.EnableRepositoryEvents; - - ContentTypesCache = new PublishedContentTypeCache( - Core.DI.Current.Services.ContentTypeService, - Core.DI.Current.Services.MediaTypeService, - Core.DI.Current.Services.MemberTypeService, - Core.DI.Current.Logger); - - // testing=true so XmlStore will not use the file nor the database - var facadeAccessor = new TestFacadeAccessor(); - var service = new FacadeService( - Core.DI.Current.Services, - _uowProvider, - cache, facadeAccessor, Core.DI.Current.Logger, ContentTypesCache, null, true, enableRepositoryEvents); - - // initialize PublishedCacheService content with an Xml source - service.XmlStore.GetXmlDocument = () => - { - var doc = new XmlDocument(); - doc.LoadXml(GetXmlContent(0)); - return doc; - }; - - _facadeService = service; - } - - base.FreezeResolution(); - } - - /// - /// Creates the tables and data for the database - /// - protected virtual void InitializeDatabase() - { - if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture || DatabaseTestBehavior == DatabaseBehavior.EmptyDbFilePerTest) - return; - - //create the schema and load default data if: - // - is the first test in the session - // - NewDbFileAndSchemaPerTest - // - _isFirstTestInFixture + DbInitBehavior.NewDbFileAndSchemaPerFixture - - if (_dbBytes == null && - (_isFirstRunInTestSession - || DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerTest - || (_isFirstTestInFixture && DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerFixture))) - { - var database = Core.DI.Current.DatabaseContext.Database; - var schemaHelper = new DatabaseSchemaHelper(database, Logger); - //Create the umbraco database and its base data - schemaHelper.CreateDatabaseSchema(Mock.Of(), Mock.Of()); - - //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(database); - - _dbBytes = File.ReadAllBytes(_dbPath); - } - } - - [TestFixtureTearDown] - public void FixtureTearDown() - { - RemoveDatabaseFile(Core.DI.Current.DatabaseContext.Database); - } - - [TearDown] - public override void TearDown() - { - using (ProfilingLogger.TraceDuration("teardown")) - { - _isFirstTestInFixture = false; //ensure this is false before anything! - - if (DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerTest) - { - RemoveDatabaseFile(Core.DI.Current.DatabaseContext.Database); - } - - AppDomain.CurrentDomain.SetData("DataDirectory", null); - - // make sure we dispose of the service to unbind events - _facadeService?.Dispose(); - _facadeService = null; - } - - base.TearDown(); - } - - private void CloseDbConnections(UmbracoDatabase database) - { - //Ensure that any database connections from a previous test is disposed. - //This is really just double safety as its also done in the TearDown. - database?.Dispose(); - SqlCeContextGuardian.CloseBackgroundConnection(); - } - - private void InitializeFirstRunFlags() - { - //this needs to be thread-safe - _isFirstRunInTestSession = false; - if (_firstRunInTestSession) - { - lock (Locker) - { - if (_firstRunInTestSession) - { - _isFirstRunInTestSession = true; //set the flag - _firstRunInTestSession = false; - } - } - } - if (_firstTestInFixture == false) return; - - lock (Locker) - { - if (_firstTestInFixture == false) return; - - _isFirstTestInFixture = true; //set the flag - _firstTestInFixture = false; - } - } - - private void RemoveDatabaseFile(UmbracoDatabase database, Action onFail = null) - { - CloseDbConnections(database); - var path = TestHelper.CurrentAssemblyDirectory; - try - { - string filePath = string.Concat(path, "\\UmbracoNPocoTests.sdf"); - if (File.Exists(filePath)) - { - File.Delete(filePath); - } - } - catch (Exception ex) - { - Core.DI.Current.Logger.Error("Could not remove the old database file", ex); - - //We will swallow this exception! That's because a sub class might require further teardown logic. - onFail?.Invoke(ex); - } - } - - protected ServiceContext ServiceContext => Core.DI.Current.Services; - - protected DatabaseContext DatabaseContext => Core.DI.Current.DatabaseContext; - - protected UmbracoContext GetUmbracoContext(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IUmbracoSettingsSection umbracoSettings = null) - { - // ensure we have a PublishedCachesService - var service = _facadeService as FacadeService; - if (service == null) - throw new Exception("Not a proper XmlPublishedCache.PublishedCachesService."); - - // re-initialize PublishedCacheService content with an Xml source with proper template id - service.XmlStore.GetXmlDocument = () => - { - var doc = new XmlDocument(); - doc.LoadXml(GetXmlContent(templateId)); - return doc; - }; - - if (umbracoSettings == null) umbracoSettings = SettingsForTests.GetDefault(); - - var httpContext = GetHttpContextFactory(url, routeData).HttpContext; - var ctx = UmbracoContext.CreateContext( - httpContext, - service, - new WebSecurity(httpContext, Core.DI.Current.Services.UserService), - umbracoSettings, - Enumerable.Empty()); - - if (setSingleton) - { - Umbraco.Web.Current.SetUmbracoContext(ctx, true); - } - - return ctx; - } - - protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null) - { - var factory = routeData != null - ? new FakeHttpContextFactory(url, routeData) - : new FakeHttpContextFactory(url); - - return factory; - } - - protected virtual string GetXmlContent(int templateId) - { - return @" - - - - -]> - - - - - 1 - - This is some content]]> - - - - - - - - - - - - - - - - -"; - } - } +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data.SqlServerCe; +using System.IO; +using System.Linq; +using System.Web.Routing; +using System.Xml; +using Moq; +using NUnit.Framework; +using SQLCE4Umbraco; +using Umbraco.Core; +using Umbraco.Core.Cache; +using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; +using Umbraco.Core.Manifest; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; +using Umbraco.Web; +using Umbraco.Web.PublishedCache; +using Umbraco.Web.PublishedCache.XmlPublishedCache; +using Umbraco.Web.Security; +using Umbraco.Core.Plugins; +using Umbraco.Web.Routing; +using File = System.IO.File; +using Umbraco.Core.DI; +using Umbraco.Core.Events; +using Umbraco.Core.Strings; + +namespace Umbraco.Tests.TestHelpers +{ + /// + /// Provides a base class for all Umbraco tests that require a database. + /// + /// + /// Can provide a SqlCE database populated with the Umbraco schema. The database should + /// be accessed through the DefaultDatabaseFactory. + /// Provides an Umbraco context and Xml content. + /// fixme what else? + /// + [TestFixture, RequiresSTA] + public abstract class TestWithDatabaseBase : TestWithApplicationBase + { + private CacheHelper _disabledCacheHelper; + private IFacadeService _facadeService; + + // note: a fixture class is created once for all the tests in that fixture + // these flags are used to ensure a new database file is used when appropriate + private static bool _isFirstInSession = true; // first test in the entire test session + private bool _isFirstInFixture = true; // first test in the test fixture + + private string _databasePath; + private static byte[] _databaseBytes; + + protected CacheHelper DisabledCache => _disabledCacheHelper ?? (_disabledCacheHelper = CacheHelper.CreateDisabledCacheHelper()); + + protected IDatabaseUnitOfWorkProvider UowProvider => Core.DI.Current.Container.GetInstance(); + + protected PublishedContentTypeCache ContentTypesCache { get; private set; } + + protected override ISqlSyntaxProvider SqlSyntax => GetSyntaxProvider(); + + protected ServiceContext ServiceContext => Core.DI.Current.Services; + + protected DatabaseContext DatabaseContext => Core.DI.Current.DatabaseContext; + + public override void SetUp() + { + base.SetUp(); + + var path = TestHelper.CurrentAssemblyDirectory; + AppDomain.CurrentDomain.SetData("DataDirectory", path); + + CreateAndInitializeDatabase(); + } + + protected override void Compose() + { + base.Compose(); + + Container.Register(); + Container.Register(factory => _facadeService); + + var manifestBuilder = new ManifestBuilder( + new NullCacheProvider(), + new ManifestParser(Logger, new DirectoryInfo(IOHelper.MapPath("~/App_Plugins")), new NullCacheProvider())); + Container.Register(_ => manifestBuilder); + + Container.RegisterCollectionBuilder() + .Add(() => Core.DI.Current.PluginManager.ResolvePropertyEditors()); + + Container.RegisterSingleton(f => + { + if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture) + return TestObjects.GetDatabaseFactoryMock(); + + var sqlSyntaxProviders = new[] { new SqlCeSyntaxProvider() }; + var factory = new DefaultDatabaseFactory(GetDbConnectionString(), GetDbProviderName(), sqlSyntaxProviders, Logger, f.GetInstance(), Mappers); + factory.ResetForTests(); + return factory; + }); + } + + [TestFixtureTearDown] + public void FixtureTearDown() + { + RemoveDatabaseFile(Core.DI.Current.HasContainer ? Core.DI.Current.DatabaseContext.Database : null); + } + + public override void TearDown() + { + // before anything else... + _isFirstInFixture = false; + _isFirstInSession = false; + + using (ProfilingLogger.TraceDuration("teardown")) + { + if (DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerTest) + RemoveDatabaseFile(Core.DI.Current.HasContainer ? Core.DI.Current.DatabaseContext.Database : null); + + AppDomain.CurrentDomain.SetData("DataDirectory", null); + + // make sure we dispose of the service to unbind events + _facadeService?.Dispose(); + _facadeService = null; + } + + base.TearDown(); + } + + private void CreateAndInitializeDatabase() + { + using (ProfilingLogger.TraceDuration("Create database.")) + { + CreateSqlCeDatabase(); // todo faster! + } + + // ensure the configuration matches the current version for tests + SettingsForTests.ConfigurationStatus = UmbracoVersion.Current.ToString(3); + + using (ProfilingLogger.TraceDuration("Initialize database.")) + { + InitializeDatabase(); // todo faster! + } + } + + // fixme implement this one way or another!!! + // + //protected override ApplicationContext CreateApplicationContext() + //{ + // var sqlSyntaxProviders = new[] { new SqlCeSyntaxProvider() }; + + // // create the database if required + // // note: must do before instanciating the database factory else it will + // // not find the database and will remain un-configured. + // using (ProfilingLogger.TraceDuration("Create database.")) + // { + // //TODO make it faster + // CreateSqlCeDatabase(); + // } + + // // ensure the configuration matches the current version for tests + // SettingsForTests.ConfigurationStatus = UmbracoVersion.Current.ToString(3); + + // // create the database factory - if the test does not require an actual database, + // // use a mock factory; otherwise use a real factory. + // IDatabaseFactory databaseFactory; + // if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture) + // { + // databaseFactory = TestObjects.GetIDatabaseFactoryMock(); + // } + // else + // { + // var f = new DefaultDatabaseFactory(GetDbConnectionString(), GetDbProviderName(), sqlSyntaxProviders, Logger, new TestUmbracoDatabaseAccessor(), Mappers); + // f.ResetForTests(); + // databaseFactory = f; + // } + + // // so, using the above code to create a mock IDatabaseFactory if we don't have a real database + // // but, that will NOT prevent _appContext from NOT being configured, because it cannot connect + // // to the database to check the migrations ;-( + + // var evtMsgs = new TransientEventMessagesFactory(); + // var databaseContext = new DatabaseContext(databaseFactory, Logger, Mock.Of(), Mock.Of()); + // var repositoryFactory = Container.GetInstance(); + // var serviceContext = TestObjects.GetServiceContext( + // repositoryFactory, + // _uowProvider = new NPocoUnitOfWorkProvider(databaseFactory, repositoryFactory), + // new FileUnitOfWorkProvider(), + // CacheHelper, + // Logger, + // evtMsgs, + // Enumerable.Empty()); + + // // if the test does not require an actual database, or runs with an empty database, the application + // // context will not be able to check the migration status in the database, so we have to force it + // // to think it is configured. + // var appContextMock = new Mock(databaseContext, serviceContext, CacheHelper, ProfilingLogger); + // //if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture // no db at all + // // || DatabaseTestBehavior == DatabaseBehavior.EmptyDbFilePerTest) // empty db + // // appContextMock.Setup(x => x.IsConfigured).Returns(true); + // _appContext = appContextMock.Object; + + // // initialize the database if required + // // note: must do after creating the application context as + // // it is using it + // using (ProfilingLogger.TraceDuration("Initialize database.")) + // { + // // TODO make it faster + // InitializeDatabase(_appContext); + // } + + // // application is ready + // //_appContext.IsReady = true; + + // return _appContext; + //} + + protected DatabaseBehavior DatabaseTestBehavior + { + get + { + var att = GetType().GetCustomAttribute(false); + return att?.Behavior ?? DatabaseBehavior.NoDatabasePerFixture; + } + } + + protected virtual ISqlSyntaxProvider GetSyntaxProvider() + { + return new SqlCeSyntaxProvider(); + } + + protected virtual string GetDbProviderName() + { + return Constants.DbProviderNames.SqlCe; + } + + protected virtual string GetDbConnectionString() + { + return @"Datasource=|DataDirectory|UmbracoNPocoTests.sdf;Flush Interval=1;"; + } + + protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null) + { + var factory = routeData != null + ? new FakeHttpContextFactory(url, routeData) + : new FakeHttpContextFactory(url); + + return factory; + } + + /// + /// Creates the SqlCe database if required + /// + protected virtual void CreateSqlCeDatabase() + { + if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture) + return; + + var path = TestHelper.CurrentAssemblyDirectory; + + //Get the connectionstring settings from config + var settings = ConfigurationManager.ConnectionStrings[Core.Configuration.GlobalSettings.UmbracoConnectionName]; + ConfigurationManager.AppSettings.Set( + Core.Configuration.GlobalSettings.UmbracoConnectionName, + GetDbConnectionString()); + + _databasePath = string.Concat(path, "\\UmbracoNPocoTests.sdf"); + + //create a new database file if + // - is the first test in the session + // - the database file doesn't exist + // - NewDbFileAndSchemaPerTest + // - _isFirstTestInFixture + DbInitBehavior.NewDbFileAndSchemaPerFixture + + //if this is the first test in the session, always ensure a new db file is created + if (_isFirstInSession + || File.Exists(_databasePath) == false + || DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerTest + || DatabaseTestBehavior == DatabaseBehavior.EmptyDbFilePerTest + || (_isFirstInFixture && DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerFixture)) + { + using (ProfilingLogger.TraceDuration("Remove database file")) + { + RemoveDatabaseFile(null, ex => + { + //if this doesn't work we have to make sure everything is reset! otherwise + // well run into issues because we've already set some things up + TearDown(); + throw ex; + }); + } + + //Create the Sql CE database + using (ProfilingLogger.TraceDuration("Create database file")) + { + if (DatabaseTestBehavior != DatabaseBehavior.EmptyDbFilePerTest && _databaseBytes != null) + { + File.WriteAllBytes(_databasePath, _databaseBytes); + } + else + { + using (var engine = new SqlCeEngine(settings.ConnectionString)) + { + engine.CreateDatabase(); + } + } + } + + } + + } + + /// + /// sets up resolvers before resolution is frozen + /// + protected override void MoreSetUp() + { + // fixme - what about if (PropertyValueConvertersResolver.HasCurrent == false) ?? + Container.RegisterCollectionBuilder(); + + // ensure we have a FacadeService + if (_facadeService == null) + { + var behavior = GetType().GetCustomAttribute(false); + var cache = new NullCacheProvider(); + + var enableRepositoryEvents = behavior != null && behavior.EnableRepositoryEvents; + + ContentTypesCache = new PublishedContentTypeCache( + Core.DI.Current.Services.ContentTypeService, + Core.DI.Current.Services.MediaTypeService, + Core.DI.Current.Services.MemberTypeService, + Core.DI.Current.Logger); + + // testing=true so XmlStore will not use the file nor the database + var facadeAccessor = new TestFacadeAccessor(); + var service = new FacadeService( + Core.DI.Current.Services, + UowProvider, + cache, facadeAccessor, Core.DI.Current.Logger, ContentTypesCache, null, true, enableRepositoryEvents); + + // initialize PublishedCacheService content with an Xml source + service.XmlStore.GetXmlDocument = () => + { + var doc = new XmlDocument(); + doc.LoadXml(GetXmlContent(0)); + return doc; + }; + + _facadeService = service; + } + + base.MoreSetUp(); + } + + /// + /// Creates the tables and data for the database + /// + protected virtual void InitializeDatabase() + { + if (DatabaseTestBehavior == DatabaseBehavior.NoDatabasePerFixture || DatabaseTestBehavior == DatabaseBehavior.EmptyDbFilePerTest) + return; + + //create the schema and load default data if: + // - is the first test in the session + // - NewDbFileAndSchemaPerTest + // - _isFirstTestInFixture + DbInitBehavior.NewDbFileAndSchemaPerFixture + + if (_databaseBytes == null && + (_isFirstInSession + || DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerTest + || (_isFirstInFixture && DatabaseTestBehavior == DatabaseBehavior.NewDbFileAndSchemaPerFixture))) + { + var database = Core.DI.Current.DatabaseContext.Database; + var schemaHelper = new DatabaseSchemaHelper(database, Logger); + //Create the umbraco database and its base data + schemaHelper.CreateDatabaseSchema(Mock.Of(), Mock.Of()); + + //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(database); + + _databaseBytes = File.ReadAllBytes(_databasePath); + } + } + + private void CloseDbConnections(UmbracoDatabase database) + { + //Ensure that any database connections from a previous test is disposed. + //This is really just double safety as its also done in the TearDown. + database?.Dispose(); + SqlCeContextGuardian.CloseBackgroundConnection(); + } + + private void RemoveDatabaseFile(UmbracoDatabase database, Action onFail = null) + { + if (database != null) CloseDbConnections(database); + var path = TestHelper.CurrentAssemblyDirectory; + try + { + var filePath = string.Concat(path, "\\UmbracoNPocoTests.sdf"); + if (File.Exists(filePath)) + File.Delete(filePath); + } + catch (Exception ex) + { + Core.DI.Current.Logger.Error("Could not remove the old database file", ex); + + // swallow this exception - that's because a sub class might require further teardown logic + onFail?.Invoke(ex); + } + } + + protected UmbracoContext GetUmbracoContext(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IUmbracoSettingsSection umbracoSettings = null, IEnumerable urlProviders = null) + { + // ensure we have a PublishedCachesService + var service = _facadeService as FacadeService; + if (service == null) + throw new Exception("Not a proper XmlPublishedCache.PublishedCachesService."); + + // re-initialize PublishedCacheService content with an Xml source with proper template id + service.XmlStore.GetXmlDocument = () => + { + var doc = new XmlDocument(); + doc.LoadXml(GetXmlContent(templateId)); + return doc; + }; + + var httpContext = GetHttpContextFactory(url, routeData).HttpContext; + + var umbracoContext = UmbracoContext.CreateContext( + httpContext, + service, + new WebSecurity(httpContext, Core.DI.Current.Services.UserService), + umbracoSettings ?? SettingsForTests.GetDefault(), + urlProviders ?? Enumerable.Empty()); + + if (setSingleton) + Umbraco.Web.Current.SetUmbracoContext(umbracoContext, true); + + return umbracoContext; + } + + protected virtual string GetXmlContent(int templateId) + { + return @" + + + + +]> + + + + + 1 + + This is some content]]> + + + + + + + + + + + + + + + + +"; + } + } } \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/TestWithSettingsBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithSettingsBase.cs new file mode 100644 index 0000000000..afdb32bd60 --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/TestWithSettingsBase.cs @@ -0,0 +1,31 @@ +using NUnit.Framework; +using Current = Umbraco.Web.Current; + +namespace Umbraco.Tests.TestHelpers +{ + /// + /// Provides a base class for all Umbraco tests that use SettingsForTests. + /// + /// + /// Ensures that SettingsForTests is property resetted before and after each test executes. + /// Sets a test Umbraco context accessor. + /// + [TestFixture] + public abstract class TestWithSettingsBase : BaseTestBase + { + public override void SetUp() + { + base.SetUp(); + + SettingsForTests.Reset(); + Current.UmbracoContextAccessor = new TestUmbracoContextAccessor(); + } + + public override void TearDown() + { + base.TearDown(); + + SettingsForTests.Reset(); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/TreesAndSections/ApplicationTreeTest.cs b/src/Umbraco.Tests/TreesAndSections/ApplicationTreeTest.cs index c27d714f9a..f04a6efe2c 100644 --- a/src/Umbraco.Tests/TreesAndSections/ApplicationTreeTest.cs +++ b/src/Umbraco.Tests/TreesAndSections/ApplicationTreeTest.cs @@ -17,12 +17,11 @@ namespace Umbraco.Tests.TreesAndSections /// [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)] [TestFixture, RequiresSTA] - public class ApplicationTreeTest : BaseDatabaseFactoryTest + public class ApplicationTreeTest : TestWithDatabaseBase { - [SetUp] - public override void Initialize() + public override void SetUp() { - base.Initialize(); + base.SetUp(); var treesConfig = TestHelper.MapPathForTest("~/TEMP/TreesAndSections/trees.config"); var appConfig = TestHelper.MapPathForTest("~/TEMP/TreesAndSections/applications.config"); @@ -40,10 +39,10 @@ namespace Umbraco.Tests.TreesAndSections SectionService.AppConfigFilePath = appConfig; } - [TearDown] public override void TearDown() { base.TearDown(); + if (Directory.Exists(TestHelper.MapPathForTest("~/TEMP/TreesAndSections"))) { Directory.Delete(TestHelper.MapPathForTest("~/TEMP/TreesAndSections"), true); diff --git a/src/Umbraco.Tests/TreesAndSections/SectionTests.cs b/src/Umbraco.Tests/TreesAndSections/SectionTests.cs index 96568cb720..bd02bb7340 100644 --- a/src/Umbraco.Tests/TreesAndSections/SectionTests.cs +++ b/src/Umbraco.Tests/TreesAndSections/SectionTests.cs @@ -16,14 +16,18 @@ namespace Umbraco.Tests.TreesAndSections /// [RequiresAutoMapperMappings] [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] - [TestFixture()] - public class SectionTests : BaseDatabaseFactoryTest + [TestFixture] + public class SectionTests : TestWithDatabaseBase { - - [SetUp] - public override void Initialize() + protected override void Compose() { - base.Initialize(); + base.Compose(); + Container.Register(); + } + + public override void SetUp() + { + base.SetUp(); var treesConfig = TestHelper.MapPathForTest("~/TEMP/TreesAndSections/trees.config"); var appConfig = TestHelper.MapPathForTest("~/TEMP/TreesAndSections/applications.config"); @@ -41,10 +45,10 @@ namespace Umbraco.Tests.TreesAndSections SectionService.AppConfigFilePath = appConfig; } - [TearDown] public override void TearDown() { base.TearDown(); + if (Directory.Exists(TestHelper.MapPathForTest("~/TEMP/TreesAndSections"))) { Directory.Delete(TestHelper.MapPathForTest("~/TEMP/TreesAndSections"), true); diff --git a/src/Umbraco.Tests/TryConvertToTests.cs b/src/Umbraco.Tests/TryConvertToTests.cs index e537e7f465..5846b4cf62 100644 --- a/src/Umbraco.Tests/TryConvertToTests.cs +++ b/src/Umbraco.Tests/TryConvertToTests.cs @@ -9,23 +9,18 @@ using Umbraco.Core.DI; namespace Umbraco.Tests { [TestFixture] - public class TryConvertToTests + public class TryConvertToTests : BaseTestBase { - [SetUp] - public void SetUp() + public override void SetUp() { + base.SetUp(); + var settings = SettingsForTests.GetDefault(); var container = new ServiceContainer(); container.ConfigureUmbracoCore(); container.RegisterSingleton(_ => new DefaultShortStringHelper(settings)); } - [TearDown] - public void TearDown() - { - Current.Reset(); - } - [Test] public void ConvertToIntegerTest() { diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 7d9b3a0d14..26921a97a9 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -236,6 +236,7 @@ + @@ -249,7 +250,6 @@ - @@ -482,7 +482,7 @@ - + @@ -522,8 +522,8 @@ - - + + diff --git a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs index 5c958f6ed6..0bf4c6509e 100644 --- a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs +++ b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs @@ -14,7 +14,7 @@ using UmbracoExamine; namespace Umbraco.Tests.UmbracoExamine { [TestFixture] - public abstract class ExamineBaseTest : BaseDatabaseFactoryTest + public abstract class ExamineBaseTest : TestWithDatabaseBase { [TestFixtureSetUp] public void InitializeFixture() @@ -28,11 +28,11 @@ namespace Umbraco.Tests.UmbracoExamine /// /// sets up resolvers before resolution is frozen /// - protected override void FreezeResolution() + protected override void MoreSetUp() { Container.RegisterSingleton(_ => new DefaultShortStringHelper(SettingsForTests.GetDefault())); - base.FreezeResolution(); + base.MoreSetUp(); } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs b/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs index b4f4d41fb3..ada8200a3a 100644 --- a/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs @@ -13,6 +13,7 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; using Umbraco.Core.Profiling; using Umbraco.Core.Services; +using Umbraco.Tests.TestHelpers; using Umbraco.Web; using Umbraco.Web.Models; using Umbraco.Web.Mvc; @@ -62,7 +63,7 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), Mock.Of(), new Mock(null, null).Object, - Mock.Of(), + TestObjects.GetUmbracoSettings(), Enumerable.Empty(), true); var ctrl = new MatchesDefaultIndexController { UmbracoContext = umbCtx }; @@ -85,7 +86,7 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), Mock.Of(), new Mock(null, null).Object, - Mock.Of(), + TestObjects.GetUmbracoSettings(), Enumerable.Empty(), true); var ctrl = new MatchesOverriddenIndexController { UmbracoContext = umbCtx }; @@ -108,7 +109,7 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), Mock.Of(), new Mock(null, null).Object, - Mock.Of(), + TestObjects.GetUmbracoSettings(), Enumerable.Empty(), true); var ctrl = new MatchesCustomIndexController { UmbracoContext = umbCtx }; @@ -131,7 +132,7 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), Mock.Of(), new Mock(null, null).Object, - Mock.Of(), + TestObjects.GetUmbracoSettings(), Enumerable.Empty(), true); var ctrl = new MatchesAsyncIndexController { UmbracoContext = umbCtx }; diff --git a/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs index c912ce0c43..8eedadea4c 100644 --- a/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs @@ -6,16 +6,10 @@ using System.Web.Routing; using System.Web.Security; using Moq; using NUnit.Framework; -using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Dictionary; -using Umbraco.Core.Logging; -using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Profiling; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; using Umbraco.Web; @@ -23,41 +17,30 @@ using Umbraco.Web.Mvc; using Umbraco.Web.PublishedCache; using Umbraco.Web.Routing; using Umbraco.Web.Security; -using Current = Umbraco.Core.DI.Current; namespace Umbraco.Tests.Web.Mvc { [TestFixture] - public class SurfaceControllerTests + public class SurfaceControllerTests : TestWithApplicationBase { - [SetUp] - public void SetUp() + public override void SetUp() { - Umbraco.Web.Current.UmbracoContextAccessor = new TestUmbracoContextAccessor(); - } - - [TearDown] - public void TearDown() - { - Current.Reset(); + base.SetUp(); + Current.UmbracoContextAccessor = new TestUmbracoContextAccessor(); } [Test] public void Can_Construct_And_Get_Result() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - - var umbCtx = UmbracoContext.EnsureContext( + var umbracoContext = UmbracoContext.EnsureContext( new Mock().Object, Mock.Of(), new Mock(null, null).Object, - Mock.Of(), + TestObjects.GetUmbracoSettings(), Enumerable.Empty(), true); - var ctrl = new TestSurfaceController { UmbracoContext = umbCtx }; + var ctrl = new TestSurfaceController { UmbracoContext = umbracoContext }; var result = ctrl.Index(); @@ -77,7 +60,7 @@ namespace Umbraco.Tests.Web.Mvc new Mock().Object, Mock.Of(), new Mock(null, null).Object, - Mock.Of(), + TestObjects.GetUmbracoSettings(), Enumerable.Empty(), true); @@ -89,40 +72,30 @@ namespace Umbraco.Tests.Web.Mvc [Test] public void Umbraco_Helper_Not_Null() { - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(); - - //var appCtx = new ApplicationContext( - // new DatabaseContext(databaseFactory, Mock.Of(), Mock.Of(), Mock.Of()), - // TestObjects.GetServiceContextMock(), - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - - var umbCtx = UmbracoContext.EnsureContext( + var umbracoContext = UmbracoContext.EnsureContext( new Mock().Object, Mock.Of(), new Mock(null, null).Object, - Mock.Of(), + TestObjects.GetUmbracoSettings(), Enumerable.Empty(), true); - var ctrl = new TestSurfaceController { UmbracoContext = umbCtx }; + var controller = new TestSurfaceController { UmbracoContext = umbracoContext }; + Container.Register(_ => umbracoContext); + Container.InjectProperties(controller); - Assert.IsNotNull(ctrl.Umbraco); + Assert.IsNotNull(controller.Umbraco); } [Test] public void Can_Lookup_Content() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - var facade = new Mock(); facade.Setup(x => x.MemberCache).Returns(Mock.Of()); var facadeService = new Mock(); facadeService.Setup(x => x.CreateFacade(It.IsAny())).Returns(facade.Object); - var umbCtx = UmbracoContext.EnsureContext( + var umbracoContext = UmbracoContext.EnsureContext( new Mock().Object, facadeService.Object, new Mock(null, null).Object, @@ -131,21 +104,20 @@ namespace Umbraco.Tests.Web.Mvc true); var helper = new UmbracoHelper( - umbCtx, + umbracoContext, Mock.Of(), Mock.Of(query => query.Content(It.IsAny()) == //return mock of IPublishedContent for any call to GetById Mock.Of(content => content.Id == 2)), Mock.Of(), Mock.Of(), - new UrlProvider(umbCtx, Enumerable.Empty()), Mock.Of(), Mock.Of(), - new MembershipHelper(umbCtx, Mock.Of(), Mock.Of()), + new MembershipHelper(umbracoContext, Mock.Of(), Mock.Of()), new ServiceContext(), CacheHelper.CreateDisabledCacheHelper()); - var ctrl = new TestSurfaceController { UmbracoContext = umbCtx, Umbraco = helper }; + var ctrl = new TestSurfaceController { UmbracoContext = umbracoContext, Umbraco = helper }; var result = ctrl.GetContent(2) as PublishedContentResult; Assert.IsNotNull(result); @@ -155,13 +127,9 @@ namespace Umbraco.Tests.Web.Mvc [Test] public void Mock_Current_Page() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); - var webRoutingSettings = Mock.Of(section => section.UrlProviderMode == "AutoLegacy"); - var umbCtx = UmbracoContext.EnsureContext( + var umbracoContext = UmbracoContext.EnsureContext( new Mock().Object, Mock.Of(), new Mock(null, null).Object, @@ -171,9 +139,9 @@ namespace Umbraco.Tests.Web.Mvc var content = Mock.Of(publishedContent => publishedContent.Id == 12345); - var contextBase = umbCtx.HttpContext; + var contextBase = umbracoContext.HttpContext; var facadeRouter = BaseWebTest.CreateFacadeRouter(); - var frequest = facadeRouter.CreateRequest(umbCtx, new Uri("http://localhost/test")); + var frequest = facadeRouter.CreateRequest(umbracoContext, new Uri("http://localhost/test")); frequest.PublishedContent = content; var routeDefinition = new RouteDefinition @@ -184,7 +152,7 @@ namespace Umbraco.Tests.Web.Mvc var routeData = new RouteData(); routeData.DataTokens.Add(Core.Constants.Web.UmbracoRouteDefinitionDataToken, routeDefinition); - var ctrl = new TestSurfaceController { UmbracoContext = umbCtx, Umbraco = new UmbracoHelper() }; + var ctrl = new TestSurfaceController { UmbracoContext = umbracoContext, Umbraco = new UmbracoHelper() }; ctrl.ControllerContext = new ControllerContext(contextBase, routeData, ctrl); var result = ctrl.GetContentFromCurrentPage() as PublishedContentResult; diff --git a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs index 13a9db75ff..0bc9626015 100644 --- a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs @@ -6,26 +6,18 @@ using System.Web.Routing; using LightInject; using Moq; using NUnit.Framework; -using umbraco.BusinessLogic; -using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.Events; using Umbraco.Core.Logging; -using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; -using Umbraco.Core.Profiling; using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Tests.TestHelpers; -using Umbraco.Tests.TestHelpers.Stubs; using Umbraco.Web; using Umbraco.Web.Models; using Umbraco.Web.Mvc; -using Umbraco.Web.PublishedCache; using Umbraco.Web.PublishedCache.XmlPublishedCache; using Umbraco.Web.Routing; using Umbraco.Web.Security; @@ -33,7 +25,7 @@ using Umbraco.Web.Security; namespace Umbraco.Tests.Web.Mvc { [TestFixture] - public class UmbracoViewPageTests : BaseUmbracoConfigurationTest + public class UmbracoViewPageTests : TestWithApplicationBase { private FacadeService _service; @@ -414,7 +406,7 @@ namespace Umbraco.Tests.Web.Mvc { var svcCtx = GetServiceContext(); - var databaseFactory = TestObjects.GetIDatabaseFactoryMock(); + var databaseFactory = TestObjects.GetDatabaseFactoryMock(); //var appCtx = new ApplicationContext( // new DatabaseContext(databaseFactory, logger, Mock.Of(), Mock.Of()), @@ -432,7 +424,7 @@ namespace Umbraco.Tests.Web.Mvc GetHttpContextFactory(url, routeData).HttpContext, _service, new WebSecurity(http, Current.Services.UserService), - Mock.Of(), + TestObjects.GetUmbracoSettings(), Enumerable.Empty()); //if (setSingleton) diff --git a/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs b/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs index decf3fb5b7..090a823946 100644 --- a/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs +++ b/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs @@ -1,19 +1,12 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Web; using System.Web.Mvc; using System.Web.Routing; using Moq; using NUnit.Framework; -using Umbraco.Core; -using Umbraco.Core.Cache; using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.Logging; -using Umbraco.Core.Profiling; +using Umbraco.Tests.TestHelpers; using Umbraco.Web; using Umbraco.Web.Mvc; using Umbraco.Web.PublishedCache; @@ -24,25 +17,16 @@ using Current = Umbraco.Web.Current; namespace Umbraco.Tests.Web { [TestFixture] - public class WebExtensionMethodTests + public class WebExtensionMethodTests : TestWithApplicationBase { - [TearDown] - public void TearDown() - { - Current.Reset(); - } - [Test] public void RouteDataExtensions_GetUmbracoContext() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); var umbCtx = UmbracoContext.CreateContext( Mock.Of(), Mock.Of(), new WebSecurity(Mock.Of(), Current.Services.UserService), - Mock.Of(), + TestObjects.GetUmbracoSettings(), new List()); var r1 = new RouteData(); r1.DataTokens.Add(Core.Constants.Web.UmbracoContextDataToken, umbCtx); @@ -54,14 +38,11 @@ namespace Umbraco.Tests.Web [Test] public void ControllerContextExtensions_GetUmbracoContext_From_RouteValues() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); var umbCtx = UmbracoContext.CreateContext( Mock.Of(), Mock.Of(), new WebSecurity(Mock.Of(), Current.Services.UserService), - Mock.Of(), + TestObjects.GetUmbracoSettings(), new List()); var r1 = new RouteData(); @@ -83,14 +64,11 @@ namespace Umbraco.Tests.Web [Test] public void ControllerContextExtensions_GetUmbracoContext_From_Current() { - //var appCtx = new ApplicationContext( - // CacheHelper.CreateDisabledCacheHelper(), - // new ProfilingLogger(Mock.Of(), Mock.Of())); var umbCtx = UmbracoContext.CreateContext( Mock.Of(), Mock.Of(), new WebSecurity(Mock.Of(), Current.Services.UserService), - Mock.Of(), + TestObjects.GetUmbracoSettings(), new List()); var httpContext = Mock.Of(); @@ -104,8 +82,8 @@ namespace Umbraco.Tests.Web r3.DataTokens.Add("ParentActionViewContext", ctx2); var ctx3 = CreateViewContext(new ControllerContext(httpContext, r3, new MyController())); - Umbraco.Web.Current.UmbracoContextAccessor = new TestUmbracoContextAccessor(); - Umbraco.Web.Current.SetUmbracoContext(umbCtx, true); + Current.UmbracoContextAccessor = new TestUmbracoContextAccessor(); + Current.SetUmbracoContext(umbCtx, true); var result = ctx3.GetUmbracoContext(); diff --git a/src/Umbraco.Web/Routing/FacadeRouter.cs b/src/Umbraco.Web/Routing/FacadeRouter.cs index 3831458c9f..84b8e2555d 100644 --- a/src/Umbraco.Web/Routing/FacadeRouter.cs +++ b/src/Umbraco.Web/Routing/FacadeRouter.cs @@ -30,7 +30,7 @@ namespace Umbraco.Web.Routing // fixme - maybe we should be initialized with UmbracoContext accessor instead? private readonly IWebRoutingSection _webRoutingSection; - private readonly IEnumerable _contentFinders; + private readonly ContentFinderCollection _contentFinders; private readonly IContentLastChanceFinder _contentLastChanceFinder; private readonly ServiceContext _services; private readonly ProfilingLogger _profilingLogger; @@ -41,7 +41,7 @@ namespace Umbraco.Web.Routing /// public FacadeRouter( IWebRoutingSection webRoutingSection, - IEnumerable contentFinders, + ContentFinderCollection contentFinders, IContentLastChanceFinder contentLastChanceFinder, ServiceContext services, ProfilingLogger proflog) diff --git a/src/Umbraco.Web/Security/Identity/BackOfficeCookieManager.cs b/src/Umbraco.Web/Security/Identity/BackOfficeCookieManager.cs index ba420b8804..b447007f56 100644 --- a/src/Umbraco.Web/Security/Identity/BackOfficeCookieManager.cs +++ b/src/Umbraco.Web/Security/Identity/BackOfficeCookieManager.cs @@ -60,7 +60,7 @@ namespace Umbraco.Web.Security.Identity /// /// Determines if we should authenticate the request /// - /// + /// /// /// /// @@ -71,7 +71,7 @@ namespace Umbraco.Web.Security.Identity /// * it is a /base request /// * it is a preview request /// - internal bool ShouldAuthenticateRequest(IOwinContext ctx, Uri originalRequestUrl, bool checkForceAuthTokens = true) + internal bool ShouldAuthenticateRequest(IOwinContext owinContext, Uri originalRequestUrl, bool checkForceAuthTokens = true) { // Do not authenticate the request if we are not running (don't have a db, are not configured) - since we will never need // to know a current user in this scenario - we treat it as a new install. Without this we can have some issues @@ -82,8 +82,8 @@ namespace Umbraco.Web.Security.Identity if (_runtime.Level == RuntimeLevel.Install) return false; - var request = ctx.Request; - var httpCtx = ctx.TryGetHttpContext(); + var request = owinContext.Request; + var httpContext = owinContext.TryGetHttpContext(); //check the explicit paths if (_explicitPaths != null) @@ -95,8 +95,8 @@ namespace Umbraco.Web.Security.Identity if (request.Uri.AbsolutePath.InvariantEquals(_getRemainingSecondsPath)) return false; if (//check the explicit flag - (checkForceAuthTokens && ctx.Get("umbraco-force-auth") != null) - || (checkForceAuthTokens && httpCtx.Success && httpCtx.Result.Items["umbraco-force-auth"] != null) + (checkForceAuthTokens && owinContext.Get("umbraco-force-auth") != null) + || (checkForceAuthTokens && httpContext.Success && httpContext.Result.Items["umbraco-force-auth"] != null) //check back office || request.Uri.IsBackOfficeRequest(HttpRuntime.AppDomainAppVirtualPath) //check installer diff --git a/src/Umbraco.Web/UmbracoHelper.cs b/src/Umbraco.Web/UmbracoHelper.cs index 295e523cf0..40f1c4d9e4 100644 --- a/src/Umbraco.Web/UmbracoHelper.cs +++ b/src/Umbraco.Web/UmbracoHelper.cs @@ -36,7 +36,6 @@ namespace Umbraco.Web private MembershipHelper _membershipHelper; private ITagQuery _tag; private IDataTypeService _dataTypeService; - private UrlProvider _urlProvider; private ICultureDictionary _cultureDictionary; #region Constructors @@ -49,7 +48,6 @@ namespace Umbraco.Web IPublishedContentQuery query, ITagQuery tagQuery, IDataTypeService dataTypeService, - UrlProvider urlProvider, ICultureDictionary cultureDictionary, IUmbracoComponentRenderer componentRenderer, MembershipHelper membershipHelper, @@ -61,7 +59,6 @@ namespace Umbraco.Web if (query == null) throw new ArgumentNullException(nameof(query)); if (tagQuery == null) throw new ArgumentNullException(nameof(tagQuery)); if (dataTypeService == null) throw new ArgumentNullException(nameof(dataTypeService)); - if (urlProvider == null) throw new ArgumentNullException(nameof(urlProvider)); if (cultureDictionary == null) throw new ArgumentNullException(nameof(cultureDictionary)); if (componentRenderer == null) throw new ArgumentNullException(nameof(componentRenderer)); if (membershipHelper == null) throw new ArgumentNullException(nameof(membershipHelper)); @@ -71,7 +68,6 @@ namespace Umbraco.Web _umbracoContext = umbracoContext; _tag = new TagQuery(tagQuery); _dataTypeService = dataTypeService; - _urlProvider = urlProvider; _cultureDictionary = cultureDictionary; _componentRenderer = componentRenderer; _membershipHelper = membershipHelper; @@ -163,8 +159,7 @@ namespace Umbraco.Web /// /// Gets the url provider. /// - public UrlProvider UrlProvider => _urlProvider - ?? (_urlProvider = UmbracoContext.UrlProvider); + public UrlProvider UrlProvider => UmbracoContext.UrlProvider; /// /// Gets the datatype service. diff --git a/src/Umbraco.Web/UmbracoModule.cs b/src/Umbraco.Web/UmbracoModule.cs index 7d503b9ebc..0c66cf69a4 100644 --- a/src/Umbraco.Web/UmbracoModule.cs +++ b/src/Umbraco.Web/UmbracoModule.cs @@ -259,7 +259,7 @@ namespace Umbraco.Web // let requests pile up and wait for 10s then show the splash anyway if (UmbracoConfig.For.UmbracoSettings().Content.EnableSplashWhileLoading == false - && ((RuntimeState) Current.RuntimeState).WaitForRunLevel(TimeSpan.FromSeconds(10))) return true; + && ((RuntimeState) Runtime).WaitForRunLevel(TimeSpan.FromSeconds(10))) return true; // redirect to booting page httpContext.Response.StatusCode = 503; // temp not available diff --git a/src/Umbraco.Web/WebRuntimeComponent.cs b/src/Umbraco.Web/WebRuntimeComponent.cs index f71fcc0cdd..16c31e9094 100644 --- a/src/Umbraco.Web/WebRuntimeComponent.cs +++ b/src/Umbraco.Web/WebRuntimeComponent.cs @@ -15,6 +15,7 @@ using LightInject; using Umbraco.Core; using Umbraco.Core.Components; using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.DI; using Umbraco.Core.Dictionary; using Umbraco.Core.Events; @@ -134,14 +135,14 @@ namespace Umbraco.Web composition.Container.RegisterCollectionBuilder() .Append(); - composition.Container.RegisterCollectionBuilder < UrlProviderCollectionBuilder>() + composition.Container.RegisterCollectionBuilder() //.Append() // not enabled by default .Append() .Append(); composition.Container.RegisterSingleton(); - composition.Container.RegisterCollectionBuilder < ContentFinderCollectionBuilder>() + composition.Container.RegisterCollectionBuilder() // all built-in finders in the correct order, // devs can then modify this list on application startup .Append() @@ -168,6 +169,10 @@ namespace Umbraco.Web // auto-register views composition.Container.RegisterAuto(typeof(UmbracoViewPage<>)); + + // register facade router + composition.Container.Register(); + composition.Container.Register(_ => UmbracoConfig.For.UmbracoSettings().WebRouting); } internal void Initialize(