using System; using System.Collections.Generic; using System.Linq; using System.Web; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; using Umbraco.Tests.TestHelpers; using Umbraco.Web; namespace Umbraco.Tests.PublishedContent { /// /// Tests the methods on IPublishedContent using the DefaultPublishedContentStore /// [TestFixture] public class PublishedContentTests : PublishedContentTestBase { protected override DatabaseBehavior DatabaseTestBehavior { get { return DatabaseBehavior.NoDatabasePerFixture; } } private PluginManager _pluginManager; public override void Initialize() { // required so we can access property.Value //PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver(); base.Initialize(); // this is so the model factory looks into the test assembly _pluginManager = PluginManager.Current; PluginManager.Current = new PluginManager(false) { AssembliesToScan = _pluginManager.AssembliesToScan .Union(new[] { typeof(PublishedContentTests).Assembly }) }; ApplicationContext.Current = new ApplicationContext(false) { IsReady = true }; // need to specify a custom callback for unit tests // AutoPublishedContentTypes generates properties automatically // when they are requested, but we must declare those that we // explicitely want to be here... var propertyTypes = new[] { // AutoPublishedContentType will auto-generate other properties new PublishedPropertyType("umbracoNaviHide", 0, Guid.Parse(Constants.PropertyEditors.TrueFalse)), new PublishedPropertyType("selectedNodes", 0, Guid.Empty), new PublishedPropertyType("umbracoUrlAlias", 0, Guid.Empty), new PublishedPropertyType("content", 0, Guid.Parse(Constants.PropertyEditors.TinyMCEv3)), new PublishedPropertyType("testRecursive", 0, Guid.Empty), }; var type = new AutoPublishedContentType(0, "anything", propertyTypes); PublishedContentType.GetPublishedContentTypeCallback = (alias) => type; } public override void TearDown() { PluginManager.Current = _pluginManager; ApplicationContext.Current.DisposeIfDisposable(); ApplicationContext.Current = null; } protected override void FreezeResolution() { PublishedContentModelFactoryResolver.Current = new PublishedContentModelFactoryResolver( new PublishedContentModelFactoryImpl()); base.FreezeResolution(); } protected override string GetXmlContent(int templateId) { return @" ]> 1 This is some content]]> 1 "; } internal IPublishedContent GetNode(int id) { var ctx = GetUmbracoContext("/test", 1234); var doc = ctx.ContentCache.GetById(id); Assert.IsNotNull(doc); return doc; } [Test] [Ignore("IPublishedContent currently (6.1 as of april 25, 2013) has bugs")] public void Fails() { var content = GetNode(1173); var c1 = content.Children.First(x => x.Id == 1177); Assert.IsFalse(c1.IsFirst()); var c2 = content.Children.Where(x => x.DocumentTypeAlias == "CustomDocument").First(x => x.Id == 1177); Assert.IsTrue(c2.IsFirst()); // First is not implemented var c2a = content.Children.First(x => x.DocumentTypeAlias == "CustomDocument" && x.Id == 1177); Assert.IsTrue(c2a.IsFirst()); // so here it's luck c1 = content.Children.First(x => x.Id == 1177); Assert.IsFalse(c1.IsFirst()); // and here it fails // but even using supported (where) method... // do not replace by First(x => ...) here since it's not supported at the moment c1 = content.Children.Where(x => x.Id == 1177).First(); c2 = content.Children.Where(x => x.DocumentTypeAlias == "CustomDocument" && x.Id == 1177).First(); Assert.IsFalse(c1.IsFirst()); // here it fails because c2 has corrupted it // so there's only 1 IPublishedContent instance // which keeps changing collection, ie being modified // which is *bad* from a cache point of vue // and from a consistency point of vue... // => we want clones! } [Test] public void Is_Last_From_Where_Filter_Dynamic_Linq() { var doc = GetNode(1173); var items = doc.Children.Where("Visible").ToContentSet(); foreach (var item in items) { if (item.Id != 1178) { Assert.IsFalse(item.IsLast()); } else { Assert.IsTrue(item.IsLast()); } } } [Test] public void Is_Last_From_Where_Filter() { var doc = GetNode(1173); var items = doc .Children .Where(x => x.IsVisible()) .ToContentSet(); Assert.AreEqual(3, items.Count()); foreach (var d in items) { switch (d.Id) { case 1174: Assert.IsTrue(d.IsFirst()); Assert.IsFalse(d.IsLast()); break; case 1177: Assert.IsFalse(d.IsFirst()); Assert.IsFalse(d.IsLast()); break; case 1178: Assert.IsFalse(d.IsFirst()); Assert.IsTrue(d.IsLast()); break; default: Assert.Fail("Invalid id."); break; } } } [PublishedContentModel("Home")] public class Home : PublishedContentModel { public Home(IPublishedContent content) : base(content) {} } [Test] public void Is_Last_From_Where_Filter2() { var doc = GetNode(1173); var items = doc.Children .Select(PublishedContentModelFactory.CreateModel) // linq, returns IEnumerable // only way around this is to make sure every IEnumerable extension // explicitely returns a PublishedContentSet, not an IEnumerable .OfType() // ours, return IEnumerable (actually a PublishedContentSet) .Where(x => x.IsVisible()) // so, here it's linq again :-( .ToContentSet() // so, we need that one for the test to pass .ToArray(); Assert.AreEqual(1, items.Count()); foreach (var d in items) { switch (d.Id) { case 1174: Assert.IsTrue(d.IsFirst()); Assert.IsTrue(d.IsLast()); break; default: Assert.Fail("Invalid id."); break; } } } [Test] public void Is_Last_From_Take() { var doc = GetNode(1173); var items = doc.Children.Take(3).ToContentSet(); foreach (var item in items) { if (item.Id != 1178) { Assert.IsFalse(item.IsLast()); } else { Assert.IsTrue(item.IsLast()); } } } [Test] public void Is_Last_From_Skip() { var doc = GetNode(1173); foreach (var d in doc.Children.Skip(1)) { if (d.Id != 1176) { Assert.IsFalse(d.IsLast()); } else { Assert.IsTrue(d.IsLast()); } } } [Test] public void Is_Last_From_Concat() { var doc = GetNode(1173); var items = doc.Children .Concat(new[] { GetNode(1175), GetNode(4444) }) .ToContentSet(); foreach (var item in items) { if (item.Id != 4444) { Assert.IsFalse(item.IsLast()); } else { Assert.IsTrue(item.IsLast()); } } } [Test] public void Descendants_Ordered_Properly() { var doc = GetNode(1046); var currentLevel = 0; var lastSortOrder = 0; var levelChangesAt = new[] { 1046, 1173, 1174 }; foreach (var d in doc.DescendantsOrSelf()) { if (levelChangesAt.Contains(d.Id)) { Assert.Greater(d.Level, currentLevel); currentLevel = d.Level; } else { Assert.AreEqual(currentLevel, d.Level); Assert.Greater(d.SortOrder, lastSortOrder); } lastSortOrder = d.SortOrder; } } [Test] public void Test_Get_Recursive_Val() { var doc = GetNode(1174); var rVal = doc.GetRecursiveValue("testRecursive"); var nullVal = doc.GetRecursiveValue("DoNotFindThis"); Assert.AreEqual("This is the recursive val", rVal); Assert.AreEqual("", nullVal); } [Test] public void Get_Property_Value_Uses_Converter() { var doc = GetNode(1173); var propVal = doc.GetPropertyValue("content"); Assert.IsInstanceOf(typeof(IHtmlString), propVal); Assert.AreEqual("
This is some content
", propVal.ToString()); var propVal2 = doc.GetPropertyValue("content"); Assert.IsInstanceOf(typeof(IHtmlString), propVal2); Assert.AreEqual("
This is some content
", propVal2.ToString()); var propVal3 = doc.GetPropertyValue("Content"); Assert.IsInstanceOf(typeof(IHtmlString), propVal3); Assert.AreEqual("
This is some content
", propVal3.ToString()); } [Test] public void Complex_Linq() { var doc = GetNode(1173); var result = doc.Ancestors().OrderBy(x => x.Level) .Single() .Descendants() .FirstOrDefault(x => x.GetPropertyValue("selectedNodes", "").Split(',').Contains("1173")); Assert.IsNotNull(result); } [Test] public void Index() { var doc = GetNode(1173); Assert.AreEqual(0, doc.Index()); doc = GetNode(1176); Assert.AreEqual(3, doc.Index()); doc = GetNode(1177); Assert.AreEqual(1, doc.Index()); doc = GetNode(1178); Assert.AreEqual(2, doc.Index()); } [Test] public void Is_First() { var doc = GetNode(1046); //test root nodes Assert.IsTrue(doc.IsFirst()); doc = GetNode(1172); Assert.IsFalse(doc.IsFirst()); doc = GetNode(1173); //test normal nodes Assert.IsTrue(doc.IsFirst()); doc = GetNode(1175); Assert.IsFalse(doc.IsFirst()); } [Test] public void Is_Not_First() { var doc = GetNode(1046); //test root nodes Assert.IsFalse(doc.IsNotFirst()); doc = GetNode(1172); Assert.IsTrue(doc.IsNotFirst()); doc = GetNode(1173); //test normal nodes Assert.IsFalse(doc.IsNotFirst()); doc = GetNode(1175); Assert.IsTrue(doc.IsNotFirst()); } [Test] public void Is_Position() { var doc = GetNode(1046); //test root nodes Assert.IsTrue(doc.IsPosition(0)); doc = GetNode(1172); Assert.IsTrue(doc.IsPosition(1)); doc = GetNode(1173); //test normal nodes Assert.IsTrue(doc.IsPosition(0)); doc = GetNode(1175); Assert.IsTrue(doc.IsPosition(1)); } [Test] public void Children_GroupBy_DocumentTypeAlias() { var doc = GetNode(1046); var found1 = doc.Children.GroupBy("DocumentTypeAlias"); Assert.AreEqual(2, found1.Count()); Assert.AreEqual(2, found1.Single(x => x.Key.ToString() == "Home").Count()); Assert.AreEqual(1, found1.Single(x => x.Key.ToString() == "CustomDocument").Count()); } [Test] public void Children_Where_DocumentTypeAlias() { var doc = GetNode(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_Order_By_Update_Date() { var doc = GetNode(1173); var ordered = doc.Children.OrderBy("UpdateDate"); var correctOrder = new[] { 1178, 1177, 1174, 1176 }; for (var i = 0; i < correctOrder.Length; i++) { Assert.AreEqual(correctOrder[i], ordered.ElementAt(i).Id); } } [Test] public void HasProperty() { var doc = GetNode(1173); var hasProp = doc.HasProperty(Constants.Conventions.Content.UrlAlias); Assert.AreEqual(true, (bool)hasProp); } [Test] public void HasValue() { var doc = GetNode(1173); var hasValue = doc.HasValue(Constants.Conventions.Content.UrlAlias); var noValue = doc.HasValue("blahblahblah"); Assert.IsTrue(hasValue); Assert.IsFalse(noValue); } [Test] public void Ancestors_Where_Visible() { var doc = GetNode(1174); var whereVisible = doc.Ancestors().Where("Visible"); Assert.AreEqual(1, whereVisible.Count()); } [Test] public void Visible() { var hidden = GetNode(1046); var visible = GetNode(1173); Assert.IsFalse(hidden.IsVisible()); Assert.IsTrue(visible.IsVisible()); } [Test] public void Ancestor_Or_Self() { var doc = GetNode(1173); var result = doc.AncestorOrSelf(); Assert.IsNotNull(result); Assert.AreEqual((int)1046, (int)result.Id); } [Test] public void Ancestors_Or_Self() { var doc = GetNode(1174); var result = doc.AncestorsOrSelf(); Assert.IsNotNull(result); Assert.AreEqual(3, result.Count()); Assert.IsTrue(result.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1174, 1173, 1046 })); } [Test] public void Ancestors() { var doc = GetNode(1174); var result = doc.Ancestors(); Assert.IsNotNull(result); Assert.AreEqual(2, result.Count()); Assert.IsTrue(result.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1173, 1046 })); } [Test] public void Descendants_Or_Self() { var doc = GetNode(1046); var result = doc.DescendantsOrSelf(); Assert.IsNotNull(result); Assert.AreEqual(8, result.Count()); Assert.IsTrue(result.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1046, 1173, 1174, 1176, 1175 })); } [Test] public void Descendants() { var doc = GetNode(1046); var result = doc.Descendants(); Assert.IsNotNull(result); Assert.AreEqual(7, result.Count()); Assert.IsTrue(result.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1173, 1174, 1176, 1175, 4444 })); } [Test] public void Up() { var doc = GetNode(1173); var result = doc.Up(); Assert.IsNotNull(result); Assert.AreEqual((int)1046, (int)result.Id); } [Test] public void Down() { var doc = GetNode(1173); var result = doc.Down(); Assert.IsNotNull(result); Assert.AreEqual((int)1174, (int)result.Id); } [Test] public void Next() { var doc = GetNode(1173); var result = doc.Next(); Assert.IsNotNull(result); Assert.AreEqual((int)1175, (int)result.Id); } [Test] public void Next_Without_Sibling() { var doc = GetNode(1176); Assert.IsNull(doc.Next()); } [Test] public void Previous_Without_Sibling() { var doc = GetNode(1173); Assert.IsNull(doc.Previous()); } [Test] public void Previous() { var doc = GetNode(1176); var result = doc.Previous(); Assert.IsNotNull(result); Assert.AreEqual((int)1178, (int)result.Id); } } }