diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 21c6fcef22..443b2839d9 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -1038,7 +1038,7 @@ namespace Umbraco.Core.Services } //Ensure that Path and Level is updated on children - var children = GetChildren(content.Id); + var children = GetChildren(content.Id).ToArray(); if (children.Any()) { foreach (var child in children) diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 7bc7524294..ea0d8464a2 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -480,6 +480,8 @@ namespace Umbraco.Core.Services /// Id of the User moving the Media public void Move(IMedia media, int parentId, int userId = 0) { + if (media == null) throw new ArgumentNullException("media"); + using (new WriteLock(Locker)) { //This ensures that the correct method is called if this method is used to Move to recycle bin. @@ -500,7 +502,7 @@ namespace Umbraco.Core.Services Save(media, userId); //Ensure that relevant properties are updated on children - var children = GetChildren(media.Id); + var children = GetChildren(media.Id).ToArray(); if (children.Any()) { var parentPath = media.Path; @@ -516,14 +518,16 @@ namespace Umbraco.Core.Services } } - /// + /// /// Deletes an object by moving it to the Recycle Bin /// /// The to delete /// Id of the User deleting the Media public void MoveToRecycleBin(IMedia media, int userId = 0) { - if (Trashing.IsRaisedEventCancelled(new MoveEventArgs(media, -21), this)) + if (media == null) throw new ArgumentNullException("media"); + + if (Trashing.IsRaisedEventCancelled(new MoveEventArgs(media, -21), this)) return; //Find Descendants, which will be moved to the recycle bin along with the parent/grandparent. @@ -951,7 +955,7 @@ namespace Umbraco.Core.Services list.Add(child); - var grandkids = GetChildren(child.Id); + var grandkids = GetChildren(child.Id).ToArray(); if (grandkids.Any()) { list.AddRange(UpdatePropertiesOnChildren(grandkids, child.Path, child.Level, child.Trashed)); diff --git a/src/Umbraco.Tests/Services/BaseServiceTest.cs b/src/Umbraco.Tests/Services/BaseServiceTest.cs index 23487eb582..b711f7c3ac 100644 --- a/src/Umbraco.Tests/Services/BaseServiceTest.cs +++ b/src/Umbraco.Tests/Services/BaseServiceTest.cs @@ -51,30 +51,7 @@ namespace Umbraco.Tests.Services Content trashed = MockedContent.CreateSimpleContent(contentType, "Text Page Deleted", -20); trashed.Trashed = true; ServiceContext.ContentService.Save(trashed, 0); - - //Create and Save folder-Media -> 1050 - var folderMediaType = ServiceContext.ContentTypeService.GetMediaType(1031); - var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1); - ServiceContext.MediaService.Save(folder); - - //Create and Save folder-Media -> 1051 - var folder2 = MockedMedia.CreateMediaFolder(folderMediaType, -1); - ServiceContext.MediaService.Save(folder2); - - //Create and Save image-Media -> 1052 - var imageMediaType = ServiceContext.ContentTypeService.GetMediaType(1032); - var image = (Media)MockedMedia.CreateMediaImage(imageMediaType, 1050); - ServiceContext.MediaService.Save(image); - - //Create and Save folder-Media that is trashed -> 1053 - var folderTrashed = (Media)MockedMedia.CreateMediaFolder(folderMediaType, -21); - folderTrashed.Trashed = true; - ServiceContext.MediaService.Save(folderTrashed); - - //Create and Save image-Media child of folderTrashed -> 1054 - var imageTrashed = (Media)MockedMedia.CreateMediaImage(imageMediaType, folderTrashed.Id); - imageTrashed.Trashed = true; - ServiceContext.MediaService.Save(imageTrashed); + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Services/MediaServiceTests.cs b/src/Umbraco.Tests/Services/MediaServiceTests.cs index 658bff9de9..fa9e530f3a 100644 --- a/src/Umbraco.Tests/Services/MediaServiceTests.cs +++ b/src/Umbraco.Tests/Services/MediaServiceTests.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; +using Umbraco.Core.Models; +using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Services { @@ -25,14 +27,15 @@ namespace Umbraco.Tests.Services public void Can_Move_Media() { // Arrange + var mediaItems = CreateTrashedTestMedia(); var mediaService = ServiceContext.MediaService; - var media = mediaService.GetById(1052); + var media = mediaService.GetById(mediaItems.Item3.Id); // Act - mediaService.Move(media, 1051); + mediaService.Move(media, mediaItems.Item2.Id); // Assert - Assert.That(media.ParentId, Is.EqualTo(1051)); + Assert.That(media.ParentId, Is.EqualTo(mediaItems.Item2.Id)); Assert.That(media.Trashed, Is.False); } @@ -40,8 +43,9 @@ namespace Umbraco.Tests.Services public void Can_Move_Media_To_RecycleBin() { // Arrange + var mediaItems = CreateTrashedTestMedia(); var mediaService = ServiceContext.MediaService; - var media = mediaService.GetById(1050); + var media = mediaService.GetById(mediaItems.Item1.Id); // Act mediaService.MoveToRecycleBin(media); @@ -55,18 +59,49 @@ namespace Umbraco.Tests.Services public void Can_Move_Media_From_RecycleBin() { // Arrange + var mediaItems = CreateTrashedTestMedia(); var mediaService = ServiceContext.MediaService; - var media = mediaService.GetById(1053); + var media = mediaService.GetById(mediaItems.Item4.Id); // Act - moving out of recycle bin - mediaService.Move(media, 1050); - var mediaChild = mediaService.GetById(1054); + mediaService.Move(media, mediaItems.Item1.Id); + var mediaChild = mediaService.GetById(mediaItems.Item5.Id); // Assert - Assert.That(media.ParentId, Is.EqualTo(1050)); + Assert.That(media.ParentId, Is.EqualTo(mediaItems.Item1.Id)); Assert.That(media.Trashed, Is.False); - Assert.That(mediaChild.ParentId, Is.EqualTo(1053)); + Assert.That(mediaChild.ParentId, Is.EqualTo(mediaItems.Item4.Id)); Assert.That(mediaChild.Trashed, Is.False); } + + private Tuple CreateTrashedTestMedia() + { + //Create and Save folder-Media -> 1050 + var folderMediaType = ServiceContext.ContentTypeService.GetMediaType(1031); + var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1); + ServiceContext.MediaService.Save(folder); + + //Create and Save folder-Media -> 1051 + var folder2 = MockedMedia.CreateMediaFolder(folderMediaType, -1); + ServiceContext.MediaService.Save(folder2); + + //Create and Save image-Media -> 1052 + var imageMediaType = ServiceContext.ContentTypeService.GetMediaType(1032); + var image = (Media)MockedMedia.CreateMediaImage(imageMediaType, 1050); + ServiceContext.MediaService.Save(image); + + //Create and Save folder-Media that is trashed -> 1053 + var folderTrashed = (Media)MockedMedia.CreateMediaFolder(folderMediaType, -21); + folderTrashed.Trashed = true; + ServiceContext.MediaService.Save(folderTrashed); + + //Create and Save image-Media child of folderTrashed -> 1054 + var imageTrashed = (Media)MockedMedia.CreateMediaImage(imageMediaType, folderTrashed.Id); + imageTrashed.Trashed = true; + ServiceContext.MediaService.Save(imageTrashed); + + + return new Tuple(folder, folder2, image, folderTrashed, imageTrashed); + } } }