Added unit tests for legacy DynamicNode which now just runs tests on the abstract class so we share tests between

DynamicDocument and DynamicNode.
Fixes: #U4-691
Fixes: #U4-690
This commit is contained in:
Shannon Deminick
2012-08-25 07:07:00 +07:00
parent 64c9d97e53
commit 92602e3480
12 changed files with 531 additions and 490 deletions

View File

@@ -46,3 +46,4 @@ src/Umbraco.Tests/config/trees.config
src/Umbraco.Web.UI/web.config
src/Umbraco.Tests/config/404handlers.config
src/Umbraco.Web.UI/Views/*
src/Umbraco.Tests/config/umbracoSettings.config

View File

@@ -2,6 +2,7 @@ using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Caching;
using System.Xml;
@@ -434,59 +435,65 @@ namespace Umbraco.Core.Configuration
}
}
public static IEnumerable<RazorDataTypeModelStaticMappingItem> RazorDataTypeModelStaticMapping
private static IEnumerable<RazorDataTypeModelStaticMappingItem> _razorDataTypeModelStaticMapping;
private static readonly ReaderWriterLockSlim Lock = new ReaderWriterLockSlim();
public static IEnumerable<RazorDataTypeModelStaticMappingItem> RazorDataTypeModelStaticMapping
{
get
{
if (HttpContext.Current != null && HttpContext.Current.Cache != null && HttpContext.Current.Cache["settings.scripting.razor.dataTypeModelStaticMappings"] != null)
{
return HttpContext.Current.Cache["settings.scripting.razor.dataTypeModelStaticMappings"] as List<RazorDataTypeModelStaticMappingItem>;
}
/*
<dataTypeModelStaticMappings>
<mapping dataTypeGuid="ef94c406-9e83-4058-a780-0375624ba7ca">DigibizAdvancedMediaPicker.RazorModel.ModelBinder</mapping>
<mapping documentTypeAlias="RoomPage" nodeTypeAlias="teaser">DigibizAdvancedMediaPicker.RazorModel.ModelBinder</mapping>
</dataTypeModelStaticMappings>
*/
List<RazorDataTypeModelStaticMappingItem> items = new List<RazorDataTypeModelStaticMappingItem>();
XmlNode root = GetKeyAsNode("/settings/scripting/razor/dataTypeModelStaticMappings");
if (root != null)
{
foreach (XmlNode element in root.SelectNodes(".//mapping"))
{
string propertyTypeAlias = null, nodeTypeAlias = null;
Guid? dataTypeGuid = null;
if (!string.IsNullOrEmpty(element.InnerText))
{
if (element.Attributes["dataTypeGuid"] != null)
{
dataTypeGuid = (Guid?)new Guid(element.Attributes["dataTypeGuid"].Value);
}
if (element.Attributes["propertyTypeAlias"] != null && !string.IsNullOrEmpty(element.Attributes["propertyTypeAlias"].Value))
{
propertyTypeAlias = element.Attributes["propertyTypeAlias"].Value;
}
if (element.Attributes["nodeTypeAlias"] != null && !string.IsNullOrEmpty(element.Attributes["nodeTypeAlias"].Value))
{
nodeTypeAlias = element.Attributes["nodeTypeAlias"].Value;
}
items.Add(new RazorDataTypeModelStaticMappingItem()
{
DataTypeGuid = dataTypeGuid,
PropertyTypeAlias = propertyTypeAlias,
NodeTypeAlias = nodeTypeAlias,
TypeName = element.InnerText,
Raw = element.OuterXml
});
}
}
}
if (HttpContext.Current != null && HttpContext.Current.Cache != null)
{
HttpContext.Current.Cache.Add("settings.scripting.razor.dataTypeModelStaticMappings", items, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 20, 0), CacheItemPriority.AboveNormal, null);
}
return items;
/*
<dataTypeModelStaticMappings>
<mapping dataTypeGuid="ef94c406-9e83-4058-a780-0375624ba7ca">DigibizAdvancedMediaPicker.RazorModel.ModelBinder</mapping>
<mapping documentTypeAlias="RoomPage" nodeTypeAlias="teaser">DigibizAdvancedMediaPicker.RazorModel.ModelBinder</mapping>
</dataTypeModelStaticMappings>
*/
using (var l = new UpgradeableReadLock(Lock))
{
if (_razorDataTypeModelStaticMapping == null)
{
l.UpgradeToWriteLock();
List<RazorDataTypeModelStaticMappingItem> items = new List<RazorDataTypeModelStaticMappingItem>();
XmlNode root = GetKeyAsNode("/settings/scripting/razor/dataTypeModelStaticMappings");
if (root != null)
{
foreach (XmlNode element in root.SelectNodes(".//mapping"))
{
string propertyTypeAlias = null, nodeTypeAlias = null;
Guid? dataTypeGuid = null;
if (!string.IsNullOrEmpty(element.InnerText))
{
if (element.Attributes["dataTypeGuid"] != null)
{
dataTypeGuid = (Guid?)new Guid(element.Attributes["dataTypeGuid"].Value);
}
if (element.Attributes["propertyTypeAlias"] != null && !string.IsNullOrEmpty(element.Attributes["propertyTypeAlias"].Value))
{
propertyTypeAlias = element.Attributes["propertyTypeAlias"].Value;
}
if (element.Attributes["nodeTypeAlias"] != null && !string.IsNullOrEmpty(element.Attributes["nodeTypeAlias"].Value))
{
nodeTypeAlias = element.Attributes["nodeTypeAlias"].Value;
}
items.Add(new RazorDataTypeModelStaticMappingItem()
{
DataTypeGuid = dataTypeGuid,
PropertyTypeAlias = propertyTypeAlias,
NodeTypeAlias = nodeTypeAlias,
TypeName = element.InnerText,
Raw = element.OuterXml
});
}
}
}
_razorDataTypeModelStaticMapping = items;
}
return _razorDataTypeModelStaticMapping;
}
}
}

