diff --git a/src/Umbraco.Core/Models/Relation.cs b/src/Umbraco.Core/Models/Relation.cs index c5fc47944b..a501a2e341 100644 --- a/src/Umbraco.Core/Models/Relation.cs +++ b/src/Umbraco.Core/Models/Relation.cs @@ -84,5 +84,14 @@ namespace Umbraco.Core.Models OnPropertyChanged(CommentSelector); } } + + /// + /// Gets the Id of the that this Relation is based on. + /// + [IgnoreDataMember] + public int RelationTypeId + { + get { return _relationType.Id; } + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Factories/RelationFactory.cs b/src/Umbraco.Core/Persistence/Factories/RelationFactory.cs index 3c3882c118..9c5d23682d 100644 --- a/src/Umbraco.Core/Persistence/Factories/RelationFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/RelationFactory.cs @@ -32,7 +32,7 @@ namespace Umbraco.Core.Persistence.Factories var dto = new RelationDto { ChildId = entity.ChildId, - Comment = entity.Comment, + Comment = string.IsNullOrEmpty(entity.Comment) ? string.Empty : entity.Comment, Datetime = entity.CreateDate, ParentId = entity.ParentId, RelationType = entity.RelationType.Id diff --git a/src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs b/src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs index 3e58420b84..a0dbb80805 100644 --- a/src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs @@ -30,7 +30,7 @@ namespace Umbraco.Core.Persistence.Mappers CacheMap(src => src.Comment, dto => dto.Comment); CacheMap(src => src.CreateDate, dto => dto.Datetime); CacheMap(src => src.ParentId, dto => dto.ParentId); - CacheMap(src => src.RelationType, dto => dto.RelationType); + CacheMap(src => src.RelationTypeId, dto => dto.RelationType); } internal override string Map(string propertyName) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 0b827c98d7..09b020ff46 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -123,6 +123,8 @@ namespace Umbraco.Core.Persistence.Repositories { string.Format("DELETE FROM umbracoUser2NodeNotify WHERE nodeId = @Id"), string.Format("DELETE FROM umbracoUser2NodePermission WHERE nodeId = @Id"), + string.Format("DELETE FROM umbracoRelation WHERE parentId = @Id"), + string.Format("DELETE FROM umbracoRelation WHERE childId = @Id"), string.Format("DELETE FROM cmsTagRelationship WHERE nodeId = @Id"), string.Format("DELETE FROM cmsDocument WHERE NodeId = @Id"), string.Format("DELETE FROM cmsPropertyData WHERE contentNodeId = @Id"), diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs index d556c0635e..9fba87f316 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs @@ -1,10 +1,13 @@ using System; +using System.Linq; using NUnit.Framework; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Caching; +using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Tests.TestHelpers; +using Umbraco.Tests.TestHelpers.Entities; namespace Umbraco.Tests.Persistence.Repositories { @@ -36,39 +39,200 @@ namespace Umbraco.Tests.Persistence.Repositories [Test] public void Can_Perform_Add_On_RelationRepository() - { } + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + // Act + var relationType = repositoryType.Get(1); + var relation = new Relation(1047, 1048) { RelationType = relationType }; + repository.AddOrUpdate(relation); + unitOfWork.Commit(); + + // Assert + Assert.That(relation, Is.Not.Null); + Assert.That(relation.HasIdentity, Is.True); + } [Test] public void Can_Perform_Update_On_RelationRepository() - { } + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + // Act + var relation = repository.Get(1); + relation.Comment = "This relation has been updated"; + repository.AddOrUpdate(relation); + unitOfWork.Commit(); + + var relationUpdated = repository.Get(1); + + // Assert + Assert.That(relationUpdated, Is.Not.Null); + Assert.That(relationUpdated.Comment, Is.EqualTo("This relation has been updated")); + Assert.AreNotEqual(relationUpdated.UpdateDate, relation.UpdateDate); + } [Test] public void Can_Perform_Delete_On_RelationRepository() - { } + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + // Act + var relation = repository.Get(2); + repository.Delete(relation); + unitOfWork.Commit(); + + var exists = repository.Exists(2); + + // Assert + Assert.That(exists, Is.False); + } [Test] public void Can_Perform_Get_On_RelationRepository() - { } + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + // Act + var relation = repository.Get(1); + + // Assert + Assert.That(relation, Is.Not.Null); + Assert.That(relation.HasIdentity, Is.True); + Assert.That(relation.ChildId, Is.EqualTo(1047)); + Assert.That(relation.ParentId, Is.EqualTo(1046)); + Assert.That(relation.RelationType.Alias, Is.EqualTo("relateContentOnCopy")); + } [Test] public void Can_Perform_GetAll_On_RelationRepository() - { } + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + // Act + var relations = repository.GetAll(); + + // Assert + Assert.That(relations, Is.Not.Null); + Assert.That(relations.Any(), Is.True); + Assert.That(relations.Any(x => x == null), Is.False); + Assert.That(relations.Count(), Is.EqualTo(2)); + } [Test] public void Can_Perform_GetAll_With_Params_On_RelationRepository() - { } + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + // Act + var relations = repository.GetAll(1, 2); + + // Assert + Assert.That(relations, Is.Not.Null); + Assert.That(relations.Any(), Is.True); + Assert.That(relations.Any(x => x == null), Is.False); + Assert.That(relations.Count(), Is.EqualTo(2)); + } [Test] public void Can_Perform_Exists_On_RelationRepository() - { } + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + // Act + var exists = repository.Exists(2); + var doesntExist = repository.Exists(5); + + // Assert + Assert.That(exists, Is.True); + Assert.That(doesntExist, Is.False); + } [Test] public void Can_Perform_Count_On_RelationRepository() - { } + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + // Act + var query = Query.Builder.Where(x => x.ParentId == 1046); + int count = repository.Count(query); + + // Assert + Assert.That(count, Is.EqualTo(2)); + } [Test] public void Can_Perform_GetByQuery_On_RelationRepository() - { } + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + // Act + var query = Query.Builder.Where(x => x.RelationTypeId == 2); + var relations = repository.GetByQuery(query); + + // Assert + Assert.That(relations, Is.Not.Null); + Assert.That(relations.Any(), Is.True); + Assert.That(relations.Any(x => x == null), Is.False); + Assert.That(relations.Count(), Is.EqualTo(2)); + } + + [Test] + public void Can_Delete_Content_And_Verify_Relation_Is_Removed() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repositoryType = new RelationTypeRepository(unitOfWork); + var repository = new RelationRepository(unitOfWork, NullCacheProvider.Current, repositoryType); + + var content = ServiceContext.ContentService.GetById(1047); + ServiceContext.ContentService.Delete(content, 0); + + // Act + var shouldntExist = repository.Exists(1); + var shouldExist = repository.Exists(2); + + // Assert + Assert.That(shouldntExist, Is.False); + Assert.That(shouldExist, Is.True); + } [TearDown] public override void TearDown() @@ -83,10 +247,33 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var repository = new RelationTypeRepository(unitOfWork); + var relationTypeRepository = new RelationTypeRepository(unitOfWork); + var relationRepository = new RelationRepository(unitOfWork, NullCacheProvider.Current, relationTypeRepository); - repository.AddOrUpdate(relateContent); - repository.AddOrUpdate(relateContentType); + relationTypeRepository.AddOrUpdate(relateContent); + relationTypeRepository.AddOrUpdate(relateContentType); + unitOfWork.Commit(); + + //Create and Save ContentType "umbTextpage" -> 1045 + ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage"); + ServiceContext.ContentTypeService.Save(contentType); + + //Create and Save Content "Homepage" based on "umbTextpage" -> 1046 + Content textpage = MockedContent.CreateSimpleContent(contentType); + ServiceContext.ContentService.Save(textpage, 0); + + //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1047 + Content subpage = MockedContent.CreateSimpleContent(contentType, "Text Page 1", textpage.Id); + ServiceContext.ContentService.Save(subpage, 0); + + //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1048 + Content subpage2 = MockedContent.CreateSimpleContent(contentType, "Text Page 2", textpage.Id); + ServiceContext.ContentService.Save(subpage2, 0); + + var relation = new Relation(textpage.Id, subpage.Id) {RelationType = relateContent, Comment = string.Empty}; + var relation2 = new Relation(textpage.Id, subpage2.Id) { RelationType = relateContent, Comment = string.Empty}; + relationRepository.AddOrUpdate(relation); + relationRepository.AddOrUpdate(relation2); unitOfWork.Commit(); } }