using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Web; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Dynamics; using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.PublishedContent { [TestFixture] public abstract class DynamicDocumentTestsBase : PublishedContentTestBase { public override void Initialize() { base.Initialize(); } public override void TearDown() { base.TearDown(); } protected override bool RequiresDbSetup { get { return false; } } protected override string GetXmlContent(int templateId) { return @" ]> 1 This is some content]]> "; } /// /// Returns the dynamic node/document to run tests against /// /// /// protected abstract dynamic GetDynamicNode(int id); [Test] public void Single() { var doc = GetDynamicNode(4444); var result = doc.Children().Single(); Assert.IsNotNull(result); Assert.AreEqual(5555, result.Id); } [Test] public void Single_With_Query() { var doc = GetDynamicNode(1046); var result = doc.Children().Single("id==1175"); Assert.IsNotNull(result); Assert.AreEqual(1175, result.Id); } [Test] public void First() { var doc = GetDynamicNode(1173); var result = doc.Children().First(); Assert.IsNotNull(result); Assert.AreEqual(1174, result.Id); } [Test] public void First_With_Query() { var doc = GetDynamicNode(1173); var result = doc.Children().First("blah==\"some content\""); Assert.IsNotNull(result); Assert.AreEqual(1176, result.Id); } [Test] public void Where_User_Property_Value() { var doc = GetDynamicNode(1173); var result = (IEnumerable)doc.Children().Where("blah==\"some content\""); Assert.IsNotNull(result); Assert.AreEqual(1, result.Count()); Assert.AreEqual(1176, result.Single().Id); } [Test] public void String_ContainsValue_Extension_Method() { var doc = GetDynamicNode(1046); var paramVals = new Dictionary { { "searchId", 1173 } }; //this is an integer value var result = doc.Children() .Where("selectedNodes.ContainsValue(searchId)", paramVals) //call an extension method .FirstOrDefault(); Assert.IsNotNull(result); Assert.AreEqual(4444, result.Id); //don't find! paramVals = new Dictionary { { "searchId", 1111777 } }; result = doc.Children() .Where("selectedNodes.ContainsValue(searchId)", paramVals) .FirstOrDefault(); Assert.IsNotNull(result); Assert.IsTrue(result.GetType() == typeof(DynamicNull) || result.GetType() == typeof(umbraco.MacroEngines.DynamicNull)); //Assert.AreEqual(typeof(DynamicNull), result.GetType()); } [Test] public void String_Contains_Method() { var doc = GetDynamicNode(1046); var paramVals = new Dictionary { { "searchId", "1173" } }; var result = doc.Children() .Where("selectedNodes.Contains(searchId)", paramVals) .FirstOrDefault(); Assert.IsNotNull(result); Assert.AreEqual(4444, result.Id); //don't find! paramVals = new Dictionary { { "searchId", "1aaa173" } }; result = doc.Children() .Where("selectedNodes.Contains(searchId)", paramVals) .FirstOrDefault(); Assert.IsNotNull(result); Assert.IsTrue(result.GetType() == typeof (DynamicNull) || result.GetType() == typeof (umbraco.MacroEngines.DynamicNull)); //Assert.AreEqual(typeof (DynamicNull), result.GetType()); } [Test] public void String_Split_Method() { var doc = GetDynamicNode(1046); var paramVals = new Dictionary { { "splitTerm", new char[] { ',' } }, { "splitOptions", StringSplitOptions.RemoveEmptyEntries } }; var result = doc.Children() .Where("selectedNodes.Split(splitTerm, splitOptions).Length == 3", paramVals) .FirstOrDefault(); Assert.IsNotNull(result); Assert.AreEqual(4444, result.Id); } [Ignore("We are ignoring this test because currently our ExpressionParser class cannot deal with this... it needs some serious TLC but it is very complex.")] [Test] public void Complex_Linq() { var doc = GetDynamicNode(1173); var paramVals = new Dictionary {{"splitTerm", new char[] {','}}, {"searchId", "1173"}}; var result = doc.Ancestors().OrderBy("level") .Single() .Descendants() .Where("selectedNodes != null && selectedNodes != String.Empty && selectedNodes.Split(splitTerm).Contains(searchId)", paramVals) .FirstOrDefault(); Assert.IsNotNull(result); Assert.AreEqual(4444, result.Id); } [Test] public void Index() { var doc = GetDynamicNode(1173); Assert.AreEqual(0, doc.Index()); doc = GetDynamicNode(1176); Assert.AreEqual(1, doc.Index()); doc = GetDynamicNode(1177); Assert.AreEqual(2, doc.Index()); doc = GetDynamicNode(1178); Assert.AreEqual(3, doc.Index()); } [Test] public virtual void Is_First_Root_Nodes() { var doc = GetDynamicNode(1046); //test root nodes Assert.IsTrue(doc.IsFirst()); doc = GetDynamicNode(1172); Assert.IsFalse(doc.IsFirst()); } [Test] public void Is_First() { var doc = GetDynamicNode(1173); //test normal nodes Assert.IsTrue(doc.IsFirst()); doc = GetDynamicNode(1175); Assert.IsFalse(doc.IsFirst()); } [Test] public virtual void Is_Not_First_Root_Nodes() { var doc = GetDynamicNode(1046); //test root nodes Assert.IsFalse(doc.IsNotFirst()); doc = GetDynamicNode(1172); Assert.IsTrue(doc.IsNotFirst()); } [Test] public void Is_Not_First() { var doc = GetDynamicNode(1173); //test normal nodes Assert.IsFalse(doc.IsNotFirst()); doc = GetDynamicNode(1175); Assert.IsTrue(doc.IsNotFirst()); } [Test] public virtual void Is_Position_Root_Nodes() { var doc = GetDynamicNode(1046); //test root nodes Assert.IsTrue(doc.IsPosition(0)); doc = GetDynamicNode(1172); Assert.IsTrue(doc.IsPosition(1)); } [Test] public void Is_Position() { var doc = GetDynamicNode(1173); //test normal nodes Assert.IsTrue(doc.IsPosition(0)); doc = GetDynamicNode(1175); Assert.IsTrue(doc.IsPosition(1)); } [Test] public void Children_GroupBy_DocumentTypeAlias() { var doc = GetDynamicNode(1046); var found1 = doc.Children.GroupBy("DocumentTypeAlias"); var casted = (IEnumerable>)(found1); Assert.AreEqual(2, casted.Count()); Assert.AreEqual(2, casted.Single(x => x.Key.ToString() == "Home").Count()); Assert.AreEqual(1, casted.Single(x => x.Key.ToString() == "CustomDocument").Count()); } [Test] public void Children_Where_DocumentTypeAlias() { var doc = GetDynamicNode(1046); var found1 = doc.Children.Where("DocumentTypeAlias == \"CustomDocument\""); var found2 = doc.Children.Where("DocumentTypeAlias == \"Home\""); Assert.AreEqual(1, found1.Count()); Assert.AreEqual(2, found2.Count()); } [Test] public void Children_Where_NodeTypeAlias() { var doc = GetDynamicNode(1046); var found1 = doc.Children.Where("NodeTypeAlias == \"CustomDocument\""); var found2 = doc.Children.Where("NodeTypeAlias == \"Home\""); Assert.AreEqual(1, found1.Count()); Assert.AreEqual(2, found2.Count()); } [Test] public void Children_Order_By_Update_Date() { var asDynamic = GetDynamicNode(1173); var ordered = asDynamic.Children.OrderBy("UpdateDate"); var casted = (IEnumerable)ordered; var correctOrder = new[] { 1178, 1177, 1174, 1176 }; for (var i = 0; i < correctOrder.Length ;i++) { Assert.AreEqual(correctOrder[i], ((dynamic)casted.ElementAt(i)).Id); } } [Test] public void Children_Order_By_Update_Date_Descending() { var asDynamic = GetDynamicNode(1173); var ordered = asDynamic.Children.OrderBy("UpdateDate desc"); var casted = (IEnumerable)ordered; var correctOrder = new[] { 1176, 1174, 1177, 1178 }; for (var i = 0; i < correctOrder.Length; i++) { Assert.AreEqual(correctOrder[i], ((dynamic)casted.ElementAt(i)).Id); } } [Test] public void HasProperty() { var asDynamic = GetDynamicNode(1173); var hasProp = asDynamic.HasProperty("umbracoUrlAlias"); Assert.AreEqual(true, (bool)hasProp); } [Test] public void Skip() { var asDynamic = GetDynamicNode(1173); var skip = asDynamic.Children.Skip(2); var casted = (IEnumerable)skip; Assert.AreEqual(2, casted.Count()); Assert.IsTrue(casted.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[]{1177, 1178})); } [Test] public void HasValue() { var asDynamic = GetDynamicNode(1173); var hasValue = asDynamic.HasValue("umbracoUrlAlias"); var noValue = asDynamic.HasValue("blahblahblah"); Assert.IsTrue(hasValue); Assert.IsFalse(noValue); } [Test] public void Take() { var asDynamic = GetDynamicNode(1173); var take = asDynamic.Children.Take(2); var casted = (IEnumerable)take; Assert.AreEqual(2, casted.Count()); Assert.IsTrue(casted.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1174, 1176 })); } [Test] public void Ancestors_Where_Visible() { var asDynamic = GetDynamicNode(1174); var whereVisible = asDynamic.Ancestors().Where("Visible"); var casted = (IEnumerable)whereVisible; Assert.AreEqual(1, casted.Count()); } [Test] public void Visible() { var asDynamicHidden = GetDynamicNode(1046); var asDynamicVisible = GetDynamicNode(1173); Assert.IsFalse(asDynamicHidden.Visible); Assert.IsTrue(asDynamicVisible.Visible); } [Test] public void Ensure_TinyMCE_Converted_Type_User_Property() { var asDynamic = GetDynamicNode(1173); Assert.IsTrue(TypeHelper.IsTypeAssignableFrom(asDynamic.Content.GetType())); Assert.AreEqual("
This is some content
", asDynamic.Content.ToString()); } [Test] public void Get_Children_With_Pluralized_Alias() { var asDynamic = GetDynamicNode(1173); Action doAssert = d => { Assert.IsTrue(TypeHelper.IsTypeAssignableFrom(d)); var casted = (IEnumerable)d; Assert.AreEqual(2, casted.Count()); }; doAssert(asDynamic.Homes); //pluralized alias doAssert(asDynamic.homes); //pluralized alias doAssert(asDynamic.CustomDocuments); //pluralized alias doAssert(asDynamic.customDocuments); //pluralized alias } [Test] public void GetPropertyValue_Non_Reflected() { var asDynamic = GetDynamicNode(1174); Assert.AreEqual("Custom data with same property name as the member name", asDynamic.GetPropertyValue("creatorName")); Assert.AreEqual("Custom data with same property name as the member name", asDynamic.GetPropertyValue("CreatorName")); } [Test] public void GetPropertyValue_Reflected() { var asDynamic = GetDynamicNode(1174); Assert.AreEqual("admin", asDynamic.GetPropertyValue("@creatorName")); Assert.AreEqual("admin", asDynamic.GetPropertyValue("@CreatorName")); } [Test] public void Get_User_Property_With_Same_Name_As_Member_Property() { var asDynamic = GetDynamicNode(1174); Assert.AreEqual("Custom data with same property name as the member name", asDynamic.creatorName); //because CreatorName is defined on DynamicNode, it will not return the user defined property Assert.AreEqual("admin", asDynamic.CreatorName); } [Test] public void Get_Member_Property() { var asDynamic = GetDynamicNode(1173); Assert.AreEqual((int) 2, (int) asDynamic.Level); Assert.AreEqual((int) 2, (int) asDynamic.level); Assert.AreEqual((int) 1046, (int) asDynamic.ParentId); Assert.AreEqual((int) 1046, (int) asDynamic.parentId); } [Test] public void Get_Children() { var asDynamic = GetDynamicNode(1173); var children = asDynamic.Children; Assert.IsTrue(TypeHelper.IsTypeAssignableFrom(children)); var childrenAsList = asDynamic.ChildrenAsList; //test ChildrenAsList too Assert.IsTrue(TypeHelper.IsTypeAssignableFrom(childrenAsList)); var castChildren = (IEnumerable)children; Assert.AreEqual(4, castChildren.Count()); var castChildrenAsList = (IEnumerable)childrenAsList; Assert.AreEqual(4, castChildrenAsList.Count()); } [Test] public void Ancestor_Or_Self() { var asDynamic = GetDynamicNode(1173); var result = asDynamic.AncestorOrSelf(); Assert.IsNotNull(result); Assert.AreEqual((int) 1046, (int) result.Id); } [Test] public void Ancestors_Or_Self() { var asDynamic = GetDynamicNode(1174); var result = asDynamic.AncestorsOrSelf(); Assert.IsNotNull(result); var list = (IEnumerable)result; Assert.AreEqual(3, list.Count()); Assert.IsTrue(list.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1174, 1173, 1046 })); } [Test] public void Ancestors() { var asDynamic = GetDynamicNode(1174); var result = asDynamic.Ancestors(); Assert.IsNotNull(result); var list = (IEnumerable)result; Assert.AreEqual(2, list.Count()); Assert.IsTrue(list.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1173, 1046 })); } [Test] public void Descendants_Or_Self() { var asDynamic = GetDynamicNode(1046); var result = asDynamic.DescendantsOrSelf(); Assert.IsNotNull(result); var list = (IEnumerable)result; Assert.AreEqual(9, list.Count()); Assert.IsTrue(list.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1046, 1173, 1174, 1176, 1175, 4444 })); } [Test] public void Descendants() { var asDynamic = GetDynamicNode(1046); var result = asDynamic.Descendants(); Assert.IsNotNull(result); var list = (IEnumerable)result; Assert.AreEqual(8, list.Count()); Assert.IsTrue(list.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1173, 1174, 1176, 1175, 4444 })); } [Test] public void Up() { var asDynamic = GetDynamicNode(1173); var result = asDynamic.Up(); Assert.IsNotNull(result); Assert.AreEqual((int) 1046, (int) result.Id); } [Test] public void Down() { var asDynamic = GetDynamicNode(1173); var result = asDynamic.Down(); Assert.IsNotNull(result); Assert.AreEqual((int) 1174, (int) result.Id); } [Test] public void Next() { var asDynamic = GetDynamicNode(1173); var result = asDynamic.Next(); Assert.IsNotNull(result); Assert.AreEqual((int) 1175, (int) result.Id); } [Test] public void Next_Without_Sibling() { var asDynamic = GetDynamicNode(1178); Assert.IsNull(asDynamic.Next()); } [Test] public void Previous_Without_Sibling() { var asDynamic = GetDynamicNode(1173); Assert.IsNull(asDynamic.Previous()); } [Test] public void Previous() { var asDynamic = GetDynamicNode(1176); var result = asDynamic.Previous(); Assert.IsNotNull(result); Assert.AreEqual((int) 1174, (int) result.Id); } } /// /// Extension methods used in tests /// public static class TestExtensionMethods { public static bool ContainsValue(this string s, int val) { return s.Contains(val.ToString()); } } }