using System;
using System.Data;
using System.Diagnostics;
using NUnit.Framework;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
using Umbraco.Core.Services;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.TestHelpers.Entities;
using Umbraco.Tests.Testing;
namespace Umbraco.Tests.Services
{
[TestFixture]
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
public class ContentVersionCleanupService_Tests_Integration : TestWithDatabaseBase
{
///
/// This is covered by the unit tests, but nice to know it deletes on infra.
/// And proves implementation is compatible with SQL CE.
///
[Test]
public void PerformContentVersionCleanup_WithNoKeepPeriods_DeletesEverythingExceptActive()
{
// For reference currently has
// 5000 Documents
// With 200K Versions
// With 11M Property data
var contentTypeA = MockedContentTypes.CreateSimpleContentType("contentTypeA", "contentTypeA");
ServiceContext.FileService.SaveTemplate(contentTypeA.DefaultTemplate);
ServiceContext.ContentTypeService.Save(contentTypeA);
var content = MockedContent.CreateSimpleContent(contentTypeA);
ServiceContext.ContentService.SaveAndPublish(content, raiseEvents: false);
for (var i = 0; i < 10; i++)
{
ServiceContext.ContentService.SaveAndPublish(content, raiseEvents: false);
}
var before = GetReport();
Debug.Assert(before.ContentVersions == 12); // 10 historic + current draft + current published
Debug.Assert(before.PropertyData == 12 * 3); // CreateSimpleContentType = 3 props
// Kill all historic
InsertCleanupPolicy(contentTypeA, 0, 0);
((IContentVersionService)ServiceContext.ContentService).PerformContentVersionCleanup(DateTime.Now.AddHours(1));
var after = GetReport();
Assert.Multiple(() =>
{
Assert.AreEqual(2, after.ContentVersions); // current draft, current published
Assert.AreEqual(2, after.DocumentVersions);
Assert.AreEqual(6, after.PropertyData); // CreateSimpleContentType = 3 props
});
}
private Report GetReport()
{
var scopeProvider = TestObjects.GetScopeProvider(Logger);
using (var scope = scopeProvider.CreateScope(autoComplete: true))
{
// SQL CE is fun!
var contentVersions = scope.Database.Single(@"select count(1) from umbracoContentVersion");
var documentVersions = scope.Database.Single(@"select count(1) from umbracoDocumentVersion");
var propertyData = scope.Database.Single(@"select count(1) from umbracoPropertyData");
return new Report
{
ContentVersions = contentVersions,
DocumentVersions = documentVersions,
PropertyData = propertyData
};
}
}
private void InsertCleanupPolicy(IContentType contentType, int daysToKeepAll, int daysToRollupAll, bool preventCleanup = false)
{
var scopeProvider = TestObjects.GetScopeProvider(Logger);
using (var scope = scopeProvider.CreateScope(autoComplete: true))
{
var entity = new ContentVersionCleanupPolicyDto
{
ContentTypeId = contentType.Id,
KeepAllVersionsNewerThanDays = daysToKeepAll,
KeepLatestVersionPerDayForDays = daysToRollupAll,
PreventCleanup = preventCleanup,
Updated = DateTime.Today
};
scope.Database.Insert(entity);
}
}
class Report
{
public int ContentVersions { get; set; }
public int DocumentVersions { get; set; }
public int PropertyData { get; set; }
}
}
}