using System; using System.Linq; using NUnit.Framework; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; 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 { [TestFixture] public class ContentRepositoryTest : BaseDatabaseFactoryTest { [SetUp] public override void Initialize() { base.Initialize(); CreateTestData(); } [TearDown] public override void TearDown() { base.TearDown(); } [Test] public void Can_Perform_Add_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "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); } [Test] public void Can_Perform_Multiple_Adds_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "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(); var contentTypeRepository = RepositoryResolver.ResolveByType(unitOfWork); var repository = RepositoryResolver.ResolveByType(unitOfWork); ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage"); Content textpage = MockedContent.CreateSimpleContent(contentType); // Act contentTypeRepository.AddOrUpdate(contentType); repository.AddOrUpdate(textpage); unitOfWork.Commit(); var repository2 = RepositoryResolver.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_Instantiate_Repository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); // Act var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, contentTypeRepository); // Assert Assert.That(repository, Is.Not.Null); } [Test] public void Can_Verify_Fresh_Entity_Is_Not_Dirty() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); // Act var content = repository.Get(1048); 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(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); // Act var content = repository.Get(1047); content.Name = "About 2"; repository.AddOrUpdate(content); unitOfWork.Commit(); var updatedContent = repository.Get(1047); // 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(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); var contentType = contentTypeRepository.Get(1045); var content = new Content(1048, contentType); content.Name = "Textpage 2 Child Node"; content.Creator = new Profile(0, "Administrator"); // Act repository.AddOrUpdate(content); unitOfWork.Commit(); var id = content.Id; var unitOfWork2 = provider.GetUnitOfWork(); var contentTypeRepository2 = new ContentTypeRepository(unitOfWork2); var repository2 = new ContentRepository(unitOfWork2, InMemoryCacheProvider.Current, contentTypeRepository2); repository2.Delete(content); unitOfWork2.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(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); // Act var content = repository.Get(1048); // Assert Assert.That(content.Id, Is.EqualTo(1048)); 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(1045)); 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(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, 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_GetAll_By_Param_Ids_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); // Act var contents = repository.GetAll(1047, 1048); // 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(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, 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(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); // Act var exists = repository.Exists(1046); // Assert Assert.That(exists, Is.True); } [Test] public void Can_Perform_Count_On_ContentRepository() { // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, 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)); } public void CreateTestData() { //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); //Create and Save Content "Text Page Deleted" based on "umbTextpage" -> 1049 Content trashed = MockedContent.CreateSimpleContent(contentType, "Text Page Deleted", -20); trashed.Trashed = true; ServiceContext.ContentService.Save(trashed, 0); } } }