View File

@@ -0,0 +1,35 @@
using System.Collections.Generic;
using Umbraco.Core.Dynamics;
namespace Umbraco.Tests.DynamicDocument
{
public static class DynamicDocumentCustomExtensionMethods
{
public static string DynamicDocumentNoParameters(this Core.Dynamics.DynamicDocument doc)
{
return "Hello world";
}
public static string DynamicDocumentCustomString(this Core.Dynamics.DynamicDocument doc, string custom)
{
return custom;
}
public static string DynamicDocumentMultiParam(this Core.Dynamics.DynamicDocument doc, string custom, int i, bool b)
{
return custom + i + b;
}
public static string DynamicDocumentListMultiParam(this DynamicDocumentList doc, string custom, int i, bool b)
{
return custom + i + b;
}
public static string DynamicDocumentEnumerableMultiParam(this IEnumerable<Core.Dynamics.DynamicDocument> doc, string custom, int i, bool b)
{
return custom + i + b;
}
}
}

View File

@@ -0,0 +1,77 @@
using System;
using NUnit.Framework;
using Umbraco.Core.Dynamics;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web;
using umbraco.BusinessLogic;
using umbraco.cms.businesslogic.template;
namespace Umbraco.Tests.DynamicDocument
{
[TestFixture]
public class DynamicDocumentTests : DynamicDocumentTestsBase<Umbraco.Core.Dynamics.DynamicDocument, DynamicDocumentList>
{
public override void Initialize()
{
base.Initialize();
DynamicDocumentDataSourceResolver.Current = new DynamicDocumentDataSourceResolver(
new TestDynamicDocumentDataSource());
PropertyEditorValueConvertersResolver.Current = new PropertyEditorValueConvertersResolver(
new[]
{
typeof(DatePickerPropertyEditorValueConverter),
typeof(TinyMcePropertyEditorValueConverter),
typeof(YesNoPropertyEditorValueConverter)
});
}
public override void TearDown()
{
base.TearDown();
DynamicDocumentDataSourceResolver.Reset();
PropertyEditorValueConvertersResolver.Reset();
}
private class TestDynamicDocumentDataSource : IDynamicDocumentDataSource
{
public Guid GetDataType(string docTypeAlias, string propertyAlias)
{
if (propertyAlias == "content")
{
//return the rte type id
return Guid.Parse("5e9b75ae-face-41c8-b47e-5f4b0fd82f83");
}
return Guid.Empty;
}
}
protected override dynamic GetDynamicNode(int id)
{
var template = Template.MakeNew("test", new User(0));
var ctx = GetUmbracoContext("/test", template);
var contentStore = new XmlPublishedContentStore();
var doc = contentStore.GetDocumentById(ctx, id);
Assert.IsNotNull(doc);
var dynamicNode = new Core.Dynamics.DynamicDocument(doc);
Assert.IsNotNull(dynamicNode);
return dynamicNode.AsDynamic();
}
[Test]
public void Custom_Extension_Methods()
{
var asDynamic = GetDynamicNode(1173);
Assert.AreEqual("Hello world", asDynamic.DynamicDocumentNoParameters());
Assert.AreEqual("Hello world!", asDynamic.DynamicDocumentCustomString("Hello world!"));
Assert.AreEqual("Hello world!" + 123 + false, asDynamic.DynamicDocumentMultiParam("Hello world!", 123, false));
Assert.AreEqual("Hello world!" + 123 + false, asDynamic.Children.DynamicDocumentListMultiParam("Hello world!", 123, false));
Assert.AreEqual("Hello world!" + 123 + false, asDynamic.Children.DynamicDocumentEnumerableMultiParam("Hello world!", 123, false));
}
}
}

