Files
Umbraco-CMS/src/Umbraco.Tests/TestHelpers/TestObjects.cs

260 lines
15 KiB
C#
Raw Normal View History

2016-04-14 18:17:18 +02:00
using System;
using System.Collections.Generic;
2016-04-22 09:58:02 +02:00
using System.IO;
using System.Linq;
2016-05-23 12:53:29 +02:00
using LightInject;
using Moq;
2016-04-14 18:17:18 +02:00
using NPoco;
2016-11-30 19:23:20 +01:00
using Umbraco.Core;
using Umbraco.Core.Cache;
2017-05-30 15:46:25 +02:00
using Umbraco.Core.Composing;
2016-04-22 09:58:02 +02:00
using Umbraco.Core.Events;
using Umbraco.Core.IO;
2016-04-14 18:17:18 +02:00
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
2016-05-23 12:53:29 +02:00
using Umbraco.Core.Persistence.Mappers;
2016-04-14 18:17:18 +02:00
using Umbraco.Core.Persistence.SqlSyntax;
2016-04-22 09:58:02 +02:00
using Umbraco.Core.Persistence.UnitOfWork;
2017-05-12 14:49:44 +02:00
using Umbraco.Core.Scoping;
2016-04-22 09:58:02 +02:00
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
using Umbraco.Web.Services;
2016-04-14 18:17:18 +02:00
namespace Umbraco.Tests.TestHelpers
{
/// <summary>
/// Provides objects for tests.
/// </summary>
2016-12-14 18:40:16 +01:00
internal partial class TestObjects
2016-04-14 18:17:18 +02:00
{
2016-12-14 18:40:16 +01:00
private readonly IServiceContainer _container;
public TestObjects(IServiceContainer container)
{
_container = container;
}
2016-04-14 18:17:18 +02:00
/// <summary>
/// Gets the default ISqlSyntaxProvider objects.
/// </summary>
/// <param name="logger">A logger.</param>
2017-05-12 14:49:44 +02:00
/// <param name="lazyScopeProvider">A (lazy) scope provider.</param>
2016-04-14 18:17:18 +02:00
/// <returns>The default ISqlSyntaxProvider objects.</returns>
2017-05-12 14:49:44 +02:00
public IEnumerable<ISqlSyntaxProvider> GetDefaultSqlSyntaxProviders(ILogger logger, Lazy<IScopeProvider> lazyScopeProvider = null)
2016-04-14 18:17:18 +02:00
{
return new ISqlSyntaxProvider[]
{
new MySqlSyntaxProvider(logger),
new SqlCeSyntaxProvider(),
2017-05-12 14:49:44 +02:00
new SqlServerSyntaxProvider(lazyScopeProvider ?? new Lazy<IScopeProvider>(() => null))
2016-04-14 18:17:18 +02:00
};
}
/// <summary>
/// Gets an UmbracoDatabase.
/// </summary>
/// <param name="logger">A logger.</param>
/// <returns>An UmbracoDatabase.</returns>
/// <remarks>This is just a void database that has no actual database but pretends to have an open connection
/// that can begin a transaction.</remarks>
2016-12-14 18:40:16 +01:00
public UmbracoDatabase GetUmbracoSqlCeDatabase(ILogger logger)
2016-04-14 18:17:18 +02:00
{
var syntax = new SqlCeSyntaxProvider();
2016-10-13 21:08:07 +02:00
var connection = GetDbConnection();
2017-09-22 18:28:21 +02:00
var sqlContext = new SqlContext(syntax, DatabaseType.SQLCe, Mock.Of<IPocoDataFactory>());
2016-11-29 18:59:01 +01:00
return new UmbracoDatabase(connection, sqlContext, logger);
2016-04-14 18:17:18 +02:00
}
/// <summary>
/// Gets an UmbracoDatabase.
/// </summary>
/// <param name="logger">A logger.</param>
/// <returns>An UmbracoDatabase.</returns>
/// <remarks>This is just a void database that has no actual database but pretends to have an open connection
/// that can begin a transaction.</remarks>
2016-12-14 18:40:16 +01:00
public UmbracoDatabase GetUmbracoSqlServerDatabase(ILogger logger)
2016-04-14 18:17:18 +02:00
{
2017-05-12 14:49:44 +02:00
var syntax = new SqlServerSyntaxProvider(new Lazy<IScopeProvider>(() => null)); // do NOT try to get the server's version!
2016-10-13 21:08:07 +02:00
var connection = GetDbConnection();
2017-09-22 18:28:21 +02:00
var sqlContext = new SqlContext(syntax, DatabaseType.SqlServer2008, Mock.Of<IPocoDataFactory>());
2016-11-29 18:59:01 +01:00
return new UmbracoDatabase(connection, sqlContext, logger);
2016-04-14 18:17:18 +02:00
}
2016-04-22 09:58:02 +02:00
2016-12-14 18:40:16 +01:00
public void RegisterServices(IServiceContainer container)
2016-10-13 21:08:07 +02:00
{ }
2016-04-22 09:58:02 +02:00
/// <summary>
/// Gets a ServiceContext.
/// </summary>
/// <param name="repositoryFactory">A repository factory.</param>
/// <param name="dbUnitOfWorkProvider">A database unit of work provider.</param>
/// <param name="cache">A cache.</param>
/// <param name="logger">A logger.</param>
/// <param name="eventMessagesFactory">An event messages factory.</param>
/// <param name="urlSegmentProviders">Some url segment providers.</param>
2016-10-13 21:08:07 +02:00
/// <param name="container">A container.</param>
2016-04-22 09:58:02 +02:00
/// <returns>A ServiceContext.</returns>
/// <remarks>Should be used sparingly for integration tests only - for unit tests
/// just mock the services to be passed to the ctor of the ServiceContext.</remarks>
2016-12-14 18:40:16 +01:00
public ServiceContext GetServiceContext(RepositoryFactory repositoryFactory,
2017-05-12 14:49:44 +02:00
IScopeUnitOfWorkProvider dbUnitOfWorkProvider,
2016-04-22 09:58:02 +02:00
CacheHelper cache,
ILogger logger,
IEventMessagesFactory eventMessagesFactory,
2016-10-13 21:08:07 +02:00
IEnumerable<IUrlSegmentProvider> urlSegmentProviders,
IServiceFactory container = null)
2016-04-22 09:58:02 +02:00
{
if (repositoryFactory == null) throw new ArgumentNullException(nameof(repositoryFactory));
if (dbUnitOfWorkProvider == null) throw new ArgumentNullException(nameof(dbUnitOfWorkProvider));
if (cache == null) throw new ArgumentNullException(nameof(cache));
if (logger == null) throw new ArgumentNullException(nameof(logger));
if (eventMessagesFactory == null) throw new ArgumentNullException(nameof(eventMessagesFactory));
var provider = dbUnitOfWorkProvider;
var mediaFileSystem = new MediaFileSystem(Mock.Of<IFileSystem>());
2016-04-22 09:58:02 +02:00
2016-10-13 21:08:07 +02:00
var migrationEntryService = GetLazyService<IMigrationEntryService>(container, () => new MigrationEntryService(provider, logger, eventMessagesFactory));
var externalLoginService = GetLazyService<IExternalLoginService>(container, () => new ExternalLoginService(provider, logger, eventMessagesFactory));
var publicAccessService = GetLazyService<IPublicAccessService>(container, () => new PublicAccessService(provider, logger, eventMessagesFactory));
var taskService = GetLazyService<ITaskService>(container, () => new TaskService(provider, logger, eventMessagesFactory));
var domainService = GetLazyService<IDomainService>(container, () => new DomainService(provider, logger, eventMessagesFactory));
var auditService = GetLazyService<IAuditService>(container, () => new AuditService(provider, logger, eventMessagesFactory));
2016-04-22 09:58:02 +02:00
2016-10-13 21:08:07 +02:00
var localizedTextService = GetLazyService<ILocalizedTextService>(container, () => new LocalizedTextService(
2016-04-22 09:58:02 +02:00
new Lazy<LocalizedTextServiceFileSources>(() =>
{
var mainLangFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Umbraco + "/config/lang/"));
var appPlugins = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.AppPlugins));
var configLangFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Config + "/lang/"));
var pluginLangFolders = appPlugins.Exists == false
? Enumerable.Empty<LocalizedTextServiceSupplementaryFileSource>()
: appPlugins.GetDirectories()
.SelectMany(x => x.GetDirectories("Lang"))
.SelectMany(x => x.GetFiles("*.xml", SearchOption.TopDirectoryOnly))
.Where(x => Path.GetFileNameWithoutExtension(x.FullName).Length == 5)
.Select(x => new LocalizedTextServiceSupplementaryFileSource(x, false));
//user defined langs that overwrite the default, these should not be used by plugin creators
var userLangFolders = configLangFolder.Exists == false
? Enumerable.Empty<LocalizedTextServiceSupplementaryFileSource>()
: configLangFolder
.GetFiles("*.user.xml", SearchOption.TopDirectoryOnly)
.Where(x => Path.GetFileNameWithoutExtension(x.FullName).Length == 10)
.Select(x => new LocalizedTextServiceSupplementaryFileSource(x, true));
return new LocalizedTextServiceFileSources(
logger,
cache.RuntimeCache,
mainLangFolder,
pluginLangFolders.Concat(userLangFolders));
}),
logger));
2017-09-14 19:29:12 +02:00
var runtimeState = Mock.Of<IRuntimeState>();
var idkMap = new IdkMap(provider);
var userService = GetLazyService<IUserService>(container, () => new UserService(provider, logger, eventMessagesFactory, runtimeState));
2016-10-13 21:08:07 +02:00
var dataTypeService = GetLazyService<IDataTypeService>(container, () => new DataTypeService(provider, logger, eventMessagesFactory));
2017-09-19 15:51:47 +02:00
var contentService = GetLazyService<IContentService>(container, () => new ContentService(provider, logger, eventMessagesFactory, mediaFileSystem));
2016-10-13 21:08:07 +02:00
var notificationService = GetLazyService<INotificationService>(container, () => new NotificationService(provider, userService.Value, contentService.Value, logger));
var serverRegistrationService = GetLazyService<IServerRegistrationService>(container, () => new ServerRegistrationService(provider, logger, eventMessagesFactory));
var memberGroupService = GetLazyService<IMemberGroupService>(container, () => new MemberGroupService(provider, logger, eventMessagesFactory));
var memberService = GetLazyService<IMemberService>(container, () => new MemberService(provider, logger, eventMessagesFactory, memberGroupService.Value, mediaFileSystem));
2017-09-19 15:51:47 +02:00
var mediaService = GetLazyService<IMediaService>(container, () => new MediaService(provider, mediaFileSystem, logger, eventMessagesFactory));
2016-10-13 21:08:07 +02:00
var contentTypeService = GetLazyService<IContentTypeService>(container, () => new ContentTypeService(provider, logger, eventMessagesFactory, contentService.Value));
var mediaTypeService = GetLazyService<IMediaTypeService>(container, () => new MediaTypeService(provider, logger, eventMessagesFactory, mediaService.Value));
2017-05-12 14:49:44 +02:00
var fileService = GetLazyService<IFileService>(container, () => new FileService(provider, logger, eventMessagesFactory));
2016-10-13 21:08:07 +02:00
var localizationService = GetLazyService<ILocalizationService>(container, () => new LocalizationService(provider, logger, eventMessagesFactory));
var memberTypeService = GetLazyService<IMemberTypeService>(container, () => new MemberTypeService(provider, logger, eventMessagesFactory, memberService.Value));
var entityService = GetLazyService<IEntityService>(container, () => new EntityService(
provider, logger, eventMessagesFactory,
contentService.Value, contentTypeService.Value, mediaService.Value, mediaTypeService.Value, dataTypeService.Value, memberService.Value, memberTypeService.Value,
2017-09-14 19:29:12 +02:00
idkMap,
2016-04-22 09:58:02 +02:00
//TODO: Consider making this an isolated cache instead of using the global one
cache.RuntimeCache));
2016-10-13 21:08:07 +02:00
var macroService = GetLazyService<IMacroService>(container, () => new MacroService(provider, logger, eventMessagesFactory));
2017-05-12 14:49:44 +02:00
var packagingService = GetLazyService<IPackagingService>(container, () => new PackagingService(logger, contentService.Value, contentTypeService.Value, mediaService.Value, macroService.Value, dataTypeService.Value, fileService.Value, localizationService.Value, entityService.Value, userService.Value, provider, urlSegmentProviders));
2016-10-13 21:08:07 +02:00
var relationService = GetLazyService<IRelationService>(container, () => new RelationService(provider, logger, eventMessagesFactory, entityService.Value));
var treeService = GetLazyService<IApplicationTreeService>(container, () => new ApplicationTreeService(logger, cache));
var tagService = GetLazyService<ITagService>(container, () => new TagService(provider, logger, eventMessagesFactory));
var sectionService = GetLazyService<ISectionService>(container, () => new SectionService(userService.Value, treeService.Value, provider, cache));
var redirectUrlService = GetLazyService<IRedirectUrlService>(container, () => new RedirectUrlService(provider, logger, eventMessagesFactory));
2016-04-22 09:58:02 +02:00
return new ServiceContext(
migrationEntryService,
publicAccessService,
taskService,
domainService,
auditService,
localizedTextService,
tagService,
contentService,
userService,
memberService,
mediaService,
contentTypeService,
mediaTypeService,
2016-04-22 09:58:02 +02:00
dataTypeService,
fileService,
localizationService,
packagingService,
serverRegistrationService,
entityService,
relationService,
treeService,
sectionService,
macroService,
memberTypeService,
memberGroupService,
notificationService,
2016-07-08 17:58:01 +02:00
externalLoginService,
redirectUrlService);
2016-04-22 09:58:02 +02:00
}
2016-05-23 12:53:29 +02:00
2016-12-14 18:40:16 +01:00
private Lazy<T> GetLazyService<T>(IServiceFactory container, Func<T> ctor)
2016-10-13 21:08:07 +02:00
where T : class
2016-05-23 12:53:29 +02:00
{
2016-10-13 21:08:07 +02:00
return new Lazy<T>(() => container?.TryGetInstance<T>() ?? ctor());
}
2017-06-23 18:54:42 +02:00
public IScopeProvider GetScopeProvider(ILogger logger, FileSystems fileSystems = null, IUmbracoDatabaseFactory databaseFactory = null)
2016-10-13 21:08:07 +02:00
{
if (databaseFactory == null)
{
2016-12-13 15:41:55 +01:00
//var mappersBuilder = new MapperCollectionBuilder(Current.Container); // fixme
//mappersBuilder.AddCore();
//var mappers = mappersBuilder.CreateCollection();
var mappers = Current.Container.GetInstance<IMapperCollection>();
2017-05-12 14:49:44 +02:00
databaseFactory = new UmbracoDatabaseFactory(Constants.System.UmbracoConnectionName, GetDefaultSqlSyntaxProviders(logger), logger, mappers);
}
2017-06-23 18:54:42 +02:00
fileSystems = fileSystems ?? new FileSystems(logger);
var scopeProvider = new ScopeProvider(databaseFactory, fileSystems, logger);
2017-05-12 14:49:44 +02:00
return scopeProvider;
}
public IScopeUnitOfWorkProvider GetScopeUnitOfWorkProvider(ILogger logger, IUmbracoDatabaseFactory databaseFactory = null, RepositoryFactory repositoryFactory = null, IScopeProvider scopeProvider = null)
{
if (databaseFactory == null)
{
//var mappersBuilder = new MapperCollectionBuilder(Current.Container); // fixme
//mappersBuilder.AddCore();
//var mappers = mappersBuilder.CreateCollection();
var mappers = Current.Container.GetInstance<IMapperCollection>();
databaseFactory = new UmbracoDatabaseFactory(Constants.System.UmbracoConnectionName, GetDefaultSqlSyntaxProviders(logger), logger, mappers);
}
if (scopeProvider == null)
{
var fileSystems = new FileSystems(logger);
scopeProvider = new ScopeProvider(databaseFactory, fileSystems, logger);
2016-10-13 21:08:07 +02:00
}
repositoryFactory = repositoryFactory ?? new RepositoryFactory(Mock.Of<IServiceContainer>());
2017-09-22 18:28:21 +02:00
return new ScopeUnitOfWorkProvider(scopeProvider, databaseFactory.SqlContext, repositoryFactory);
2016-05-23 12:53:29 +02:00
}
2016-04-14 18:17:18 +02:00
}
}