// 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.PublishedCache;
using Umbraco.Cms.Core.Routing;
using Umbraco.Cms.Core.Services.Navigation;
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]);
}
[TestCase(
@"
![]()
",
ExpectedResult = @"
![]()
",
TestName = "Remove image source with data-udi set")]
[TestCase(
@"
",
ExpectedResult = @"
",
TestName = "Remove image source but keep querystring")]
[TestCase(
@"
",
ExpectedResult = @"
",
TestName = "Remove image source with empty src")]
[TestCase(
@"
",
ExpectedResult = @"
",
TestName = "Do not remove image source without data-udi set")]
[Category("Remove image sources")]
public string Remove_Image_Sources(string sourceHtml)
{
var imageSourceParser = new HtmlImageSourceParser(Mock.Of());
var actual = imageSourceParser.RemoveImageSources(sourceHtml);
return actual;
}
[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.AsUrl("/media/1001/my-image.jpg", "Test Provider"));
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(),
Mock.Of(),
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 = "Order of attributes does not matter")]
[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 = "Parameters are prefixed (order of attributes reversed)")]
[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);
}
}