using System; using System.Collections.Generic; using System.Linq; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Caching; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; using umbraco.editorControls.tinyMCE3; using umbraco.interfaces; using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Tests.Persistence.Repositories { [DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerTest)] [TestFixture] public class ContentRepositoryTest : BaseDatabaseFactoryTest { [SetUp] public override void Initialize() { base.Initialize(); CreateTestData(); } [TearDown] public override void TearDown() { base.TearDown(); } private ContentRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out ContentTypeRepository contentTypeRepository) { var templateRepository = new TemplateRepository(unitOfWork, NullCacheProvider.Current); var tagRepository = new TagsRepository(unitOfWork, NullCacheProvider.Current); contentTypeRepository = new ContentTypeRepository(unitOfWork, NullCacheProvider.Current, templateRepository); var repository = new ContentRepository(unitOfWork, NullCacheProvider.Current, contentTypeRepository, templateRepository, tagRepository, CacheHelper.CreateDisabledCacheHelper()); return repository; } [Test] public void Ensures_Permissions_Are_Set_If_Parent_Entity_Permissions_Exist() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { var contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage1", "Textpage"); contentType.AllowedContentTypes = new List { new ContentTypeSort { Alias = contentType.Alias, Id = new Lazy(() => contentType.Id), SortOrder = 0 } }; var parentPage = MockedContent.CreateSimpleContent(contentType); contentTypeRepository.AddOrUpdate(contentType); repository.AddOrUpdate(parentPage); unitOfWork.Commit(); // Act repository.AssignEntityPermission(parentPage, 'A', new int[] { 0 }); var childPage = MockedContent.CreateSimpleContent(contentType, "child", parentPage); repository.AddOrUpdate(childPage); unitOfWork.Commit(); // Assert var permissions = repository.GetPermissionsForEntity(childPage.Id); Assert.AreEqual(1, permissions.Count()); Assert.AreEqual("A", permissions.Single().AssignedPermissions.First()); } } [Test] public void Can_Instantiate_Repository_From_Resolver() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); // Act var repository = RepositoryResolver.Current.ResolveByType(unitOfWork); // Assert Assert.That(repository, Is.Not.Null); } [Test] public void Can_Perform_Add_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage2", "Textpage"); Content textpage = MockedContent.CreateSimpleContent(contentType); // Act contentTypeRepository.AddOrUpdate(contentType); repository.AddOrUpdate(textpage); unitOfWork.Commit(); // Assert Assert.That(contentType.HasIdentity, Is.True); Assert.That(textpage.HasIdentity, Is.True); } } //Covers issue U4-2791 and U4-2607 [Test] public void Can_Save_Content_With_AtSign_In_Name_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { var contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage1", "Textpage"); contentTypeRepository.AddOrUpdate(contentType); unitOfWork.Commit(); var textpage = MockedContent.CreateSimpleContent(contentType, "test@umbraco.org", -1); var anotherTextpage = MockedContent.CreateSimpleContent(contentType, "@lightgiants", -1); // Act repository.AddOrUpdate(textpage); repository.AddOrUpdate(anotherTextpage); unitOfWork.Commit(); // Assert Assert.That(contentType.HasIdentity, Is.True); Assert.That(textpage.HasIdentity, Is.True); var content = repository.Get(textpage.Id); Assert.That(content.Name, Is.EqualTo(textpage.Name)); var content2 = repository.Get(anotherTextpage.Id); Assert.That(content2.Name, Is.EqualTo(anotherTextpage.Name)); } } [Test] public void Can_Perform_Multiple_Adds_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage1", "Textpage"); Content textpage = MockedContent.CreateSimpleContent(contentType); // Act contentTypeRepository.AddOrUpdate(contentType); repository.AddOrUpdate(textpage); unitOfWork.Commit(); Content subpage = MockedContent.CreateSimpleContent(contentType, "Text Page 1", textpage.Id); repository.AddOrUpdate(subpage); unitOfWork.Commit(); // Assert Assert.That(contentType.HasIdentity, Is.True); Assert.That(textpage.HasIdentity, Is.True); Assert.That(subpage.HasIdentity, Is.True); Assert.That(textpage.Id, Is.EqualTo(subpage.ParentId)); } } [Test] public void Can_Perform_Multiple_Adds_On_ContentRepository_With_RepositoryResolver() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage1", "Textpage"); Content textpage = MockedContent.CreateSimpleContent(contentType); // Act contentTypeRepository.AddOrUpdate(contentType); repository.AddOrUpdate(textpage); unitOfWork.Commit(); var repository2 = RepositoryResolver.Current.ResolveByType(unitOfWork); Content subpage = MockedContent.CreateSimpleContent(contentType, "Text Page 1", textpage.Id); repository2.AddOrUpdate(subpage); unitOfWork.Commit(); // Assert Assert.That(contentType.HasIdentity, Is.True); Assert.That(textpage.HasIdentity, Is.True); Assert.That(subpage.HasIdentity, Is.True); Assert.That(textpage.Id, Is.EqualTo(subpage.ParentId)); } } [Test] public void Can_Verify_Fresh_Entity_Is_Not_Dirty() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var content = repository.Get(NodeDto.NodeIdSeed + 3); bool dirty = ((Content)content).IsDirty(); // Assert Assert.That(dirty, Is.False); } } [Test] public void Can_Perform_Update_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var content = repository.Get(NodeDto.NodeIdSeed + 2); content.Name = "About 2"; repository.AddOrUpdate(content); unitOfWork.Commit(); var updatedContent = repository.Get(NodeDto.NodeIdSeed + 2); // Assert Assert.That(updatedContent.Id, Is.EqualTo(content.Id)); Assert.That(updatedContent.Name, Is.EqualTo(content.Name)); } } [Test] public void Can_Perform_Delete_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { var contentType = contentTypeRepository.Get(NodeDto.NodeIdSeed); var content = new Content("Textpage 2 Child Node", NodeDto.NodeIdSeed + 3, contentType); content.CreatorId = 0; content.WriterId = 0; // Act repository.AddOrUpdate(content); unitOfWork.Commit(); var id = content.Id; var repository2 = RepositoryResolver.Current.ResolveByType(unitOfWork); repository2.Delete(content); unitOfWork.Commit(); var content1 = repository2.Get(id); // Assert Assert.That(content1, Is.Null); } } [Test] public void Can_Perform_Get_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var content = repository.Get(NodeDto.NodeIdSeed + 3); // Assert Assert.That(content.Id, Is.EqualTo(NodeDto.NodeIdSeed + 3)); Assert.That(content.CreateDate, Is.GreaterThan(DateTime.MinValue)); Assert.That(content.UpdateDate, Is.GreaterThan(DateTime.MinValue)); Assert.That(content.ParentId, Is.Not.EqualTo(0)); Assert.That(content.Name, Is.EqualTo("Text Page 2")); Assert.That(content.SortOrder, Is.EqualTo(1)); Assert.That(content.Version, Is.Not.EqualTo(Guid.Empty)); Assert.That(content.ContentTypeId, Is.EqualTo(NodeDto.NodeIdSeed)); Assert.That(content.Path, Is.Not.Empty); Assert.That(content.Properties.Any(), Is.True); } } [Test] public void Can_Perform_GetByQuery_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var query = Query.Builder.Where(x => x.Level == 2); var result = repository.GetByQuery(query); // Assert Assert.That(result.Count(), Is.GreaterThanOrEqualTo(2)); } } [Test] public void Can_Perform_GetPagedResultsByQuery_ForFirstPage_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); Assert.That(result.Count(), Is.EqualTo(1)); Assert.That(result.First().Name, Is.EqualTo("Text Page 1")); } } [Test] public void Can_Perform_GetPagedResultsByQuery_ForSecondPage_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; var result = repository.GetPagedResultsByQuery(query, 2, 1, out totalRecords, "Name", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); Assert.That(result.Count(), Is.EqualTo(1)); Assert.That(result.First().Name, Is.EqualTo("Text Page 2")); } } [Test] public void Can_Perform_GetPagedResultsByQuery_WithSinglePage_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; var result = repository.GetPagedResultsByQuery(query, 1, 2, out totalRecords, "Name", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); Assert.That(result.Count(), Is.EqualTo(2)); Assert.That(result.First().Name, Is.EqualTo("Text Page 1")); } } [Test] public void Can_Perform_GetPagedResultsByQuery_WithDescendingOrder_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Descending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); Assert.That(result.Count(), Is.EqualTo(1)); Assert.That(result.First().Name, Is.EqualTo("Text Page 2")); } } [Test] public void Can_Perform_GetPagedResultsByQuery_WithFilterMatchingSome_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending, "Page 2"); // Assert Assert.That(totalRecords, Is.EqualTo(1)); Assert.That(result.Count(), Is.EqualTo(1)); Assert.That(result.First().Name, Is.EqualTo("Text Page 2")); } } [Test] public void Can_Perform_GetPagedResultsByQuery_WithFilterMatchingAll_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending, "Page"); // Assert Assert.That(totalRecords, Is.EqualTo(2)); Assert.That(result.Count(), Is.EqualTo(1)); Assert.That(result.First().Name, Is.EqualTo("Text Page 1")); } } [Test] public void Can_Perform_GetAll_By_Param_Ids_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var contents = repository.GetAll(NodeDto.NodeIdSeed + 2, NodeDto.NodeIdSeed + 3); // Assert Assert.That(contents, Is.Not.Null); Assert.That(contents.Any(), Is.True); Assert.That(contents.Count(), Is.EqualTo(2)); } } [Test] public void Can_Perform_GetAll_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var contents = repository.GetAll(); // Assert Assert.That(contents, Is.Not.Null); Assert.That(contents.Any(), Is.True); Assert.That(contents.Count(), Is.GreaterThanOrEqualTo(4)); } } [Test] public void Can_Perform_Exists_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var exists = repository.Exists(NodeDto.NodeIdSeed + 1); // Assert Assert.That(exists, Is.True); } } [Test] public void Can_Perform_Count_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act int level = 2; var query = Query.Builder.Where(x => x.Level == level); var result = repository.Count(query); // Assert Assert.That(result, Is.GreaterThanOrEqualTo(2)); } } [Test] public void Can_Verify_Keys_Set() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var textpage = repository.Get(NodeDto.NodeIdSeed + 1); var subpage = repository.Get(NodeDto.NodeIdSeed + 2); var trashed = repository.Get(NodeDto.NodeIdSeed + 4); // Assert Assert.That(textpage.Key.ToString().ToUpper(), Is.EqualTo("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0")); Assert.That(subpage.Key.ToString().ToUpper(), Is.EqualTo("FF11402B-7E53-4654-81A7-462AC2108059")); Assert.That(trashed.Key, Is.Not.EqualTo(Guid.Empty)); } } [Test] public void Can_Get_Content_By_Guid_Key() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { // Act var query = Query.Builder.Where(x => x.Key == new Guid("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0")); var content = repository.GetByQuery(query).SingleOrDefault(); // Assert Assert.That(content, Is.Not.Null); Assert.That(content.Id, Is.EqualTo(NodeDto.NodeIdSeed + 1)); } } [Test] public void Can_Create_Different_Language_Version() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { var content = repository.Get(NodeDto.NodeIdSeed + 2); // Act content.Language = "da-DK"; content.Name = "Tekst Side 1"; repository.AddOrUpdate(content); unitOfWork.Commit(); var latest = repository.Get(NodeDto.NodeIdSeed + 2); var english = repository.GetByLanguage(NodeDto.NodeIdSeed + 2, "en-US"); var danish = repository.GetByLanguage(NodeDto.NodeIdSeed + 2, "da-DK"); // Assert Assert.That(latest.Name, Is.EqualTo("Tekst Side 1")); Assert.That(english.Name, Is.EqualTo("Text Page 1")); Assert.That(danish.Name, Is.EqualTo("Tekst Side 1")); } } public void CreateTestData() { //Create and Save ContentType "umbTextpage" -> (NodeDto.NodeIdSeed) ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage"); contentType.Key = new Guid("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"); ServiceContext.ContentTypeService.Save(contentType); //Create and Save Content "Homepage" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 1) Content textpage = MockedContent.CreateSimpleContent(contentType); textpage.Key = new Guid("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0"); ServiceContext.ContentService.Save(textpage, 0); //Create and Save Content "Text Page 1" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 2) Content subpage = MockedContent.CreateSimpleContent(contentType, "Text Page 1", textpage.Id); subpage.Key = new Guid("FF11402B-7E53-4654-81A7-462AC2108059"); ServiceContext.ContentService.Save(subpage, 0); //Create and Save Content "Text Page 1" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 3) Content subpage2 = MockedContent.CreateSimpleContent(contentType, "Text Page 2", textpage.Id); ServiceContext.ContentService.Save(subpage2, 0); //Create and Save Content "Text Page Deleted" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 4) Content trashed = MockedContent.CreateSimpleContent(contentType, "Text Page Deleted", -20); trashed.Trashed = true; ServiceContext.ContentService.Save(trashed, 0); } } }