diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index f324384a3d58..8694eb9bf8f4 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -372,7 +372,7 @@ public IContent Create(string name, IContent? parent, string contentTypeAlias, i public IContent CreateAndSave(string name, int parentId, string contentTypeAlias, int userId = Constants.Security.SuperUserId) { // TODO: what about culture? - using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = ScopeProvider.CreateCoreScope()) { // locking the content tree secures content types too scope.WriteLock(Constants.Locks.ContentTree); @@ -395,6 +395,8 @@ public IContent CreateAndSave(string name, int parentId, string contentTypeAlias Save(content, userId); + scope.Complete(); + return content; } } @@ -416,7 +418,7 @@ public IContent CreateAndSave(string name, IContent parent, string contentTypeAl throw new ArgumentNullException(nameof(parent)); } - using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = ScopeProvider.CreateCoreScope()) { // locking the content tree secures content types too scope.WriteLock(Constants.Locks.ContentTree); @@ -431,6 +433,7 @@ public IContent CreateAndSave(string name, IContent parent, string contentTypeAl Save(content, userId); + scope.Complete(); return content; } } @@ -508,10 +511,11 @@ public ContentScheduleCollection GetContentScheduleByContentId(int contentId) /// public void PersistContentSchedule(IContent content, ContentScheduleCollection contentSchedule) { - using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = ScopeProvider.CreateCoreScope()) { scope.WriteLock(Constants.Locks.ContentTree); _documentRepository.PersistContentSchedule(content, contentSchedule); + scope.Complete(); } } @@ -2960,7 +2964,7 @@ private OperationResult Sort(ICoreScope scope, IContent[] itemsA, int userId, Ev public ContentDataIntegrityReport CheckDataIntegrity(ContentDataIntegrityReportOptions options) { - using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = ScopeProvider.CreateCoreScope()) { scope.WriteLock(Constants.Locks.ContentTree); @@ -2973,6 +2977,8 @@ public ContentDataIntegrityReport CheckDataIntegrity(ContentDataIntegrityReportO scope.Notifications.Publish(new ContentTreeChangeNotification(root, TreeChangeTypes.RefreshAll, EventMessagesFactory.Get())); } + scope.Complete(); + return report; } } diff --git a/src/Umbraco.Core/Services/ContentTypeServiceBaseOfTRepositoryTItemTService.cs b/src/Umbraco.Core/Services/ContentTypeServiceBaseOfTRepositoryTItemTService.cs index 7cf63445a934..512fad06742e 100644 --- a/src/Umbraco.Core/Services/ContentTypeServiceBaseOfTRepositoryTItemTService.cs +++ b/src/Umbraco.Core/Services/ContentTypeServiceBaseOfTRepositoryTItemTService.cs @@ -322,7 +322,6 @@ public IEnumerable GetAll(IEnumerable? ids) } using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) - { scope.ReadLock(ReadLockIds); return Repository.GetMany(ids.ToArray()); diff --git a/src/Umbraco.Core/Services/ContentVersionService.cs b/src/Umbraco.Core/Services/ContentVersionService.cs index 24443a3957db..d4dea0af914a 100644 --- a/src/Umbraco.Core/Services/ContentVersionService.cs +++ b/src/Umbraco.Core/Services/ContentVersionService.cs @@ -68,7 +68,7 @@ public IReadOnlyCollection PerformContentVersionCleanup(Date /// public void SetPreventCleanup(int versionId, bool preventCleanup, int userId = -1) { - using (ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = _scopeProvider.CreateCoreScope()) { scope.WriteLock(Constants.Locks.ContentTree); _documentVersionRepository.SetPreventCleanup(versionId, preventCleanup); @@ -87,6 +87,7 @@ public void SetPreventCleanup(int versionId, bool preventCleanup, int userId = - var message = $"set preventCleanup = '{preventCleanup}' for version '{versionId}'"; Audit(auditType, userId, version.ContentId, message, $"{version.VersionDate}"); + scope.Complete(); } } @@ -120,7 +121,7 @@ private IReadOnlyCollection CleanupDocumentVersions(DateTime * * tl;dr lots of scopes to enable other connections to use the DB whilst we work. */ - using (ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = _scopeProvider.CreateCoreScope()) { IReadOnlyCollection? allHistoricVersions = _documentVersionRepository.GetDocumentVersionsEligibleForCleanup(); @@ -149,6 +150,8 @@ private IReadOnlyCollection CleanupDocumentVersions(DateTime versionsToDelete.Add(version); } + + scope.Complete(); } if (!versionsToDelete.Any()) @@ -161,7 +164,7 @@ private IReadOnlyCollection CleanupDocumentVersions(DateTime foreach (IEnumerable group in versionsToDelete.InGroupsOf(Constants.Sql.MaxParameterCount)) { - using (ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = _scopeProvider.CreateCoreScope()) { scope.WriteLock(Constants.Locks.ContentTree); var groupEnumerated = group.ToList(); @@ -174,12 +177,16 @@ private IReadOnlyCollection CleanupDocumentVersions(DateTime scope.Notifications.Publish( new ContentDeletedVersionsNotification(version.ContentId, messages, version.VersionId)); } + + scope.Complete(); } } - using (_scopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = _scopeProvider.CreateCoreScope()) { Audit(AuditType.Delete, Constants.Security.SuperUserId, -1, $"Removed {versionsToDelete.Count} ContentVersion(s) according to cleanup policy"); + + scope.Complete(); } return versionsToDelete; diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs index 92ab381c7984..885cfc21af3c 100644 --- a/src/Umbraco.Core/Services/DataTypeService.cs +++ b/src/Umbraco.Core/Services/DataTypeService.cs @@ -608,7 +608,7 @@ public void Delete(IDataType dataType, int userId = Constants.Security.SuperUser public IReadOnlyDictionary> GetReferences(int id) { - using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete:true); + using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true); return _dataTypeRepository.FindUsages(id); } diff --git a/src/Umbraco.Core/Services/DefaultContentVersionCleanupPolicy.cs b/src/Umbraco.Core/Services/DefaultContentVersionCleanupPolicy.cs index f51858fa5b25..234dae683f80 100644 --- a/src/Umbraco.Core/Services/DefaultContentVersionCleanupPolicy.cs +++ b/src/Umbraco.Core/Services/DefaultContentVersionCleanupPolicy.cs @@ -33,7 +33,7 @@ public IEnumerable Apply(DateTime asAtDate, IEnumerable(); - using (_scopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = _scopeProvider.CreateCoreScope()) { var policyOverrides = _documentVersionRepository.GetCleanupPolicies()? .ToDictionary(x => x.ContentTypeId); @@ -77,6 +77,8 @@ public IEnumerable Apply(DateTime asAtDate, IEnumerable items, int userId = Constants.Security.Supe public ContentDataIntegrityReport CheckDataIntegrity(ContentDataIntegrityReportOptions options) { - using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = ScopeProvider.CreateCoreScope()) { scope.WriteLock(Constants.Locks.MediaTree); @@ -1210,6 +1210,7 @@ public ContentDataIntegrityReport CheckDataIntegrity(ContentDataIntegrityReportO scope.Notifications.Publish(new MediaTreeChangeNotification(root, TreeChangeTypes.RefreshAll, EventMessagesFactory.Get())); } + scope.Complete(); return report; } } diff --git a/src/Umbraco.Core/Services/TwoFactorLoginService.cs b/src/Umbraco.Core/Services/TwoFactorLoginService.cs index de79284ac9fc..19ecf5a2dfe2 100644 --- a/src/Umbraco.Core/Services/TwoFactorLoginService.cs +++ b/src/Umbraco.Core/Services/TwoFactorLoginService.cs @@ -59,8 +59,10 @@ public TwoFactorLoginService( /// public async Task DeleteUserLoginsAsync(Guid userOrMemberKey) { - using ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true); + using ICoreScope scope = _scopeProvider.CreateCoreScope(); await _twoFactorLoginRepository.DeleteUserLoginsAsync(userOrMemberKey); + + scope.Complete(); } /// @@ -155,8 +157,12 @@ public async Task IsTwoFactorEnabledAsync(Guid userOrMemberKey) => /// public async Task DisableAsync(Guid userOrMemberKey, string providerName) { - using ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true); - return await _twoFactorLoginRepository.DeleteUserLoginsAsync(userOrMemberKey, providerName); + using ICoreScope scope = _scopeProvider.CreateCoreScope(); + var result = await _twoFactorLoginRepository.DeleteUserLoginsAsync(userOrMemberKey, providerName); + + scope.Complete(); + + return result; } /// @@ -173,9 +179,10 @@ public bool ValidateTwoFactorSetup(string providerName, string secret, string co /// public Task SaveAsync(TwoFactorLogin twoFactorLogin) { - using ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true); + using ICoreScope scope = _scopeProvider.CreateCoreScope(); _twoFactorLoginRepository.Save(twoFactorLogin); + scope.Complete(); return Task.CompletedTask; } diff --git a/src/Umbraco.Infrastructure/HostedServices/ScheduledPublishing.cs b/src/Umbraco.Infrastructure/HostedServices/ScheduledPublishing.cs index d593124ccbeb..d8a77414dc30 100644 --- a/src/Umbraco.Infrastructure/HostedServices/ScheduledPublishing.cs +++ b/src/Umbraco.Infrastructure/HostedServices/ScheduledPublishing.cs @@ -94,7 +94,7 @@ public override Task PerformExecuteAsync(object? state) // but then what should be its "scope"? could we attach it to scopes? // - and we should definitively *not* have to flush it here (should be auto) using UmbracoContextReference contextReference = _umbracoContextFactory.EnsureUmbracoContext(); - using ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true); + using ICoreScope scope = _scopeProvider.CreateCoreScope(); /* We used to assume that there will never be two instances running concurrently where (IsMainDom && ServerRole == SchedulingPublisher) * However this is possible during an azure deployment slot swap for the SchedulingPublisher instance when trying to achieve zero downtime deployments. @@ -113,6 +113,8 @@ public override Task PerformExecuteAsync(object? state) grouped.Count(), grouped.Key); } + + scope.Complete(); } finally { diff --git a/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerConfig.cs b/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerConfig.cs index e8b9de36d78f..082efbfb124e 100644 --- a/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerConfig.cs +++ b/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerConfig.cs @@ -1,6 +1,8 @@ -using Umbraco.Cms.Core.Models; +using Microsoft.Extensions.DependencyInjection; +using Umbraco.Cms.Core.DependencyInjection; +using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Repositories; -using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Infrastructure.Scoping; using IScope = Umbraco.Cms.Infrastructure.Scoping.IScope; namespace Umbraco.Cms.Core.Logging.Viewer; @@ -10,6 +12,21 @@ public class LogViewerConfig : ILogViewerConfig private readonly ILogViewerQueryRepository _logViewerQueryRepository; private readonly IScopeProvider _scopeProvider; + [Obsolete("Use non-obsolete ctor. This will be removed in Umbraco 14.")] + public LogViewerConfig(ILogViewerQueryRepository logViewerQueryRepository, Umbraco.Cms.Core.Scoping.IScopeProvider scopeProvider) + : this(logViewerQueryRepository, StaticServiceProvider.Instance.GetRequiredService()) + { + + } + + //Temp ctor used by MSDI (Greedy) + [Obsolete("Use non-obsolete ctor. This will be removed in Umbraco 14.")] + public LogViewerConfig(ILogViewerQueryRepository logViewerQueryRepository, Umbraco.Cms.Core.Scoping.IScopeProvider coreScopeProvider, IScopeProvider scopeProvider) + : this(logViewerQueryRepository, scopeProvider) + { + + } + public LogViewerConfig(ILogViewerQueryRepository logViewerQueryRepository, IScopeProvider scopeProvider) { _logViewerQueryRepository = logViewerQueryRepository; @@ -26,15 +43,16 @@ public LogViewerConfig(ILogViewerQueryRepository logViewerQueryRepository, IScop public IReadOnlyList? AddSavedSearch(string? name, string? query) { - using IScope scope = _scopeProvider.CreateScope(autoComplete: true); + using IScope scope = _scopeProvider.CreateScope(); _logViewerQueryRepository.Save(new LogViewerQuery(name, query)); + scope.Complete(); return GetSavedSearches(); } public IReadOnlyList? DeleteSavedSearch(string? name, string? query) { - using IScope scope = _scopeProvider.CreateScope(autoComplete: true); + using IScope scope = _scopeProvider.CreateScope(); ILogViewerQuery? item = name is null ? null : _logViewerQueryRepository.GetByName(name); if (item is not null) { @@ -42,6 +60,8 @@ public LogViewerConfig(ILogViewerQueryRepository logViewerQueryRepository, IScop } // Return the updated object - so we can instantly reset the entire array from the API response - return GetSavedSearches(); + IReadOnlyList result = GetSavedSearches(); + scope.Complete(); + return result; } } diff --git a/src/Umbraco.Infrastructure/Security/MemberUserStore.cs b/src/Umbraco.Infrastructure/Security/MemberUserStore.cs index 70efeeb73913..059017baaa6f 100644 --- a/src/Umbraco.Infrastructure/Security/MemberUserStore.cs +++ b/src/Umbraco.Infrastructure/Security/MemberUserStore.cs @@ -96,7 +96,7 @@ public override Task CreateAsync( throw new ArgumentNullException(nameof(user)); } - using ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true); + using ICoreScope scope = _scopeProvider.CreateCoreScope(); // create member IMember memberEntity = _memberService.CreateMember( @@ -150,6 +150,7 @@ public override Task CreateAsync( x.Value))); } + scope.Complete(); return Task.FromResult(IdentityResult.Success); } catch (Exception ex) @@ -179,7 +180,7 @@ public override Task UpdateAsync( throw new InvalidOperationException("The user id must be an integer to work with the Umbraco"); } - using ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true); + using ICoreScope scope = _scopeProvider.CreateCoreScope(); IMember? found = _memberService.GetById(asInt); if (found != null) @@ -220,6 +221,7 @@ public override Task UpdateAsync( } } + scope.Complete(); return Task.FromResult(IdentityResult.Success); } catch (Exception ex) diff --git a/src/Umbraco.Web.Website/Controllers/UmbProfileController.cs b/src/Umbraco.Web.Website/Controllers/UmbProfileController.cs index 41286f7dba01..22d5f7e3e268 100644 --- a/src/Umbraco.Web.Website/Controllers/UmbProfileController.cs +++ b/src/Umbraco.Web.Website/Controllers/UmbProfileController.cs @@ -102,7 +102,7 @@ private void AddErrors(IdentityResult result) private async Task UpdateMemberAsync(ProfileModel model, MemberIdentityUser currentMember) { - using ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true); + using ICoreScope scope = _scopeProvider.CreateCoreScope(); currentMember.Email = model.Email; currentMember.Name = model.Name; @@ -140,6 +140,7 @@ private async Task UpdateMemberAsync(ProfileModel model, MemberI _memberService.Save(member); + scope.Complete(); return saveResult; } } diff --git a/src/Umbraco.Web.Website/Controllers/UmbRegisterController.cs b/src/Umbraco.Web.Website/Controllers/UmbRegisterController.cs index 493dd624d1a9..3fb2a966c439 100644 --- a/src/Umbraco.Web.Website/Controllers/UmbRegisterController.cs +++ b/src/Umbraco.Web.Website/Controllers/UmbRegisterController.cs @@ -118,7 +118,7 @@ private void AddErrors(IdentityResult result) /// Result of registration operation. private async Task RegisterMemberAsync(RegisterModel model) { - using ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true); + using ICoreScope scope = _scopeProvider.CreateCoreScope(); // U4-10762 Server error with "Register Member" snippet (Cannot save member with empty name) // If name field is empty, add the email address instead. @@ -160,6 +160,8 @@ private async Task RegisterMemberAsync(RegisterModel model) } } + scope.Complete(); + return identityResult; } } diff --git a/tests/Umbraco.Tests.Common/TestHelperBase.cs b/tests/Umbraco.Tests.Common/TestHelperBase.cs index ba7d29cd69cf..21c3c65b7da5 100644 --- a/tests/Umbraco.Tests.Common/TestHelperBase.cs +++ b/tests/Umbraco.Tests.Common/TestHelperBase.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; using Moq; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; @@ -14,6 +15,8 @@ using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Diagnostics; +using Umbraco.Cms.Core.DistributedLocking; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Logging; @@ -24,6 +27,8 @@ using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.Persistence; +using Umbraco.Cms.Infrastructure.Persistence.SqlSyntax; +using Umbraco.Cms.Infrastructure.Scoping; using Umbraco.Cms.Infrastructure.Serialization; using Umbraco.Cms.Tests.Common.TestHelpers; using Umbraco.Extensions; @@ -76,6 +81,61 @@ public string WorkingDirectory public IShortStringHelper ShortStringHelper { get; } = new DefaultShortStringHelper(new DefaultShortStringHelperConfig()); + public IScopeProvider ScopeProvider + { + get + { + var loggerFactory = NullLoggerFactory.Instance; + var fileSystems = new FileSystems( + loggerFactory, + Mock.Of(), + Mock.Of>(), + Mock.Of()); + var mediaFileManager = new MediaFileManager( + Mock.Of(), + Mock.Of(), + loggerFactory.CreateLogger(), + Mock.Of(), + Mock.Of(), + Options.Create(new ContentSettings())); + var databaseFactory = new Mock(); + var database = new Mock(); + var sqlContext = new Mock(); + + var lockingMechanism = new Mock(); + lockingMechanism.Setup(x => x.ReadLock(It.IsAny(), It.IsAny())) + .Returns(Mock.Of()); + lockingMechanism.Setup(x => x.WriteLock(It.IsAny(), It.IsAny())) + .Returns(Mock.Of()); + + var lockingMechanismFactory = new Mock(); + lockingMechanismFactory.Setup(x => x.DistributedLockingMechanism) + .Returns(lockingMechanism.Object); + + // Setup mock of database factory to return mock of database. + databaseFactory.Setup(x => x.CreateDatabase()).Returns(database.Object); + databaseFactory.Setup(x => x.SqlContext).Returns(sqlContext.Object); + + // Setup mock of database to return mock of sql SqlContext + database.Setup(x => x.SqlContext).Returns(sqlContext.Object); + + var syntaxProviderMock = new Mock(); + + // Setup mock of ISqlContext to return syntaxProviderMock + sqlContext.Setup(x => x.SqlSyntax).Returns(syntaxProviderMock.Object); + + return new ScopeProvider( + new AmbientScopeStack(), + new AmbientScopeContextStack(), + lockingMechanismFactory.Object, + databaseFactory.Object, + fileSystems, + new TestOptionsMonitor(new CoreDebugSettings()), + mediaFileManager, + loggerFactory, + Mock.Of()); + } + } public IJsonSerializer JsonSerializer { get; } = new JsonNetSerializer(); diff --git a/tests/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs b/tests/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs index cfc57ee9ff2d..b123a6695e62 100644 --- a/tests/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs +++ b/tests/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs @@ -32,6 +32,7 @@ using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Routing; using Umbraco.Cms.Core.Runtime; +using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.Mail; @@ -43,6 +44,7 @@ using Umbraco.Extensions; using File = System.IO.File; using IHostingEnvironment = Umbraco.Cms.Core.Hosting.IHostingEnvironment; +using IScopeProvider = Umbraco.Cms.Infrastructure.Scoping.IScopeProvider; namespace Umbraco.Cms.Tests.UnitTests.TestHelpers; @@ -59,6 +61,8 @@ public static class TestHelper /// The assembly directory. public static string WorkingDirectory => s_testHelperInternal.WorkingDirectory; + public static IScopeProvider ScopeProvider => s_testHelperInternal.ScopeProvider; + public static ICoreScopeProvider CoreScopeProvider => s_testHelperInternal.ScopeProvider; public static IShortStringHelper ShortStringHelper => s_testHelperInternal.ShortStringHelper; public static IJsonSerializer JsonSerializer => s_testHelperInternal.JsonSerializer; diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Logging/LogviewerTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Logging/LogviewerTests.cs index 5c028714b80e..cf3d985b2a08 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Logging/LogviewerTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Logging/LogviewerTests.cs @@ -49,7 +49,7 @@ public void Setup() File.Copy(exampleLogfilePath, _newLogfilePath, true); var logger = Mock.Of>(); - var logViewerConfig = new LogViewerConfig(LogViewerQueryRepository, Mock.Of()); + var logViewerConfig = new LogViewerConfig(LogViewerQueryRepository, TestHelper.ScopeProvider); var logLevelLoader = Mock.Of(); _logViewer = new SerilogJsonLogViewer(logger, logViewerConfig, loggingConfiguration, logLevelLoader, Log.Logger); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberManagerTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberManagerTests.cs index f745c06ceb0d..10d45109022e 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberManagerTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberManagerTests.cs @@ -17,6 +17,7 @@ using Umbraco.Cms.Tests.Common; using Umbraco.Cms.Tests.Common.Builders; using Umbraco.Cms.Tests.Common.Builders.Extensions; +using Umbraco.Cms.Tests.UnitTests.TestHelpers; using Umbraco.Cms.Web.Common.Security; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security; @@ -33,7 +34,7 @@ public class MemberManagerTests public MemberManager CreateSut() { - var scopeProvider = new Mock().Object; + var scopeProvider = TestHelper.ScopeProvider; _mockMemberService = new Mock(); var mapDefinitions = new List diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberUserStoreTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberUserStoreTests.cs index 9e2a769e746e..79a60418182a 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberUserStoreTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberUserStoreTests.cs @@ -15,6 +15,7 @@ using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Tests.UnitTests.TestHelpers; using Umbraco.Cms.Tests.UnitTests.Umbraco.Core.ShortStringHelper; using IScopeProvider = Umbraco.Cms.Infrastructure.Scoping.IScopeProvider; @@ -28,23 +29,12 @@ public class MemberUserStoreTests public MemberUserStore CreateSut() { _mockMemberService = new Mock(); - var mockScope = new Mock(); - var mockScopeProvider = new Mock(); - mockScopeProvider - .Setup(x => x.CreateScope( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(mockScope.Object); + var mockScopeProvider = TestHelper.ScopeProvider; return new MemberUserStore( _mockMemberService.Object, - new UmbracoMapper(new MapDefinitionCollection(() => new List()), mockScopeProvider.Object, NullLogger.Instance), - mockScopeProvider.Object, + new UmbracoMapper(new MapDefinitionCollection(() => new List()), mockScopeProvider, NullLogger.Instance), + mockScopeProvider, new IdentityErrorDescriber(), Mock.Of(), Mock.Of(),