From fbfaac0e4709e208282c56a2a807d093164f17c1 Mon Sep 17 00:00:00 2001 From: Jamie Pollock Date: Tue, 23 Jan 2024 17:35:20 -0500 Subject: [PATCH] feat (Tests): adds link tag helper renderer tests --- .../{Components => }/FakeComponent.cs | 2 +- .../DefaultLinkTagHelperRendererTests.cs | 99 +++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) rename tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/{Components => }/FakeComponent.cs (64%) create mode 100644 tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/Links/DefaultLinkTagHelperRendererTests.cs diff --git a/tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/Components/FakeComponent.cs b/tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/FakeComponent.cs similarity index 64% rename from tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/Components/FakeComponent.cs rename to tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/FakeComponent.cs index c16373d..ed22259 100644 --- a/tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/Components/FakeComponent.cs +++ b/tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/FakeComponent.cs @@ -1,4 +1,4 @@ -namespace Rhythm.Drop.Web.Tests.TagHelperRenderers.Components; +namespace Rhythm.Drop.Web.Tests.TagHelperRenderers; using Rhythm.Drop.Models.Components; internal class FakeComponent : IComponent diff --git a/tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/Links/DefaultLinkTagHelperRendererTests.cs b/tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/Links/DefaultLinkTagHelperRendererTests.cs new file mode 100644 index 0000000..ae6e442 --- /dev/null +++ b/tests/Rhythm.Drop.Web.Tests/TagHelperRenderers/Links/DefaultLinkTagHelperRendererTests.cs @@ -0,0 +1,99 @@ +namespace Rhythm.Drop.Web.Tests.TagHelperRenderers.Links; + +using Microsoft.AspNetCore.Html; +using Microsoft.AspNetCore.Razor.TagHelpers; +using Rhythm.Drop.Models.Common.Attributes; +using Rhythm.Drop.Models.Links; +using Rhythm.Drop.Models.Modals; +using Rhythm.Drop.Web.TagHelperRenderers.Links; +using System.Threading.Tasks; + +[TestFixture] +public class DefaultLinkTagHelperRendererTests : TagHelperRendererTestsBase +{ + private const string DefaultUrl = "#"; + + private const string DefaultLabel = "Click Me"; + + private const string HrefAttributeName = "href"; + + [Test] + public async Task RenderAsync_With_No_Link_Should_Return_Nothing() + { + var tagHelperRenderer = new DefaultDropLinkTagHelperRenderer(); + var context = CreateTagHelperContext(DefaultTagName); + var output = CreateTagHelperOutput(DefaultTagName); + + await tagHelperRenderer.RenderAsync(default, context, output); + + Assert.Multiple(() => + { + Assert.That(output.TagName, Is.Not.EqualTo(DefaultTagName)); + Assert.That(output.Content.IsModified, Is.False); + }); + } + + [Test] + public async Task RenderAsync_With_Anchor_Link_Should_Return_Modified_Content() + { + var tagHelperRenderer = new DefaultDropLinkTagHelperRenderer(); + var context = CreateTagHelperContext(DefaultTagName); + var output = CreateTagHelperOutput(DefaultTagName); + var link = CreateAnchorLink(DefaultUrl); + + await tagHelperRenderer.RenderAsync(link, context, output); + + Assert.Multiple(() => + { + Assert.That(output.TagName, Is.EqualTo("a")); + Assert.That(output.Attributes, Has.One.Matches(x => x.Name == HrefAttributeName && x.Value.ToString() == DefaultUrl)); + Assert.That(output.Content.IsModified, Is.True); + }); + } + + [Test] + public async Task RenderAsync_With_Modal_Link_Should_Return_Modified_Content() + { + var tagHelperRenderer = new DefaultDropLinkTagHelperRenderer(); + var context = CreateTagHelperContext(DefaultTagName); + var output = CreateTagHelperOutput(DefaultTagName); + + var modal = new Modal("test", [new FakeComponent()]); + var link = new ModalLink(modal, "Click Me", ReadOnlyHtmlAttributeCollection.Empty()); + + await tagHelperRenderer.RenderAsync(link, context, output); + + Assert.Multiple(() => + { + Assert.That(output.TagName, Is.EqualTo("button")); + Assert.That(output.Attributes, Has.One.Matches(x => x.Name == "data-modal-target" && x.Value.ToString() == "test")); + Assert.That(output.Content.IsModified, Is.True); + }); + } + + [Test] + public async Task RenderAsync_With_Link_And_Existing_Content_Should_Return_Only_Outter_Modified_Content() + { + var tagHelperRenderer = new DefaultDropLinkTagHelperRenderer(); + var context = CreateTagHelperContext(DefaultTagName); + var output = CreateTagHelperOutput(DefaultTagName, new HtmlString("Existing Content")); + + var link = CreateAnchorLink(DefaultUrl); + await tagHelperRenderer.RenderAsync(link, context, output); + + Assert.Multiple(() => + { + Assert.That(output.TagName, Is.EqualTo("a")); + Assert.That(output.Attributes, Has.One.Matches(x => x.Name == HrefAttributeName && x.Value.ToString() == DefaultUrl)); + Assert.That(output.Content.IsModified, Is.False); + }); + } + + private static AnchorLink CreateAnchorLink(string url) + { + var linkAttributes = new HtmlAttributeCollection(); + linkAttributes.SetAttribute("href", url); + + return new AnchorLink(DefaultLabel, linkAttributes.ToReadOnly()); + } +}