using System; using System.Collections.Generic; using System.Linq; using Moq; using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.PublishedCache; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.PublishedCache; using Umbraco.Cms.Tests.Common.Published; using Umbraco.Cms.Tests.UnitTests.TestHelpers; using Umbraco.Extensions; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.PublishedCache { [TestFixture] public class PublishedContentTests : PublishedSnapshotServiceTestBase { private readonly Guid _node1173Guid = Guid.NewGuid(); private PublishedModelFactory _publishedModelFactory; private DataType[] _dataTypes; [SetUp] public override void Setup() { base.Setup(); string xml = PublishedContentXml.PublishedContentTestXml(1234, _node1173Guid); IEnumerable kits = PublishedContentXmlAdapter.GetContentNodeKits( xml, TestHelper.ShortStringHelper, out ContentType[] contentTypes, out DataType[] dataTypes).ToList(); _dataTypes = dataTypes; // configure the Home content type to be composed of another for tests. var compositionType = new ContentType(TestHelper.ShortStringHelper, -1) { Alias = "MyCompositionAlias" }; contentTypes.First(x => x.Alias == "Home").AddContentType(compositionType); InitializedCache(kits, contentTypes, dataTypes: dataTypes); } // override to specify our own factory with custom types protected override IPublishedModelFactory PublishedModelFactory => _publishedModelFactory ??= new PublishedModelFactory( new[] { typeof(Home), typeof(Anything), typeof(CustomDocument) }, PublishedValueFallback); [PublishedModel("Home")] internal class Home : PublishedContentModel { public Home(IPublishedContent content, IPublishedValueFallback fallback) : base(content, fallback) { } public bool UmbracoNaviHide => this.Value(Mock.Of(), "umbracoNaviHide"); } [PublishedModel("anything")] internal class Anything : PublishedContentModel { public Anything(IPublishedContent content, IPublishedValueFallback fallback) : base(content, fallback) { } } [PublishedModel("CustomDocument")] internal class CustomDocument : PublishedContentModel { public CustomDocument(IPublishedContent content, IPublishedValueFallback fallback) : base(content, fallback) { } } [Test] public void GetNodeByIds() { var snapshot = GetPublishedSnapshot(); var contentById = snapshot.Content.GetById(1173); Assert.IsNotNull(contentById); var contentByGuid = snapshot.Content.GetById(_node1173Guid); Assert.IsNotNull(contentByGuid); Assert.AreEqual(contentById.Id, contentByGuid.Id); Assert.AreEqual(contentById.Key, contentByGuid.Key); contentById = snapshot.Content.GetById(666); Assert.IsNull(contentById); contentByGuid = snapshot.Content.GetById(Guid.NewGuid()); Assert.IsNull(contentByGuid); } [Test] public void Is_Last_From_Where_Filter_Dynamic_Linq() { var doc = GetContent(1173); var items = doc.Children(VariationContextAccessor).Where(x => x.IsVisible(Mock.Of())).ToIndexedArray(); foreach (var item in items) { if (item.Content.Id != 1178) { Assert.IsFalse(item.IsLast(), $"The item {item.Content.Id} is last"); } else { Assert.IsTrue(item.IsLast(), $"The item {item.Content.Id} is not last"); } } } [Test] public void Is_Last_From_Where_Filter() { var doc = GetContent(1173); var items = doc .Children(VariationContextAccessor) .Where(x => x.IsVisible(Mock.Of())) .ToIndexedArray(); Assert.AreEqual(4, items.Length); foreach (var d in items) { switch (d.Content.Id) { case 1174: Assert.IsTrue(d.IsFirst()); Assert.IsFalse(d.IsLast()); break; case 117: Assert.IsFalse(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; } } } [Test] public void Is_Last_From_Where_Filter2() { var doc = GetContent(1173); var ct = doc.ContentType; var items = doc.Children(VariationContextAccessor) .Select(x => x.CreateModel(PublishedModelFactory)) // 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(Mock.Of())) // so, here it's linq again :-( .ToIndexedArray(); // so, we need that one for the test to pass Assert.AreEqual(1, items.Length); foreach (var d in items) { switch (d.Content.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 = GetContent(1173); var items = doc.Children(VariationContextAccessor).Take(4).ToIndexedArray(); foreach (var item in items) { if (item.Content.Id != 1178) { Assert.IsFalse(item.IsLast()); } else { Assert.IsTrue(item.IsLast()); } } } [Test] public void Is_Last_From_Skip() { var doc = GetContent(1173); foreach (var d in doc.Children(VariationContextAccessor).Skip(1).ToIndexedArray()) { if (d.Content.Id != 1176) { Assert.IsFalse(d.IsLast()); } else { Assert.IsTrue(d.IsLast()); } } } [Test] public void Is_Last_From_Concat() { var doc = GetContent(1173); var items = doc.Children(VariationContextAccessor) .Concat(new[] { GetContent(1175), GetContent(4444) }) .ToIndexedArray(); foreach (var item in items) { if (item.Content.Id != 4444) { Assert.IsFalse(item.IsLast()); } else { Assert.IsTrue(item.IsLast()); } } } [Test] public void Descendants_Ordered_Properly() { var doc = GetContent(1046); var expected = new[] { 1046, 1173, 1174, 117, 1177, 1178, 1179, 1176, 1175, 4444, 1172 }; var exindex = 0; // must respect the XPath descendants-or-self axis! foreach (var d in doc.DescendantsOrSelf(Mock.Of())) { Assert.AreEqual(expected[exindex++], d.Id); } } [Test] public void Get_Property_Value_Recursive() { // TODO: We need to use a different fallback? var doc = GetContent(1174); var rVal = doc.Value(PublishedValueFallback, "testRecursive", fallback: Fallback.ToAncestors); var nullVal = doc.Value(PublishedValueFallback, "DoNotFindThis", fallback: Fallback.ToAncestors); Assert.AreEqual("This is the recursive val", rVal); Assert.AreEqual(null, nullVal); } [Test] public void Get_Property_Value_Uses_Converter() { var doc = GetContent(1173); var propVal = doc.Value(PublishedValueFallback, "content"); Assert.IsInstanceOf(typeof(IHtmlEncodedString), propVal); Assert.AreEqual("
This is some content
", propVal.ToString()); var propVal2 = doc.Value(PublishedValueFallback, "content"); Assert.IsInstanceOf(typeof(IHtmlEncodedString), propVal2); Assert.AreEqual("
This is some content
", propVal2.ToString()); var propVal3 = doc.Value(PublishedValueFallback, "Content"); Assert.IsInstanceOf(typeof(IHtmlEncodedString), propVal3); Assert.AreEqual("
This is some content
", propVal3.ToString()); } [Test] public void Complex_Linq() { var doc = GetContent(1173); var result = doc.Ancestors().OrderBy(x => x.Level) .Single() .Descendants(Mock.Of()) .FirstOrDefault(x => x.Value(PublishedValueFallback, "selectedNodes", fallback: Fallback.ToDefaultValue, defaultValue: "").Split(',').Contains("1173")); Assert.IsNotNull(result); } [Test] public void Children_GroupBy_DocumentTypeAlias() { //var home = new AutoPublishedContentType(Guid.NewGuid(), 22, "Home", new PublishedPropertyType[] { }); //var custom = new AutoPublishedContentType(Guid.NewGuid(), 23, "CustomDocument", new PublishedPropertyType[] { }); //var contentTypes = new Dictionary //{ // { home.Alias, home }, // { custom.Alias, custom } //}; //ContentTypesCache.GetPublishedContentTypeByAlias = alias => contentTypes[alias]; var doc = GetContent(1046); var found1 = doc.Children(VariationContextAccessor).GroupBy(x => x.ContentType.Alias).ToArray(); Assert.AreEqual(2, found1.Length); 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 home = new AutoPublishedContentType(Guid.NewGuid(), 22, "Home", new PublishedPropertyType[] { }); //var custom = new AutoPublishedContentType(Guid.NewGuid(), 23, "CustomDocument", new PublishedPropertyType[] { }); //var contentTypes = new Dictionary //{ // { home.Alias, home }, // { custom.Alias, custom } //}; //ContentTypesCache.GetPublishedContentTypeByAlias = alias => contentTypes[alias]; var doc = GetContent(1046); var found1 = doc.Children(VariationContextAccessor).Where(x => x.ContentType.Alias == "CustomDocument"); var found2 = doc.Children(VariationContextAccessor).Where(x => x.ContentType.Alias == "Home"); Assert.AreEqual(1, found1.Count()); Assert.AreEqual(2, found2.Count()); } [Test] public void Children_Order_By_Update_Date() { var doc = GetContent(1173); var ordered = doc.Children(VariationContextAccessor).OrderBy(x => x.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 FirstChild() { var doc = GetContent(1173); // has child nodes Assert.IsNotNull(doc.FirstChild(Mock.Of())); Assert.IsNotNull(doc.FirstChild(Mock.Of(), x => true)); Assert.IsNotNull(doc.FirstChild(Mock.Of())); doc = GetContent(1175); // does not have child nodes Assert.IsNull(doc.FirstChild(Mock.Of())); Assert.IsNull(doc.FirstChild(Mock.Of(), x => true)); Assert.IsNull(doc.FirstChild(Mock.Of())); } [Test] public void FirstChildAsT() { var doc = GetContent(1046); // has child nodes var model = doc.FirstChild(Mock.Of(), x => true); // predicate Assert.IsNotNull(model); Assert.IsTrue(model.Id == 1173); Assert.IsInstanceOf(model); Assert.IsInstanceOf(model); doc = GetContent(1175); // does not have child nodes Assert.IsNull(doc.FirstChild(Mock.Of())); Assert.IsNull(doc.FirstChild(Mock.Of(), x => true)); } [Test] public void IsComposedOf() { var doc = GetContent(1173); var isComposedOf = doc.IsComposedOf("MyCompositionAlias"); Assert.IsTrue(isComposedOf); } [Test] public void HasProperty() { var doc = GetContent(1173); var hasProp = doc.HasProperty(Constants.Conventions.Content.UrlAlias); Assert.IsTrue(hasProp); } [Test] public void HasValue() { var doc = GetContent(1173); var hasValue = doc.HasValue(Mock.Of(), Constants.Conventions.Content.UrlAlias); var noValue = doc.HasValue(Mock.Of(), "blahblahblah"); Assert.IsTrue(hasValue); Assert.IsFalse(noValue); } [Test] public void Ancestors_Where_Visible() { var doc = GetContent(1174); var whereVisible = doc.Ancestors().Where(x => x.IsVisible(Mock.Of())); Assert.AreEqual(1, whereVisible.Count()); } [Test] public void Visible() { var hidden = GetContent(1046); var visible = GetContent(1173); Assert.IsFalse(hidden.IsVisible(Mock.Of())); Assert.IsTrue(visible.IsVisible(Mock.Of())); } [Test] public void Ancestor_Or_Self() { var doc = GetContent(1173); var result = doc.AncestorOrSelf(); Assert.IsNotNull(result); // ancestor-or-self has to be self! Assert.AreEqual(1173, result.Id); } [Test] public void U4_4559() { var doc = GetContent(1174); var result = doc.AncestorOrSelf(1); Assert.IsNotNull(result); Assert.AreEqual(1046, result.Id); } [Test] public void Ancestors_Or_Self() { var doc = GetContent(1174); var result = doc.AncestorsOrSelf().ToArray(); Assert.IsNotNull(result); Assert.AreEqual(3, result.Length); Assert.IsTrue(result.Select(x => x.Id).ContainsAll(new [] { 1174, 1173, 1046 })); } [Test] public void Ancestors() { var doc = GetContent(1174); var result = doc.Ancestors().ToArray(); Assert.IsNotNull(result); Assert.AreEqual(2, result.Length); Assert.IsTrue(result.Select(x => x.Id).ContainsAll(new [] { 1173, 1046 })); } [Test] public void IsAncestor() { // Structure: // - Root : 1046 (no parent) // -- Home: 1173 (parent 1046) // -- Custom Doc: 1178 (parent 1173) // --- Custom Doc2: 1179 (parent: 1178) // -- Custom Doc4: 117 (parent 1173) // - Custom Doc3: 1172 (no parent) var home = GetContent(1173); var root = GetContent(1046); var customDoc = GetContent(1178); var customDoc2 = GetContent(1179); var customDoc3 = GetContent(1172); var customDoc4 = GetContent(117); Assert.IsTrue(root.IsAncestor(customDoc4)); Assert.IsFalse(root.IsAncestor(customDoc3)); Assert.IsTrue(root.IsAncestor(customDoc2)); Assert.IsTrue(root.IsAncestor(customDoc)); Assert.IsTrue(root.IsAncestor(home)); Assert.IsFalse(root.IsAncestor(root)); Assert.IsTrue(home.IsAncestor(customDoc4)); Assert.IsFalse(home.IsAncestor(customDoc3)); Assert.IsTrue(home.IsAncestor(customDoc2)); Assert.IsTrue(home.IsAncestor(customDoc)); Assert.IsFalse(home.IsAncestor(home)); Assert.IsFalse(home.IsAncestor(root)); Assert.IsFalse(customDoc.IsAncestor(customDoc4)); Assert.IsFalse(customDoc.IsAncestor(customDoc3)); Assert.IsTrue(customDoc.IsAncestor(customDoc2)); Assert.IsFalse(customDoc.IsAncestor(customDoc)); Assert.IsFalse(customDoc.IsAncestor(home)); Assert.IsFalse(customDoc.IsAncestor(root)); Assert.IsFalse(customDoc2.IsAncestor(customDoc4)); Assert.IsFalse(customDoc2.IsAncestor(customDoc3)); Assert.IsFalse(customDoc2.IsAncestor(customDoc2)); Assert.IsFalse(customDoc2.IsAncestor(customDoc)); Assert.IsFalse(customDoc2.IsAncestor(home)); Assert.IsFalse(customDoc2.IsAncestor(root)); Assert.IsFalse(customDoc3.IsAncestor(customDoc3)); } [Test] public void IsAncestorOrSelf() { // Structure: // - Root : 1046 (no parent) // -- Home: 1173 (parent 1046) // -- Custom Doc: 1178 (parent 1173) // --- Custom Doc2: 1179 (parent: 1178) // -- Custom Doc4: 117 (parent 1173) // - Custom Doc3: 1172 (no parent) var home = GetContent(1173); var root = GetContent(1046); var customDoc = GetContent(1178); var customDoc2 = GetContent(1179); var customDoc3 = GetContent(1172); var customDoc4 = GetContent(117); Assert.IsTrue(root.IsAncestorOrSelf(customDoc4)); Assert.IsFalse(root.IsAncestorOrSelf(customDoc3)); Assert.IsTrue(root.IsAncestorOrSelf(customDoc2)); Assert.IsTrue(root.IsAncestorOrSelf(customDoc)); Assert.IsTrue(root.IsAncestorOrSelf(home)); Assert.IsTrue(root.IsAncestorOrSelf(root)); Assert.IsTrue(home.IsAncestorOrSelf(customDoc4)); Assert.IsFalse(home.IsAncestorOrSelf(customDoc3)); Assert.IsTrue(home.IsAncestorOrSelf(customDoc2)); Assert.IsTrue(home.IsAncestorOrSelf(customDoc)); Assert.IsTrue(home.IsAncestorOrSelf(home)); Assert.IsFalse(home.IsAncestorOrSelf(root)); Assert.IsFalse(customDoc.IsAncestorOrSelf(customDoc4)); Assert.IsFalse(customDoc.IsAncestorOrSelf(customDoc3)); Assert.IsTrue(customDoc.IsAncestorOrSelf(customDoc2)); Assert.IsTrue(customDoc.IsAncestorOrSelf(customDoc)); Assert.IsFalse(customDoc.IsAncestorOrSelf(home)); Assert.IsFalse(customDoc.IsAncestorOrSelf(root)); Assert.IsFalse(customDoc2.IsAncestorOrSelf(customDoc4)); Assert.IsFalse(customDoc2.IsAncestorOrSelf(customDoc3)); Assert.IsTrue(customDoc2.IsAncestorOrSelf(customDoc2)); Assert.IsFalse(customDoc2.IsAncestorOrSelf(customDoc)); Assert.IsFalse(customDoc2.IsAncestorOrSelf(home)); Assert.IsFalse(customDoc2.IsAncestorOrSelf(root)); Assert.IsTrue(customDoc4.IsAncestorOrSelf(customDoc4)); Assert.IsTrue(customDoc3.IsAncestorOrSelf(customDoc3)); } [Test] public void Descendants_Or_Self() { var doc = GetContent(1046); var result = doc.DescendantsOrSelf(Mock.Of()).ToArray(); Assert.IsNotNull(result); Assert.AreEqual(10, result.Count()); Assert.IsTrue(result.Select(x => x.Id).ContainsAll(new [] { 1046, 1173, 1174, 1176, 1175 })); } [Test] public void Descendants() { var doc = GetContent(1046); var result = doc.Descendants(Mock.Of()).ToArray(); Assert.IsNotNull(result); Assert.AreEqual(9, result.Count()); Assert.IsTrue(result.Select(x => x.Id).ContainsAll(new [] { 1173, 1174, 1176, 1175, 4444 })); } [Test] public void IsDescendant() { // Structure: // - Root : 1046 (no parent) // -- Home: 1173 (parent 1046) // -- Custom Doc: 1178 (parent 1173) // --- Custom Doc2: 1179 (parent: 1178) // -- Custom Doc4: 117 (parent 1173) // - Custom Doc3: 1172 (no parent) var home = GetContent(1173); var root = GetContent(1046); var customDoc = GetContent(1178); var customDoc2 = GetContent(1179); var customDoc3 = GetContent(1172); var customDoc4 = GetContent(117); Assert.IsFalse(root.IsDescendant(root)); Assert.IsFalse(root.IsDescendant(home)); Assert.IsFalse(root.IsDescendant(customDoc)); Assert.IsFalse(root.IsDescendant(customDoc2)); Assert.IsFalse(root.IsDescendant(customDoc3)); Assert.IsFalse(root.IsDescendant(customDoc4)); Assert.IsTrue(home.IsDescendant(root)); Assert.IsFalse(home.IsDescendant(home)); Assert.IsFalse(home.IsDescendant(customDoc)); Assert.IsFalse(home.IsDescendant(customDoc2)); Assert.IsFalse(home.IsDescendant(customDoc3)); Assert.IsFalse(home.IsDescendant(customDoc4)); Assert.IsTrue(customDoc.IsDescendant(root)); Assert.IsTrue(customDoc.IsDescendant(home)); Assert.IsFalse(customDoc.IsDescendant(customDoc)); Assert.IsFalse(customDoc.IsDescendant(customDoc2)); Assert.IsFalse(customDoc.IsDescendant(customDoc3)); Assert.IsFalse(customDoc.IsDescendant(customDoc4)); Assert.IsTrue(customDoc2.IsDescendant(root)); Assert.IsTrue(customDoc2.IsDescendant(home)); Assert.IsTrue(customDoc2.IsDescendant(customDoc)); Assert.IsFalse(customDoc2.IsDescendant(customDoc2)); Assert.IsFalse(customDoc2.IsDescendant(customDoc3)); Assert.IsFalse(customDoc2.IsDescendant(customDoc4)); Assert.IsFalse(customDoc3.IsDescendant(customDoc3)); } [Test] public void IsDescendantOrSelf() { // Structure: // - Root : 1046 (no parent) // -- Home: 1173 (parent 1046) // -- Custom Doc: 1178 (parent 1173) // --- Custom Doc2: 1179 (parent: 1178) // -- Custom Doc4: 117 (parent 1173) // - Custom Doc3: 1172 (no parent) var home = GetContent(1173); var root = GetContent(1046); var customDoc = GetContent(1178); var customDoc2 = GetContent(1179); var customDoc3 = GetContent(1172); var customDoc4 = GetContent(117); Assert.IsTrue(root.IsDescendantOrSelf(root)); Assert.IsFalse(root.IsDescendantOrSelf(home)); Assert.IsFalse(root.IsDescendantOrSelf(customDoc)); Assert.IsFalse(root.IsDescendantOrSelf(customDoc2)); Assert.IsFalse(root.IsDescendantOrSelf(customDoc3)); Assert.IsFalse(root.IsDescendantOrSelf(customDoc4)); Assert.IsTrue(home.IsDescendantOrSelf(root)); Assert.IsTrue(home.IsDescendantOrSelf(home)); Assert.IsFalse(home.IsDescendantOrSelf(customDoc)); Assert.IsFalse(home.IsDescendantOrSelf(customDoc2)); Assert.IsFalse(home.IsDescendantOrSelf(customDoc3)); Assert.IsFalse(home.IsDescendantOrSelf(customDoc4)); Assert.IsTrue(customDoc.IsDescendantOrSelf(root)); Assert.IsTrue(customDoc.IsDescendantOrSelf(home)); Assert.IsTrue(customDoc.IsDescendantOrSelf(customDoc)); Assert.IsFalse(customDoc.IsDescendantOrSelf(customDoc2)); Assert.IsFalse(customDoc.IsDescendantOrSelf(customDoc3)); Assert.IsFalse(customDoc.IsDescendantOrSelf(customDoc4)); Assert.IsTrue(customDoc2.IsDescendantOrSelf(root)); Assert.IsTrue(customDoc2.IsDescendantOrSelf(home)); Assert.IsTrue(customDoc2.IsDescendantOrSelf(customDoc)); Assert.IsTrue(customDoc2.IsDescendantOrSelf(customDoc2)); Assert.IsFalse(customDoc2.IsDescendantOrSelf(customDoc3)); Assert.IsFalse(customDoc2.IsDescendantOrSelf(customDoc4)); Assert.IsTrue(customDoc3.IsDescendantOrSelf(customDoc3)); } [Test] public void SiblingsAndSelf() { // Structure: // - Root : 1046 (no parent) // -- Level1.1: 1173 (parent 1046) // --- Level1.1.1: 1174 (parent 1173) // --- Level1.1.2: 117 (parent 1173) // --- Level1.1.3: 1177 (parent 1173) // --- Level1.1.4: 1178 (parent 1173) // ---- Level1.1.4.1: 1179 (parent 1178) // --- Level1.1.5: 1176 (parent 1173) // -- Level1.2: 1175 (parent 1046) // -- Level1.3: 4444 (parent 1046) // - Root : 1172 (no parent) var root = GetContent(1046); var level1_1 = GetContent(1173); var level1_1_1 = GetContent(1174); var level1_1_2 = GetContent(117); var level1_1_3 = GetContent(1177); var level1_1_4 = GetContent(1178); var level1_1_5 = GetContent(1176); var level1_2 = GetContent(1175); var level1_3 = GetContent(4444); var root2 = GetContent(1172); var publishedSnapshot = GetPublishedSnapshot(); CollectionAssertAreEqual(new[] { root, root2 }, root.SiblingsAndSelf(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1, level1_2, level1_3 }, level1_1.SiblingsAndSelf(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1, level1_2, level1_3 }, level1_2.SiblingsAndSelf(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1, level1_2, level1_3 }, level1_3.SiblingsAndSelf(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_1, level1_1_2, level1_1_3, level1_1_4, level1_1_5 }, level1_1_1.SiblingsAndSelf(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_1, level1_1_2, level1_1_3, level1_1_4, level1_1_5 }, level1_1_2.SiblingsAndSelf(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_1, level1_1_2, level1_1_3, level1_1_4, level1_1_5 }, level1_1_3.SiblingsAndSelf(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_1, level1_1_2, level1_1_3, level1_1_4, level1_1_5 }, level1_1_4.SiblingsAndSelf(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_1, level1_1_2, level1_1_3, level1_1_4, level1_1_5 }, level1_1_5.SiblingsAndSelf(publishedSnapshot, VariationContextAccessor)); } [Test] public void Siblings() { // Structure: // - Root : 1046 (no parent) // -- Level1.1: 1173 (parent 1046) // --- Level1.1.1: 1174 (parent 1173) // --- Level1.1.2: 117 (parent 1173) // --- Level1.1.3: 1177 (parent 1173) // --- Level1.1.4: 1178 (parent 1173) // ---- Level1.1.4.1: 1179 (parent 1178) // --- Level1.1.5: 1176 (parent 1173) // -- Level1.2: 1175 (parent 1046) // -- Level1.3: 4444 (parent 1046) // - Root : 1172 (no parent) var root = GetContent(1046); var level1_1 = GetContent(1173); var level1_1_1 = GetContent(1174); var level1_1_2 = GetContent(117); var level1_1_3 = GetContent(1177); var level1_1_4 = GetContent(1178); var level1_1_5 = GetContent(1176); var level1_2 = GetContent(1175); var level1_3 = GetContent(4444); var root2 = GetContent(1172); var publishedSnapshot = GetPublishedSnapshot(); CollectionAssertAreEqual(new[] { root2 }, root.Siblings(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_2, level1_3 }, level1_1.Siblings(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1, level1_3 }, level1_2.Siblings(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1, level1_2 }, level1_3.Siblings(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_2, level1_1_3, level1_1_4, level1_1_5 }, level1_1_1.Siblings(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_1, level1_1_3, level1_1_4, level1_1_5 }, level1_1_2.Siblings(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_1, level1_1_2, level1_1_4, level1_1_5 }, level1_1_3.Siblings(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_1, level1_1_2, level1_1_3, level1_1_5 }, level1_1_4.Siblings(publishedSnapshot, VariationContextAccessor)); CollectionAssertAreEqual(new[] { level1_1_1, level1_1_2, level1_1_3, level1_1_4 }, level1_1_5.Siblings(publishedSnapshot, VariationContextAccessor)); } private void CollectionAssertAreEqual(IEnumerable expected, IEnumerable actual) where T : IPublishedContent { var e = expected.Select(x => x.Id); var a = actual.Select(x => x.Id); CollectionAssert.AreEquivalent(e, a, $"\nExpected:\n{string.Join(", ", e)}\n\nActual:\n{string.Join(", ", a)}"); } [Test] public void FragmentProperty() { IEnumerable CreatePropertyTypes(IPublishedContentType contentType) { yield return PublishedContentTypeFactory.CreatePropertyType(contentType, "detached", _dataTypes[0].Id); } var ct = PublishedContentTypeFactory.CreateContentType(Guid.NewGuid(), 0, "alias", CreatePropertyTypes); var pt = ct.GetPropertyType("detached"); var prop = new PublishedElementPropertyBase(pt, null, false, PropertyCacheLevel.None, 5548); Assert.IsInstanceOf(prop.GetValue()); Assert.AreEqual(5548, prop.GetValue()); } [Test] public void Fragment2() { IEnumerable CreatePropertyTypes(IPublishedContentType contentType) { yield return PublishedContentTypeFactory.CreatePropertyType(contentType, "legend", _dataTypes[0].Id); yield return PublishedContentTypeFactory.CreatePropertyType(contentType, "image", _dataTypes[0].Id); yield return PublishedContentTypeFactory.CreatePropertyType(contentType, "size", _dataTypes[0].Id); } const string val1 = "boom bam"; const int val2 = 0; const int val3 = 666; var guid = Guid.NewGuid(); var ct = PublishedContentTypeFactory.CreateContentType(Guid.NewGuid(), 0, "alias", CreatePropertyTypes); var c = new ImageWithLegendModel(ct, guid, new Dictionary { { "legend", val1 }, { "image", val2 }, { "size", val3 }, }, false); Assert.AreEqual(val1, c.Legend); Assert.AreEqual(val3, c.Size); } [Test] public void First() { var publishedSnapshot = GetPublishedSnapshot(); var content = publishedSnapshot.Content.GetAtRoot().First(); Assert.AreEqual("Home", content.Name(VariationContextAccessor)); } [Test] public void Distinct() { var items = GetContent(1173) .Children(VariationContextAccessor) .Distinct() .Distinct() .ToIndexedArray(); Assert.AreEqual(5, items.Length); IndexedArrayItem item = items[0]; Assert.AreEqual(1174, item.Content.Id); Assert.IsTrue(item.IsFirst()); Assert.IsFalse(item.IsLast()); item = items[^1]; Assert.AreEqual(1176, item.Content.Id); Assert.IsFalse(item.IsFirst()); Assert.IsTrue(item.IsLast()); } [Test] public void OfType1() { var publishedSnapshot = GetPublishedSnapshot(); var items = publishedSnapshot.Content.GetAtRoot() .OfType() .Distinct() .ToIndexedArray(); Assert.AreEqual(1, items.Length); Assert.IsInstanceOf(items.First().Content); } [Test] public void OfType2() { var publishedSnapshot = GetPublishedSnapshot(); var content = publishedSnapshot.Content.GetAtRoot() .OfType() .Distinct() .ToIndexedArray(); Assert.AreEqual(1, content.Length); Assert.IsInstanceOf(content.First().Content); } [Test] public void OfType() { var content = GetContent(1173) .Children(VariationContextAccessor) .OfType() .First(x => x.UmbracoNaviHide == true); Assert.AreEqual(1176, content.Id); } [Test] public void Position() { var items = GetContent(1173).Children(VariationContextAccessor) .Where(x => x.Value(Mock.Of(), "umbracoNaviHide") == 0) .ToIndexedArray(); Assert.AreEqual(3, items.Length); Assert.IsTrue(items.First().IsFirst()); Assert.IsFalse(items.First().IsLast()); Assert.IsFalse(items.Skip(1).First().IsFirst()); Assert.IsFalse(items.Skip(1).First().IsLast()); Assert.IsFalse(items.Skip(2).First().IsFirst()); Assert.IsTrue(items.Skip(2).First().IsLast()); } class ImageWithLegendModel : PublishedElement { public ImageWithLegendModel(IPublishedContentType contentType, Guid fragmentKey, Dictionary values, bool previewing) : base(contentType, fragmentKey, values, previewing) { } public string Legend => this.Value(Mock.Of(), "legend"); public IPublishedContent Image => this.Value(Mock.Of(), "image"); public int Size => this.Value(Mock.Of(), "size"); } //[PublishedModel("ContentType2")] //public class ContentType2 : PublishedContentModel //{ // #region Plumbing // public ContentType2(IPublishedContent content, IPublishedValueFallback fallback) // : base(content, fallback) // { } // #endregion // public int Prop1 => this.Value(Mock.Of(), "prop1"); //} //[PublishedModel("ContentType2Sub")] //public class ContentType2Sub : ContentType2 //{ // #region Plumbing // public ContentType2Sub(IPublishedContent content, IPublishedValueFallback fallback) // : base(content, fallback) // { } // #endregion //} } }