View File

@@ -0,0 +1,241 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Umbraco.Core;
using Umbraco.Tests.TestHelpers;
namespace Umbraco.Tests.DynamicDocument
{
[TestFixture]
public abstract class DynamicDocumentTestsBase<TDocument, TDocumentList> : BaseWebTest
{
/// <summary>
/// Returns the dynamic node/document to run tests against
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
protected abstract dynamic GetDynamicNode(int id);
[Test]
public void Ensure_TinyMCE_Converted_Type_User_Property()
{
var asDynamic = GetDynamicNode(1173);
Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IHtmlString>(asDynamic.Content.GetType()));
Assert.AreEqual("<div>This is some content</div>", asDynamic.Content.ToString());
}
[Test]
public void Get_Children_With_Pluralized_Alias()
{
var asDynamic = GetDynamicNode(1173);
Action<object> doAssert = d =>
{
Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IEnumerable>(d));
var casted = (IEnumerable<TDocument>)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<IEnumerable>(children));
var childrenAsList = asDynamic.ChildrenAsList; //test ChildrenAsList too
Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IEnumerable>(childrenAsList));
var castChildren = (IEnumerable<TDocument>)children;
Assert.AreEqual(4, castChildren.Count());
var castChildrenAsList = (IEnumerable<TDocument>)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<TDocument>)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<TDocument>)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<TDocument>)result;
Assert.AreEqual(7, list.Count());
Assert.IsTrue(list.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1046, 1173, 1174, 1176, 1175 }));
}
[Test]
public void Descendants()
{
var asDynamic = GetDynamicNode(1046);
var result = asDynamic.Descendants();
Assert.IsNotNull(result);
var list = (IEnumerable<TDocument>)result;
Assert.AreEqual(6, list.Count());
Assert.IsTrue(list.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1173, 1174, 1176, 1175 }));
}
[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);
}
}
}

View File

@@ -0,0 +1,46 @@
using System.IO;
using NUnit.Framework;
using Umbraco.Core.Configuration;
using Umbraco.Tests.TestHelpers;
using Umbraco.Web;
using umbraco.BusinessLogic;
using umbraco.IO;
using umbraco.MacroEngines;
using umbraco.NodeFactory;
using umbraco.cms.businesslogic.template;
using System.Linq;
namespace Umbraco.Tests.DynamicDocument
{
[TestFixture]
public class DynamicNodeTests : DynamicDocumentTestsBase<DynamicNode, DynamicNodeList>
{
public override void Initialize()
{
base.Initialize();
//copy the umbraco settings file over
var currDir = new DirectoryInfo(TestHelper.CurrentAssemblyDirectory);
File.Copy(
currDir.Parent.Parent.Parent.GetDirectories("Umbraco.Web.UI")
.First()
.GetDirectories("config").First()
.GetFiles("umbracoSettings.Release.config").First().FullName,
Path.Combine(currDir.Parent.Parent.FullName, "config", "umbracoSettings.config"),
true);
UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config, false);
}
protected override dynamic GetDynamicNode(int id)
{
var template = Template.MakeNew("test", new User(0));
var ctx = GetUmbracoContext("/test", template);
var contentStore = new XmlPublishedContentStore();
var node = new DynamicNode(
new DynamicBackingItem(
new Node(ctx.GetXml().SelectSingleNode("//*[@id='" + id + "' and @isDoc]"))));
Assert.IsNotNull(node);
return (dynamic) node;
}
}
}

View File

