diff --git a/src/Umbraco.Tests/FrontEnd/UmbracoHelperTests.cs b/src/Umbraco.Tests/FrontEnd/UmbracoHelperTests.cs index 058f063f8e..a0e80a33cf 100644 --- a/src/Umbraco.Tests/FrontEnd/UmbracoHelperTests.cs +++ b/src/Umbraco.Tests/FrontEnd/UmbracoHelperTests.cs @@ -1,70 +1,67 @@ using System; using System.Collections.Generic; using System.Text; +using LightInject; +using Moq; using NUnit.Framework; using Umbraco.Core; using Umbraco.Tests.TestHelpers; +using Umbraco.Core.Cache; +using Umbraco.Core.Composing; +using Umbraco.Core.Logging; +using Umbraco.Tests.TestHelpers; using Umbraco.Web; namespace Umbraco.Tests.FrontEnd { [TestFixture] public class UmbracoHelperTests - //: BaseUmbracoApplicationTest { - [Test] - public void Truncate_Simple() - { - var text = "Hello world, this is some text with a link"; + private const string SampleWithAnchorElement = "Hello world, this is some text with a link"; + private const string SampleWithBoldAndAnchorElements = "Hello world, this is some text with a link"; + [Test] + public static void Truncate_Simple() + { var helper = new UmbracoHelper(); - var result = helper.Truncate(text, 25).ToString(); - - Assert.AreEqual("Hello world, this is some…", result); - } - - /// - /// If a truncated string ends with a space, we should trim the space before appending the ellipsis. - /// - [Test] - public void Truncate_Simple_With_Trimming() - { - var text = "Hello world, this is some text with a link"; - - var helper = new UmbracoHelper(); - - var result = helper.Truncate(text, 26).ToString(); + var result = helper.Truncate(SampleWithAnchorElement, 25).ToString(); Assert.AreEqual("Hello world, this is some…", result); } [Test] - public void Truncate_Inside_Word() + public static void When_Truncating_A_String_Ends_With_A_Space_We_Should_Trim_The_Space_Before_Appending_The_Ellipsis() { - var text = "Hello world, this is some text with a link"; - var helper = new UmbracoHelper(); - var result = helper.Truncate(text, 24).ToString(); + var result = helper.Truncate(SampleWithAnchorElement, 26).ToString(); + + Assert.AreEqual("Hello world, this is some…", result); + } + + [Test] + public static void Truncate_Inside_Word() + { + var helper = new UmbracoHelper(); + + var result = helper.Truncate(SampleWithAnchorElement, 24).ToString(); Assert.AreEqual("Hello world, this is som…", result); } [Test] - public void Truncate_With_Tag() + public static void Truncate_With_Tag() { - var text = "Hello world, this is some text with a link"; - var helper = new UmbracoHelper(); - var result = helper.Truncate(text, 35).ToString(); + var result = helper.Truncate(SampleWithAnchorElement, 35).ToString(); Assert.AreEqual("Hello world, this is some text with…", result); } [Test] - public void Create_Encrypted_RouteString_From_Anonymous_Object() + public static void Create_Encrypted_RouteString_From_Anonymous_Object() { var additionalRouteValues = new { @@ -73,15 +70,23 @@ namespace Umbraco.Tests.FrontEnd Key3 = "Value3", keY4 = "valuE4" }; - var encryptedRouteString = UmbracoHelper.CreateEncryptedRouteString("FormController", "FormAction", "", additionalRouteValues); + + var encryptedRouteString = UmbracoHelper.CreateEncryptedRouteString( + "FormController", + "FormAction", + "", + additionalRouteValues + ); + var result = encryptedRouteString.DecryptWithMachineKey(); - var expectedResult = "c=FormController&a=FormAction&ar=&key1=value1&key2=value2&Key3=Value3&keY4=valuE4"; + + const string expectedResult = "c=FormController&a=FormAction&ar=&key1=value1&key2=value2&Key3=Value3&keY4=valuE4"; Assert.AreEqual(expectedResult, result); } [Test] - public void Create_Encrypted_RouteString_From_Dictionary() + public static void Create_Encrypted_RouteString_From_Dictionary() { var additionalRouteValues = new Dictionary() { @@ -90,79 +95,77 @@ namespace Umbraco.Tests.FrontEnd {"Key3", "Value3"}, {"keY4", "valuE4"} }; - var encryptedRouteString = UmbracoHelper.CreateEncryptedRouteString("FormController", "FormAction", "", additionalRouteValues); + + var encryptedRouteString = UmbracoHelper.CreateEncryptedRouteString( + "FormController", + "FormAction", + "", + additionalRouteValues + ); + var result = encryptedRouteString.DecryptWithMachineKey(); - var expectedResult = "c=FormController&a=FormAction&ar=&key1=value1&key2=value2&Key3=Value3&keY4=valuE4"; + + const string expectedResult = "c=FormController&a=FormAction&ar=&key1=value1&key2=value2&Key3=Value3&keY4=valuE4"; Assert.AreEqual(expectedResult, result); } [Test] - public void Truncate_By_Words() + public static void Truncate_By_Words() { - var text = "Hello world, this is some text with a link"; - var helper = new UmbracoHelper(); - var result = helper.TruncateByWords(text, 4).ToString(); + var result = helper.TruncateByWords(SampleWithAnchorElement, 4).ToString(); Assert.AreEqual("Hello world, this is…", result); } [Test] - public void Truncate_By_Words_With_Tag() + public static void Truncate_By_Words_With_Tag() { - var text = "Hello world, this is some text with a link"; - var helper = new UmbracoHelper(); - var result = helper.TruncateByWords(text, 4).ToString(); + var result = helper.TruncateByWords(SampleWithBoldAndAnchorElements, 4).ToString(); Assert.AreEqual("Hello world, this is…", result); } [Test] - public void Truncate_By_Words_Mid_Tag() + public static void Truncate_By_Words_Mid_Tag() { - var text = "Hello world, this is some text with a link"; - var helper = new UmbracoHelper(); - var result = helper.TruncateByWords(text, 7).ToString(); + var result = helper.TruncateByWords(SampleWithAnchorElement, 7).ToString(); Assert.AreEqual("Hello world, this is some text with…", result); } [Test] - public void Strip_All_Html() + public static void Strip_All_Html() { - var text = "Hello world, this is some text with a link"; - var helper = new UmbracoHelper(); - var result = helper.StripHtml(text, null).ToString(); + var result = helper.StripHtml(SampleWithBoldAndAnchorElements, null).ToString(); Assert.AreEqual("Hello world, this is some text with a link", result); } [Test] - public void Strip_Specific_Html() + public static void Strip_Specific_Html() { - var text = "Hello world, this is some text with a link"; - string[] tags = { "b" }; var helper = new UmbracoHelper(); - var result = helper.StripHtml(text, tags).ToString(); + var result = helper.StripHtml(SampleWithBoldAndAnchorElements, tags).ToString(); Assert.AreEqual("Hello world, this is some text with a link", result); } [Test] - public void Strip_Invalid_Html() + public static void Strip_Invalid_Html() { - var text = "Hello world, is some text with a link"; + const string text = "Hello world, is some text with a link"; var helper = new UmbracoHelper(); @@ -398,5 +401,252 @@ namespace Umbraco.Tests.FrontEnd Assert.IsFalse(success); Assert.That(result, Is.Null); } + + // ------- Int32 conversion tests + [Test] + public static void Converting_Boxed_34_To_An_Int_Returns_34() + { + // Arrange + const int sample = 34; + + // Act + bool success = UmbracoHelper.ConvertIdObjectToInt( + sample, + out int result + ); + + // Assert + Assert.IsTrue(success); + Assert.That(result, Is.EqualTo(34)); + } + + [Test] + public static void Converting_String_54_To_An_Int_Returns_54() + { + // Arrange + const string sample = "54"; + + // Act + bool success = UmbracoHelper.ConvertIdObjectToInt( + sample, + out int result + ); + + // Assert + Assert.IsTrue(success); + Assert.That(result, Is.EqualTo(54)); + } + + [Test] + public static void Converting_Hello_To_An_Int_Returns_False() + { + // Arrange + const string sample = "Hello"; + + // Act + bool success = UmbracoHelper.ConvertIdObjectToInt( + sample, + out int result + ); + + // Assert + Assert.IsFalse(success); + Assert.That(result, Is.EqualTo(0)); + } + + [Test] + public static void Converting_Unsupported_Object_To_An_Int_Returns_False() + { + // Arrange + var clearlyWillNotConvertToInt = new StringBuilder(0); + + // Act + bool success = UmbracoHelper.ConvertIdObjectToInt( + clearlyWillNotConvertToInt, + out int result + ); + + // Assert + Assert.IsFalse(success); + Assert.That(result, Is.EqualTo(0)); + } + + // ------- GUID conversion tests + [Test] + public static void Converting_Boxed_Guid_To_A_Guid_Returns_Original_Guid_Value() + { + // Arrange + Guid sample = Guid.NewGuid(); + + // Act + bool success = UmbracoHelper.ConvertIdObjectToGuid( + sample, + out Guid result + ); + + // Assert + Assert.IsTrue(success); + Assert.That(result, Is.EqualTo(sample)); + } + + [Test] + public static void Converting_String_Guid_To_A_Guid_Returns_Original_Guid_Value() + { + // Arrange + Guid sample = Guid.NewGuid(); + + // Act + bool success = UmbracoHelper.ConvertIdObjectToGuid( + sample.ToString(), + out Guid result + ); + + // Assert + Assert.IsTrue(success); + Assert.That(result, Is.EqualTo(sample)); + } + + [Test] + public static void Converting_Hello_To_A_Guid_Returns_False() + { + // Arrange + const string sample = "Hello"; + + // Act + bool success = UmbracoHelper.ConvertIdObjectToGuid( + sample, + out Guid result + ); + + // Assert + Assert.IsFalse(success); + Assert.That(result, Is.EqualTo(new Guid("00000000-0000-0000-0000-000000000000"))); + } + + [Test] + public static void Converting_Unsupported_Object_To_A_Guid_Returns_False() + { + // Arrange + var clearlyWillNotConvertToGuid = new StringBuilder(0); + + // Act + bool success = UmbracoHelper.ConvertIdObjectToGuid( + clearlyWillNotConvertToGuid, + out Guid result + ); + + // Assert + Assert.IsFalse(success); + Assert.That(result, Is.EqualTo(new Guid("00000000-0000-0000-0000-000000000000"))); + } + + // ------- UDI Conversion Tests + [Test] + public void Converting_Boxed_Udi_To_A_Udi_Returns_Original_Udi_Value() + { + // Arrange + SetUpDependencyContainer(); + Udi.ResetUdiTypes(); + + Udi sample = new GuidUdi(Constants.UdiEntityType.AnyGuid, Guid.NewGuid()); + + // Act + bool success = UmbracoHelper.ConvertIdObjectToUdi( + sample, + out Udi result + ); + + // Assert + ResetDependencyContainer(); + + Assert.IsTrue(success); + Assert.That(result, Is.EqualTo(sample)); + } + + [Test] + public void Converting_String_Udi_To_A_Udi_Returns_Original_Udi_Value() + { + // Arrange + SetUpDependencyContainer(); + Udi.ResetUdiTypes(); + + Udi sample = new GuidUdi(Constants.UdiEntityType.AnyGuid, Guid.NewGuid()); + + // Act + bool success = UmbracoHelper.ConvertIdObjectToUdi( + sample.ToString(), + out Udi result + ); + + // Assert + ResetDependencyContainer(); + + Assert.IsTrue(success); + Assert.That(result, Is.EqualTo(sample)); + } + + [Test] + public void Converting_Hello_To_A_Udi_Returns_False() + { + // Arrange + SetUpDependencyContainer(); + Udi.ResetUdiTypes(); + + const string SAMPLE = "Hello"; + + // Act + bool success = UmbracoHelper.ConvertIdObjectToUdi( + SAMPLE, + out Udi result + ); + + // Assert + ResetDependencyContainer(); + + Assert.IsFalse(success); + Assert.That(result, Is.Null); + } + + [Test] + public void Converting_Unsupported_Object_To_A_Udi_Returns_False() + { + // Arrange + SetUpDependencyContainer(); + Udi.ResetUdiTypes(); + + var clearlyWillNotConvertToGuid = new StringBuilder(0); + + // Act + bool success = UmbracoHelper.ConvertIdObjectToUdi( + clearlyWillNotConvertToGuid, + out Udi result + ); + + // Assert + ResetDependencyContainer(); + + Assert.IsFalse(success); + Assert.That(result, Is.Null); + } + + private void SetUpDependencyContainer() + { + // fixme - bad in a unit test - but Udi has a static ctor that wants it?! + var container = new Mock(); + var globalSettings = SettingsForTests.GenerateMockGlobalSettings(); + + container + .Setup(x => x.GetInstance(typeof(TypeLoader))) + .Returns(new TypeLoader( + NullCacheProvider.Instance, + globalSettings, + new ProfilingLogger(Mock.Of(), Mock.Of()) + ) + ); + + Current.Container = container.Object; + } + + private void ResetDependencyContainer() => Current.Reset(); } } diff --git a/src/Umbraco.Web/UmbracoHelper.cs b/src/Umbraco.Web/UmbracoHelper.cs index 2bc25bb97c..b467a9a15c 100644 --- a/src/Umbraco.Web/UmbracoHelper.cs +++ b/src/Umbraco.Web/UmbracoHelper.cs @@ -8,15 +8,15 @@ using System.Web.Mvc; using System.Xml.XPath; using Umbraco.Core; using Umbraco.Core.Dictionary; -using Umbraco.Core.Services; -using Umbraco.Core.Xml; -using Umbraco.Web.Routing; -using Umbraco.Web.Security; using Umbraco.Core.Exceptions; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Services; +using Umbraco.Core.Xml; using Umbraco.Web.Composing; using Umbraco.Core.Cache; +using Umbraco.Web.Routing; +using Umbraco.Web.Security; namespace Umbraco.Web { @@ -673,6 +673,7 @@ namespace Umbraco.Web guidId = default; return false; } + } }