using System.Web; using System.Xml.Linq; using System.Xml.XPath; using Lucene.Net.Store; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; using Umbraco.Tests.UmbracoExamine; using Umbraco.Web; using Umbraco.Web.PublishedCache.XmlPublishedCache; using System.Linq; using System.Threading; using System.Xml; using Examine; using Umbraco.Core.Cache; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Strings; using Umbraco.Examine; using Current = Umbraco.Web.Composing.Current; using Umbraco.Tests.Testing; using LightInject; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; namespace Umbraco.Tests.PublishedContent { /// /// Tests the typed extension methods on IPublishedContent using the DefaultPublishedMediaStore /// [TestFixture] [Apartment(ApartmentState.STA)] [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest, WithApplication = true)] public class PublishedMediaTests : PublishedContentTestBase { /// /// sets up resolvers before resolution is frozen /// protected override void Compose() { base.Compose(); Container.GetInstance() .Clear() .Append(); } private IMediaType MakeNewMediaType(IUser user, string text, int parentId = -1) { var mt = new MediaType(parentId) { Name = text, Alias = text, Thumbnail = "icon-folder", Icon = "icon-folder" }; ServiceContext.MediaTypeService.Save(mt); return mt; } private IMedia MakeNewMedia(string name, IMediaType mediaType, IUser user, int parentId) { var m = ServiceContext.MediaService.CreateMediaWithIdentity(name, parentId, mediaType.Alias); return m; } /// /// Shared with PublishMediaStoreTests /// /// /// /// internal IPublishedContent GetNode(int id, UmbracoContext umbracoContext) { var cache = new PublishedMediaCache(new XmlStore((XmlDocument)null, null, null, null), Current.Services.MediaService, Current.Services.UserService, new StaticCacheProvider(), ContentTypesCache); var doc = cache.GetById(id); Assert.IsNotNull(doc); return doc; } private IPublishedContent GetNode(int id) { return GetNode(id, GetUmbracoContext("/test")); } [Test] public void Get_Property_Value_Uses_Converter() { var mType = MockedContentTypes.CreateImageMediaType("image2"); //lets add an RTE to this mType.PropertyGroups.First().PropertyTypes.Add( new PropertyType("test", ValueStorageType.Nvarchar, "content") { Name = "Rich Text", DataTypeId = -87 //tiny mce }); ServiceContext.MediaTypeService.Save(mType); var media = MockedMedia.CreateMediaImage(mType, -1); media.Properties["content"].SetValue("
This is some content
"); ServiceContext.MediaService.Save(media); var publishedMedia = GetNode(media.Id); var propVal = publishedMedia.Value("content"); Assert.IsInstanceOf(propVal); Assert.AreEqual("
This is some content
", propVal.ToString()); var propVal2 = publishedMedia.Value("content"); Assert.IsInstanceOf(propVal2); Assert.AreEqual("
This is some content
", propVal2.ToString()); var propVal3 = publishedMedia.Value("Content"); Assert.IsInstanceOf(propVal3); Assert.AreEqual("
This is some content
", propVal3.ToString()); } [Test] public void Ensure_Children_Sorted_With_Examine() { using (var luceneDir = new RandomIdRamDirectory()) using (var indexer = IndexInitializer.GetUmbracoIndexer(ProfilingLogger, luceneDir, ScopeProvider.SqlContext, options: new UmbracoContentIndexerOptions(true, false, null))) { indexer.RebuildIndex(); var searcher = indexer.GetSearcher(); var ctx = GetUmbracoContext("/test"); var cache = new PublishedMediaCache(ServiceContext.MediaService, ServiceContext.UserService, searcher, indexer, new StaticCacheProvider(), ContentTypesCache); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = cache.GetById(1111); var rootChildren = publishedMedia.Children().ToArray(); var currSort = 0; for (var i = 0; i < rootChildren.Count(); i++) { Assert.GreaterOrEqual(rootChildren[i].SortOrder, currSort); currSort = rootChildren[i].SortOrder; } } } [Test] public void Do_Not_Find_In_Recycle_Bin() { using (var luceneDir = new RandomIdRamDirectory()) using (var indexer = IndexInitializer.GetUmbracoIndexer(ProfilingLogger, luceneDir, ScopeProvider.SqlContext, //include unpublished content since this uses the 'internal' indexer, it's up to the media cache to filter options: new UmbracoContentIndexerOptions(true, false, null))) using (indexer.ProcessNonAsync()) { indexer.RebuildIndex(); var searcher = indexer.GetSearcher(); var ctx = GetUmbracoContext("/test"); var cache = new PublishedMediaCache(ServiceContext.MediaService, ServiceContext.UserService, searcher, indexer, new StaticCacheProvider(), ContentTypesCache); //ensure it is found var publishedMedia = cache.GetById(3113); Assert.IsNotNull(publishedMedia); //move item to recycle bin var newXml = XElement.Parse(@" 115 268 10726 jpg "); indexer.IndexItems(new[]{ newXml.ConvertToValueSet("media") }); //ensure it still exists in the index (raw examine search) var criteria = searcher.CreateCriteria(); var filter = criteria.Id(3113); var found = searcher.Search(filter.Compile()); Assert.IsNotNull(found); Assert.AreEqual(1, found.TotalItemCount); //ensure it does not show up in the published media store var recycledMedia = cache.GetById(3113); Assert.IsNull(recycledMedia); } } [Test] public void Children_With_Examine() { using (var luceneDir = new RandomIdRamDirectory()) using (var indexer = IndexInitializer.GetUmbracoIndexer(ProfilingLogger, luceneDir, ScopeProvider.SqlContext, options: new UmbracoContentIndexerOptions(true, false, null))) using (indexer.ProcessNonAsync()) { indexer.RebuildIndex(); var searcher = indexer.GetSearcher(); var ctx = GetUmbracoContext("/test"); var cache = new PublishedMediaCache(ServiceContext.MediaService, ServiceContext.UserService, searcher, indexer, new StaticCacheProvider(), ContentTypesCache); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = cache.GetById(1111); var rootChildren = publishedMedia.Children(); Assert.IsTrue(rootChildren.Select(x => x.Id).ContainsAll(new[] { 2222, 1113, 1114, 1115, 1116 })); var publishedChild1 = cache.GetById(2222); var subChildren = publishedChild1.Children(); Assert.IsTrue(subChildren.Select(x => x.Id).ContainsAll(new[] { 2112 })); } } [Test] public void Descendants_With_Examine() { using (var luceneDir = new RandomIdRamDirectory()) using (var indexer = IndexInitializer.GetUmbracoIndexer(ProfilingLogger, luceneDir, ScopeProvider.SqlContext, options: new UmbracoContentIndexerOptions(true, false, null))) using (indexer.ProcessNonAsync()) { indexer.RebuildIndex(); var searcher = indexer.GetSearcher(); var ctx = GetUmbracoContext("/test"); var cache = new PublishedMediaCache(ServiceContext.MediaService, ServiceContext.UserService, searcher, indexer, new StaticCacheProvider(), ContentTypesCache); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = cache.GetById(1111); var rootDescendants = publishedMedia.Descendants(); Assert.IsTrue(rootDescendants.Select(x => x.Id).ContainsAll(new[] { 2112, 2222, 1113, 1114, 1115, 1116 })); var publishedChild1 = cache.GetById(2222); var subDescendants = publishedChild1.Descendants(); Assert.IsTrue(subDescendants.Select(x => x.Id).ContainsAll(new[] { 2112, 3113 })); } } [Test] public void DescendantsOrSelf_With_Examine() { using (var luceneDir = new RandomIdRamDirectory()) using (var indexer = IndexInitializer.GetUmbracoIndexer(ProfilingLogger, luceneDir, ScopeProvider.SqlContext, options: new UmbracoContentIndexerOptions(true, false, null))) using (indexer.ProcessNonAsync()) { indexer.RebuildIndex(); var searcher = indexer.GetSearcher(); var ctx = GetUmbracoContext("/test"); var cache = new PublishedMediaCache(ServiceContext.MediaService, ServiceContext.UserService, searcher, indexer, new StaticCacheProvider(), ContentTypesCache); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = cache.GetById(1111); var rootDescendants = publishedMedia.DescendantsOrSelf(); Assert.IsTrue(rootDescendants.Select(x => x.Id).ContainsAll(new[] { 1111, 2112, 2222, 1113, 1114, 1115, 1116 })); var publishedChild1 = cache.GetById(2222); var subDescendants = publishedChild1.DescendantsOrSelf(); Assert.IsTrue(subDescendants.Select(x => x.Id).ContainsAll(new[] { 2222, 2112, 3113 })); } } [Test] public void Ancestors_With_Examine() { using (var luceneDir = new RandomIdRamDirectory()) using (var indexer = IndexInitializer.GetUmbracoIndexer(ProfilingLogger, luceneDir, ScopeProvider.SqlContext, options: new UmbracoContentIndexerOptions(true, false, null))) using (indexer.ProcessNonAsync()) { indexer.RebuildIndex(); var ctx = GetUmbracoContext("/test"); var searcher = indexer.GetSearcher(); var cache = new PublishedMediaCache(ServiceContext.MediaService, ServiceContext.UserService, searcher, indexer, new StaticCacheProvider(), ContentTypesCache); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = cache.GetById(3113); var ancestors = publishedMedia.Ancestors(); Assert.IsTrue(ancestors.Select(x => x.Id).ContainsAll(new[] { 2112, 2222, 1111 })); } } [Test] public void AncestorsOrSelf_With_Examine() { using (var luceneDir = new RandomIdRamDirectory()) using (var indexer = IndexInitializer.GetUmbracoIndexer(ProfilingLogger, luceneDir, ScopeProvider.SqlContext, options: new UmbracoContentIndexerOptions(true, false, null))) using (indexer.ProcessNonAsync()) { indexer.RebuildIndex(); var ctx = GetUmbracoContext("/test"); var searcher = indexer.GetSearcher(); var cache = new PublishedMediaCache(ServiceContext.MediaService, ServiceContext.UserService, searcher, indexer, new StaticCacheProvider(), ContentTypesCache); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = cache.GetById(3113); var ancestors = publishedMedia.AncestorsOrSelf(); Assert.IsTrue(ancestors.Select(x => x.Id).ContainsAll(new[] { 3113, 2112, 2222, 1111 })); } } [Test] public void Children_Without_Examine() { var user = ServiceContext.UserService.GetUserById(0); var mType = MakeNewMediaType(user, "TestMediaType"); var mRoot = MakeNewMedia("MediaRoot", mType, user, -1); var mChild1 = MakeNewMedia("Child1", mType, user, mRoot.Id); var mChild2 = MakeNewMedia("Child2", mType, user, mRoot.Id); var mChild3 = MakeNewMedia("Child3", mType, user, mRoot.Id); var mSubChild1 = MakeNewMedia("SubChild1", mType, user, mChild1.Id); var mSubChild2 = MakeNewMedia("SubChild2", mType, user, mChild1.Id); var mSubChild3 = MakeNewMedia("SubChild3", mType, user, mChild1.Id); var publishedMedia = GetNode(mRoot.Id); var rootChildren = publishedMedia.Children(); Assert.IsTrue(rootChildren.Select(x => x.Id).ContainsAll(new[] { mChild1.Id, mChild2.Id, mChild3.Id })); var publishedChild1 = GetNode(mChild1.Id); var subChildren = publishedChild1.Children(); Assert.IsTrue(subChildren.Select(x => x.Id).ContainsAll(new[] { mSubChild1.Id, mSubChild2.Id, mSubChild3.Id })); } [Test] public void Descendants_Without_Examine() { var user = ServiceContext.UserService.GetUserById(0); var mType = MakeNewMediaType(user, "TestMediaType"); var mRoot = MakeNewMedia("MediaRoot", mType, user, -1); var mChild1 = MakeNewMedia("Child1", mType, user, mRoot.Id); var mChild2 = MakeNewMedia("Child2", mType, user, mRoot.Id); var mChild3 = MakeNewMedia("Child3", mType, user, mRoot.Id); var mSubChild1 = MakeNewMedia("SubChild1", mType, user, mChild1.Id); var mSubChild2 = MakeNewMedia("SubChild2", mType, user, mChild1.Id); var mSubChild3 = MakeNewMedia("SubChild3", mType, user, mChild1.Id); var publishedMedia = GetNode(mRoot.Id); var rootDescendants = publishedMedia.Descendants(); Assert.IsTrue(rootDescendants.Select(x => x.Id).ContainsAll(new[] { mChild1.Id, mChild2.Id, mChild3.Id, mSubChild1.Id, mSubChild2.Id, mSubChild3.Id })); var publishedChild1 = GetNode(mChild1.Id); var subDescendants = publishedChild1.Descendants(); Assert.IsTrue(subDescendants.Select(x => x.Id).ContainsAll(new[] { mSubChild1.Id, mSubChild2.Id, mSubChild3.Id })); } [Test] public void DescendantsOrSelf_Without_Examine() { var user = ServiceContext.UserService.GetUserById(0); var mType = MakeNewMediaType(user, "TestMediaType"); var mRoot = MakeNewMedia("MediaRoot", mType, user, -1); var mChild1 = MakeNewMedia("Child1", mType, user, mRoot.Id); var mChild2 = MakeNewMedia("Child2", mType, user, mRoot.Id); var mChild3 = MakeNewMedia("Child3", mType, user, mRoot.Id); var mSubChild1 = MakeNewMedia("SubChild1", mType, user, mChild1.Id); var mSubChild2 = MakeNewMedia("SubChild2", mType, user, mChild1.Id); var mSubChild3 = MakeNewMedia("SubChild3", mType, user, mChild1.Id); var publishedMedia = GetNode(mRoot.Id); var rootDescendantsOrSelf = publishedMedia.DescendantsOrSelf(); Assert.IsTrue(rootDescendantsOrSelf.Select(x => x.Id).ContainsAll( new[] { mRoot.Id, mChild1.Id, mChild2.Id, mChild3.Id, mSubChild1.Id, mSubChild2.Id, mSubChild3.Id })); var publishedChild1 = GetNode(mChild1.Id); var subDescendantsOrSelf = publishedChild1.DescendantsOrSelf(); Assert.IsTrue(subDescendantsOrSelf.Select(x => x.Id).ContainsAll( new[] { mChild1.Id, mSubChild1.Id, mSubChild2.Id, mSubChild3.Id })); } [Test] public void Parent_Without_Examine() { var user = ServiceContext.UserService.GetUserById(0); var mType = MakeNewMediaType(user, "TestMediaType"); var mRoot = MakeNewMedia("MediaRoot", mType, user, -1); var mChild1 = MakeNewMedia("Child1", mType, user, mRoot.Id); var mChild2 = MakeNewMedia("Child2", mType, user, mRoot.Id); var mChild3 = MakeNewMedia("Child3", mType, user, mRoot.Id); var mSubChild1 = MakeNewMedia("SubChild1", mType, user, mChild1.Id); var mSubChild2 = MakeNewMedia("SubChild2", mType, user, mChild1.Id); var mSubChild3 = MakeNewMedia("SubChild3", mType, user, mChild1.Id); var publishedRoot = GetNode(mRoot.Id); Assert.AreEqual(null, publishedRoot.Parent); var publishedChild1 = GetNode(mChild1.Id); Assert.AreEqual(mRoot.Id, publishedChild1.Parent.Id); var publishedSubChild1 = GetNode(mSubChild1.Id); Assert.AreEqual(mChild1.Id, publishedSubChild1.Parent.Id); } [Test] public void Ancestors_Without_Examine() { var user = ServiceContext.UserService.GetUserById(0); var mType = MakeNewMediaType(user, "TestMediaType"); var mRoot = MakeNewMedia("MediaRoot", mType, user, -1); var mChild1 = MakeNewMedia("Child1", mType, user, mRoot.Id); var mChild2 = MakeNewMedia("Child2", mType, user, mRoot.Id); var mChild3 = MakeNewMedia("Child3", mType, user, mRoot.Id); var mSubChild1 = MakeNewMedia("SubChild1", mType, user, mChild1.Id); var mSubChild2 = MakeNewMedia("SubChild2", mType, user, mChild1.Id); var mSubChild3 = MakeNewMedia("SubChild3", mType, user, mChild1.Id); var publishedSubChild1 = GetNode(mSubChild1.Id); Assert.IsTrue(publishedSubChild1.Ancestors().Select(x => x.Id).ContainsAll(new[] { mChild1.Id, mRoot.Id })); } [Test] public void AncestorsOrSelf_Without_Examine() { var user = ServiceContext.UserService.GetUserById(0); var mType = MakeNewMediaType(user, "TestMediaType"); var mRoot = MakeNewMedia("MediaRoot", mType, user, -1); var mChild1 = MakeNewMedia("Child1", mType, user, mRoot.Id); var mChild2 = MakeNewMedia("Child2", mType, user, mRoot.Id); var mChild3 = MakeNewMedia("Child3", mType, user, mRoot.Id); var mSubChild1 = MakeNewMedia("SubChild1", mType, user, mChild1.Id); var mSubChild2 = MakeNewMedia("SubChild2", mType, user, mChild1.Id); var mSubChild3 = MakeNewMedia("SubChild3", mType, user, mChild1.Id); var publishedSubChild1 = GetNode(mSubChild1.Id); Assert.IsTrue(publishedSubChild1.AncestorsOrSelf().Select(x => x.Id).ContainsAll( new[] { mSubChild1.Id, mChild1.Id, mRoot.Id })); } [Test] public void Convert_From_Standard_Xml() { var config = SettingsForTests.GenerateMockUmbracoSettings(); SettingsForTests.ConfigureSettings(config); var nodeId = 2112; var xml = XElement.Parse(@" 115 268 10726 jpg 115 268 10726 jpg "); var node = xml.DescendantsAndSelf("Image").Single(x => (int)x.Attribute("id") == nodeId); var publishedMedia = new PublishedMediaCache(new XmlStore((XmlDocument)null, null, null, null), ServiceContext.MediaService, ServiceContext.UserService, new StaticCacheProvider(), ContentTypesCache); var nav = node.CreateNavigator(); var converted = publishedMedia.CreateFromCacheValues( publishedMedia.ConvertFromXPathNodeIterator(nav.Select("/Image"), nodeId)); Assert.AreEqual(nodeId, converted.Id); Assert.AreEqual(3, converted.Level); Assert.AreEqual(1, converted.SortOrder); Assert.AreEqual("Sam's Umbraco Image", converted.Name); Assert.AreEqual("-1,1111,2222,2112", converted.Path); } [Test] public void Detects_Error_In_Xml() { var errorXml = new XElement("error", string.Format("No media is maching '{0}'", 1234)); var nav = errorXml.CreateNavigator(); var publishedMedia = new PublishedMediaCache(new XmlStore((XmlDocument)null, null, null, null), ServiceContext.MediaService, ServiceContext.UserService, new StaticCacheProvider(), ContentTypesCache); var converted = publishedMedia.ConvertFromXPathNodeIterator(nav.Select("/"), 1234); Assert.IsNull(converted); } } }