Files
Umbraco-CMS/umbraco.Test/DocumentTest.cs
Shandem a6cdbf1a55 More unit tests
[TFS Changeset #66373]
2010-06-02 11:25:50 +00:00

944 lines
37 KiB
C#

using umbraco.cms.businesslogic.web;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using umbraco.BusinessLogic;
using umbraco.cms.businesslogic;
using System.Collections.Generic;
using System.Xml;
using Microsoft.VisualStudio.TestTools.UnitTesting.Web;
using System.Linq;
using System.Threading;
using umbraco.cms.businesslogic.datatype;
using umbraco.editorControls.textfield;
using umbraco.cms.businesslogic.propertytype;
using umbraco.cms.businesslogic.property;
using umbraco.cms.businesslogic.language;
using umbraco.BusinessLogic.console;
namespace umbraco.Test
{
/// <summary>
/// Test for the Document API.
///</summary>
///<remarks>
/// All of these tests are run in the ASP.Net context and these tests will require that there is data
/// in the Umbraco instance being tested including both document types and content.
///
/// This WILL make alot of SQL calls.
///
/// All of these tests will also delete any data that they create
/// </remarks>
[TestClass()]
public class DocumentTest
{
/// <summary>
/// Creates a bunch of nodes in a heirarchy, then deletes the top most node (moves to the recycle bin
/// and completely deletes from system.) This should completely delete all of these nodes from the database.
/// </summary>
[TestMethod()]
public void Document_Delete_Heirarchy_Permanently()
{
var docList = new List<Document>();
var total = 20;
var dt = new DocumentType(GetExistingDocTypeId());
//allow the doc type to be created underneath itself
dt.AllowedChildContentTypeIDs = new int[] { dt.Id };
dt.Save();
//create 20 content nodes underneath each other, this will test deleting with heirarchy as well
var lastParentId = -1;
for (var i = 0; i < total; i++)
{
var newDoc = Document.MakeNew(i.ToString() + Guid.NewGuid().ToString("N"), dt, m_User, lastParentId);
docList.Add(newDoc);
Assert.IsTrue(docList[docList.Count - 1].Id > 0);
lastParentId = newDoc.Id;
}
//now delete all of them permanently, since they are nested, we only need to delete one
docList.First().delete(true);
//make sure they are all gone
foreach (var d in docList)
{
Assert.IsFalse(Document.IsNode(d.Id));
}
}
/// <summary>
///A test for PublishWithResult
///</summary>
[TestMethod()]
public void Document_Publish_With_Result()
{
var val = m_NewRootDoc.PublishWithResult(m_User);
}
/// <summary>
/// Creates a doc type, assigns a domain to it and removes it
/// </summary>
[TestMethod()]
public void Document_Assign_Domain()
{
var d = CreateNewUnderRoot(GetExistingDocType());
var languages = Language.getAll.ToList();
Assert.IsTrue(languages.Count > 0);
//get all assigned domains
var domains = Domain.GetDomains();
var domainName = "www." + Guid.NewGuid().ToString("N") + ".com";
//add a domain name to the node with the first language found
Domain.MakeNew(domainName, d.Id, languages[0].id);
Assert.IsTrue(Domain.Exists(domainName));
Assert.AreEqual<int>(domains.Count + 1, Domain.GetDomains().Count);
//delete the document, ensure that the domain is gone
RecycleAndDelete(d);
Assert.IsFalse(Domain.Exists(domainName));
Assert.AreEqual<int>(domains.Count, Domain.GetDomains().Count);
}
/// <summary>
///A test for making a new document and deleting it which actuall first moves it to the recycle bin
///and then deletes it.
///</summary>
[TestMethod()]
public void Document_Make_New()
{
Assert.IsInstanceOfType(m_NewRootDoc, typeof(Document));
}
/// <summary>
/// A test for Copying a node, then deleting the copied node.
/// This does error checking on the case of when a node is being copied that is in the root and doesn't have a parent node, it will
/// lookup the root docs to do the test.
///</summary>
[TestMethod()]
public void Document_Copy()
{
//System.Diagnostics.Debugger.Break();
Document target = new Document(GetExistingNodeId());
int parentId = target.ParentId;
bool RelateToOrignal = false;
//get children ids for the current parent
var childrenIds = GetChildNodesOfParent(target).Select(x => x.Id);
//copy the node
target.Copy(parentId, m_User, RelateToOrignal);
//test that the child id count + 1 is equal to the total child count
Assert.AreEqual(childrenIds.Count() + 1, GetChildNodesOfParent(target).Count(), "Child node counts do not match");
//get the list of new child ids from the parent
var newChildIds = GetChildNodesOfParent(target).Select(x => x.Id);
//get the children difference which should be the new node
var diff = newChildIds.Except(childrenIds);
Assert.AreEqual(1, diff.Count());
//get the node that is the difference to compare
Document newDoc = new Document(diff.First());
Assert.AreEqual<int>(parentId, newDoc.ParentId);
RecycleAndDelete(newDoc);
}
/// <summary>
/// Tests copying by relating nodes, then deleting
/// </summary>
[TestMethod()]
public void Document_Copy_And_Relate()
{
//System.Diagnostics.Debugger.Break();
Document target = new Document(GetExistingNodeId());
int parentId = target.ParentId;
bool RelateToOrignal = true;
//get children ids
var childrenIds = GetChildNodesOfParent(target).Select(x => x.Id);
target.Copy(parentId, m_User, RelateToOrignal);
var parentChildNodes = GetChildNodesOfParent(target);
Assert.AreEqual(childrenIds.Count() + 1, parentChildNodes.Count());
//get the children difference which should be the new node
var diff = parentChildNodes.Select(x => x.Id).Except(childrenIds);
Assert.AreEqual(1, diff.Count());
Document newDoc = new Document(diff.First());
RecycleAndDelete(newDoc);
}
/// <summary>
///Create a new document, create preview xml for it, then delete it
///</summary>
[TestMethod()]
public void Document_To_Preview_Xml()
{
//System.Diagnostics.Debugger.Break();
var doc = m_NewRootDoc;
var id = doc.Id;
Assert.IsTrue(doc.Id > 0);
XmlDocument xd = new XmlDocument();
var xmlNode = doc.ToPreviewXml(xd);
Assert.IsNotNull(xmlNode);
Assert.IsTrue(xmlNode.HasChildNodes);
}
/// <summary>
/// Run test to create a node, publish it and delete it. This will test the versioning too.
/// </summary>
[TestMethod()]
public void Document_Make_New_And_Publish()
{
//System.Diagnostics.Debugger.Break();
var doc = m_NewRootDoc;
var id = doc.Id;
Assert.IsTrue(doc.Id > 0);
var versionCount = doc.GetVersions().Count();
doc.Publish(m_User);
Assert.IsTrue(doc.Published);
Assert.AreEqual(versionCount + 1, doc.GetVersions().Count());
}
/// <summary>
///A test that creates a new document, publishes it, unpublishes it and finally deletes it
///</summary>
[TestMethod()]
public void Document_Publish_Then_UnPublish()
{
//System.Diagnostics.Debugger.Break();
var doc = m_NewRootDoc;
var id = doc.Id;
Assert.IsTrue(doc.Id > 0);
var versionCount = doc.GetVersions().Count();
doc.Publish(m_User);
Assert.IsTrue(doc.Published);
Assert.AreEqual(versionCount + 1, doc.GetVersions().Count());
doc.UnPublish();
Assert.IsFalse(doc.Published);
}
/// <summary>
///A test that makes a new document, updates some properties, saves and publishes the document, then rolls the document back and finally deletes it.
///</summary>
[TestMethod()]
public void Document_Save_And_Publish_Then_Roll_Back()
{
//System.Diagnostics.Debugger.Break();
//create new document in the root
var doc = m_NewRootDoc;
var id = doc.Id;
Assert.IsTrue(doc.Id > 0);
//get a text property
var prop = GetTextFieldProperty(m_ExistingDocType, doc);
var originalPropVal = prop.Value;
var versionCount = doc.GetVersions().Count();
//save
//wait a sec so that there's a time delay between the update time and version time
Thread.Sleep(1000);
doc.Save();
Assert.IsTrue(doc.HasPendingChanges());
//publish and create new version
doc.Publish(m_User);
Assert.IsTrue(doc.Published);
var versions = doc.GetVersions().ToList();
Assert.AreEqual(versionCount + 1, versions.Count());
prop.Value = "updated!"; //udpate the prop
Assert.AreNotEqual(originalPropVal, prop.Value);
//rollback to first version
doc.RollBack(versions.OrderBy(x => x.Date).Last().Version, m_User);
var rolledBack = new Document(id);
Assert.AreEqual(originalPropVal, rolledBack.GenericProperties.ToList().Where(x => x.PropertyType.Alias == "headerText").First().Value);
}
/// <summary>
///Tests creating a new document type, then creating a new node with that document type, adding some data to it, then deleting the
///document type which should delete all documents associated with that.
///This will create a document type that has it's own id allowed as children. When we create the content nodes, we'll create
///them as children of each other to ensure the deletion occurs correctly.
///</summary>
[TestMethod()]
public void Document_Delete_All_Docs_By_Document_Type()
{
//System.Diagnostics.Debugger.Break();
//create a new doc type
string name = "TEST-" + Guid.NewGuid().ToString("N");
var dt = DocumentType.MakeNew(m_User, name);
//test the doc type
Assert.AreEqual(DateTime.Now.Date, dt.CreateDateTime.Date);
Assert.IsTrue(dt.Id > 0);
//allow itself to be created under itself
dt.AllowedChildContentTypeIDs = new int[] { dt.Id };
//create a tab
dt.AddVirtualTab("TEST");
//test the tab
var tabs = dt.getVirtualTabs.ToList();
Assert.AreEqual(1, tabs.Count);
//create a property
var allDataTypes = DataTypeDefinition.GetAll().ToList(); //get all definitions
dt.AddPropertyType(allDataTypes[0], "testProperty", "Test Property"); //add a property type of the first type found in the list
//test the prop
var prop = dt.getPropertyType("testProperty");
Assert.AreEqual("Test Property", prop.Name);
//create 1st node
var node1 = Document.MakeNew("TEST-" + Guid.NewGuid().ToString("N"), dt, m_User, -1);
Assert.IsTrue(node1.Id > 0);
//create 2nd node underneath node 1
var node2 = Document.MakeNew("TEST-" + Guid.NewGuid().ToString("N"), dt, m_User, node1.Id);
Assert.IsTrue(node2.Id > 0);
Assert.AreEqual(node1.Id, node2.Parent.Id);
//create 3rd node underneath node 2
var node3 = Document.MakeNew("TEST-" + Guid.NewGuid().ToString("N"), dt, m_User, node2.Id);
Assert.IsTrue(node3.Id > 0);
Assert.AreEqual(node2.Id, node3.Parent.Id);
Document.DeleteFromType(dt);
Assert.IsFalse(Document.IsNode(node1.Id));
Assert.IsFalse(Document.IsNode(node2.Id));
Assert.IsFalse(Document.IsNode(node3.Id));
//now remove the document type created
dt.delete();
Assert.IsFalse(DocumentType.IsNode(dt.Id));
}
/// <summary>
/// This will find a document type that supports a heirarchy, create 2 root nodes, then create a child node under the first one,
/// then move it to the second one and finally delete everything that was created.
/// </summary>
[TestMethod]
public void Document_Move()
{
//first need to document type that allows other types of document types to exist underneath it
DocumentType parent = null;
DocumentType child = null;
var ids = DocumentType.getAllUniqueNodeIdsFromObjectType(DocumentType._objectType);
foreach (var id in ids)
{
var dt = new DocumentType(id);
var allowed = dt.AllowedChildContentTypeIDs.ToList();
if (allowed.Count() > 0)
{
parent = dt;
child = new DocumentType(allowed[0]);
break;
}
}
if (parent == null || child == null)
{
throw new NotImplementedException("The umbraco install doesn't have document types that support a heirarchy");
}
//now that we have a parent and a child, we need to create some documents
var node1 = Document.MakeNew("FromCopy" + Guid.NewGuid().ToString("N"), parent, m_User, -1);
Assert.IsTrue(node1.Id > 0);
var node2 = Document.MakeNew("ToCopy" + Guid.NewGuid().ToString("N"), parent, m_User, -1);
Assert.IsTrue(node2.Id > 0);
//we now have 2 nodes in the root of the same type, we'll create a child node under node1 and move it to node2
var childNode = Document.MakeNew("ChildCopy" + Guid.NewGuid().ToString("N"), child, m_User, node2.Id);
Assert.IsTrue(childNode.Id > 0);
childNode.Move(node2.Id);
Assert.AreEqual(node2.Id, childNode.Parent.Id);
RecycleAndDelete(childNode);
RecycleAndDelete(node2);
RecycleAndDelete(node1);
}
/// <summary>
/// This will find an existing node, copy it to the same parent, delete the copied node and restore it, then finally completley remove it.
/// </summary>
[TestMethod]
public void Document_Undelete()
{
//find existing content
var doc = new Document(GetExistingNodeId());
//create new content based on the existing content in the same heirarchy
var dt = new DocumentType(doc.ContentType.Id);
var parentId = doc.ParentId;
var newDoc = Document.MakeNew("NewDoc" + Guid.NewGuid().ToString("N"), dt, m_User, parentId);
Assert.IsTrue(newDoc.Id > 0);
//this will recycle the node
newDoc.delete();
Assert.IsTrue(newDoc.IsTrashed);
Assert.IsTrue(newDoc.Path.Contains("," + (int)RecycleBin.RecycleBinType.Content + ","));
//undelete the node (move it)
newDoc.Move(parentId);
Assert.IsFalse(newDoc.IsTrashed);
Assert.IsFalse(newDoc.Path.Contains("," + (int)RecycleBin.RecycleBinType.Content + ","));
//remove it completely
RecycleAndDelete(newDoc);
}
/// <summary>
/// This method will create 20 content nodes, send them to the recycle bin and then empty the recycle bin
/// </summary>
[TestMethod]
public void Document_Empty_Recycle_Bin()
{
var docList = new List<Document>();
var total = 20;
var dt = m_ExistingDocType;
//allow the doc type to be created underneath itself
dt.AllowedChildContentTypeIDs = new int[] { dt.Id };
dt.Save();
//create 20 content nodes underneath each other, this will test deleting with heirarchy as well
var lastParentId = -1;
for (var i = 0; i < total; i++)
{
var newDoc = Document.MakeNew("R-" + i.ToString() + Guid.NewGuid().ToString("N"), dt, m_User, lastParentId);
docList.Add(newDoc);
Assert.IsTrue(docList[docList.Count - 1].Id > 0);
Assert.AreEqual(lastParentId, newDoc.ParentId);
lastParentId = newDoc.Id;
}
//now delete all of them, since they are nested, we only need to delete one
docList.First().delete();
//a callback action for each item removed from the recycle bin
var totalDeleted = 0;
var bin = new RecycleBin(RecycleBin.RecycleBinType.Content);
var totalTrashedItems = bin.GetDescendants().Cast<object>().Count();
bin.CallTheGarbageMan(x =>
{
Assert.AreEqual(totalTrashedItems - (++totalDeleted), x);
});
Assert.AreEqual(0, RecycleBin.Count(RecycleBin.RecycleBinType.Content));
}
#region TEST TO BE WRITTEN
///// <summary>
/////A test for XmlPopulate
/////</summary>
//[TestMethod()]
//public void XmlPopulateTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// XmlDocument xd = null; // TODO: Initialize to an appropriate value
// XmlNode x = null; // TODO: Initialize to an appropriate value
// XmlNode xExpected = null; // TODO: Initialize to an appropriate value
// bool Deep = false; // TODO: Initialize to an appropriate value
// target.XmlPopulate(xd, ref x, Deep);
// Assert.AreEqual(xExpected, x);
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
//}
///// <summary>
/////A test for XmlNodeRefresh
/////</summary>
//[TestMethod()]
//public void XmlNodeRefreshTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// XmlDocument xd = null; // TODO: Initialize to an appropriate value
// XmlNode x = null; // TODO: Initialize to an appropriate value
// XmlNode xExpected = null; // TODO: Initialize to an appropriate value
// target.XmlNodeRefresh(xd, ref x);
// Assert.AreEqual(xExpected, x);
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
//}
///// <summary>
/////A test for XmlGenerate
/////</summary>
//[TestMethod()]
//public void XmlGenerateTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// XmlDocument xd = null; // TODO: Initialize to an appropriate value
// target.XmlGenerate(xd);
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
//}
///// <summary>
/////A test for ToXml
/////</summary>
//[TestMethod()]
//public void ToXmlTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// XmlDocument xd = null; // TODO: Initialize to an appropriate value
// bool Deep = false; // TODO: Initialize to an appropriate value
// XmlNode expected = null; // TODO: Initialize to an appropriate value
// XmlNode actual;
// actual = target.ToXml(xd, Deep);
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for SendToPublication
/////</summary>
//[TestMethod()]
//public void SendToPublicationTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// User u = null; // TODO: Initialize to an appropriate value
// bool expected = false; // TODO: Initialize to an appropriate value
// bool actual;
// actual = target.SendToPublication(u);
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for RePublishAll
/////</summary>
//[TestMethod()]
//public void RePublishAllTest()
//{
// Document.RePublishAll();
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
//}
///// <summary>
/////A test for RegeneratePreviews
/////</summary>
//[TestMethod()]
//public void RegeneratePreviewsTest()
//{
// Document.RegeneratePreviews();
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
//}
///// <summary>
/////A test for refreshXmlSortOrder
/////</summary>
//[TestMethod()]
//public void refreshXmlSortOrderTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// target.refreshXmlSortOrder();
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
//}
///// <summary>
/////A test for PublishWithSubs
/////</summary>
//[TestMethod()]
//public void PublishWithSubsTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// User u = null; // TODO: Initialize to an appropriate value
// target.PublishWithSubs(u);
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
//}
///// <summary>
/////A test for PublishWithChildrenWithResult
/////</summary>
//[TestMethod()]
//public void PublishWithChildrenWithResultTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// User u = null; // TODO: Initialize to an appropriate value
// bool expected = false; // TODO: Initialize to an appropriate value
// bool actual;
// actual = target.PublishWithChildrenWithResult(u);
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for Publish
/////</summary>
//[TestMethod()]
//public void PublishTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// User u = null; // TODO: Initialize to an appropriate value
// target.Publish(u);
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
//}
///// <summary>
/////A test for Import
/////</summary>
//[TestMethod()]
//public void ImportTest()
//{
// int ParentId = 0; // TODO: Initialize to an appropriate value
// User Creator = null; // TODO: Initialize to an appropriate value
// XmlElement Source = null; // TODO: Initialize to an appropriate value
// int expected = 0; // TODO: Initialize to an appropriate value
// int actual;
// actual = Document.Import(ParentId, Creator, Source);
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for GetTextPath
/////</summary>
//[TestMethod()]
//public void GetTextPathTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// string expected = string.Empty; // TODO: Initialize to an appropriate value
// string actual;
// actual = target.GetTextPath();
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for GetRootDocuments
/////</summary>
//[TestMethod()]
//public void GetRootDocumentsTest()
//{
// Document[] expected = null; // TODO: Initialize to an appropriate value
// Document[] actual;
// actual = Document.GetRootDocuments();
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for GetNodesForPreview
/////</summary>
//[TestMethod()]
//public void GetNodesForPreviewTest()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// bool childrenOnly = false; // TODO: Initialize to an appropriate value
// List<CMSPreviewNode> expected = null; // TODO: Initialize to an appropriate value
// List<CMSPreviewNode> actual;
// actual = target.GetNodesForPreview(childrenOnly);
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for GetDocumentsForRelease
/////</summary>
//[TestMethod()]
//public void GetDocumentsForReleaseTest()
//{
// Document[] expected = null; // TODO: Initialize to an appropriate value
// Document[] actual;
// actual = Document.GetDocumentsForRelease();
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for GetDocumentsForExpiration
/////</summary>
//[TestMethod()]
//public void GetDocumentsForExpirationTest()
//{
// Document[] expected = null; // TODO: Initialize to an appropriate value
// Document[] actual;
// actual = Document.GetDocumentsForExpiration();
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for GetChildrenForTree
/////</summary>
//[TestMethod()]
//public void GetChildrenForTreeTest()
//{
// int NodeId = 0; // TODO: Initialize to an appropriate value
// Document[] expected = null; // TODO: Initialize to an appropriate value
// Document[] actual;
// actual = Document.GetChildrenForTree(NodeId);
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for CountSubs
/////</summary>
//[TestMethod()]
//public void CountSubsTest()
//{
// int parentId = 0; // TODO: Initialize to an appropriate value
// bool publishedOnly = false; // TODO: Initialize to an appropriate value
// int expected = 0; // TODO: Initialize to an appropriate value
// int actual;
// actual = Document.CountSubs(parentId, publishedOnly);
// Assert.AreEqual(expected, actual);
// Assert.Inconclusive("Verify the correctness of this test method.");
//}
///// <summary>
/////A test for Copy
/////</summary>
//[TestMethod()]
//public void CopyTest1()
//{
// Guid id = new Guid(); // TODO: Initialize to an appropriate value
// Document target = new Document(id); // TODO: Initialize to an appropriate value
// int CopyTo = 0; // TODO: Initialize to an appropriate value
// User u = null; // TODO: Initialize to an appropriate value
// target.Copy(CopyTo, u);
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
//}
#endregion
#region Private properties and methods
/// <summary>
/// The user to be used to create stuff
/// </summary>
private static User m_User = new User(0);
/// <summary>
/// Used for each test initialization. Before each test is run a new root doc is created.
/// </summary>
private Document m_NewRootDoc;
/// <summary>
/// Gets initialized for each test and is set to an existing document type
/// </summary>
private DocumentType m_ExistingDocType;
/// <summary>
/// Completely remove the document, this will first recycle it and then delete it (the api doesn't directly support deleting completey in one step)
/// </summary>
/// <param name="d"></param>
internal static void RecycleAndDelete(Document d)
{
if (d == null)
{
return;
}
var id = d.Id;
//check if it is already trashed
var alreadyTrashed = d.IsTrashed;
if (!alreadyTrashed)
{
//now recycle it
d.delete();
Assert.IsTrue(d.IsTrashed);
}
//now permanently delete
d.delete(true);
Assert.IsFalse(Document.IsNode(id));
//check with sql that it is gone
var count = Application.SqlHelper.ExecuteScalar<int>("SELECT COUNT(*) FROM umbracoNode WHERE id=@id",
Application.SqlHelper.CreateParameter("@id", id));
Assert.AreEqual(0, count);
}
/// <summary>
/// Returns a random docuemnt type that supports a text property
/// </summary>
/// <returns></returns>
internal static int GetExistingDocTypeId()
{
var types = DocumentType.GetAllAsList();
DocumentType found = null;
TextFieldDataType txtField = new TextFieldDataType();
foreach (var d in types)
{
var prop = d.PropertyTypes
.Where(x => x.DataTypeDefinition.DataType.Id == txtField.Id).FirstOrDefault();
if (prop != null)
{
found = d;
break;
}
}
if (found == null)
{
throw new MissingMemberException("No document type was found that contains a text field property");
}
return found.Id;
}
/// <summary>
/// Returns a text field property of the document type specified. This will throw an exception if one is not found.
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
internal static Property GetTextFieldProperty(DocumentType dt, Document d)
{
TextFieldDataType txtField = new TextFieldDataType();
var prop = dt.PropertyTypes
.Where(x => x.DataTypeDefinition.DataType.Id == txtField.Id).First();
return d.GenericProperties.Where(x => x.PropertyType.Id == prop.Id).First();
}
/// <summary>
/// Returns a content node
/// </summary>
/// <returns></returns>
internal static int GetExistingNodeId()
{
var ids = Document.getAllUniqueNodeIdsFromObjectType(Document._objectType).ToList();
var r = new Random();
var index = r.Next(0, ids.Count() - 1);
return ids[index];
}
/// <summary>
/// A helper method to get the parent node.
/// The reason we need this is because the API currently throws an exception if we access the Parent property
/// of a node and the node is on level 1. This also causes issues if the node is in level 1 in the recycle bin.
/// </summary>
/// <param name="d"></param>
/// <returns></returns>
internal static IEnumerable<IconI> GetChildNodesOfParent(Document d)
{
if (d.ParentId == (int)RecycleBin.RecycleBinType.Content)
{
return new RecycleBin(RecycleBin.RecycleBinType.Content).Children.ToList();
}
else
{
if (d.Level == 1)
{
return Document.GetRootDocuments();
}
else
{
return d.Parent.Children;
}
}
}
internal static DocumentType GetExistingDocType()
{
DocumentType dct = new DocumentType(GetExistingDocTypeId());
Assert.IsTrue(dct.Id > 0);
return dct;
}
/// <summary>
/// Creates a new node based on an existing doc type
/// </summary>
/// <returns></returns>
internal static Document CreateNewUnderRoot(DocumentType dt)
{
string Name = "TEST-" + Guid.NewGuid().ToString("N");
int ParentId = -1;
Document actual = Document.MakeNew(Name, dt, m_User, ParentId);
var id = actual.Id;
Assert.IsTrue(actual.Id > 0);
return actual;
}
#endregion
#region Initialize and cleanup
//
//You can use the following additional attributes as you write your tests:
//
//Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext)
//{
//}
//
//Use ClassCleanup to run code after all tests in a class have run
//[ClassCleanup()]
//public static void MyClassCleanup()
//{
//}
//
/// <summary>
/// Creates a new root document to use for each test if required
/// </summary>
[TestInitialize()]
public void MyTestInitialize()
{
m_ExistingDocType = GetExistingDocType();
m_NewRootDoc = CreateNewUnderRoot(m_ExistingDocType);
}
/// <summary>
/// Makes sure the root doc is deleted
/// </summary>
[TestCleanup()]
public void MyTestCleanup()
{
RecycleAndDelete(m_NewRootDoc);
}
#endregion
}
}