// Copyright (c) Umbraco. // See LICENSE for more details. using System.Diagnostics; using System.Linq; using Microsoft.Extensions.Options; using Moq; using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.Routing; using Umbraco.Cms.Core.Templates; using Umbraco.Cms.Tests.Common; using Umbraco.Cms.Tests.UnitTests.TestHelpers.Objects; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.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 WebRoutingSettings(); var publishedUrlProvider = new UrlProvider( umbracoContextAccessor, 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() { var symbolCount = 25000; var 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(); parser.EnsureImageSources(text); timer.Stop(); Assert.IsTrue(timer.ElapsedMilliseconds <= maxMsToRun); } }