@@ -1,365 +0,0 @@
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.Core.Models;
using Umbraco.Core.PropertyEditors;
using Umbraco.Tests.TestHelpers;
using Umbraco.Web;
using umbraco.BusinessLogic;
using umbraco.cms.businesslogic.template;
namespace Umbraco.Tests
{
[TestFixture]
public class DynamicDocumentTests : BaseWebTest
{
public override void Initialize()
{
base.Initialize();
DynamicDocumentDataSourceResolver.Current = new DynamicDocumentDataSourceResolver(
new TestDynamicDocumentDataSource());
PropertyEditorValueConvertersResolver.Current = new PropertyEditorValueConvertersResolver(
new[]
{
typeof(DatePickerPropertyEditorValueConverter),
typeof(TinyMcePropertyEditorValueConverter),
typeof(YesNoPropertyEditorValueConverter)
});
}
public override void TearDown()
{
base.TearDown();
DynamicDocumentDataSourceResolver.Reset();
PropertyEditorValueConvertersResolver.Reset();
}
private DynamicDocument GetDynamicNode(int id)
{
var template = Template.MakeNew("test", new User(0));
var ctx = GetUmbracoContext("/test", template);
var contentStore = new XmlPublishedContentStore();
var doc = contentStore.GetDocumentById(ctx, id);
Assert.IsNotNull(doc);
var dynamicNode = new DynamicDocument(doc);
Assert.IsNotNull(dynamicNode);
return dynamicNode;
}
[Test]
public void Custom_Extension_Methods()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
Assert.AreEqual("Hello world", asDynamic.DynamicDocumentNoParameters());
Assert.AreEqual("Hello world!", asDynamic.DynamicDocumentCustomString("Hello world!"));
Assert.AreEqual("Hello world!" + 123 + false, asDynamic.DynamicDocumentMultiParam("Hello world!", 123, false));
Assert.AreEqual("Hello world!" + 123 + false, asDynamic.Children.DynamicDocumentListMultiParam("Hello world!", 123, false));
Assert.AreEqual("Hello world!" + 123 + false, asDynamic.Children.DynamicDocumentEnumerableMultiParam("Hello world!", 123, false));
}
[Test]
public void Custom_Extension_Method_With_Params()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
Assert.AreEqual("Hello world", asDynamic.ReturnHelloWorld());
}
[Test]
public void Ensure_TinyMCE_Converted_Type_User_Property()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IHtmlString>(asDynamic.Content.GetType()));
Assert.AreEqual("<div>This is some content</div>", asDynamic.Content.ToString());
}
[Test]
public void Get_Children_With_Pluralized_Alias()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
Action<dynamic> doAssert = d =>
{
Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IEnumerable>(d));
var casted = (IEnumerable<DynamicDocument>)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 dynamicNode = GetDynamicNode(1174);
var asDynamic = dynamicNode.AsDynamic();
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 dynamicNode = GetDynamicNode(1174);
var asDynamic = dynamicNode.AsDynamic();
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 dynamicNode = GetDynamicNode(1174);
var asDynamic = dynamicNode.AsDynamic();
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 dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
Assert.AreEqual(2, asDynamic.Level);
Assert.AreEqual(2, asDynamic.level);
Assert.AreEqual(1046, asDynamic.ParentId);
Assert.AreEqual(1046, asDynamic.parentId);
}
[Test]
public void Get_Children()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
var children = asDynamic.Children;
Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IEnumerable>(children));
var childrenAsList = asDynamic.ChildrenAsList; //test ChildrenAsList too
Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IEnumerable>(childrenAsList));
var castChildren = (IEnumerable<DynamicDocument>)children;
Assert.AreEqual(4, castChildren.Count());
var castChildrenAsList = (IEnumerable<DynamicDocument>)childrenAsList;
Assert.AreEqual(4, castChildrenAsList.Count());
}
[Test]
public void Ancestor_Or_Self()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
var result = asDynamic.AncestorOrSelf();
Assert.IsNotNull(result);
Assert.AreEqual(1046, result.Id);
}
[Test]
public void Ancestors_Or_Self()
{
var dynamicNode = GetDynamicNode(1174);
var asDynamic = dynamicNode.AsDynamic();
var result = asDynamic.AncestorsOrSelf();
Assert.IsNotNull(result);
var list = (IEnumerable<DynamicDocument>)result;
Assert.AreEqual(3, list.Count());
Assert.IsTrue(list.Select(x => x.Id).ContainsAll(new[] { 1174, 1173, 1046 }));
}
[Test]
public void Ancestors()
{
var dynamicNode = GetDynamicNode(1174);
var asDynamic = dynamicNode.AsDynamic();
var result = asDynamic.Ancestors();
Assert.IsNotNull(result);
var list = (IEnumerable<DynamicDocument>)result;
Assert.AreEqual(2, list.Count());
Assert.IsTrue(list.Select(x => x.Id).ContainsAll(new[] { 1173, 1046 }));
}
[Test]
public void Descendants_Or_Self()
{
var dynamicNode = GetDynamicNode(1046);
var asDynamic = dynamicNode.AsDynamic();
var result = asDynamic.DescendantsOrSelf();
Assert.IsNotNull(result);
var list = (IEnumerable<DynamicDocument>)result;
Assert.AreEqual(7, list.Count());
Assert.IsTrue(list.Select(x => x.Id).ContainsAll(new[] { 1046, 1173, 1174, 1176, 1175 }));
}
[Test]
public void Descendants()
{
var dynamicNode = GetDynamicNode(1046);
var asDynamic = dynamicNode.AsDynamic();
var result = asDynamic.Descendants();
Assert.IsNotNull(result);
var list = (IEnumerable<DynamicDocument>)result;
Assert.AreEqual(6, list.Count());
Assert.IsTrue(list.Select(x => x.Id).ContainsAll(new[] { 1173, 1174, 1176, 1175 }));
}
[Test]
public void Up()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
var result = asDynamic.Up();
Assert.IsNotNull(result);
Assert.AreEqual(1046, result.Id);
}
[Test]
public void Down()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
var result = asDynamic.Down();
Assert.IsNotNull(result);
Assert.AreEqual(1174, result.Id);
}
[Test]
public void Next()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
var result = asDynamic.Next();
Assert.IsNotNull(result);
Assert.AreEqual(1175, result.Id);
}
[Test]
public void Next_Without_Sibling()
{
var dynamicNode = GetDynamicNode(1178);
var asDynamic = dynamicNode.AsDynamic();
Assert.IsNull(asDynamic.Next());
}
[Test]
public void Previous_Without_Sibling()
{
var dynamicNode = GetDynamicNode(1173);
var asDynamic = dynamicNode.AsDynamic();
Assert.IsNull(asDynamic.Previous());
}
[Test]
public void Previous()
{
var dynamicNode = GetDynamicNode(1176);
var asDynamic = dynamicNode.AsDynamic();
var result = asDynamic.Previous();
Assert.IsNotNull(result);
Assert.AreEqual(1174, result.Id);
}
#region Classes used in test
private class TestDynamicDocumentDataSource : IDynamicDocumentDataSource
{
public Guid GetDataType(string docTypeAlias, string propertyAlias)
{
if (propertyAlias == "content")
{
//return the rte type id
return Guid.Parse("5e9b75ae-face-41c8-b47e-5f4b0fd82f83");
}
return Guid.Empty;
}
}
#endregion
}
public static class DynamicDocumentCustomExtensionMethods
{
public static string DynamicDocumentNoParameters(this DynamicDocument doc)
{
return "Hello world";
}
public static string DynamicDocumentCustomString(this DynamicDocument doc, string custom)
{
return custom;
}
public static string DynamicDocumentMultiParam(this DynamicDocument doc, string custom, int i, bool b)
{
return custom + i + b;
}
public static string DynamicDocumentListMultiParam(this DynamicDocumentList doc, string custom, int i, bool b)
{
return custom + i + b;
}
public static string DynamicDocumentEnumerableMultiParam(this IEnumerable<DynamicDocument> doc, string custom, int i, bool b)
{
return custom + i + b;
}
}
}

