From baa22301e9a95d213e6aafb41a5abe6985d23d4c Mon Sep 17 00:00:00 2001 From: Stefan Kip Date: Thu, 5 Sep 2013 11:31:06 +0200 Subject: [PATCH 1/7] Added Exception which tells you which datatype is unable to load --- src/umbraco.cms/businesslogic/Property/Property.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/umbraco.cms/businesslogic/Property/Property.cs b/src/umbraco.cms/businesslogic/Property/Property.cs index 8404081677..faf263607e 100644 --- a/src/umbraco.cms/businesslogic/Property/Property.cs +++ b/src/umbraco.cms/businesslogic/Property/Property.cs @@ -37,6 +37,8 @@ namespace umbraco.cms.businesslogic.property _pt = pt; _id = Id; + if (_pt.DataTypeDefinition.DataType == null) + throw new Exception(string.Format("Could not load datatype '{0}'", _pt.DataTypeDefinition.Text)); _data = _pt.DataTypeDefinition.DataType.Data; _data.PropertyId = Id; } @@ -47,6 +49,8 @@ namespace umbraco.cms.businesslogic.property _pt = PropertyType.GetPropertyType( SqlHelper.ExecuteScalar("select propertytypeid from cmsPropertyData where id = @id", SqlHelper.CreateParameter("@id", Id))); + if (_pt.DataTypeDefinition.DataType == null) + throw new Exception(string.Format("Could not load datatype '{0}'", _pt.DataTypeDefinition.Text)); _data = _pt.DataTypeDefinition.DataType.Data; _data.PropertyId = Id; } @@ -59,6 +63,8 @@ namespace umbraco.cms.businesslogic.property //Just to ensure that there is a PropertyType available _pt = PropertyType.GetPropertyType(property.PropertyTypeId); + if (_pt.DataTypeDefinition.DataType == null) + throw new Exception(string.Format("Could not load datatype '{0}'", _pt.DataTypeDefinition.Text)); _data = _pt.DataTypeDefinition.DataType.Data; _data.PropertyId = Id; } @@ -142,4 +148,4 @@ namespace umbraco.cms.businesslogic.property } } -} \ No newline at end of file +} From 0d49a59cfe9079e13002d7a15f9cb2e97866a94e Mon Sep 17 00:00:00 2001 From: dprothero Date: Thu, 5 Sep 2013 15:15:40 -0700 Subject: [PATCH 2/7] Fix #U4-2796 Possible to have duplicate Login Name (Member.LoginName) for Umbraco Members --- .../umbraco/members/EditMember.aspx.cs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs index cf54379d96..83f0577120 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs @@ -26,6 +26,7 @@ namespace umbraco.cms.presentation.members protected TextBox MemberLoginNameTxt = new TextBox(); protected RequiredFieldValidator MemberLoginNameVal = new RequiredFieldValidator(); + protected CustomValidator MemberLoginNameExistCheck = new CustomValidator(); protected PlaceHolder MemberPasswordTxt = new PlaceHolder(); protected TextBox MemberEmail = new TextBox(); @@ -67,12 +68,19 @@ namespace umbraco.cms.presentation.members MemberLoginNameVal.EnableClientScript = false; MemberLoginNameVal.Display = ValidatorDisplay.Dynamic; + MemberLoginNameExistCheck.ErrorMessage = ui.Text("errorHandling", "errorExistsWithoutTab", "Login Name", BasePages.UmbracoEnsuredPage.CurrentUser); + MemberLoginNameExistCheck.EnableClientScript = false; + MemberLoginNameExistCheck.ValidateEmptyText = false; + MemberLoginNameExistCheck.ControlToValidate = MemberEmail.ID; + MemberLoginNameExistCheck.ServerValidate += MemberLoginNameExistCheck_ServerValidate; + MemberEmailExistCheck.ErrorMessage = ui.Text("errorHandling", "errorExistsWithoutTab", "E-mail", BasePages.UmbracoEnsuredPage.CurrentUser); MemberEmailExistCheck.EnableClientScript = false; MemberEmailExistCheck.ValidateEmptyText = false; MemberEmailExistCheck.ControlToValidate = MemberEmail.ID; MemberEmailExistCheck.ServerValidate += MemberEmailExistCheck_ServerValidate; + _contentControl.PropertiesPane.addProperty("", MemberLoginNameExistCheck); _contentControl.PropertiesPane.addProperty(ui.Text("login"), ph); _contentControl.PropertiesPane.addProperty(ui.Text("password"), MemberPasswordTxt); _contentControl.PropertiesPane.addProperty("", MemberEmailExistCheck); @@ -141,7 +149,18 @@ namespace umbraco.cms.presentation.members } - void MemberEmailExistCheck_ServerValidate(object source, ServerValidateEventArgs args) + void MemberLoginNameExistCheck_ServerValidate(object source, ServerValidateEventArgs args) + { + var oldLoginName = _document.LoginName.Replace(" ", "").ToLower(); + var newLoginName = MemberLoginNameTxt.Text.Replace(" ", "").ToLower(); + + if (oldLoginName != newLoginName && newLoginName != "" && Member.GetMemberFromLoginName(newLoginName) != null) + args.IsValid = false; + else + args.IsValid = true; + } + + void MemberEmailExistCheck_ServerValidate(object source, ServerValidateEventArgs args) { var oldEmail = _document.Email.ToLower(); var newEmail = MemberEmail.Text.ToLower(); From 6675bac1dc09a3f03e22181624d4ede00d87c722 Mon Sep 17 00:00:00 2001 From: dprothero Date: Thu, 5 Sep 2013 15:23:25 -0700 Subject: [PATCH 3/7] Fix #U4-2796 - fixed copy/paste error (does not affect functionality) --- .../umbraco.presentation/umbraco/members/EditMember.aspx.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs index 83f0577120..d83d52f8e3 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs @@ -71,7 +71,7 @@ namespace umbraco.cms.presentation.members MemberLoginNameExistCheck.ErrorMessage = ui.Text("errorHandling", "errorExistsWithoutTab", "Login Name", BasePages.UmbracoEnsuredPage.CurrentUser); MemberLoginNameExistCheck.EnableClientScript = false; MemberLoginNameExistCheck.ValidateEmptyText = false; - MemberLoginNameExistCheck.ControlToValidate = MemberEmail.ID; + MemberLoginNameExistCheck.ControlToValidate = MemberLoginNameTxt.ID; MemberLoginNameExistCheck.ServerValidate += MemberLoginNameExistCheck_ServerValidate; MemberEmailExistCheck.ErrorMessage = ui.Text("errorHandling", "errorExistsWithoutTab", "E-mail", BasePages.UmbracoEnsuredPage.CurrentUser); From 0af73b0290432e63a461bf8555dc1c205cc37252 Mon Sep 17 00:00:00 2001 From: Mads Krohn Date: Thu, 12 Sep 2013 00:14:44 +0200 Subject: [PATCH 4/7] Fixed U4-2842 Umb 6.1.5 - moving a media item from recycle bin / trash --- src/Umbraco.Core/Services/MediaService.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 68b4253f77..fbf6d0f67b 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -479,16 +479,22 @@ namespace Umbraco.Core.Services if (Moving.IsRaisedEventCancelled(new MoveEventArgs(media, parentId), this)) return; - media.ParentId = parentId; + //If we aren't moving to recycle bin, we must be moving from recycle bin -> #U4-2842 + media.ChangeTrashedState(false, parentId); Save(media, userId); //Ensure that Path and Level is updated on children - var children = GetChildren(media.Id); + var children = GetChildren(media.Id).ToList(); //No need to enumerate twice? if (children.Any()) { var parentPath = media.Path; var parentLevel = media.Level; - var updatedDescendents = UpdatePathAndLevelOnChildren(children, parentPath, parentLevel); + var updatedDescendents = UpdatePathAndLevelOnChildren(children, parentPath, parentLevel).ToList(); + //Update trashed state for descendants -> #U4-2842 + foreach (var descendant in updatedDescendents) + { + descendant.ChangeTrashedState(false, descendant.ParentId); + } Save(updatedDescendents, userId); } @@ -910,7 +916,7 @@ namespace Umbraco.Core.Services child.Level = parentLevel + 1; list.Add(child); - var grandkids = GetChildren(child.Id); + var grandkids = GetChildren(child.Id).ToList(); //No need to enumerate twice? if (grandkids.Any()) { list.AddRange(UpdatePathAndLevelOnChildren(grandkids, child.Path, child.Level)); From 31f146fc6f1f62916041f2a58ff6826280069182 Mon Sep 17 00:00:00 2001 From: Mads Krohn Date: Fri, 13 Sep 2013 10:29:03 +0200 Subject: [PATCH 5/7] Updates to the media trashed state handling Tweaked the logic for determining when a media item is trashed or not. Added unit tests. Removed unnecessary comments. --- src/Umbraco.Core/Services/MediaService.cs | 33 +++++---- src/Umbraco.Tests/Services/BaseServiceTest.cs | 24 +++++++ .../Services/MediaServiceTests.cs | 72 +++++++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + 4 files changed, 116 insertions(+), 14 deletions(-) create mode 100644 src/Umbraco.Tests/Services/MediaServiceTests.cs diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index fbf6d0f67b..c45bbb1353 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -479,23 +479,22 @@ namespace Umbraco.Core.Services if (Moving.IsRaisedEventCancelled(new MoveEventArgs(media, parentId), this)) return; - //If we aren't moving to recycle bin, we must be moving from recycle bin -> #U4-2842 - media.ChangeTrashedState(false, parentId); + media.ParentId = parentId; + if (media.Trashed) + { + media.ChangeTrashedState(false, parentId); + } Save(media, userId); - //Ensure that Path and Level is updated on children - var children = GetChildren(media.Id).ToList(); //No need to enumerate twice? + //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).ToList(); - //Update trashed state for descendants -> #U4-2842 - foreach (var descendant in updatedDescendents) - { - descendant.ChangeTrashedState(false, descendant.ParentId); - } - 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); @@ -901,25 +900,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).ToList(); //No need to enumerate twice? 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 032fcb8bfb..186b0736f5 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -200,6 +200,7 @@ + From 0fe33c120b73b13e47a9e6d9b4b24b66dda9529f Mon Sep 17 00:00:00 2001 From: Mads Krohn Date: Fri, 13 Sep 2013 10:42:08 +0200 Subject: [PATCH 6/7] Removing unwanted ToList() --- src/Umbraco.Core/Services/MediaService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index c45bbb1353..09df9f6297 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -921,7 +921,7 @@ namespace Umbraco.Core.Services list.Add(child); - var grandkids = GetChildren(child.Id).ToList(); //No need to enumerate twice? + var grandkids = GetChildren(child.Id); if (grandkids.Any()) { list.AddRange(UpdatePropertiesOnChildren(grandkids, child.Path, child.Level, child.Trashed)); From c912e8013428d613b12815db75f26d01a3c5daf0 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 19 Dec 2013 12:27:21 +1100 Subject: [PATCH 7/7] modified media service tests to not have to create data in teh base tests --- src/Umbraco.Core/Services/ContentService.cs | 2 +- src/Umbraco.Core/Services/MediaService.cs | 12 +++-- src/Umbraco.Tests/Services/BaseServiceTest.cs | 25 +-------- .../Services/MediaServiceTests.cs | 53 +++++++++++++++---- 4 files changed, 54 insertions(+), 38 deletions(-) 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); + } } }