using System.Collections.Generic; using System.Diagnostics; using System.Linq; using AutoFixture.NUnit3; using Moq; using NUnit.Framework; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Tests.UnitTests.AutoFixture; namespace Umbraco.Tests.Services; [TestFixture] internal class ContentVersionCleanupServiceTest { [Test] [AutoMoqData] public void PerformContentVersionCleanup_Always_RespectsDeleteRevisionsCancellation( [Frozen] Mock eventAggregator, [Frozen] Mock policy, [Frozen] Mock documentVersionRepository, List someHistoricVersions, DateTime aDateTime, ContentVersionService sut) { documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup()) .Returns(someHistoricVersions); eventAggregator.Setup(x => x.PublishCancelable(It.IsAny())) .Returns(true); policy.Setup(x => x.Apply(aDateTime, someHistoricVersions)) .Returns(someHistoricVersions); // # Act var report = sut.PerformContentVersionCleanup(aDateTime); Assert.Multiple(() => { eventAggregator.Verify( x => x.PublishCancelable( It.IsAny()), Times.Exactly(someHistoricVersions.Count)); Assert.AreEqual(0, report.Count); }); } [Test] [AutoMoqData] public void PerformContentVersionCleanup_Always_FiresDeletedVersionsForEachDeletedVersion( [Frozen] Mock eventAggregator, [Frozen] Mock policy, [Frozen] Mock documentVersionRepository, List someHistoricVersions, DateTime aDateTime, ContentVersionService sut) { documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup()) .Returns(someHistoricVersions); eventAggregator .Setup(x => x.PublishCancelable(It.IsAny())) .Returns(false); policy.Setup(x => x.Apply(aDateTime, someHistoricVersions)) .Returns(someHistoricVersions); // # Act sut.PerformContentVersionCleanup(aDateTime); eventAggregator.Verify(x => x.Publish(It.IsAny()), Times.Exactly(someHistoricVersions.Count)); } [Test] [AutoMoqData] public void PerformContentVersionCleanup_Always_ReturnsReportOfDeletedItems( [Frozen] Mock eventAggregator, [Frozen] Mock policy, [Frozen] Mock documentVersionRepository, List someHistoricVersions, DateTime aDateTime, ContentVersionService sut) { documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup()) .Returns(someHistoricVersions); eventAggregator .Setup(x => x.PublishCancelable(It.IsAny())) .Returns(false); // # Act var report = sut.PerformContentVersionCleanup(aDateTime); Assert.Multiple(() => { Assert.Greater(report.Count, 0); Assert.AreEqual(someHistoricVersions.Count, report.Count); }); } [Test] [AutoMoqData] public void PerformContentVersionCleanup_Always_AdheresToCleanupPolicy( [Frozen] Mock eventAggregator, [Frozen] Mock policy, [Frozen] Mock documentVersionRepository, List someHistoricVersions, DateTime aDateTime, ContentVersionService sut) { documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup()) .Returns(someHistoricVersions); eventAggregator .Setup(x => x.PublishCancelable(It.IsAny())) .Returns(false); policy.Setup(x => x.Apply(It.IsAny(), It.IsAny>())) .Returns>((_, items) => items.Take(1)); // # Act var report = sut.PerformContentVersionCleanup(aDateTime); Debug.Assert(someHistoricVersions.Count > 1); Assert.Multiple(() => { policy.Verify(x => x.Apply(aDateTime, someHistoricVersions), Times.Once); Assert.AreEqual(someHistoricVersions.First(), report.Single()); }); } /// /// For v9 this just needs a rewrite, no static events, no service location etc /// [Test] [AutoMoqData] public void PerformContentVersionCleanup_HasVersionsToDelete_CallsDeleteOnRepositoryWithFilteredSet( [Frozen] Mock eventAggregator, [Frozen] Mock policy, [Frozen] Mock documentVersionRepository, List someHistoricVersions, DateTime aDateTime, ContentVersionService sut) { documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup()) .Returns(someHistoricVersions); eventAggregator .Setup(x => x.PublishCancelable(It.IsAny())) .Returns(false); var filteredSet = someHistoricVersions.Take(1); policy.Setup(x => x.Apply(It.IsAny(), It.IsAny>())) .Returns>((_, items) => filteredSet); // # Act sut.PerformContentVersionCleanup(aDateTime); Debug.Assert(someHistoricVersions.Any()); var expectedId = filteredSet.First().VersionId; documentVersionRepository.Verify( x => x.DeleteVersions(It.Is>(y => y.Single() == expectedId)), Times.Once); } }