View File

@@ -58,7 +58,10 @@
<Compile Include="BusinessLogic\ApplicationTreeTest.cs" />
<Compile Include="BusinessLogic\BaseTest.cs" />
<Compile Include="CacheRefresherFactoryTests.cs" />
<Compile Include="DynamicDocumentTests.cs" />
<Compile Include="DynamicDocument\DynamicDocumentCustomExtensionMethods.cs" />
<Compile Include="DynamicDocument\DynamicDocumentTests.cs" />
<Compile Include="DynamicDocument\DynamicDocumentTestsBase.cs" />
<Compile Include="DynamicDocument\DynamicNodeTests.cs" />
<Compile Include="PublishContentStoreTests.cs" />
<Compile Include="DataTypeFactoryTests.cs" />
<Compile Include="DocumentLookups\BaseRoutingTest.cs" />
@@ -151,6 +154,7 @@
<Name>Umbraco.Web</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>xcopy "$(ProjectDir)"..\..\lib\SQLCE4\amd64\*.* "$(TargetDir)amd64\" /Y /F /E /D

View File

@@ -55,10 +55,17 @@
function xsltVisualize() {
xsltSnippet = UmbEditor.GetSelection();
if (xsltSnippet == '')
UmbEditor.GetCode()
xsltSnippet = UmbEditor.IsSimpleEditor
? jQuery("#<%= editorSource.ClientID %>").getSelection().text
: UmbEditor._editor.selection();
if (xsltSnippet == '') {
xsltSnippet = UmbEditor.IsSimpleEditor
? jQuery("#<%= editorSource.ClientID %>").val()
: UmbEditor.GetCode();
// alert('Please select the xslt to visualize');
}
UmbClientMgr.openModalWindow('<%= umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) %>/developer/xslt/xsltVisualize.aspx', 'Visualize XSLT', true, 550, 650);
}

