diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index fefb70d4cb..7bc7524294 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -492,17 +492,22 @@ namespace Umbraco.Core.Services if (Moving.IsRaisedEventCancelled(new MoveEventArgs(media, parentId), this)) return; - media.ParentId = parentId; + media.ParentId = parentId; + if (media.Trashed) + { + media.ChangeTrashedState(false, parentId); + } Save(media, userId); - //Ensure that Path and Level is updated on children + //Ensure that relevant properties are updated on children var children = GetChildren(media.Id); if (children.Any()) { var parentPath = media.Path; var parentLevel = media.Level; - var updatedDescendents = UpdatePathAndLevelOnChildren(children, parentPath, parentLevel); - Save(updatedDescendents, userId); + var parentTrashed = media.Trashed; + var updatedDescendants = UpdatePropertiesOnChildren(children, parentPath, parentLevel, parentTrashed); + Save(updatedDescendants, userId); } Moved.RaiseEvent(new MoveEventArgs(media, false, parentId), this); @@ -925,25 +930,31 @@ namespace Umbraco.Core.Services /// /// Updates the Path and Level on a collection of objects - /// based on the Parent's Path and Level. + /// based on the Parent's Path and Level. Also change the trashed state if relevant. /// /// Collection of objects to update /// Path of the Parent media /// Level of the Parent media + /// Indicates whether the Parent is trashed or not /// Collection of updated objects - private IEnumerable UpdatePathAndLevelOnChildren(IEnumerable children, string parentPath, int parentLevel) + private IEnumerable UpdatePropertiesOnChildren(IEnumerable children, string parentPath, int parentLevel, bool parentTrashed) { var list = new List(); foreach (var child in children) { child.Path = string.Concat(parentPath, ",", child.Id); child.Level = parentLevel + 1; + if (parentTrashed != child.Trashed) + { + child.ChangeTrashedState(parentTrashed, child.ParentId); + } + list.Add(child); var grandkids = GetChildren(child.Id); if (grandkids.Any()) { - list.AddRange(UpdatePathAndLevelOnChildren(grandkids, child.Path, child.Level)); + list.AddRange(UpdatePropertiesOnChildren(grandkids, child.Path, child.Level, child.Trashed)); } } return list; diff --git a/src/Umbraco.Tests/Services/BaseServiceTest.cs b/src/Umbraco.Tests/Services/BaseServiceTest.cs index cd4318b5a6..23487eb582 100644 --- a/src/Umbraco.Tests/Services/BaseServiceTest.cs +++ b/src/Umbraco.Tests/Services/BaseServiceTest.cs @@ -51,6 +51,30 @@ 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 new file mode 100644 index 0000000000..658bff9de9 --- /dev/null +++ b/src/Umbraco.Tests/Services/MediaServiceTests.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; + +namespace Umbraco.Tests.Services +{ + [TestFixture, RequiresSTA] + public class MediaServiceTests : BaseServiceTest + { + [SetUp] + public override void Initialize() + { + base.Initialize(); + } + + [TearDown] + public override void TearDown() + { + base.TearDown(); + } + + [Test] + public void Can_Move_Media() + { + // Arrange + var mediaService = ServiceContext.MediaService; + var media = mediaService.GetById(1052); + + // Act + mediaService.Move(media, 1051); + + // Assert + Assert.That(media.ParentId, Is.EqualTo(1051)); + Assert.That(media.Trashed, Is.False); + } + + [Test] + public void Can_Move_Media_To_RecycleBin() + { + // Arrange + var mediaService = ServiceContext.MediaService; + var media = mediaService.GetById(1050); + + // Act + mediaService.MoveToRecycleBin(media); + + // Assert + Assert.That(media.ParentId, Is.EqualTo(-21)); + Assert.That(media.Trashed, Is.True); + } + + [Test] + public void Can_Move_Media_From_RecycleBin() + { + // Arrange + var mediaService = ServiceContext.MediaService; + var media = mediaService.GetById(1053); + + // Act - moving out of recycle bin + mediaService.Move(media, 1050); + var mediaChild = mediaService.GetById(1054); + + // Assert + Assert.That(media.ParentId, Is.EqualTo(1050)); + Assert.That(media.Trashed, Is.False); + Assert.That(mediaChild.ParentId, Is.EqualTo(1053)); + Assert.That(mediaChild.Trashed, Is.False); + } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index c51807a7af..f5f434cc73 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -216,6 +216,7 @@ +