From f8e04eb1d624fbefcb39b889a2babeb7bbe255bb Mon Sep 17 00:00:00 2001
From: Shannon
Date: Tue, 22 Oct 2019 00:53:52 +1100
Subject: [PATCH] Adds tests for MediaParser and simplifies UmbracoContext
mocking
---
.../PropertyEditors/ImageCropperTest.cs | 1 +
.../Testing/Objects/TestDataSource.cs | 3 +
.../Objects/TestUmbracoContextFactory.cs | 49 ++++++++++
src/Umbraco.Tests/Umbraco.Tests.csproj | 2 +
.../Web/InternalLinkParserTests.cs | 46 ++++-----
src/Umbraco.Tests/Web/MediaParserTests.cs | 97 +++++++++++++++++++
src/Umbraco.Web/Templates/MediaParser.cs | 12 ++-
7 files changed, 176 insertions(+), 34 deletions(-)
create mode 100644 src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs
create mode 100644 src/Umbraco.Tests/Web/MediaParserTests.cs
diff --git a/src/Umbraco.Tests/PropertyEditors/ImageCropperTest.cs b/src/Umbraco.Tests/PropertyEditors/ImageCropperTest.cs
index 8d2ab84d35..433ba64b38 100644
--- a/src/Umbraco.Tests/PropertyEditors/ImageCropperTest.cs
+++ b/src/Umbraco.Tests/PropertyEditors/ImageCropperTest.cs
@@ -24,6 +24,7 @@ using Umbraco.Web.PropertyEditors;
namespace Umbraco.Tests.PropertyEditors
{
+
[TestFixture]
public class ImageCropperTest
{
diff --git a/src/Umbraco.Tests/Testing/Objects/TestDataSource.cs b/src/Umbraco.Tests/Testing/Objects/TestDataSource.cs
index 0291715e46..4476a7464e 100644
--- a/src/Umbraco.Tests/Testing/Objects/TestDataSource.cs
+++ b/src/Umbraco.Tests/Testing/Objects/TestDataSource.cs
@@ -1,12 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Scoping;
+using Umbraco.Web;
using Umbraco.Web.PublishedCache.NuCache;
using Umbraco.Web.PublishedCache.NuCache.DataSource;
namespace Umbraco.Tests.Testing.Objects
{
+
internal class TestDataSource : IDataSource
{
public TestDataSource(params ContentNodeKit[] kits)
diff --git a/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs b/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs
new file mode 100644
index 0000000000..7f891a2580
--- /dev/null
+++ b/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs
@@ -0,0 +1,49 @@
+using Moq;
+using Umbraco.Core.Configuration;
+using Umbraco.Core.Configuration.UmbracoSettings;
+using Umbraco.Core.Services;
+using Umbraco.Tests.TestHelpers;
+using Umbraco.Tests.Testing.Objects.Accessors;
+using Umbraco.Web;
+using Umbraco.Web.PublishedCache;
+using Umbraco.Web.Routing;
+
+namespace Umbraco.Tests.Testing.Objects
+{
+ ///
+ /// Simplify creating test UmbracoContext's
+ ///
+ public class TestUmbracoContextFactory
+ {
+ public static IUmbracoContextFactory Create(IGlobalSettings globalSettings = null, IUrlProvider urlProvider = null,
+ IMediaUrlProvider mediaUrlProvider = null,
+ IUmbracoContextAccessor umbracoContextAccessor = null)
+ {
+ if (globalSettings == null) globalSettings = SettingsForTests.GenerateMockGlobalSettings();
+ if (urlProvider == null) urlProvider = Mock.Of();
+ if (mediaUrlProvider == null) mediaUrlProvider = Mock.Of();
+ if (umbracoContextAccessor == null) umbracoContextAccessor = new TestUmbracoContextAccessor();
+
+ var contentCache = new Mock();
+ var mediaCache = new Mock();
+ var snapshot = new Mock();
+ snapshot.Setup(x => x.Content).Returns(contentCache.Object);
+ snapshot.Setup(x => x.Media).Returns(mediaCache.Object);
+ var snapshotService = new Mock();
+ snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())).Returns(snapshot.Object);
+
+ var umbracoContextFactory = new UmbracoContextFactory(
+ umbracoContextAccessor,
+ snapshotService.Object,
+ new TestVariationContextAccessor(),
+ new TestDefaultCultureAccessor(),
+ Mock.Of(section => section.WebRouting == Mock.Of(routingSection => routingSection.UrlProviderMode == "Auto")),
+ globalSettings,
+ new UrlProviderCollection(new[] { urlProvider }),
+ new MediaUrlProviderCollection(new[] { mediaUrlProvider }),
+ Mock.Of());
+
+ return umbracoContextFactory;
+ }
+ }
+}
diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj
index e73caf4517..20b29a3147 100644
--- a/src/Umbraco.Tests/Umbraco.Tests.csproj
+++ b/src/Umbraco.Tests/Umbraco.Tests.csproj
@@ -212,6 +212,7 @@
+
@@ -254,6 +255,7 @@
+
diff --git a/src/Umbraco.Tests/Web/InternalLinkParserTests.cs b/src/Umbraco.Tests/Web/InternalLinkParserTests.cs
index 6cdff240b8..0a948a8617 100644
--- a/src/Umbraco.Tests/Web/InternalLinkParserTests.cs
+++ b/src/Umbraco.Tests/Web/InternalLinkParserTests.cs
@@ -8,6 +8,7 @@ using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Services;
using Umbraco.Tests.TestHelpers;
+using Umbraco.Tests.Testing.Objects;
using Umbraco.Tests.Testing.Objects.Accessors;
using Umbraco.Web;
using Umbraco.Web.PublishedCache;
@@ -16,6 +17,7 @@ using Umbraco.Web.Templates;
namespace Umbraco.Tests.Web
{
+
[TestFixture]
public class InternalLinkParserTests
{
@@ -29,54 +31,40 @@ namespace Umbraco.Tests.Web
[TestCase("hello href=\"{localLink:umb://document-type/9931BDE0-AAC3-4BAB-B838-909A7B47570E}\" world ", "hello href=\"#\" world ")]
public void ParseLocalLinks(string input, string result)
{
- var serviceCtxMock = new TestObjects(null).GetServiceContextMock();
-
//setup a mock url provider which we'll use for testing
- var testUrlProvider = new Mock();
- testUrlProvider
+ var contentUrlProvider = new Mock();
+ contentUrlProvider
.Setup(x => x.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(UrlInfo.Url("/my-test-url"));
-
- var globalSettings = SettingsForTests.GenerateMockGlobalSettings();
-
var contentType = new PublishedContentType(666, "alias", PublishedItemType.Content, Enumerable.Empty(), Enumerable.Empty(), ContentVariation.Nothing);
var publishedContent = new Mock();
publishedContent.Setup(x => x.Id).Returns(1234);
publishedContent.Setup(x => x.ContentType).Returns(contentType);
- var contentCache = new Mock();
- contentCache.Setup(x => x.GetById(It.IsAny())).Returns(publishedContent.Object);
- contentCache.Setup(x => x.GetById(It.IsAny())).Returns(publishedContent.Object);
+
var mediaType = new PublishedContentType(777, "image", PublishedItemType.Media, Enumerable.Empty(), Enumerable.Empty(), ContentVariation.Nothing);
var media = new Mock();
- media.Setup(x => x.Url).Returns("/media/1001/my-image.jpg");
media.Setup(x => x.ContentType).Returns(mediaType);
- var mediaCache = new Mock();
- mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object);
- mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object);
- var snapshot = new Mock();
- snapshot.Setup(x => x.Content).Returns(contentCache.Object);
- snapshot.Setup(x => x.Media).Returns(mediaCache.Object);
- var snapshotService = new Mock();
- snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())).Returns(snapshot.Object);
var mediaUrlProvider = new Mock();
mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(UrlInfo.Url("/media/1001/my-image.jpg"));
var umbracoContextAccessor = new TestUmbracoContextAccessor();
- var umbracoContextFactory = new UmbracoContextFactory(
- umbracoContextAccessor,
- snapshotService.Object,
- new TestVariationContextAccessor(),
- new TestDefaultCultureAccessor(),
- Mock.Of(section => section.WebRouting == Mock.Of(routingSection => routingSection.UrlProviderMode == "Auto")),
- globalSettings,
- new UrlProviderCollection(new[] { testUrlProvider.Object }),
- new MediaUrlProviderCollection(new[] { mediaUrlProvider.Object }),
- Mock.Of());
+ var umbracoContextFactory = TestUmbracoContextFactory.Create(
+ urlProvider: contentUrlProvider.Object,
+ mediaUrlProvider: mediaUrlProvider.Object,
+ umbracoContextAccessor: umbracoContextAccessor);
using (var reference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()))
{
+ var contentCache = Mock.Get(reference.UmbracoContext.Content);
+ contentCache.Setup(x => x.GetById(It.IsAny())).Returns(publishedContent.Object);
+ contentCache.Setup(x => x.GetById(It.IsAny())).Returns(publishedContent.Object);
+
+ var mediaCache = Mock.Get(reference.UmbracoContext.Media);
+ mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object);
+ mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object);
+
var linkParser = new InternalLinkParser(umbracoContextAccessor);
var output = linkParser.EnsureInternalLinks(input);
diff --git a/src/Umbraco.Tests/Web/MediaParserTests.cs b/src/Umbraco.Tests/Web/MediaParserTests.cs
new file mode 100644
index 0000000000..7c9e7576b5
--- /dev/null
+++ b/src/Umbraco.Tests/Web/MediaParserTests.cs
@@ -0,0 +1,97 @@
+using Umbraco.Core.Logging;
+using Moq;
+using NUnit.Framework;
+using Umbraco.Core.Services;
+using Umbraco.Tests.Testing.Objects.Accessors;
+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;
+
+namespace Umbraco.Tests.Web
+{
+ [TestFixture]
+ public class MediaParserTests
+ {
+ [Test]
+ public void Remove_Image_Sources()
+ {
+ var logger = Mock.Of();
+ var umbracoContextAccessor = new TestUmbracoContextAccessor();
+ var mediaParser = new MediaParser(umbracoContextAccessor, logger, Mock.Of(), Mock.Of());
+
+ var result = mediaParser.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(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(), It.IsAny()))
+ .Returns(UrlInfo.Url("/media/1001/my-image.jpg"));
+
+ var umbracoContextAccessor = new TestUmbracoContextAccessor();
+
+ var umbracoContextFactory = TestUmbracoContextFactory.Create(
+ mediaUrlProvider: mediaUrlProvider.Object,
+ umbracoContextAccessor: umbracoContextAccessor);
+
+ using (var reference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()))
+ {
+ var mediaCache = Mock.Get(reference.UmbracoContext.Media);
+ mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object);
+
+ var mediaParser = new MediaParser(umbracoContextAccessor, Mock.Of(), Mock.Of(), Mock.Of());
+
+ var result = mediaParser.EnsureImageSources(@"
+
+
![]()
+
+
+
+
+
+
+");
+
+ Assert.AreEqual(@"
+
+
![]()
+
+
+
+
+
+
+", result);
+
+ }
+
+
+ }
+ }
+}
diff --git a/src/Umbraco.Web/Templates/MediaParser.cs b/src/Umbraco.Web/Templates/MediaParser.cs
index 9a3f8def3c..4130b21da2 100644
--- a/src/Umbraco.Web/Templates/MediaParser.cs
+++ b/src/Umbraco.Web/Templates/MediaParser.cs
@@ -9,6 +9,7 @@ using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
+using Umbraco.Web.Routing;
namespace Umbraco.Web.Templates
{
@@ -39,11 +40,13 @@ namespace Umbraco.Web.Templates
public string EnsureImageSources(string text)
{
// don't attempt to proceed without a context
- if (_umbracoContextAccessor?.UmbracoContext?.Media == null)
+ if (_umbracoContextAccessor?.UmbracoContext?.UrlProvider == null)
{
return text;
}
+ var urlProvider = _umbracoContextAccessor.UmbracoContext.UrlProvider;
+
return ResolveImgPattern.Replace(text, match =>
{
// match groups:
@@ -57,16 +60,15 @@ namespace Umbraco.Web.Templates
{
return match.Value;
}
- var media = _umbracoContextAccessor?.UmbracoContext?.Media.GetById(guidUdi.Guid);
- if (media == null)
+ var mediaUrl = urlProvider.GetMediaUrl(guidUdi.Guid);
+ if (mediaUrl == null)
{
// image does not exist - we could choose to remove the image entirely here (return empty string),
// but that would leave the editors completely in the dark as to why the image doesn't show
return match.Value;
}
- var url = media.Url;
- return $"{match.Groups[1].Value}{url}{match.Groups[3].Value}{udi}{match.Groups[5].Value}";
+ return $"{match.Groups[1].Value}{mediaUrl}{match.Groups[3].Value}{udi}{match.Groups[5].Value}";
});
}