using Umbraco.Core.Logging; using Moq; using NUnit.Framework; using Umbraco.Web.Templates; using Umbraco.Web; using Umbraco.Core.Models.PublishedContent; using Umbraco.Web.Routing; using Umbraco.Tests.Testing.Objects; using System.Web; using System; using System.Linq; using Umbraco.Core.Models; using Umbraco.Core; using System.Diagnostics; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Common; using Umbraco.Tests.Common.Builders; namespace Umbraco.Tests.Templates { [TestFixture] public class HtmlImageSourceParserTests { [Test] public void Returns_Udis_From_Data_Udi_Html_Attributes() { var input = @"

"; var imageSourceParser = new HtmlImageSourceParser(Mock.Of()); var result = imageSourceParser.FindUdisFromDataAttributes(input).ToList(); Assert.AreEqual(2, result.Count); Assert.AreEqual(UdiParser.Parse("umb://media/D4B18427A1544721B09AC7692F35C264"), result[0]); Assert.AreEqual(UdiParser.Parse("umb://media-type/B726D735E4C446D58F703F3FBCFC97A5"), result[1]); } [Test] public void Remove_Image_Sources() { var imageSourceParser = new HtmlImageSourceParser(Mock.Of()); var result = imageSourceParser.RemoveImageSources(@"

"); Assert.AreEqual(@"

", result); } [Test] public void Ensure_Image_Sources() { //setup a mock url provider which we'll use for testing var mediaType = new PublishedContentType(Guid.NewGuid(), 777, "image", PublishedItemType.Media, Enumerable.Empty(), Enumerable.Empty(), ContentVariation.Nothing); var media = new Mock(); media.Setup(x => x.ContentType).Returns(mediaType); var mediaUrlProvider = new Mock(); mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(UrlInfo.Url("/media/1001/my-image.jpg")); var umbracoContextAccessor = new TestUmbracoContextAccessor(); var umbracoContextFactory = TestUmbracoContextFactory.Create( umbracoContextAccessor: umbracoContextAccessor); var webRoutingSettings = new WebRoutingSettingsBuilder().Build(); var publishedUrlProvider = new UrlProvider(umbracoContextAccessor, Microsoft.Extensions.Options.Options.Create(webRoutingSettings), new UrlProviderCollection(Enumerable.Empty()), new MediaUrlProviderCollection(new []{mediaUrlProvider.Object}), Mock.Of() ); using (var reference = umbracoContextFactory.EnsureUmbracoContext()) { var mediaCache = Mock.Get(reference.UmbracoContext.Media); mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object); var imageSourceParser = new HtmlImageSourceParser(publishedUrlProvider); var result = imageSourceParser.EnsureImageSources(@"

"); Assert.AreEqual(@"

", result); } } [TestCase( @"
", ExpectedResult = @"
", TestName = "Empty source is not updated with no data-udi set" )] [TestCase( @"
", ExpectedResult = @"
", TestName = "Empty source is updated with data-udi set" )] [TestCase( @"
", ExpectedResult = @"
", TestName = "Filled source is overwritten with data-udi set" )] [TestCase( @"
", ExpectedResult = @"
", TestName = "Attributes are persisted" )] [TestCase( @"
", ExpectedResult = @"
", TestName = "Source is trimmed and parameters are prefixed" )] [TestCase( @"
", ExpectedResult = @"
", TestName = "Parameters are prefixed" )] [TestCase( @"
", ExpectedResult = @"
", TestName = "Multiple img tags are handled" )] [Category("Ensure image sources")] public string Ensure_ImageSources_Processing(string sourceHtml) { var fakeMediaUrl = "/media/1001/image.jpg"; var parser = new HtmlImageSourceParser((guid) => fakeMediaUrl); var actual = parser.EnsureImageSources(sourceHtml); return actual; } [Category("Ensure image sources")] [Test] public void Ensure_Large_Html_Is_Processed_Quickly() { int symbolCount = 25000; int maxMsToRun = 200; var longText = new string('*', symbolCount); var text = $@""; var fakeMediaUrl = "/media/1001/image.jpg"; var parser = new HtmlImageSourceParser((guid) => fakeMediaUrl); var timer = new Stopwatch(); timer.Start(); var actual = parser.EnsureImageSources(text); timer.Stop(); Assert.IsTrue(timer.ElapsedMilliseconds <= maxMsToRun); } } }