* Remove nucache reference from Web.Common * Get tests building-ish * Move ReservedFieldNamesService to the right project * Remove IPublishedSnapshotStatus * Added functionality to the INavigationQueryService to get root keys * Fixed issue with navigation * Remove IPublishedSnapshot from UmbracoContext * Begin removing usage of IPublishedSnapshot from PublishedContentExtensions * Fix PublishedContentExtensions.cs * Don't use snapshots in delivery media api * Use IPublishedMediaCache in QueryMediaApiController * Remove more usages of IPublishedSnapshotAccessor * Comment out tests * Remove more usages of PublishedSnapshotAccessor * Remove PublishedSnapshot from property * Fixed test build * Fix errors * Fix some tests * Delete NuCache 🎉 * Implement DatabaseCacheRebuilder * Remove usage of IPublishedSnapshotService * Remove IPublishedSnapshotService * Remove TestPublishedSnapshotAccessor and make tests build * Don't test Snapshot cachelevel It's no longer supported * Fix BlockEditorConverter Element != Element document type * Remember to set cachemanager * Fix RichTextParserTests * Implement TryGetLevel on INavigationQueryService * Fake level and obsolete it in PublishedContent * Remove ChildrenForAllCultures * Hack Path property on PublishedContent * Remove usages of IPublishedSnapshot in tests * More ConvertersTests * Add hybrid cache to integration tests We can actually do this now because we no longer save files on disk * Rename IPublishedSnapshotRebuilder to ICacheRebuilder * Comment out tests * V15: Replacing the usages of Parent (navigation data) from IPublishedContent (#17125) * Fix .Parent references in PublishedContentExtensions * Add missing methods to FriendlyPublishedContentExtensions (ones that you were able to call on the content directly as they now require extra params) * Fix references from the extension methods * Fix dependencies in tests * Replace IPublishedSnapshotAccessor with the content cache in tests * Resolving more .Parent references * Fix unit tests * Obsolete and use extension methods * Remove private method and use extension instead * Moving code around * Fix tests * Fix more references * Cleanup * Fix more usages * Resolve merge conflict * Fix tests * Cleanup * Fix more tests * Fixed unit tests * Cleanup * Replace last usages --------- Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove usage of IPublishedSnapshotAccessor from IRequestItemProvider * Post merge fixup * Remo IPublishedSnapshot * Add HasAny to IDocumentUrlService * Fix TextBuilder * Fix modelsbuilder tests * Use explicit types * Implement GetByContentType * Support element types in PublishedContentTypeCache * Run enlistments before publishing notifications * Fix elements cache refreshing * Implement GetByUdi * Implement GetAtRoot * Implement GetByRoute * Reimplement GetRouteById * Fix blocks unit tests * Initialize domain cache on boot * Only return routes with domains on non default lanauges * V15: Replacing the usages of `Children` (navigation data) from `IPublishedContent` (#17159) * Update params in PublishedContentExtensions to the general interfaces for the published cache and navigation service, so that we can use the extension methods on both documents and media * Introduce GetParent() which uses the right services * Fix obsolete message on .Parent * Obsolete .Children * Fix usages of Children for ApiMediaQueryService * Fix usage in internal * Fix usages in views * Fix indentation * Fix issue with delete language * Update nuget pacakges * Clear elements cache when content is deleted instead of trying to update it * Reset publishedModelFactory * Fixed publishing --------- Co-authored-by: Bjarke Berg <mail@bergmania.dk> Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> Co-authored-by: kjac <kja@umbraco.dk>
216 lines
8.6 KiB
C#
216 lines
8.6 KiB
C#
// Copyright (c) Umbraco.
|
|
// See LICENSE for more details.
|
|
|
|
using Examine;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.FileProviders;
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Options;
|
|
using Moq;
|
|
using NUnit.Framework;
|
|
using Umbraco.Cms.Core.Cache;
|
|
using Umbraco.Cms.Core.Composing;
|
|
using Umbraco.Cms.Core.Configuration.Models;
|
|
using Umbraco.Cms.Core.DistributedLocking;
|
|
using Umbraco.Cms.Core.Logging;
|
|
using Umbraco.Cms.Core.Runtime;
|
|
using Umbraco.Cms.Core.Services;
|
|
using Umbraco.Cms.Core.Sync;
|
|
using Umbraco.Cms.Infrastructure.Examine;
|
|
using Umbraco.Cms.Infrastructure.HostedServices;
|
|
using Umbraco.Cms.Persistence.EFCore.Locking;
|
|
using Umbraco.Cms.Persistence.EFCore.Scoping;
|
|
using Umbraco.Cms.Tests.Common.TestHelpers.Stubs;
|
|
using Umbraco.Cms.Tests.Integration.Implementations;
|
|
using Umbraco.Cms.Tests.Integration.Testing;
|
|
using Umbraco.Cms.Tests.Integration.Umbraco.Persistence.EFCore.DbContext;
|
|
|
|
namespace Umbraco.Cms.Tests.Integration.DependencyInjection;
|
|
|
|
/// <summary>
|
|
/// This is used to replace certain services that are normally registered from our Core / Infrastructure that
|
|
/// we do not want active within integration tests
|
|
/// </summary>
|
|
public static class UmbracoBuilderExtensions
|
|
{
|
|
/// <summary>
|
|
/// Uses/Replaces services with testing services
|
|
/// </summary>
|
|
public static IUmbracoBuilder AddTestServices(this IUmbracoBuilder builder, TestHelper testHelper)
|
|
{
|
|
builder.Services.AddUnique(AppCaches.NoCache);
|
|
builder.Services.AddUnique(Mock.Of<IUmbracoBootPermissionChecker>());
|
|
builder.Services.AddUnique(testHelper.MainDom);
|
|
|
|
builder.Services.AddUnique<IIndexRebuilder, TestBackgroundIndexRebuilder>();
|
|
|
|
#if IS_WINDOWS
|
|
// ensure all lucene indexes are using RAM directory (no file system)
|
|
builder.Services.AddUnique<IDirectoryFactory, LuceneRAMDirectoryFactory>();
|
|
#endif
|
|
|
|
// replace this service so that it can lookup the correct file locations
|
|
builder.Services.AddUnique(GetLocalizedTextService);
|
|
|
|
builder.Services.AddUnique<IServerMessenger, NoopServerMessenger>();
|
|
builder.Services.AddUnique<IProfiler, TestProfiler>();
|
|
|
|
builder.Services.AddDbContext<TestUmbracoDbContext>(
|
|
(serviceProvider, options) =>
|
|
{
|
|
var testDatabaseType = builder.Config.GetValue<TestDatabaseSettings.TestDatabaseType>("Tests:Database:DatabaseType");
|
|
if (testDatabaseType is TestDatabaseSettings.TestDatabaseType.Sqlite)
|
|
{
|
|
options.UseSqlite(serviceProvider.GetRequiredService<IOptionsMonitor<ConnectionStrings>>().CurrentValue.ConnectionString);
|
|
}
|
|
else
|
|
{
|
|
// If not Sqlite, assume SqlServer
|
|
options.UseSqlServer(serviceProvider.GetRequiredService<IOptionsMonitor<ConnectionStrings>>().CurrentValue.ConnectionString);
|
|
}
|
|
},
|
|
optionsLifetime: ServiceLifetime.Singleton);
|
|
|
|
builder.Services.AddDbContextFactory<TestUmbracoDbContext>(
|
|
(serviceProvider, options) =>
|
|
{
|
|
var testDatabaseType = builder.Config.GetValue<TestDatabaseSettings.TestDatabaseType>("Tests:Database:DatabaseType");
|
|
if (testDatabaseType is TestDatabaseSettings.TestDatabaseType.Sqlite)
|
|
{
|
|
options.UseSqlite(serviceProvider.GetRequiredService<IOptionsMonitor<ConnectionStrings>>().CurrentValue.ConnectionString);
|
|
}
|
|
else
|
|
{
|
|
// If not Sqlite, assume SqlServer
|
|
options.UseSqlServer(serviceProvider.GetRequiredService<IOptionsMonitor<ConnectionStrings>>().CurrentValue.ConnectionString);
|
|
}
|
|
});
|
|
|
|
builder.Services.AddUnique<IAmbientEFCoreScopeStack<TestUmbracoDbContext>, AmbientEFCoreScopeStack<TestUmbracoDbContext>>();
|
|
builder.Services.AddUnique<IEFCoreScopeAccessor<TestUmbracoDbContext>, EFCoreScopeAccessor<TestUmbracoDbContext>>();
|
|
builder.Services.AddUnique<IEFCoreScopeProvider<TestUmbracoDbContext>, EFCoreScopeProvider<TestUmbracoDbContext>>();
|
|
builder.Services.AddSingleton<IDistributedLockingMechanism, SqliteEFCoreDistributedLockingMechanism<TestUmbracoDbContext>>();
|
|
builder.Services.AddSingleton<IDistributedLockingMechanism, SqlServerEFCoreDistributedLockingMechanism<TestUmbracoDbContext>>();
|
|
|
|
return builder;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Used to register a replacement for <see cref="ILocalizedTextService" /> where the file sources are the ones within
|
|
/// the netcore project so
|
|
/// we don't need to copy files
|
|
/// </summary>
|
|
private static ILocalizedTextService GetLocalizedTextService(IServiceProvider factory)
|
|
{
|
|
var globalSettings = factory.GetRequiredService<IOptions<GlobalSettings>>();
|
|
var loggerFactory = factory.GetRequiredService<ILoggerFactory>();
|
|
var appCaches = factory.GetRequiredService<AppCaches>();
|
|
|
|
var localizedTextService = new LocalizedTextService(
|
|
new Lazy<LocalizedTextServiceFileSources>(() =>
|
|
{
|
|
// get the src folder
|
|
var root = TestContext.CurrentContext.TestDirectory.Split("tests")[0];
|
|
var srcFolder = Path.Combine(root, "src");
|
|
|
|
var currFolder = new DirectoryInfo(srcFolder);
|
|
|
|
if (!currFolder.Exists)
|
|
{
|
|
currFolder = new DirectoryInfo(Path.GetTempPath());
|
|
}
|
|
|
|
var uiProject = currFolder.GetDirectories("Umbraco.Web.UI", SearchOption.TopDirectoryOnly).FirstOrDefault();
|
|
if (uiProject == null)
|
|
{
|
|
uiProject = new DirectoryInfo(Path.Combine(Path.GetTempPath(), "Umbraco.Web.UI"));
|
|
uiProject.Create();
|
|
}
|
|
|
|
var mainLangFolder = new DirectoryInfo(Path.Combine(uiProject.FullName, globalSettings.Value.UmbracoPath.TrimStartExact("~/"), "config", "lang"));
|
|
|
|
return new LocalizedTextServiceFileSources(
|
|
loggerFactory.CreateLogger<LocalizedTextServiceFileSources>(),
|
|
appCaches,
|
|
currFolder,
|
|
Array.Empty<LocalizedTextServiceSupplementaryFileSource>(),
|
|
new EmbeddedFileProvider(typeof(IAssemblyProvider).Assembly, "Umbraco.Cms.Core.EmbeddedResources.Lang").GetDirectoryContents(string.Empty));
|
|
}),
|
|
loggerFactory.CreateLogger<LocalizedTextService>());
|
|
|
|
return localizedTextService;
|
|
}
|
|
|
|
// replace the default so there is no background index rebuilder
|
|
private class TestBackgroundIndexRebuilder : ExamineIndexRebuilder
|
|
{
|
|
public TestBackgroundIndexRebuilder(
|
|
IMainDom mainDom,
|
|
IRuntimeState runtimeState,
|
|
ILogger<ExamineIndexRebuilder> logger,
|
|
IExamineManager examineManager,
|
|
IEnumerable<IIndexPopulator> populators,
|
|
IBackgroundTaskQueue backgroundTaskQueue)
|
|
: base(
|
|
mainDom,
|
|
runtimeState,
|
|
logger,
|
|
examineManager,
|
|
populators,
|
|
backgroundTaskQueue)
|
|
{
|
|
}
|
|
|
|
public override void RebuildIndex(string indexName, TimeSpan? delay = null, bool useBackgroundThread = true)
|
|
{
|
|
// noop
|
|
}
|
|
|
|
public override void RebuildIndexes(bool onlyEmptyIndexes, TimeSpan? delay = null, bool useBackgroundThread = true)
|
|
{
|
|
// noop
|
|
}
|
|
}
|
|
|
|
private class NoopServerMessenger : IServerMessenger
|
|
{
|
|
public void QueueRefresh<TPayload>(ICacheRefresher refresher, TPayload[] payload)
|
|
{
|
|
}
|
|
|
|
public void QueueRefresh<T>(ICacheRefresher refresher, Func<T, int> getNumericId, params T[] instances)
|
|
{
|
|
}
|
|
|
|
public void QueueRefresh<T>(ICacheRefresher refresher, Func<T, Guid> getGuidId, params T[] instances)
|
|
{
|
|
}
|
|
|
|
public void QueueRemove<T>(ICacheRefresher refresher, Func<T, int> getNumericId, params T[] instances)
|
|
{
|
|
}
|
|
|
|
public void QueueRemove(ICacheRefresher refresher, params int[] numericIds)
|
|
{
|
|
}
|
|
|
|
public void QueueRefresh(ICacheRefresher refresher, params int[] numericIds)
|
|
{
|
|
}
|
|
|
|
public void QueueRefresh(ICacheRefresher refresher, params Guid[] guidIds)
|
|
{
|
|
}
|
|
|
|
public void QueueRefreshAll(ICacheRefresher refresher)
|
|
{
|
|
}
|
|
|
|
public void Sync() { }
|
|
|
|
public void SendMessages() { }
|
|
}
|
|
}
|