Files
Umbraco-CMS/src/Umbraco.Tests/Services/ContentServiceTests.cs

934 lines
37 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using NUnit.Framework;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Models.Rdbms;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.UnitOfWork;
using Umbraco.Core.Services;
using Umbraco.Tests.TestHelpers.Entities;
namespace Umbraco.Tests.Services
{
/// <summary>
/// Tests covering all methods in the ContentService class.
/// This is more of an integration test as it involves multiple layers
/// as well as configuration.
/// </summary>
[TestFixture, RequiresSTA]
public class ContentServiceTests : BaseServiceTest
{
[SetUp]
public override void Initialize()
{
base.Initialize();
}
[TearDown]
public override void TearDown()
{
base.TearDown();
}
//TODO Add test to verify there is only ONE newest document/content in cmsDocument table after updating.
//TODO Add test to delete specific version (with and without deleting prior versions) and versions by date.
[Test]
public void Can_Remove_Property_Type()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
var content = contentService.CreateContent("Test", -1, "umbTextpage", 0);
// Assert
Assert.That(content, Is.Not.Null);
Assert.That(content.HasIdentity, Is.False);
}
[Test]
public void Can_Create_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
var content = contentService.CreateContent("Test", -1, "umbTextpage", 0);
// Assert
Assert.That(content, Is.Not.Null);
Assert.That(content.HasIdentity, Is.False);
}
[Test]
public void Can_Create_Content_Without_Explicitly_Set_User()
{
// Arrange
var contentService = ServiceContext.ContentService as ContentService;
// Act
var content = contentService.CreateContent("Test", -1, "umbTextpage");
// Assert
Assert.That(content, Is.Not.Null);
Assert.That(content.HasIdentity, Is.False);
Assert.That(content.CreatorId, Is.EqualTo(0));//Default to zero/administrator
}
[Test]
public void Can_Save_New_Content_With_Explicit_User()
{
var user = new User(ServiceContext.UserService.GetUserTypeByAlias("admin"))
{
Name = "Test",
Email = "test@test.com",
Username = "test",
Password = "test"
};
ServiceContext.UserService.Save(user);
var content = new Content("Test", -1, ServiceContext.ContentTypeService.GetContentType("umbTextpage"));
// Act
ServiceContext.ContentService.Save(content, (int)user.Id);
// Assert
Assert.That(content.CreatorId, Is.EqualTo(user.Id));
Assert.That(content.WriterId, Is.EqualTo(user.Id));
}
[Test]
public void Cannot_Create_Content_With_Non_Existing_ContentType_Alias()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act & Assert
Assert.Throws<Exception>(() => contentService.CreateContent("Test", -1, "umbAliasDoesntExist"));
}
[Test]
public void Can_Get_Content_By_Id()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
var content = contentService.GetById(NodeDto.NodeIdSeed + 1);
// Assert
Assert.That(content, Is.Not.Null);
Assert.That(content.Id, Is.EqualTo(NodeDto.NodeIdSeed + 1));
}
[Test]
public void Can_Get_Content_By_Guid_Key()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
var content = contentService.GetById(new Guid("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0"));
// Assert
Assert.That(content, Is.Not.Null);
Assert.That(content.Id, Is.EqualTo(NodeDto.NodeIdSeed + 1));
}
[Test]
public void Can_Get_Content_By_Level()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
var contents = contentService.GetByLevel(2);
// Assert
Assert.That(contents, Is.Not.Null);
Assert.That(contents.Any(), Is.True);
Assert.That(contents.Count(), Is.GreaterThanOrEqualTo(2));
}
[Test]
public void Can_Get_Children_Of_Content_Id()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
var contents = contentService.GetChildren(NodeDto.NodeIdSeed + 1);
// Assert
Assert.That(contents, Is.Not.Null);
Assert.That(contents.Any(), Is.True);
Assert.That(contents.Count(), Is.GreaterThanOrEqualTo(2));
}
[Test]
public void Can_Get_Descendents_Of_Contnet()
{
// Arrange
var contentService = ServiceContext.ContentService;
var hierarchy = CreateContentHierarchy();
contentService.Save(hierarchy, 0);
// Act
var contents = contentService.GetDescendants(NodeDto.NodeIdSeed + 1);
// Assert
Assert.That(contents, Is.Not.Null);
Assert.That(contents.Any(), Is.True);
Assert.That(contents.Count(), Is.EqualTo(52));
}
[Test]
public void Can_Get_All_Versions_Of_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var parent = ServiceContext.ContentService.GetById(NodeDto.NodeIdSeed + 1);
ServiceContext.ContentService.Publish(parent);//Publishing root, so Text Page 2 can be updated.
var subpage2 = contentService.GetById(NodeDto.NodeIdSeed + 3);
subpage2.Name = "Text Page 2 Updated";
subpage2.SetValue("author", "Jane Doe");
contentService.SaveAndPublish(subpage2, 0);//NOTE New versions are only added between publish-state-changed, so publishing to ensure addition version.
// Act
var versions = contentService.GetVersions(NodeDto.NodeIdSeed + 3);
// Assert
Assert.That(versions.Any(), Is.True);
Assert.That(versions.Count(), Is.GreaterThanOrEqualTo(2));
}
[Test]
public void Can_Get_Root_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
var contents = contentService.GetRootContent();
// Assert
Assert.That(contents, Is.Not.Null);
Assert.That(contents.Any(), Is.True);
Assert.That(contents.Count(), Is.EqualTo(1));
}
[Test]
public void Can_Get_Content_For_Expiration()
{
// Arrange
var contentService = ServiceContext.ContentService;
var root = contentService.GetById(NodeDto.NodeIdSeed + 1);
contentService.SaveAndPublish(root);
var content = contentService.GetById(NodeDto.NodeIdSeed + 3);
content.ExpireDate = DateTime.Now.AddSeconds(1);
contentService.SaveAndPublish(content);
// Act
Thread.Sleep(new TimeSpan(0, 0, 0, 2));
var contents = contentService.GetContentForExpiration();
// Assert
Assert.That(DateTime.Now.AddMinutes(-5) <= DateTime.Now);
Assert.That(contents, Is.Not.Null);
Assert.That(contents.Any(), Is.True);
Assert.That(contents.Count(), Is.EqualTo(1));
}
[Test]
public void Can_Get_Content_For_Release()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
var contents = contentService.GetContentForRelease();
// Assert
Assert.That(DateTime.Now.AddMinutes(-5) <= DateTime.Now);
Assert.That(contents, Is.Not.Null);
Assert.That(contents.Any(), Is.True);
Assert.That(contents.Count(), Is.EqualTo(1));
}
[Test]
public void Can_Get_Content_In_RecycleBin()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
var contents = contentService.GetContentInRecycleBin();
// Assert
Assert.That(contents, Is.Not.Null);
Assert.That(contents.Any(), Is.True);
Assert.That(contents.Count(), Is.EqualTo(1));
}
[Test]
public void Can_UnPublish_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 1);
bool published = contentService.Publish(content, 0);
// Act
bool unpublished = contentService.UnPublish(content, 0);
// Assert
Assert.That(published, Is.True);
Assert.That(unpublished, Is.True);
Assert.That(content.Published, Is.False);
}
/// <summary>
/// This test is ignored because the way children are handled when
/// parent is unpublished is treated differently now then from when this test
/// was written.
/// The correct case is now that Root is UnPublished removing the children
/// from cache, but still having them "Published" in the "background".
/// Once the Parent is Published the Children should re-appear as published.
/// </summary>
[Test, NUnit.Framework.Ignore]
public void Can_UnPublish_Root_Content_And_Verify_Children_Is_UnPublished()
{
// Arrange
var contentService = ServiceContext.ContentService;
var published = contentService.RePublishAll(0);
var content = contentService.GetById(NodeDto.NodeIdSeed + 1);
// Act
bool unpublished = contentService.UnPublish(content, 0);
var children = contentService.GetChildren(NodeDto.NodeIdSeed + 1);
// Assert
Assert.That(published, Is.True);//Verify that everything was published
//Verify that content with Id (NodeDto.NodeIdSeed + 1) was unpublished
Assert.That(unpublished, Is.True);
Assert.That(content.Published, Is.False);
//Verify that all children was unpublished
Assert.That(children.Any(x => x.Published), Is.False);
Assert.That(children.First(x => x.Id == NodeDto.NodeIdSeed + 2).Published, Is.False);//Released 5 mins ago, but should be unpublished
Assert.That(children.First(x => x.Id == NodeDto.NodeIdSeed + 2).ReleaseDate.HasValue, Is.False);//Verify that the release date has been removed
Assert.That(children.First(x => x.Id == NodeDto.NodeIdSeed + 3).Published, Is.False);//Expired 5 mins ago, so isn't be published
}
[Test]
public void Can_RePublish_All_Content()
{
// Arrange
var contentService = (ContentService)ServiceContext.ContentService;
var rootContent = contentService.GetRootContent();
foreach (var c in rootContent)
{
contentService.PublishWithChildren(c);
}
var allContent = rootContent.Concat(rootContent.SelectMany(x => x.Descendants()));
//for testing we need to clear out the contentXml table so we can see if it worked
var provider = new PetaPocoUnitOfWorkProvider();
var uow = provider.GetUnitOfWork();
using (RepositoryResolver.Current.ResolveByType<IContentRepository>(uow))
{
uow.Database.TruncateTable("cmsContentXml");
}
//for this test we are also going to save a revision for a content item that is not published, this is to ensure
//that it's published version still makes it into the cmsContentXml table!
contentService.Save(allContent.Last());
// Act
var published = contentService.RePublishAll(0);
// Assert
Assert.IsTrue(published);
uow = provider.GetUnitOfWork();
using (var repo = RepositoryResolver.Current.ResolveByType<IContentRepository>(uow))
{
Assert.AreEqual(allContent.Count(), uow.Database.ExecuteScalar<int>("select count(*) from cmsContentXml"));
}
}
[Test]
public void Can_RePublish_All_Content_Of_Type()
{
// Arrange
var contentService = (ContentService)ServiceContext.ContentService;
var rootContent = contentService.GetRootContent();
foreach (var c in rootContent)
{
contentService.PublishWithChildren(c);
}
var allContent = rootContent.Concat(rootContent.SelectMany(x => x.Descendants()));
//for testing we need to clear out the contentXml table so we can see if it worked
var provider = new PetaPocoUnitOfWorkProvider();
var uow = provider.GetUnitOfWork();
using (RepositoryResolver.Current.ResolveByType<IContentRepository>(uow))
{
uow.Database.TruncateTable("cmsContentXml");
}
//for this test we are also going to save a revision for a content item that is not published, this is to ensure
//that it's published version still makes it into the cmsContentXml table!
contentService.Save(allContent.Last());
// Act
contentService.RePublishAll(new int[] { allContent.Last().ContentTypeId });
// Assert
uow = provider.GetUnitOfWork();
using (var repo = RepositoryResolver.Current.ResolveByType<IContentRepository>(uow))
{
Assert.AreEqual(allContent.Count(), uow.Database.ExecuteScalar<int>("select count(*) from cmsContentXml"));
}
}
[Test]
public void Can_Publish_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 1);
// Act
bool published = contentService.Publish(content, 0);
// Assert
Assert.That(published, Is.True);
Assert.That(content.Published, Is.True);
}
[Test]
public void Can_Publish_Only_Valid_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var contentTypeService = ServiceContext.ContentTypeService;
var contentType = MockedContentTypes.CreateSimpleContentType("umbMandatory", "Mandatory Doc Type", true);
contentTypeService.Save(contentType);
Content content = MockedContent.CreateSimpleContent(contentType, "Invalid Content", NodeDto.NodeIdSeed + 1);
content.SetValue("author", string.Empty);
contentService.Save(content, 0);
// Act
var parent = contentService.GetById(NodeDto.NodeIdSeed + 1);
bool parentPublished = contentService.Publish(parent, 0);
bool published = contentService.Publish(content, 0);
// Assert
Assert.That(parentPublished, Is.True);
Assert.That(published, Is.False);
Assert.That(content.IsValid(), Is.False);
Assert.That(parent.Published, Is.True);
Assert.That(content.Published, Is.False);
}
[Test]
public void Can_Publish_Content_Children()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 1);
// Act
bool published = contentService.PublishWithChildren(content, 0);
var children = contentService.GetChildren(NodeDto.NodeIdSeed + 1);
// Assert
Assert.That(published, Is.True);//Nothing was cancelled, so should be true
Assert.That(content.Published, Is.True);//No restrictions, so should be published
Assert.That(children.First(x => x.Id == NodeDto.NodeIdSeed + 2).Published, Is.True);//Released 5 mins ago, so should be published
}
[Test]
public void Cannot_Publish_Expired_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 3); //This Content expired 5min ago
content.ExpireDate = DateTime.Now.AddMinutes(-5);
contentService.Save(content);
var parent = contentService.GetById(NodeDto.NodeIdSeed + 1);
bool parentPublished = contentService.Publish(parent, 0);//Publish root Home node to enable publishing of 'NodeDto.NodeIdSeed + 3'
// Act
bool published = contentService.Publish(content, 0);
// Assert
Assert.That(parentPublished, Is.True);
Assert.That(published, Is.False);
Assert.That(content.Published, Is.False);
}
[Test]
public void Cannot_Publish_Content_Awaiting_Release()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 2);
content.ReleaseDate = DateTime.Now.AddHours(2);
contentService.Save(content, 0);
var parent = contentService.GetById(NodeDto.NodeIdSeed + 1);
bool parentPublished = contentService.Publish(parent, 0);//Publish root Home node to enable publishing of 'NodeDto.NodeIdSeed + 3'
// Act
bool published = contentService.Publish(content, 0);
// Assert
Assert.That(parentPublished, Is.True);
Assert.That(published, Is.False);
Assert.That(content.Published, Is.False);
}
[Test]
public void Cannot_Publish_Content_Where_Parent_Is_Unpublished()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.CreateContent("Subpage with Unpublisehed Parent", NodeDto.NodeIdSeed + 1, "umbTextpage", 0);
contentService.Save(content, 0);
// Act
bool published = contentService.PublishWithChildren(content, 0);
// Assert
Assert.That(published, Is.False);
Assert.That(content.Published, Is.False);
}
[Test]
public void Cannot_Publish_Trashed_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 4);
// Act
bool published = contentService.Publish(content, 0);
// Assert
Assert.That(published, Is.False);
Assert.That(content.Published, Is.False);
Assert.That(content.Trashed, Is.True);
}
[Test]
public void Can_Save_And_Publish_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.CreateContent("Home US", -1, "umbTextpage", 0);
content.SetValue("author", "Barack Obama");
// Act
bool published = contentService.SaveAndPublish(content, 0);
// Assert
Assert.That(content.HasIdentity, Is.True);
Assert.That(content.Published, Is.True);
Assert.That(published, Is.True);
}
[Test]
public void Can_Get_Published_Descendant_Versions()
{
// Arrange
var contentService = ServiceContext.ContentService;
var root = contentService.GetById(NodeDto.NodeIdSeed + 1);
var rootPublished = contentService.Publish(root);
var content = contentService.GetById(NodeDto.NodeIdSeed + 3);
content.Properties["title"].Value = content.Properties["title"].Value + " Published";
bool published = contentService.SaveAndPublish(content);
var publishedVersion = content.Version;
content.Properties["title"].Value = content.Properties["title"].Value + " Saved";
contentService.Save(content);
var savedVersion = content.Version;
// Act
var publishedDescendants = ((ContentService)contentService).GetPublishedDescendants(root);
// Assert
Assert.That(rootPublished, Is.True);
Assert.That(published, Is.True);
Assert.That(publishedDescendants.Any(x => x.Version == publishedVersion), Is.True);
Assert.That(publishedDescendants.Any(x => x.Version == savedVersion), Is.False);
//Ensure that the published content version has the correct property value and is marked as published
var publishedContentVersion = publishedDescendants.First(x => x.Version == publishedVersion);
Assert.That(publishedContentVersion.Published, Is.True);
Assert.That(publishedContentVersion.Properties["title"].Value, Contains.Substring("Published"));
//Ensure that the saved content version has the correct property value and is not marked as published
var savedContentVersion = contentService.GetByVersion(savedVersion);
Assert.That(savedContentVersion.Published, Is.False);
Assert.That(savedContentVersion.Properties["title"].Value, Contains.Substring("Saved"));
//Ensure that the latest version of the content is the saved and not-yet-published one
var currentContent = contentService.GetById(NodeDto.NodeIdSeed + 3);
Assert.That(currentContent.Published, Is.False);
Assert.That(currentContent.Properties["title"].Value, Contains.Substring("Saved"));
Assert.That(currentContent.Version, Is.EqualTo(savedVersion));
}
[Test]
public void Can_Save_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.CreateContent("Home US", -1, "umbTextpage", 0);
content.SetValue("author", "Barack Obama");
// Act
contentService.Save(content, 0);
// Assert
Assert.That(content.HasIdentity, Is.True);
}
[Test]
public void Can_Bulk_Save_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var contentTypeService = ServiceContext.ContentTypeService;
var contentType = contentTypeService.GetContentType("umbTextpage");
Content subpage = MockedContent.CreateSimpleContent(contentType, "Text Subpage 1", NodeDto.NodeIdSeed + 2);
Content subpage2 = MockedContent.CreateSimpleContent(contentType, "Text Subpage 2", NodeDto.NodeIdSeed + 2);
var list = new List<IContent> { subpage, subpage2 };
// Act
contentService.Save(list, 0);
// Assert
Assert.That(list.Any(x => !x.HasIdentity), Is.False);
}
[Test]
public void Can_Bulk_Save_New_Hierarchy_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var hierarchy = CreateContentHierarchy();
// Act
contentService.Save(hierarchy, 0);
Assert.That(hierarchy.Any(), Is.True);
Assert.That(hierarchy.Any(x => x.HasIdentity == false), Is.False);
//all parent id's should be ok, they are lazy and if they equal zero an exception will be thrown
Assert.DoesNotThrow(() => hierarchy.Any(x => x.ParentId != 0));
}
[Test]
public void Can_Delete_Content_Of_Specific_ContentType()
{
// Arrange
var contentService = ServiceContext.ContentService;
var contentTypeService = ServiceContext.ContentTypeService;
var contentType = contentTypeService.GetContentType("umbTextpage");
// Act
contentService.DeleteContentOfType(contentType.Id);
var rootContent = contentService.GetRootContent();
var contents = contentService.GetContentOfContentType(contentType.Id);
// Assert
Assert.That(rootContent.Any(), Is.False);
Assert.That(contents.Any(x => !x.Trashed), Is.False);
}
[Test]
public void Can_Delete_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 4);
// Act
contentService.Delete(content, 0);
var deleted = contentService.GetById(NodeDto.NodeIdSeed + 4);
// Assert
Assert.That(deleted, Is.Null);
}
[Test]
public void Can_Move_Content_To_RecycleBin()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 3);
// Act
contentService.MoveToRecycleBin(content, 0);
// Assert
Assert.That(content.ParentId, Is.EqualTo(-20));
Assert.That(content.Trashed, Is.True);
}
[Test]
public void Can_Move_Content_Structure_To_RecycleBin_And_Empty_RecycleBin()
{
// Arrange
var contentService = ServiceContext.ContentService;
var contentType = ServiceContext.ContentTypeService.GetContentType("umbTextpage");
Content subsubpage = MockedContent.CreateSimpleContent(contentType, "Text Page 3", NodeDto.NodeIdSeed + 2);
contentService.Save(subsubpage, 0);
var content = contentService.GetById(NodeDto.NodeIdSeed + 1);
// Act
contentService.MoveToRecycleBin(content, 0);
var descendants = contentService.GetDescendants(content);
// Assert
Assert.That(content.ParentId, Is.EqualTo(-20));
Assert.That(content.Trashed, Is.True);
Assert.That(descendants.Count(), Is.EqualTo(3));
Assert.That(descendants.Any(x => x.Path.Contains("-20") == false), Is.False);
//Empty Recycle Bin
contentService.EmptyRecycleBin();
var trashed = contentService.GetContentInRecycleBin();
Assert.That(trashed.Any(), Is.False);
}
[Test]
public void Can_Empty_RecycleBin()
{
// Arrange
var contentService = ServiceContext.ContentService;
// Act
contentService.EmptyRecycleBin();
var contents = contentService.GetContentInRecycleBin();
// Assert
Assert.That(contents.Any(), Is.False);
}
[Test]
public void Can_Move_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 4);
// Act - moving out of recycle bin
contentService.Move(content, NodeDto.NodeIdSeed + 1, 0);
// Assert
Assert.That(content.ParentId, Is.EqualTo(NodeDto.NodeIdSeed + 1));
Assert.That(content.Trashed, Is.False);
Assert.That(content.Published, Is.False);
}
[Test]
public void Can_Copy_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var temp = contentService.GetById(NodeDto.NodeIdSeed + 3);
// Act
var copy = contentService.Copy(temp, temp.ParentId, false, 0);
var content = contentService.GetById(NodeDto.NodeIdSeed + 3);
// Assert
Assert.That(copy, Is.Not.Null);
Assert.That(copy.Id, Is.Not.EqualTo(content.Id));
Assert.AreNotSame(content, copy);
foreach (var property in copy.Properties)
{
Assert.AreNotEqual(property.Id, content.Properties[property.Alias].Id);
Assert.AreEqual(property.Value, content.Properties[property.Alias].Value);
}
//Assert.AreNotEqual(content.Name, copy.Name);
}
[Test, NUnit.Framework.Ignore]
public void Can_Send_To_Publication()
{ }
[Test]
public void Can_Rollback_Version_On_Content()
{
// Arrange
var contentService = ServiceContext.ContentService;
var parent = ServiceContext.ContentService.GetById(NodeDto.NodeIdSeed + 1);
ServiceContext.ContentService.Publish(parent);//Publishing root, so Text Page 2 can be updated.
var subpage2 = contentService.GetById(NodeDto.NodeIdSeed + 3);
var version = subpage2.Version;
var nameBeforeRollback = subpage2.Name;
subpage2.Name = "Text Page 2 Updated";
subpage2.SetValue("author", "Jane Doe");
contentService.SaveAndPublish(subpage2, 0);//Saving and publishing, so a new version is created
// Act
var rollback = contentService.Rollback(NodeDto.NodeIdSeed + 3, version, 0);
// Assert
Assert.That(rollback, Is.Not.Null);
Assert.AreNotEqual(rollback.Version, subpage2.Version);
Assert.That(rollback.GetValue<string>("author"), Is.Not.EqualTo("Jane Doe"));
Assert.AreEqual(nameBeforeRollback, rollback.Name);
}
[Test]
public void Can_Save_Lazy_Content()
{
var unitOfWork = PetaPocoUnitOfWorkProvider.CreateUnitOfWork();
var contentType = ServiceContext.ContentTypeService.GetContentType("umbTextpage");
var root = ServiceContext.ContentService.GetById(NodeDto.NodeIdSeed + 1);
var c = new Lazy<IContent>(() => MockedContent.CreateSimpleContent(contentType, "Hierarchy Simple Text Page", root.Id));
var c2 = new Lazy<IContent>(() => MockedContent.CreateSimpleContent(contentType, "Hierarchy Simple Text Subpage", c.Value.Id));
var list = new List<Lazy<IContent>> { c, c2 };
var repository = RepositoryResolver.Current.ResolveByType<IContentRepository>(unitOfWork);
foreach (var content in list)
{
repository.AddOrUpdate(content.Value);
unitOfWork.Commit();
}
Assert.That(c.Value.HasIdentity, Is.True);
Assert.That(c2.Value.HasIdentity, Is.True);
Assert.That(c.Value.Id > 0, Is.True);
Assert.That(c2.Value.Id > 0, Is.True);
Assert.That(c.Value.ParentId > 0, Is.True);
Assert.That(c2.Value.ParentId > 0, Is.True);
}
[Test]
public void Can_Verify_Content_Has_Published_Version()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 1);
bool published = contentService.PublishWithChildren(content, 0);
var homepage = contentService.GetById(NodeDto.NodeIdSeed + 1);
homepage.Name = "Homepage";
ServiceContext.ContentService.Save(homepage);
// Act
bool hasPublishedVersion = ServiceContext.ContentService.HasPublishedVersion(NodeDto.NodeIdSeed + 1);
// Assert
Assert.That(published, Is.True);
Assert.That(homepage.Published, Is.False);
Assert.That(hasPublishedVersion, Is.True);
}
[Test]
public void Can_Verify_Property_Types_On_Content()
{
// Arrange
var contentTypeService = ServiceContext.ContentTypeService;
var contentType = MockedContentTypes.CreateAllTypesContentType("allDataTypes", "All DataTypes");
contentTypeService.Save(contentType);
var contentService = ServiceContext.ContentService;
var content = MockedContent.CreateAllTypesContent(contentType, "Random Content", -1);
contentService.Save(content);
var id = content.Id;
// Act
var sut = contentService.GetById(id);
// Arrange
Assert.That(sut.GetValue<bool>("isTrue"), Is.True);
Assert.That(sut.GetValue<int>("number"), Is.EqualTo(42));
Assert.That(sut.GetValue<string>("bodyText"), Is.EqualTo("Lorem Ipsum Body Text Test"));
Assert.That(sut.GetValue<string>("singleLineText"), Is.EqualTo("Single Line Text Test"));
Assert.That(sut.GetValue<string>("multilineText"), Is.EqualTo("Multiple lines \n in one box"));
Assert.That(sut.GetValue<string>("upload"), Is.EqualTo("/media/1234/koala.jpg"));
Assert.That(sut.GetValue<string>("label"), Is.EqualTo("Non-editable label"));
//SD: This is failing because the 'content' call to GetValue<DateTime> always has empty milliseconds
//MCH: I'm guessing this is an issue because of the format the date is actually stored as, right? Cause we don't do any formatting when saving or loading
Assert.That(sut.GetValue<DateTime>("dateTime").ToString("G"), Is.EqualTo(content.GetValue<DateTime>("dateTime").ToString("G")));
Assert.That(sut.GetValue<string>("colorPicker"), Is.EqualTo("black"));
Assert.That(sut.GetValue<string>("folderBrowser"), Is.Empty);
Assert.That(sut.GetValue<string>("ddlMultiple"), Is.EqualTo("1234,1235"));
Assert.That(sut.GetValue<string>("rbList"), Is.EqualTo("random"));
Assert.That(sut.GetValue<DateTime>("date").ToString("G"), Is.EqualTo(content.GetValue<DateTime>("date").ToString("G")));
Assert.That(sut.GetValue<string>("ddl"), Is.EqualTo("1234"));
Assert.That(sut.GetValue<string>("chklist"), Is.EqualTo("randomc"));
Assert.That(sut.GetValue<int>("contentPicker"), Is.EqualTo(1090));
Assert.That(sut.GetValue<int>("mediaPicker"), Is.EqualTo(1091));
Assert.That(sut.GetValue<int>("memberPicker"), Is.EqualTo(1092));
Assert.That(sut.GetValue<string>("relatedLinks"), Is.EqualTo("<links><link title=\"google\" link=\"http://google.com\" type=\"external\" newwindow=\"0\" /></links>"));
Assert.That(sut.GetValue<string>("tags"), Is.EqualTo("this,is,tags"));
}
[Test]
public void Can_Delete_Previous_Versions_Not_Latest()
{
// Arrange
var contentService = ServiceContext.ContentService;
var content = contentService.GetById(NodeDto.NodeIdSeed + 4);
var version = content.Version;
// Act
contentService.DeleteVersion(NodeDto.NodeIdSeed + 4, version, true, 0);
var sut = contentService.GetById(NodeDto.NodeIdSeed + 4);
// Assert
Assert.That(sut.Version, Is.EqualTo(version));
}
private IEnumerable<IContent> CreateContentHierarchy()
{
var contentType = ServiceContext.ContentTypeService.GetContentType("umbTextpage");
var root = ServiceContext.ContentService.GetById(NodeDto.NodeIdSeed + 1);
var list = new List<IContent>();
for (int i = 0; i < 10; i++)
{
var content = MockedContent.CreateSimpleContent(contentType, "Hierarchy Simple Text Page " + i, root);
list.Add(content);
list.AddRange(CreateChildrenOf(contentType, content, 4));
Console.WriteLine("Created: 'Hierarchy Simple Text Page {0}'", i);
}
return list;
}
private IEnumerable<IContent> CreateChildrenOf(IContentType contentType, IContent content, int depth)
{
var list = new List<IContent>();
for (int i = 0; i < depth; i++)
{
var c = MockedContent.CreateSimpleContent(contentType, "Hierarchy Simple Text Subpage " + i, content);
list.Add(c);
Console.WriteLine("Created: 'Hierarchy Simple Text Subpage {0}' - Depth: {1}", i, depth);
}
return list;
}
}
}