From b75578c889fc84dced7be8190daef4221009b83b Mon Sep 17 00:00:00 2001 From: Claus Date: Wed, 22 Jun 2016 19:30:31 +0200 Subject: [PATCH] U4-8640 Deleting a content type with children only emits a deleted event on the parent content type service now includes all deleted content types including children, in the DeletedContentType event arguments. tests to ensure the correct number of deleted entities are sent in events. --- .../Services/ContentTypeService.cs | 21 +++++-- .../Services/ContentTypeServiceTests.cs | 62 ++++++++++++++++++- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Core/Services/ContentTypeService.cs b/src/Umbraco.Core/Services/ContentTypeService.cs index 34dcdc01a9..1ea43c0f08 100644 --- a/src/Umbraco.Core/Services/ContentTypeService.cs +++ b/src/Umbraco.Core/Services/ContentTypeService.cs @@ -803,10 +803,13 @@ namespace Umbraco.Core.Services var uow = UowProvider.GetUnitOfWork(); using (var repository = RepositoryFactory.CreateContentTypeRepository(uow)) { + var deletedContentTypes = new List() {contentType}; + deletedContentTypes.AddRange(contentType.Descendants().OfType()); + repository.Delete(contentType); uow.Commit(); - DeletedContentType.RaiseEvent(new DeleteEventArgs(contentType, false), this); + DeletedContentType.RaiseEvent(new DeleteEventArgs(deletedContentTypes.DistinctBy(x => x.Id), false), this); } Audit(AuditType.Delete, string.Format("Delete ContentType performed by user"), userId, contentType.Id); @@ -838,14 +841,18 @@ namespace Umbraco.Core.Services var uow = UowProvider.GetUnitOfWork(); using (var repository = RepositoryFactory.CreateContentTypeRepository(uow)) { + var deletedContentTypes = new List(); + deletedContentTypes.AddRange(asArray); + foreach (var contentType in asArray) { + deletedContentTypes.AddRange(contentType.Descendants().OfType()); repository.Delete(contentType); } uow.Commit(); - DeletedContentType.RaiseEvent(new DeleteEventArgs(asArray, false), this); + DeletedContentType.RaiseEvent(new DeleteEventArgs(deletedContentTypes.DistinctBy(x => x.Id), false), this); } Audit(AuditType.Delete, string.Format("Delete ContentTypes performed by user"), userId, -1); @@ -1238,11 +1245,13 @@ namespace Umbraco.Core.Services var uow = UowProvider.GetUnitOfWork(); using (var repository = RepositoryFactory.CreateMediaTypeRepository(uow)) { + var deletedMediaTypes = new List() {mediaType}; + deletedMediaTypes.AddRange(mediaType.Descendants().OfType()); repository.Delete(mediaType); uow.Commit(); - DeletedMediaType.RaiseEvent(new DeleteEventArgs(mediaType, false), this); + DeletedMediaType.RaiseEvent(new DeleteEventArgs(deletedMediaTypes.DistinctBy(x => x.Id), false), this); } Audit(AuditType.Delete, string.Format("Delete MediaType performed by user"), userId, mediaType.Id); @@ -1271,13 +1280,17 @@ namespace Umbraco.Core.Services var uow = UowProvider.GetUnitOfWork(); using (var repository = RepositoryFactory.CreateMediaTypeRepository(uow)) { + var deletedMediaTypes = new List(); + deletedMediaTypes.AddRange(asArray); + foreach (var mediaType in asArray) { + deletedMediaTypes.AddRange(mediaType.Descendants().OfType()); repository.Delete(mediaType); } uow.Commit(); - DeletedMediaType.RaiseEvent(new DeleteEventArgs(asArray, false), this); + DeletedMediaType.RaiseEvent(new DeleteEventArgs(deletedMediaTypes.DistinctBy(x => x.Id), false), this); } Audit(AuditType.Delete, string.Format("Delete MediaTypes performed by user"), userId, -1); diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs index 742205904f..921dea16d9 100644 --- a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs @@ -7,7 +7,7 @@ using Umbraco.Core; using Umbraco.Core.Exceptions; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; - +using Umbraco.Core.Services; using Umbraco.Tests.CodeFirst.TestModels.Composition; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; @@ -275,6 +275,66 @@ namespace Umbraco.Tests.Services Assert.That(success, Is.False); } + [Test] + public void Deleting_ContentType_Sends_Correct_Number_Of_DeletedEntities_In_Events() + { + var cts = ServiceContext.ContentTypeService; + var deletedEntities = 0; + var contentType = MockedContentTypes.CreateSimpleContentType("page", "Page"); + cts.Save(contentType); + + ContentTypeService.DeletedContentType += (sender, args) => + { + deletedEntities += args.DeletedEntities.Count(); + }; + + cts.Delete(contentType); + + Assert.AreEqual(deletedEntities, 1); + } + + [Test] + public void Deleting_Multiple_ContentTypes_Sends_Correct_Number_Of_DeletedEntities_In_Events() + { + var cts = ServiceContext.ContentTypeService; + var deletedEntities = 0; + var contentType = MockedContentTypes.CreateSimpleContentType("page", "Page"); + cts.Save(contentType); + var contentType2 = MockedContentTypes.CreateSimpleContentType("otherPage", "Other page"); + cts.Save(contentType2); + + ContentTypeService.DeletedContentType += (sender, args) => + { + deletedEntities += args.DeletedEntities.Count(); + }; + + cts.Delete(contentType); + cts.Delete(contentType2); + + Assert.AreEqual(deletedEntities, 2); + } + + [Test] + public void Deleting_ContentType_With_Child_Sends_Correct_Number_Of_DeletedEntities_In_Events() + { + var cts = ServiceContext.ContentTypeService; + var deletedEntities = 0; + var contentType = MockedContentTypes.CreateSimpleContentType("page", "Page"); + cts.Save(contentType); + var contentType2 = MockedContentTypes.CreateSimpleContentType("subPage", "Sub page"); + contentType2.ParentId = contentType.Id; + cts.Save(contentType2); + + ContentTypeService.DeletedContentType += (sender, args) => + { + deletedEntities += args.DeletedEntities.Count(); + }; + + cts.Delete(contentType); + + Assert.AreEqual(deletedEntities, 2); + } + [Test] public void Can_Remove_ContentType_Composition_From_ContentType() {