using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Persistence.EFCore.Scoping; using Umbraco.Cms.Tests.Common.Testing; using Umbraco.Cms.Tests.Integration.Testing; using Umbraco.Cms.Tests.Integration.Umbraco.Persistence.EFCore.DbContext; using IScopeProvider = Umbraco.Cms.Infrastructure.Scoping.IScopeProvider; namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Scoping { /// /// These tests verify that the various types of scopes we have can be created and disposed within each other. /// /// /// Scopes are: /// - "Normal" - created by "/>. /// - "Core" - created by "/>. /// - "EFCore" - created by "/>. /// [TestFixture] [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] internal sealed class NestedScopeTests : UmbracoIntegrationTest { private new IScopeProvider ScopeProvider => Services.GetRequiredService(); private ICoreScopeProvider CoreScopeProvider => Services.GetRequiredService(); private IEFCoreScopeProvider EfCoreScopeProvider => Services.GetRequiredService>(); [Test] public void CanNestScopes_Normal_Core_EfCore() { using (var ambientScope = ScopeProvider.CreateScope()) { ambientScope.WriteLock(Constants.Locks.ContentTree); using (var outerScope = CoreScopeProvider.CreateCoreScope()) { outerScope.WriteLock(Constants.Locks.ContentTree); using (var innerScope = EfCoreScopeProvider.CreateScope()) { innerScope.WriteLock(Constants.Locks.ContentTree); innerScope.Complete(); outerScope.Complete(); ambientScope.Complete(); } } } } [Test] public void CanNestScopes_Normal_EfCore_Core() { using (var ambientScope = ScopeProvider.CreateScope()) { ambientScope.WriteLock(Constants.Locks.ContentTree); using (var outerScope = EfCoreScopeProvider.CreateScope()) { outerScope.WriteLock(Constants.Locks.ContentTree); using (var innerScope = CoreScopeProvider.CreateCoreScope()) { innerScope.WriteLock(Constants.Locks.ContentTree); innerScope.Complete(); outerScope.Complete(); ambientScope.Complete(); } } } } [Test] public void CanNestScopes_Core_Normal_Efcore() { using (var ambientScope = CoreScopeProvider.CreateCoreScope()) { ambientScope.WriteLock(Constants.Locks.ContentTree); using (var outerScope = ScopeProvider.CreateScope()) { outerScope.WriteLock(Constants.Locks.ContentTree); using (var innerScope = EfCoreScopeProvider.CreateScope()) { innerScope.WriteLock(Constants.Locks.ContentTree); innerScope.Complete(); outerScope.Complete(); ambientScope.Complete(); } } } } [Test] public void CanNestScopes_Core_EfCore_Normal() { using (var ambientScope = CoreScopeProvider.CreateCoreScope()) { ambientScope.WriteLock(Constants.Locks.ContentTree); using (var outerScope = EfCoreScopeProvider.CreateScope()) { outerScope.WriteLock(Constants.Locks.ContentTree); using (var innerScope = ScopeProvider.CreateScope()) { innerScope.WriteLock(Constants.Locks.ContentTree); innerScope.Complete(); outerScope.Complete(); ambientScope.Complete(); } } } } [Test] public void CanNestScopes_EfCore_Normal_Core() { using (var ambientScope = EfCoreScopeProvider.CreateScope()) { ambientScope.WriteLock(Constants.Locks.ContentTree); using (var outerScope = ScopeProvider.CreateScope()) { outerScope.WriteLock(Constants.Locks.ContentTree); using (var innerScope = CoreScopeProvider.CreateCoreScope()) { innerScope.WriteLock(Constants.Locks.ContentTree); innerScope.Complete(); outerScope.Complete(); ambientScope.Complete(); } } } } [Test] public void CanNestScopes_EfCore_Core_Normal() { using (var ambientScope = EfCoreScopeProvider.CreateScope()) { ambientScope.WriteLock(Constants.Locks.ContentTree); using (var outerScope = CoreScopeProvider.CreateCoreScope()) { outerScope.WriteLock(Constants.Locks.ContentTree); using (var innerScope = ScopeProvider.CreateScope()) { innerScope.WriteLock(Constants.Locks.ContentTree); innerScope.Complete(); outerScope.Complete(); ambientScope.Complete(); } } } } [Test] public void CanNestScopes_Normal_Normal() { using (var ambientScope = ScopeProvider.CreateScope()) { ambientScope.WriteLock(Constants.Locks.ContentTree); using (var inner = ScopeProvider.CreateScope()) { inner.WriteLock(Constants.Locks.ContentTree); inner.Complete(); ambientScope.Complete(); } } } [Test] public void CanNestScopes_Core_Core() { using (var ambientScope = CoreScopeProvider.CreateCoreScope()) { ambientScope.WriteLock(Constants.Locks.ContentTree); using (var inner = CoreScopeProvider.CreateCoreScope()) { inner.WriteLock(Constants.Locks.ContentTree); inner.Complete(); ambientScope.Complete(); } } } [Test] public void CanNestScopes_EfCore_EfCore() { using (var ambientScope = EfCoreScopeProvider.CreateScope()) { ambientScope.WriteLock(Constants.Locks.ContentTree); using (var inner = EfCoreScopeProvider.CreateScope()) { inner.WriteLock(Constants.Locks.ContentTree); inner.Complete(); ambientScope.Complete(); } } } } }