diff --git a/Our.Umbraco.TagHelpers.Tests/DictionaryTagHelperTests.cs b/Our.Umbraco.TagHelpers.Tests/DictionaryTagHelperTests.cs new file mode 100644 index 0000000..bffca8a --- /dev/null +++ b/Our.Umbraco.TagHelpers.Tests/DictionaryTagHelperTests.cs @@ -0,0 +1,128 @@ +using Microsoft.AspNetCore.Razor.TagHelpers; +using Moq; +using NUnit.Framework; +using System.Collections.Generic; +using System.Globalization; +using System.Threading.Tasks; +using Our.Umbraco.TagHelpers.Tests.Helpers; +using Umbraco.Cms.Core.Dictionary; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Services; + +namespace Our.Umbraco.TagHelpers.Tests +{ + public class DictionaryTagHelperTests + { + private Mock _mockLocalizationService; + private DictionaryTagHelper _tagHelper; + + [SetUp] + public void SetUp() + { + _mockLocalizationService = new Mock(); + _tagHelper = new DictionaryTagHelper(_mockLocalizationService.Object); + } + + [Test] + public async Task Process_WithValidKeyAndTranslation_ReturnsTranslation() + { + // Arrange + var key = "test.key"; + var expectedTranslation = "Test Translation"; + var culture = new CultureInfo("en-US"); + CultureInfo.CurrentCulture = culture; + + var mockDictionaryItem = new Mock(); + var mockLanguage = new Mock(); + mockLanguage.Setup(x => x.CultureInfo).Returns(culture); + + var mockTranslation = new Mock(); + mockTranslation.Setup(x => x.Language).Returns(mockLanguage.Object); + mockTranslation.Setup(x => x.Value).Returns(expectedTranslation); + + mockDictionaryItem.Setup(x => x.Translations).Returns(new List { mockTranslation.Object }); + + _mockLocalizationService.Setup(x => x.GetDictionaryItemByKey(key)).Returns(mockDictionaryItem.Object); + + var tagHelperContext = TestContextHelpers.GetTagHelperContext("dict-id"); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("our-dictionary"); + + _tagHelper.Key = key; + + // Act + await Task.Run(() => _tagHelper.Process(tagHelperContext, tagHelperOutput)); + + var content = tagHelperOutput.Content.GetContent(); + + // Assert + Assert.AreEqual("", tagHelperOutput.TagName); // Tag name should be removed + Assert.AreEqual(expectedTranslation, content); + } + + [Test] + public async Task Process_WithNullKey_DoesNotModifyContent() + { + // Arrange + var tagHelperContext = TestContextHelpers.GetTagHelperContext("dict-id"); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("our-dictionary"); + var originalContent = "Original content"; + tagHelperOutput.Content.SetHtmlContent(originalContent); + + _tagHelper.Key = null; + + // Act + await Task.Run(() => _tagHelper.Process(tagHelperContext, tagHelperOutput)); + + var content = tagHelperOutput.Content.GetContent(); + + // Assert + Assert.AreEqual("", tagHelperOutput.TagName); // Tag name should be removed + Assert.AreEqual(originalContent, content); + } + + [Test] + public async Task Process_WithEmptyKey_DoesNotModifyContent() + { + // Arrange + var tagHelperContext = TestContextHelpers.GetTagHelperContext("dict-id"); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("our-dictionary"); + var originalContent = "Original content"; + tagHelperOutput.Content.SetHtmlContent(originalContent); + + _tagHelper.Key = ""; + + // Act + await Task.Run(() => _tagHelper.Process(tagHelperContext, tagHelperOutput)); + + var content = tagHelperOutput.Content.GetContent(); + + // Assert + Assert.AreEqual("", tagHelperOutput.TagName); // Tag name should be removed + Assert.AreEqual(originalContent, content); + } + + [Test] + public async Task Process_WithNonExistentKey_DoesNotModifyContent() + { + // Arrange + var key = "nonexistent.key"; + _mockLocalizationService.Setup(x => x.GetDictionaryItemByKey(key)).Returns((IDictionaryItem)null); + + var tagHelperContext = TestContextHelpers.GetTagHelperContext("dict-id"); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("our-dictionary"); + var originalContent = "Original content"; + tagHelperOutput.Content.SetHtmlContent(originalContent); + + _tagHelper.Key = key; + + // Act + await Task.Run(() => _tagHelper.Process(tagHelperContext, tagHelperOutput)); + + var content = tagHelperOutput.Content.GetContent(); + + // Assert + Assert.AreEqual("", tagHelperOutput.TagName); // Tag name should be removed + Assert.AreEqual(originalContent, content); + } + } +} \ No newline at end of file diff --git a/Our.Umbraco.TagHelpers.Tests/EditLinkTagHelperTests.cs b/Our.Umbraco.TagHelpers.Tests/EditLinkTagHelperTests.cs new file mode 100644 index 0000000..2643f38 --- /dev/null +++ b/Our.Umbraco.TagHelpers.Tests/EditLinkTagHelperTests.cs @@ -0,0 +1,71 @@ +using Microsoft.AspNetCore.Razor.TagHelpers; +using Moq; +using NUnit.Framework; +using System.Threading.Tasks; +using Our.Umbraco.TagHelpers.Tests.Helpers; +using Our.Umbraco.TagHelpers.Services; +using Umbraco.Cms.Core.Web; + +namespace Our.Umbraco.TagHelpers.Tests +{ + public class EditLinkTagHelperTests + { + [Test] + public void Constructor_WithValidParameters_InitializesProperties() + { + // Arrange + var mockBackofficeUserAccessor = new Mock(); + var mockUmbracoContextAccessor = new Mock(); + + // Act + var tagHelper = new EditLinkTagHelper(mockBackofficeUserAccessor.Object, mockUmbracoContextAccessor.Object); + + // Assert + Assert.IsNotNull(tagHelper); + Assert.AreEqual("/umbraco#/content/content/edit/", tagHelper.EditUrl); + Assert.IsFalse(tagHelper.UseDefaultStyles); + Assert.AreEqual(int.MinValue, tagHelper.ContentId); + } + + [Test] + public void Properties_CanBeSetAndRetrieved() + { + // Arrange + var mockBackofficeUserAccessor = new Mock(); + var mockUmbracoContextAccessor = new Mock(); + var tagHelper = new EditLinkTagHelper(mockBackofficeUserAccessor.Object, mockUmbracoContextAccessor.Object); + + // Act + tagHelper.ContentId = 1234; + tagHelper.EditUrl = "/custom/edit/url/"; + tagHelper.UseDefaultStyles = true; + + // Assert + Assert.AreEqual(1234, tagHelper.ContentId); + Assert.AreEqual("/custom/edit/url/", tagHelper.EditUrl); + Assert.IsTrue(tagHelper.UseDefaultStyles); + } + + [Test] + public void Process_WithNoBackofficeUser_SuppressesOutput() + { + // Arrange + var mockBackofficeUserAccessor = new Mock(); + var mockUmbracoContextAccessor = new Mock(); + + // Setup: No backoffice user (null) + mockBackofficeUserAccessor.Setup(x => x.BackofficeUser).Returns((System.Security.Claims.ClaimsIdentity)null); + + var tagHelper = new EditLinkTagHelper(mockBackofficeUserAccessor.Object, mockUmbracoContextAccessor.Object); + var tagHelperContext = TestContextHelpers.GetTagHelperContext("edit-link-id"); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("our-edit-link"); + + // Act + tagHelper.Process(tagHelperContext, tagHelperOutput); + + // Assert - When no backoffice user, output should be suppressed (no tag name) + // The EditLinkTagHelper should suppress output when no backoffice user is found + Assert.IsNull(tagHelperOutput.TagName); + } + } +} \ No newline at end of file diff --git a/Our.Umbraco.TagHelpers.Tests/Our.Umbraco.TagHelpers.Tests.csproj b/Our.Umbraco.TagHelpers.Tests/Our.Umbraco.TagHelpers.Tests.csproj index 341eb07..32d85cd 100644 --- a/Our.Umbraco.TagHelpers.Tests/Our.Umbraco.TagHelpers.Tests.csproj +++ b/Our.Umbraco.TagHelpers.Tests/Our.Umbraco.TagHelpers.Tests.csproj @@ -1,7 +1,7 @@  - net5.0 + net8.0 false diff --git a/Our.Umbraco.TagHelpers.Tests/SurfaceControllerFormTagHelperTests.cs b/Our.Umbraco.TagHelpers.Tests/SurfaceControllerFormTagHelperTests.cs new file mode 100644 index 0000000..6bb8d35 --- /dev/null +++ b/Our.Umbraco.TagHelpers.Tests/SurfaceControllerFormTagHelperTests.cs @@ -0,0 +1,96 @@ +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Razor.TagHelpers; +using Moq; +using NUnit.Framework; +using Our.Umbraco.TagHelpers.Tests.Helpers; +using System; +using System.Collections.Generic; + +namespace Our.Umbraco.TagHelpers.Tests +{ + public class SurfaceControllerFormTagHelperTests + { + [Test] + public void Constructor_WithValidParameters_InitializesProperties() + { + // Arrange + var mockDataProtectionProvider = new Mock(); + + // Act + var tagHelper = new SurfaceControllerFormTagHelper(mockDataProtectionProvider.Object); + + // Assert + Assert.IsNotNull(tagHelper); + Assert.AreEqual("", tagHelper.Area); + Assert.IsNull(tagHelper.ControllerAction); + Assert.IsNull(tagHelper.ControllerName); + Assert.IsNotNull(tagHelper.RouteValues); + } + + [Test] + public void Properties_CanBeSetAndRetrieved() + { + // Arrange + var mockDataProtectionProvider = new Mock(); + var tagHelper = new SurfaceControllerFormTagHelper(mockDataProtectionProvider.Object); + + // Act + tagHelper.ControllerAction = "TestAction"; + tagHelper.ControllerName = "TestController"; + tagHelper.Area = "TestArea"; + + var routeValues = new Dictionary { { "id", "123" } }; + tagHelper.RouteValues = routeValues; + + // Assert + Assert.AreEqual("TestAction", tagHelper.ControllerAction); + Assert.AreEqual("TestController", tagHelper.ControllerName); + Assert.AreEqual("TestArea", tagHelper.Area); + Assert.AreEqual(routeValues, tagHelper.RouteValues); + } + + [Test] + public void Process_WithNullContext_ThrowsArgumentNullException() + { + // Arrange + var mockDataProtectionProvider = new Mock(); + var tagHelper = new SurfaceControllerFormTagHelper(mockDataProtectionProvider.Object); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("form"); + + // Act & Assert + Assert.Throws(() => tagHelper.Process(null, tagHelperOutput)); + } + + [Test] + public void Process_WithNullOutput_ThrowsArgumentNullException() + { + // Arrange + var mockDataProtectionProvider = new Mock(); + var tagHelper = new SurfaceControllerFormTagHelper(mockDataProtectionProvider.Object); + var tagHelperContext = TestContextHelpers.GetTagHelperContext("form-id"); + + // Act & Assert + Assert.Throws(() => tagHelper.Process(tagHelperContext, null)); + } + + [Test] + public void Process_WithEmptyControllerName_ReturnsEarly() + { + // Arrange + var mockDataProtectionProvider = new Mock(); + var tagHelper = new SurfaceControllerFormTagHelper(mockDataProtectionProvider.Object); + var tagHelperContext = TestContextHelpers.GetTagHelperContext("form-id"); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("form"); + + tagHelper.ControllerName = ""; + tagHelper.ControllerAction = "TestAction"; + + // Act - Should return early without doing anything + tagHelper.Process(tagHelperContext, tagHelperOutput); + + // Assert - Since it returns early, PostContent should not be modified + // This is a basic test to ensure the method doesn't throw + Assert.DoesNotThrow(() => tagHelper.Process(tagHelperContext, tagHelperOutput)); + } + } +} \ No newline at end of file diff --git a/Our.Umbraco.TagHelpers.Tests/VersionTagHelperTests.cs b/Our.Umbraco.TagHelpers.Tests/VersionTagHelperTests.cs new file mode 100644 index 0000000..19ab91f --- /dev/null +++ b/Our.Umbraco.TagHelpers.Tests/VersionTagHelperTests.cs @@ -0,0 +1,70 @@ +using Microsoft.AspNetCore.Razor.TagHelpers; +using NUnit.Framework; +using System.Threading.Tasks; +using Our.Umbraco.TagHelpers.Tests.Helpers; + +namespace Our.Umbraco.TagHelpers.Tests +{ + public class VersionTagHelperTests + { + [Test] + public async Task Process_WithNoAssemblyName_ReturnsEntryAssemblyVersion() + { + // Arrange + var id = "version-id"; + var tagHelperContext = TestContextHelpers.GetTagHelperContext(id); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("our-version"); + + var tagHelper = new VersionTagHelper(); + + // Act + await Task.Run(() => tagHelper.Process(tagHelperContext, tagHelperOutput)); + + var content = tagHelperOutput.Content.GetContent(); + + // Assert + Assert.AreEqual("", tagHelperOutput.TagName); // Tag name should be removed + Assert.IsNotNull(content); + Assert.IsNotEmpty(content); + } + + [Test] + public async Task Process_WithValidAssemblyName_ReturnsAssemblyVersion() + { + // Arrange + var id = "version-id"; + var tagHelperContext = TestContextHelpers.GetTagHelperContext(id); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("our-version"); + + var tagHelper = new VersionTagHelper { AssemblyName = "System.Private.CoreLib" }; + + // Act + await Task.Run(() => tagHelper.Process(tagHelperContext, tagHelperOutput)); + + var content = tagHelperOutput.Content.GetContent(); + + // Assert + Assert.AreEqual("", tagHelperOutput.TagName); // Tag name should be removed + Assert.IsNotNull(content); + Assert.IsNotEmpty(content); + } + + [Test] + public async Task Process_WithNonExistentAssemblyName_SuppressesOutput() + { + // Arrange + var id = "version-id"; + var tagHelperContext = TestContextHelpers.GetTagHelperContext(id); + var tagHelperOutput = TestContextHelpers.GetTagHelperOutput("our-version"); + + var tagHelper = new VersionTagHelper { AssemblyName = "NonExistentAssembly" }; + + // Act + await Task.Run(() => tagHelper.Process(tagHelperContext, tagHelperOutput)); + + // Assert - Should suppress output and have empty content + var content = tagHelperOutput.Content.GetContent(); + Assert.IsTrue(string.IsNullOrEmpty(content)); + } + } +} \ No newline at end of file diff --git a/Our.Umbraco.TagHelpers/Our.Umbraco.TagHelpers.csproj b/Our.Umbraco.TagHelpers/Our.Umbraco.TagHelpers.csproj index 69c8232..29a543e 100644 --- a/Our.Umbraco.TagHelpers/Our.Umbraco.TagHelpers.csproj +++ b/Our.Umbraco.TagHelpers/Our.Umbraco.TagHelpers.csproj @@ -41,7 +41,7 @@ - +