public void Process_HrefDefaultsToTagHelperOutputHrefAttributeAddedByOtherTagHelper( string href, string hrefOutput, string expectedHrefPrefix) { // Arrange var allAttributes = new TagHelperAttributeList( new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, { "asp-append-version", true }, }); var context = MakeTagHelperContext(allAttributes); var outputAttributes = new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, { "href", hrefOutput }, }; var output = MakeTagHelperOutput("link", outputAttributes); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var urlHelper = new Mock<IUrlHelper>(); // Ensure expanded path does not look like an absolute path on Linux, avoiding // https://github.com/aspnet/External/issues/21 urlHelper .Setup(urlhelper => urlhelper.Content(It.IsAny<string>())) .Returns(new Func<string, string>(url => url.Replace("~/", "virtualRoot/"))); var urlHelperFactory = new Mock<IUrlHelperFactory>(); urlHelperFactory .Setup(f => f.GetUrlHelper(It.IsAny<ActionContext>())) .Returns(urlHelper.Object); var helper = new LinkTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), urlHelperFactory.Object) { ViewContext = viewContext, AppendVersion = true, Href = href, }; // Act helper.Process(context, output); // Assert Assert.Equal( expectedHrefPrefix + "?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", (string)output.Attributes["href"].Value, StringComparer.Ordinal); }
public void RendersLinkTags_GlobbedHref_WithFileVersion() { // Arrange var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, { "href", "/css/site.css" }, { "asp-href-include", "**/*.css" }, { "asp-append-version", "true" }, }); var output = MakeTagHelperOutput("link", attributes: new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, }); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>( new TestFileProvider(), Mock.Of<IMemoryCache>(), PathString.Empty); globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null)) .Returns(new[] { "/base.css" }); var helper = new LinkTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { GlobbingUrlBuilder = globbingUrlBuilder.Object, ViewContext = viewContext, Href = "/css/site.css", HrefInclude = "**/*.css", AppendVersion = true }; // Act helper.Process(context, output); // Assert Assert.Equal("link", output.TagName); Assert.Equal("/css/site.css?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", output.Attributes["href"].Value); var content = HtmlContentUtilities.HtmlContentToString(output.PostElement, new HtmlTestEncoder()); Assert.Equal( "<link rel=\"stylesheet\" href=\"HtmlEncode[[/base.css?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk]]\" />", content); }
public void RenderLinkTags_FallbackHref_WithFileVersion_EncodesAsExpected() { // Arrange var expectedContent = "<link encoded=\"contains \"quotes\"\" " + "href=\"HtmlEncode[[/css/site.css?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk]]\" " + "literal=\"HtmlEncode[[all HTML encoded]]\" " + "mixed=\"HtmlEncode[[HTML encoded]] and contains \"quotes\"\" />" + Environment.NewLine + "<meta name=\"x-stylesheet-fallback-test\" content=\"\" class=\"HtmlEncode[[hidden]]\" />" + "<script>!function(a,b,c){var d,e=document,f=e.getElementsByTagName(\"SCRIPT\")," + "g=f[f.length-1].previousElementSibling," + "h=e.defaultView&&e.defaultView.getComputedStyle?e.defaultView.getComputedStyle(g):g.currentStyle;" + "if(h&&h[a]!==b)for(d=0;d<c.length;d++)e.write('<link rel=\"stylesheet\" href=\"'+c[d]+'\"/>')}(" + "\"JavaScriptEncode[[visibility]]\",\"JavaScriptEncode[[hidden]]\"," + "[\"JavaScriptEncode[[HtmlEncode[[/fallback.css?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk]]]]\"]);" + "</script>"; var mixed = new DefaultTagHelperContent(); mixed.Append("HTML encoded"); mixed.AppendHtml(" and contains \"quotes\""); var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { { "asp-append-version", "true" }, { "asp-fallback-href-include", "**/fallback.css" }, { "asp-fallback-test-class", "hidden" }, { "asp-fallback-test-property", "visibility" }, { "asp-fallback-test-value", "hidden" }, { "encoded", new HtmlString("contains \"quotes\"") }, { "href", "/css/site.css" }, { "literal", "all HTML encoded" }, { "mixed", mixed }, }); var output = MakeTagHelperOutput( "link", attributes: new TagHelperAttributeList { { "encoded", new HtmlString("contains \"quotes\"") }, { "literal", "all HTML encoded" }, { "mixed", mixed }, }); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>( new TestFileProvider(), Mock.Of<IMemoryCache>(), PathString.Empty); globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/fallback.css", null)) .Returns(new[] { "/fallback.css" }); var helper = new LinkTagHelper( MakeHostingEnvironment(), MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { AppendVersion = true, FallbackHrefInclude = "**/fallback.css", FallbackTestClass = "hidden", FallbackTestProperty = "visibility", FallbackTestValue = "hidden", GlobbingUrlBuilder = globbingUrlBuilder.Object, Href = "/css/site.css", ViewContext = viewContext, }; // Act helper.Process(context, output); // Assert Assert.Equal("link", output.TagName); Assert.Equal("/css/site.css?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", output.Attributes["href"].Value); var content = HtmlContentUtilities.HtmlContentToString(output, new HtmlTestEncoder()); Assert.Equal(expectedContent, content); }
public void RendersLinkTags_WithFileVersion_AndRequestPathBase() { // Arrange var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, { "href", "/bar/css/site.css" }, { "asp-append-version", "true" }, }); var output = MakeTagHelperOutput("link", attributes: new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, }); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext("/bar"); var helper = new LinkTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, Href = "/bar/css/site.css", AppendVersion = true }; // Act helper.Process(context, output); // Assert Assert.Equal("link", output.TagName); Assert.Equal("/bar/css/site.css?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", output.Attributes["href"].Value); }
public void RendersLinkTagsForGlobbedHrefResults_EncodesAsExpected() { // Arrange var expectedContent = "<link encoded='contains \"quotes\"' href=\"HtmlEncode[[/css/site.css]]\" " + "literal=\"HtmlEncode[[all HTML encoded]]\" " + "mixed='HtmlEncode[[HTML encoded]] and contains \"quotes\"' />" + "<link encoded='contains \"quotes\"' href=\"HtmlEncode[[/base.css]]\" " + "literal=\"HtmlEncode[[all HTML encoded]]\" " + "mixed='HtmlEncode[[HTML encoded]] and contains \"quotes\"' />"; var mixed = new DefaultTagHelperContent(); mixed.Append("HTML encoded"); mixed.AppendHtml(" and contains \"quotes\""); var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { { "asp-href-include", "**/*.css" }, { new TagHelperAttribute("encoded", new HtmlString("contains \"quotes\""), HtmlAttributeValueStyle.SingleQuotes) }, { "href", "/css/site.css" }, { "literal", "all HTML encoded" }, { new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) }, }); var output = MakeTagHelperOutput( "link", attributes: new TagHelperAttributeList { { new TagHelperAttribute("encoded", new HtmlString("contains \"quotes\""), HtmlAttributeValueStyle.SingleQuotes) }, { "literal", "all HTML encoded" }, { new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) }, }); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>( new TestFileProvider(), Mock.Of<IMemoryCache>(), PathString.Empty); globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null)) .Returns(new[] { "/base.css" }); var helper = new LinkTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { GlobbingUrlBuilder = globbingUrlBuilder.Object, Href = "/css/site.css", HrefInclude = "**/*.css", ViewContext = viewContext, }; // Act helper.Process(context, output); // Assert Assert.Equal("link", output.TagName); Assert.Equal("/css/site.css", output.Attributes["href"].Value); var content = HtmlContentUtilities.HtmlContentToString(output, new HtmlTestEncoder()); Assert.Equal(expectedContent, content); }
public void RendersLinkTagsForGlobbedHrefResults() { // Arrange var expectedContent = "<link rel=\"stylesheet\" href=\"HtmlEncode[[/css/site.css]]\" />" + "<link rel=\"stylesheet\" href=\"HtmlEncode[[/base.css]]\" />"; var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, { "href", "/css/site.css" }, { "asp-href-include", "**/*.css" }, }); var output = MakeTagHelperOutput("link", attributes: new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, }); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>( new TestFileProvider(), Mock.Of<IMemoryCache>(), PathString.Empty); globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null)) .Returns(new[] { "/base.css" }); var helper = new LinkTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { GlobbingUrlBuilder = globbingUrlBuilder.Object, ViewContext = viewContext, Href = "/css/site.css", HrefInclude = "**/*.css", }; // Act helper.Process(context, output); // Assert Assert.Equal("link", output.TagName); Assert.Equal("/css/site.css", output.Attributes["href"].Value); var content = HtmlContentUtilities.HtmlContentToString(output, new HtmlTestEncoder()); Assert.Equal(expectedContent, content); }
public void DoesNotRunWhenAllRequiredAttributesAreMissing() { // Arrange var context = MakeTagHelperContext(); var output = MakeTagHelperOutput("link"); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var helper = new LinkTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, }; // Act helper.Process(context, output); // Assert Assert.NotNull(output.TagName); Assert.False(output.IsContentModified); Assert.Empty(output.Attributes); Assert.True(output.PostElement.GetContent().Length == 0); }
public void PreservesOrderOfNonHrefAttributes() { // Arrange var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, { "href", "test.css" }, { "data-extra", new HtmlString("something") }, { "asp-fallback-href", "test.css" }, { "asp-fallback-test-class", "hidden" }, { "asp-fallback-test-property", "visibility" }, { "asp-fallback-test-value", "hidden" }, }); var output = MakeTagHelperOutput("link", attributes: new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, { "data-extra", new HtmlString("something") }, }); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var helper = new LinkTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, FallbackHref = "test.css", FallbackTestClass = "hidden", FallbackTestProperty = "visibility", FallbackTestValue = "hidden", Href = "test.css", }; // Act helper.Process(context, output); // Assert Assert.Equal("rel", output.Attributes[0].Name); Assert.Equal("href", output.Attributes[1].Name); Assert.Equal("data-extra", output.Attributes[2].Name); }
public void RunsWhenRequiredAttributesArePresent_NoHref( TagHelperAttributeList attributes, Action<LinkTagHelper> setProperties) { // Arrange var context = MakeTagHelperContext(attributes); var output = MakeTagHelperOutput("link"); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>( new TestFileProvider(), Mock.Of<IMemoryCache>(), PathString.Empty); globbingUrlBuilder.Setup(g => g.BuildUrlList(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())) .Returns(new[] { "/common.css" }); var helper = new LinkTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, GlobbingUrlBuilder = globbingUrlBuilder.Object }; setProperties(helper); // Act helper.Process(context, output); // Assert Assert.Null(output.TagName); Assert.True(output.IsContentModified); Assert.True(output.Content.GetContent().Length == 0); Assert.True(output.PostElement.IsModified); }
public void HandlesMultipleAttributesSameNameCorrectly(TagHelperAttributeList outputAttributes) { // Arrange var allAttributes = new TagHelperAttributeList( outputAttributes.Concat( new TagHelperAttributeList { { "rel", new HtmlString("stylesheet") }, { "href", "test.css" }, { "asp-fallback-href", "test.css" }, { "asp-fallback-test-class", "hidden" }, { "asp-fallback-test-property", "visibility" }, { "asp-fallback-test-value", "hidden" }, })); var context = MakeTagHelperContext(allAttributes); var combinedOutputAttributes = new TagHelperAttributeList( outputAttributes.Concat( new[] { new TagHelperAttribute("rel", new HtmlString("stylesheet")) })); var output = MakeTagHelperOutput("link", combinedOutputAttributes); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var helper = new LinkTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, FallbackHref = "test.css", FallbackTestClass = "hidden", FallbackTestProperty = "visibility", FallbackTestValue = "hidden", Href = "test.css", }; var expectedAttributes = new TagHelperAttributeList(output.Attributes); expectedAttributes.Add(new TagHelperAttribute("href", "test.css")); // Act helper.Process(context, output); // Assert Assert.Equal(expectedAttributes, output.Attributes); }