Files
Umbraco-CMS/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/DefaultContentVersionCleanupPolicyTest.cs
Bjarke Berg b0a4a92f57 ContentVersion cleanup backoffice UI (#11637) (#11644)
* ContentVersion cleanup backoffice UI (#11637)

* init rollback ui prototype

* add busy state to button, deselect version, add pagination status

* add localisation

* style current version

* disable rollback button when nothing is selected

* stop click event

* Endpoints for paginated content versions.
Light on tests, tight on time.

* Endpoints to "pin" content versions

* camel case json output.
Not sure why json formatter not set for controller, bit risky to add it now

* wire up paging

* wire up pin/unpin

* rename getPagedRollbackVersions to getPagedContentVersions

* prevent selection of current version and current draft

* add current draft and current version to UI

* remove pointer if the row is not selectable

* Improve warning for globally disabled cleanup feature.

* Fix current loses prevent cleanup state on publish.

* Added umbracoLog audit entries for "pin" / "unpin"

* Match v9 defaults for keepVersions settings

* Fix - losing preventCleanup on save current with content changes

* update pin/unpin button labels

* fix pagination bug

* add missing "

* always send culture when a doc type can vary

Co-authored-by: Mads Rasmussen <madsr@hey.com>
# Conflicts:
#	src/Umbraco.Core/ContentEditing/ContentVersionMetaViewModel.cs
#	src/Umbraco.Core/Models/HistoricContentVersionMeta.cs
#	src/Umbraco.Infrastructure/Services/Implement/ContentService.cs
#	src/Umbraco.Tests/Persistence/Repositories/DocumentVersionRepository_Tests_Integration.cs
#	src/Umbraco.Tests/Services/ContentVersionCleanupService_Tests_UnitTests.cs
#	src/Umbraco.Web.BackOffice/Controllers/ContentController.cs
#	src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js
#	src/Umbraco.Web.UI/config/umbracoSettings.Release.config
#	src/Umbraco.Web.UI/umbraco/config/lang/en.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
#	src/Umbraco.Web/Umbraco.Web.csproj

* Added tests

* Misc - missed translation update

* Bugfix - DocumentVersionRepository.Get should not join culture variation

* Bugfix - Missing write lock

* Removed unnecessary view model

* Misc - kill some warnings

* Misc - Kill some more warnings

* Fixed cypress rollback test

* Bugfix - Policy returns items to delete not items to keep.
Switch to inverse behavior.

# Conflicts:
#	src/Umbraco.Tests/Services/DefaultContentVersionCleanupPolicy_Tests_UnitTests.cs

Co-authored-by: Paul Johnson <pmj@umbraco.com>
2021-11-16 13:04:31 +01:00

280 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using AutoFixture.NUnit3;
using Microsoft.Extensions.Options;
using Moq;
using NUnit.Framework;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Persistence.Repositories;
using Umbraco.Cms.Infrastructure.Services.Implement;
using Umbraco.Cms.Tests.UnitTests.AutoFixture;
using ContentVersionCleanupPolicySettings = Umbraco.Cms.Core.Models.ContentVersionCleanupPolicySettings;
namespace Umbraco.Tests.Services
{
[TestFixture]
public class DefaultContentVersionCleanupPolicyTest
{
[Test, AutoMoqData]
public void Apply_AllOlderThanKeepSettings_AllVersionsReturned(
[Frozen] Mock<IDocumentVersionRepository> documentVersionRepository,
[Frozen] Mock<IOptions<ContentSettings>> contentSettings,
DefaultContentVersionCleanupPolicy sut)
{
var versionId = 0;
var historicItems = new List<ContentVersionMeta>
{
new ContentVersionMeta(versionId: ++versionId, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
new ContentVersionMeta(versionId: ++versionId, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
};
contentSettings.Setup(x => x.Value).Returns(new ContentSettings()
{
ContentVersionCleanupPolicy = new Cms.Core.Configuration.Models.ContentVersionCleanupPolicySettings()
{
EnableCleanup = true,
KeepAllVersionsNewerThanDays = 0,
KeepLatestVersionPerDayForDays = 0
}
});
documentVersionRepository.Setup(x => x.GetCleanupPolicies())
.Returns(Array.Empty<ContentVersionCleanupPolicySettings>());
documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup())
.Returns(historicItems);
var results = sut.Apply(DateTime.Today, historicItems).ToList();
Assert.AreEqual(2, results.Count);
}
[Test, AutoMoqData]
public void Apply_OverlappingKeepSettings_KeepAllVersionsNewerThanDaysTakesPriority(
[Frozen] Mock<IDocumentVersionRepository> documentVersionRepository,
[Frozen] Mock<IOptions<ContentSettings>> contentSettings,
DefaultContentVersionCleanupPolicy sut)
{
var versionId = 0;
var historicItems = new List<ContentVersionMeta>
{
new ContentVersionMeta(versionId: ++versionId, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
new ContentVersionMeta(versionId: ++versionId, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
};
contentSettings.Setup(x => x.Value).Returns(new ContentSettings()
{
ContentVersionCleanupPolicy = new Cms.Core.Configuration.Models.ContentVersionCleanupPolicySettings()
{
EnableCleanup = true,
KeepAllVersionsNewerThanDays = 2,
KeepLatestVersionPerDayForDays = 2
}
});
documentVersionRepository.Setup(x => x.GetCleanupPolicies())
.Returns(Array.Empty<ContentVersionCleanupPolicySettings>());
documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup())
.Returns(historicItems);
var results = sut.Apply(DateTime.Today, historicItems).ToList();
Assert.AreEqual(0, results.Count);
}
[Test, AutoMoqData]
public void Apply_WithinInKeepLatestPerDay_ReturnsSinglePerContentPerDay(
[Frozen] Mock<IDocumentVersionRepository> documentVersionRepository,
[Frozen] Mock<IOptions<ContentSettings>> contentSettings,
DefaultContentVersionCleanupPolicy sut)
{
var historicItems = new List<ContentVersionMeta>
{
new ContentVersionMeta(versionId: 1, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 2, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 3, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
new ContentVersionMeta(versionId: 4, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddDays(-1).AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 5, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddDays(-1).AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 6, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddDays(-1).AddHours(-1), false, false, false, null),
// another content
new ContentVersionMeta(versionId: 7, contentId: 2, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 8, contentId: 2, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 9, contentId: 2, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
};
contentSettings.Setup(x => x.Value).Returns(new ContentSettings()
{
ContentVersionCleanupPolicy = new Cms.Core.Configuration.Models.ContentVersionCleanupPolicySettings()
{
EnableCleanup = true,
KeepAllVersionsNewerThanDays = 0,
KeepLatestVersionPerDayForDays = 3
}
});
documentVersionRepository.Setup(x => x.GetCleanupPolicies())
.Returns(Array.Empty<ContentVersionCleanupPolicySettings>());
documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup())
.Returns(historicItems);
var results = sut.Apply(DateTime.Today, historicItems).ToList();
// Keep latest per day for 3 days per content type
// 2 content types, one of which has 2 days of entries, the other only a single day
Assert.Multiple(() =>
{
Assert.AreEqual(6, results.Count);
Assert.AreEqual(4, results.Count(x => x.ContentTypeId == 1));
Assert.AreEqual(2, results.Count(x => x.ContentTypeId == 2));
Assert.False(results.Any(x => x.VersionId == 9)); // Most recent for content type 2
Assert.False(results.Any(x => x.VersionId == 3)); // Most recent for content type 1 today
Assert.False(results.Any(x => x.VersionId == 6)); // Most recent for content type 1 yesterday
});
}
[Test, AutoMoqData]
public void Apply_HasOverridePolicy_RespectsPreventCleanup(
[Frozen] Mock<IDocumentVersionRepository> documentVersionRepository,
[Frozen] Mock<IOptions<ContentSettings>> contentSettings,
DefaultContentVersionCleanupPolicy sut)
{
var historicItems = new List<ContentVersionMeta>
{
new ContentVersionMeta(versionId: 1, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 2, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 3, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
// another content & type
new ContentVersionMeta(versionId: 4, contentId: 2, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 5, contentId: 2, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 6, contentId: 2, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
};
contentSettings.Setup(x => x.Value).Returns(new ContentSettings()
{
ContentVersionCleanupPolicy = new Cms.Core.Configuration.Models.ContentVersionCleanupPolicySettings()
{
EnableCleanup = true,
KeepAllVersionsNewerThanDays = 0,
KeepLatestVersionPerDayForDays = 0
}
});
documentVersionRepository.Setup(x => x.GetCleanupPolicies())
.Returns(new ContentVersionCleanupPolicySettings[]
{
new ContentVersionCleanupPolicySettings{ ContentTypeId = 2, PreventCleanup = true }
});
documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup())
.Returns(historicItems);
var results = sut.Apply(DateTime.Today, historicItems).ToList();
Assert.True(results.All(x => x.ContentTypeId == 1));
}
[Test, AutoMoqData]
public void Apply_HasOverridePolicy_RespectsKeepAll(
[Frozen] Mock<IDocumentVersionRepository> documentVersionRepository,
[Frozen] Mock<IOptions<ContentSettings>> contentSettings,
DefaultContentVersionCleanupPolicy sut)
{
var historicItems = new List<ContentVersionMeta>
{
new ContentVersionMeta(versionId: 1, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 2, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 3, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
// another content & type
new ContentVersionMeta(versionId: 4, contentId: 2, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 5, contentId: 2, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 6, contentId: 2, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
};
contentSettings.Setup(x => x.Value).Returns(new ContentSettings()
{
ContentVersionCleanupPolicy = new Cms.Core.Configuration.Models.ContentVersionCleanupPolicySettings()
{
EnableCleanup = true,
KeepAllVersionsNewerThanDays = 0,
KeepLatestVersionPerDayForDays = 0
}
});
documentVersionRepository.Setup(x => x.GetCleanupPolicies())
.Returns(new ContentVersionCleanupPolicySettings[]
{
new ContentVersionCleanupPolicySettings{ ContentTypeId = 2, PreventCleanup = false, KeepAllVersionsNewerThanDays = 3 }
});
documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup())
.Returns(historicItems);
var results = sut.Apply(DateTime.Today, historicItems).ToList();
Assert.True(results.All(x => x.ContentTypeId == 1));
}
[Test, AutoMoqData]
public void Apply_HasOverridePolicy_RespectsKeepLatest(
[Frozen] Mock<IDocumentVersionRepository> documentVersionRepository,
[Frozen] Mock<IOptions<ContentSettings>> contentSettings,
DefaultContentVersionCleanupPolicy sut)
{
var historicItems = new List<ContentVersionMeta>
{
new ContentVersionMeta(versionId: 1, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 2, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 3, contentId: 1, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
// another content
new ContentVersionMeta(versionId: 4, contentId: 2, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 5, contentId: 2, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 6, contentId: 2, contentTypeId: 1, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
// another content & type
new ContentVersionMeta(versionId: 7, contentId: 3, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-3), false, false, false, null),
new ContentVersionMeta(versionId: 8, contentId: 3, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-2), false, false, false, null),
new ContentVersionMeta(versionId: 9, contentId: 3, contentTypeId: 2, -1, versionDate: DateTime.Today.AddHours(-1), false, false, false, null),
};
contentSettings.Setup(x => x.Value).Returns(new ContentSettings()
{
ContentVersionCleanupPolicy = new Cms.Core.Configuration.Models.ContentVersionCleanupPolicySettings()
{
EnableCleanup = true,
KeepAllVersionsNewerThanDays = 0,
KeepLatestVersionPerDayForDays = 0
}
});
documentVersionRepository.Setup(x => x.GetCleanupPolicies())
.Returns(new ContentVersionCleanupPolicySettings[]
{
new ContentVersionCleanupPolicySettings{ ContentTypeId = 2, PreventCleanup = false, KeepLatestVersionPerDayForDays = 3 }
});
documentVersionRepository.Setup(x => x.GetDocumentVersionsEligibleForCleanup())
.Returns(historicItems);
var results = sut.Apply(DateTime.Today, historicItems).ToList();
// By default no historic versions are kept
// Override policy for content type 2 keeps latest per day for 3 days, no versions retained for content type with id 1
// There were 3 entries for content type 2 all on the same day
// version id 9 is most recent for content type 2, and should be filtered, all the rest should be present.
Assert.Multiple(() =>
{
Assert.AreEqual(8, results.Count);
Assert.AreEqual(2, results.Count(x => x.ContentTypeId == 2));
Assert.False(results.Any(x => x.VersionId == 9));
});
}
}
}