View File

@@ -5,6 +5,7 @@ using System.Linq;
using System.Threading;
using System.Web;
using Umbraco.Core;
using Umbraco.Core.Logging;
using umbraco.interfaces;
using System.Collections;
using System.Reflection;
@@ -452,7 +453,6 @@ namespace umbraco.MacroEngines
var foundTypes = new Dictionary<System.Tuple<Guid, int>, Type>();
HttpContext.Current.Trace.Write("RazorDataTypeModelTypes cache is empty, populating cache using PluginTypeResolver...");
try
{
PluginManager.Current.ResolveRazorDataTypeModels()
@@ -477,13 +477,14 @@ namespace umbraco.MacroEngines
foundTypes.Add(key, item.Value);
}
});
HttpContext.Current.Trace.Write(string.Format("{0} items added to cache...", foundTypes.Count));
var i = 1;
foreach (var item in foundTypes)
{
HttpContext.Current.Trace.Write(string.Format("{0}/{1}: {2}@{4} => {3}", i, foundTypes.Count, item.Key.Item1, item.Value.FullName, item.Key.Item2));
i++;
}
//NOTE: We really dont need to log this?
//var i = 1;
//foreach (var item in foundTypes)
//{
// HttpContext.Current.Trace.Write(string.Format("{0}/{1}: {2}@{4} => {3}", i, foundTypes.Count, item.Key.Item1, item.Value.FullName, item.Key.Item2));
// i++;
//}
//there is no error, so set the collection
_razorDataTypeModelTypes = foundTypes;
@@ -491,8 +492,8 @@ namespace umbraco.MacroEngines
}
catch (Exception ex)
{
HttpContext.Current.Trace.Warn("Exception occurred while populating cache, will keep RazorDataTypeModelTypes to null so that this error remains visible and you don't end up with an empty cache with silent failure.");
HttpContext.Current.Trace.Warn(string.Format("The exception was {0} and the message was {1}. {2}", ex.GetType().FullName, ex.Message, ex.StackTrace));
LogHelper.Warn<DynamicNode>("Exception occurred while populating cache, will keep RazorDataTypeModelTypes to null so that this error remains visible and you don't end up with an empty cache with silent failure."
+ string.Format("The exception was {0} and the message was {1}. {2}", ex.GetType().FullName, ex.Message, ex.StackTrace));
}
}
@@ -541,18 +542,14 @@ namespace umbraco.MacroEngines
//contextAlias is the node which the property data was returned from
Guid dataType = ContentType.GetDataType(data.ContextAlias, data.Alias);
HttpContext.Current.Trace.Write(string.Format("RazorDynamicNode got datatype {0} for {1} on {2}", dataType, data.Alias, data.ContextAlias));
HttpContext.Current.Trace.Write(string.Format("Checking for a RazorDataTypeModel for data type guid {0}...", dataType));
HttpContext.Current.Trace.Write("Checking the RazorDataTypeModelTypes static mappings to see if there is a static mapping...");
var staticMapping = UmbracoSettings.RazorDataTypeModelStaticMapping.FirstOrDefault(mapping =>
{
return mapping.Applies(dataType, data.ContextAlias, data.Alias);
});
if (staticMapping != null)
{
HttpContext.Current.Trace.Write(string.Format("Found a staticMapping defined {0}, instantiating type and attempting to apply model...", staticMapping.Raw));
Type dataTypeType = Type.GetType(staticMapping.TypeName);
if (dataTypeType != null)
{
@@ -564,21 +561,15 @@ namespace umbraco.MacroEngines
}
else
{
HttpContext.Current.Trace.Write("Failed");
HttpContext.Current.Trace.Warn(string.Format("Failed to create the instance of the model binder"));
LogHelper.Warn<DynamicNode>(string.Format("Failed to create the instance of the model binder"));
}
}
else
{
HttpContext.Current.Trace.Warn(string.Format("staticMapping type name {0} came back as null from Type.GetType; check the casing, assembly presence, assembly framework version, namespace", staticMapping.TypeName));
LogHelper.Warn<DynamicNode>(string.Format("staticMapping type name {0} came back as null from Type.GetType; check the casing, assembly presence, assembly framework version, namespace", staticMapping.TypeName));
}
}
else
{
HttpContext.Current.Trace.Write(string.Format("There isn't a staticMapping defined so checking the RazorDataTypeModelTypes cache..."));
}
if (RazorDataTypeModelTypes != null && RazorDataTypeModelTypes.Any(model => model.Key.Item1 == dataType) && dataType != Guid.Empty)
{
var razorDataTypeModelDefinition = RazorDataTypeModelTypes.Where(model => model.Key.Item1 == dataType).OrderByDescending(model => model.Key.Item2).FirstOrDefault();
@@ -593,26 +584,25 @@ namespace umbraco.MacroEngines
}
else
{
HttpContext.Current.Trace.Write("Failed");
HttpContext.Current.Trace.Warn(string.Format("Failed to create the instance of the model binder"));
LogHelper.Warn<DynamicNode>(string.Format("Failed to create the instance of the model binder"));
}
}
else
{
HttpContext.Current.Trace.Write("Failed");
HttpContext.Current.Trace.Warn(string.Format("Could not get the dataTypeType for the RazorDataTypeModel"));
LogHelper.Warn<DynamicNode>(string.Format("Could not get the dataTypeType for the RazorDataTypeModel"));
}
}
else
{
if (RazorDataTypeModelTypes == null)
{
HttpContext.Current.Trace.Write(string.Format("RazorDataTypeModelTypes is null, probably an exception while building the cache, falling back to ConvertPropertyValueByDataType", dataType));
}
else
{
HttpContext.Current.Trace.Write(string.Format("GUID {0} does not have a DataTypeModel, falling back to ConvertPropertyValueByDataType", dataType));
}
//NOTE: Do we really want to log this? I'm not sure.
//if (RazorDataTypeModelTypes == null)
//{
// HttpContext.Current.Trace.Write(string.Format("RazorDataTypeModelTypes is null, probably an exception while building the cache, falling back to ConvertPropertyValueByDataType", dataType));
//}
//else
//{
// HttpContext.Current.Trace.Write(string.Format("GUID {0} does not have a DataTypeModel, falling back to ConvertPropertyValueByDataType", dataType));
//}
}
@@ -678,43 +668,30 @@ namespace umbraco.MacroEngines
}
private bool TryCreateInstanceRazorDataTypeModel(Guid dataType, Type dataTypeType, string value, out object result)
{
HttpContext.Current.Trace.Write(string.Format("Found dataType {0} for GUID {1}", dataTypeType.FullName, dataType));
IRazorDataTypeModel razorDataTypeModel = Activator.CreateInstance(dataTypeType, false) as IRazorDataTypeModel;
HttpContext.Current.Trace.Write(string.Format("Instantiating {0}...", dataTypeType.FullName));
if (razorDataTypeModel != null)
{
HttpContext.Current.Trace.Write("Success");
object instance = null;
HttpContext.Current.Trace.Write("Calling Init on razorDataTypeModel");
if (razorDataTypeModel.Init(n.Id, value, out instance))
{
if (instance != null)
if (instance == null)
{
HttpContext.Current.Trace.Write(string.Format("razorDataTypeModel successfully instantiated and returned a valid instance of type {0}", instance.GetType().FullName));
LogHelper.Warn<DynamicNode>("razorDataTypeModel successfully instantiated but returned null for instance");
}
else
{
HttpContext.Current.Trace.Warn("razorDataTypeModel successfully instantiated but returned null for instance");
}
result = instance;
result = instance;
return true;
}
else
{
if (instance != null)
if (instance == null)
{
HttpContext.Current.Trace.Write(string.Format("razorDataTypeModel returned false but returned a valid instance of type {0}", instance.GetType().FullName));
}
else
{
HttpContext.Current.Trace.Warn("razorDataTypeModel successfully instantiated but returned null for instance");
LogHelper.Warn<DynamicNode>("razorDataTypeModel successfully instantiated but returned null for instance");
}
}
}
else
{
HttpContext.Current.Trace.Write("Failed");
HttpContext.Current.Trace.Warn(string.Format("DataTypeModel {0} failed to instantiate, perhaps it is lacking a parameterless constructor or doesn't implement IRazorDataTypeModel?", dataTypeType.FullName));
LogHelper.Warn<DynamicNode>(string.Format("DataTypeModel {0} failed to instantiate, perhaps it is lacking a parameterless constructor or doesn't implement IRazorDataTypeModel?", dataTypeType.FullName));
}
result = null;
return false;
@@ -1335,9 +1312,13 @@ namespace umbraco.MacroEngines
get { if (n == null) return null; return n.PropertiesAsList; }
}
public List<DynamicBackingItem> ChildrenAsList
public DynamicNodeList ChildrenAsList
{
get { if (n == null) return null; return n.ChildrenAsList; }
get
{
return GetChildrenAsList;
//if (n == null) return null; return n.ChildrenAsList;
}
}
public IProperty GetProperty(string alias)
@@ -1438,7 +1419,7 @@ namespace umbraco.MacroEngines
{
if (this.ownerList == null && this.Parent != null)
{
var list = this.Parent.ChildrenAsList.ConvertAll(n => new DynamicNode(n));
var list = this.Parent.ChildrenAsList.Select(n => new DynamicNode(n));
this.ownerList = new DynamicNodeList(list);
}
if (this.ownerList != null)

View File

@@ -12,7 +12,7 @@ using System.Linq.Expressions;
using System.Linq.Dynamic;
namespace umbraco.MacroEngines
{
public class DynamicNodeList : DynamicObject, IEnumerable
public class DynamicNodeList : DynamicObject, IEnumerable<DynamicNode>
{
public List<DynamicNode> Items;
public List<DynamicNode> get_Items()
@@ -403,10 +403,15 @@ namespace umbraco.MacroEngines
return result;
}
public IEnumerator GetEnumerator()
{
return Items.GetEnumerator();
}
public IEnumerator<DynamicNode> GetEnumerator()
{
return Items.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IQueryable<T> Where<T>(string predicate, params object[] values)
{

View File

@@ -80,8 +80,9 @@ namespace umbraco.MacroEngines
{
if (context.ownerList == null && context.Parent != null)
{
var list = context.Parent.ChildrenAsList.ConvertAll(n => new DynamicNode(n));
context.ownerList = new DynamicNodeList(list);
//var list = context.Parent.ChildrenAsList.Select(n => new DynamicNode(n));
//context.ownerList = new DynamicNodeList(list);
context.ownerList = context.Parent.ChildrenAsList;
}
if (context.ownerList != null)
{
@@ -105,7 +106,7 @@ namespace umbraco.MacroEngines
{
if (context.ownerList == null && context.Parent != null)
{
var list = context.Parent.ChildrenAsList.ConvertAll(n => new DynamicNode(n));
var list = context.Parent.ChildrenAsList.Select(n => new DynamicNode(n));
context.ownerList = new DynamicNodeList(list);
}
if (context.ownerList != null)
@@ -130,7 +131,7 @@ namespace umbraco.MacroEngines
{
if (context.ownerList == null && context.Parent != null)
{
var list = context.Parent.ChildrenAsList.ConvertAll(n => new DynamicNode(n));
var list = context.Parent.ChildrenAsList.Select(n => new DynamicNode(n));
context.ownerList = new DynamicNodeList(list);
}
if (context.ownerList != null)
@@ -169,7 +170,7 @@ namespace umbraco.MacroEngines
{
if (context.ownerList == null && context.Parent != null)
{
var list = context.Parent.ChildrenAsList.ConvertAll(n => new DynamicNode(n));
var list = context.Parent.ChildrenAsList.Select(n => new DynamicNode(n));
context.ownerList = new DynamicNodeList(list);
}
if (context.ownerList != null)
@@ -203,8 +204,9 @@ namespace umbraco.MacroEngines
{
if (context.ownerList == null && context.Parent != null)
{
var list = context.Parent.ChildrenAsList.ConvertAll(n => new DynamicNode(n));
context.ownerList = new DynamicNodeList(list);
//var list = context.Parent.ChildrenAsList.Select(n => new DynamicNode(n));
//context.ownerList = new DynamicNodeList(list);
context.ownerList = context.Parent.ChildrenAsList;
}
if (context.ownerList != null)
{
@@ -228,7 +230,7 @@ namespace umbraco.MacroEngines
{
if (context.ownerList == null && context.Parent != null)
{
var list = context.Parent.ChildrenAsList.ConvertAll(n => new DynamicNode(n));
var list = context.Parent.ChildrenAsList.Select(n => new DynamicNode(n));
context.ownerList = new DynamicNodeList(list);
}
if (context.ownerList != null)