public void Process_SrcDefaultsToTagHelperOutputSrcAttributeAddedByOtherTagHelper( string src, string srcOutput, string expectedSrcPrefix) { // Arrange var allAttributes = new TagHelperAttributeList( new TagHelperAttributeList { { "type", new HtmlString("text/javascript") }, { "asp-append-version", true }, }); var context = MakeTagHelperContext(allAttributes); var outputAttributes = new TagHelperAttributeList { { "type", new HtmlString("text/javascript") }, { "src", srcOutput }, }; var output = MakeTagHelperOutput("script", 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 ScriptTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), urlHelperFactory.Object) { ViewContext = viewContext, AppendVersion = true, Src = src, }; // Act helper.Process(context, output); // Assert Assert.Equal( expectedSrcPrefix + "?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", (string)output.Attributes["src"].Value, StringComparer.Ordinal); }
public void HandlesMultipleAttributesSameNameCorrectly(TagHelperAttributeList outputAttributes) { // Arrange var allAttributes = new TagHelperAttributeList( outputAttributes.Concat( new TagHelperAttributeList { new TagHelperAttribute("data-extra", "something"), new TagHelperAttribute("src", "/blank.js"), new TagHelperAttribute("asp-fallback-src", "http://www.example.com/blank.js"), new TagHelperAttribute("asp-fallback-test", "isavailable()"), })); var tagHelperContext = MakeTagHelperContext(allAttributes); var viewContext = MakeViewContext(); var combinedOutputAttributes = new TagHelperAttributeList( outputAttributes.Concat( new[] { new TagHelperAttribute("data-extra", new HtmlString("something")) })); var output = MakeTagHelperOutput("script", combinedOutputAttributes); var hostingEnvironment = MakeHostingEnvironment(); var helper = new ScriptTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, FallbackSrc = "~/blank.js", FallbackTestExpression = "http://www.example.com/blank.js", Src = "/blank.js", }; var expectedAttributes = new TagHelperAttributeList(output.Attributes); expectedAttributes.Add(new TagHelperAttribute("src", "/blank.js")); // Act helper.Process(tagHelperContext, output); // Assert Assert.Equal(expectedAttributes, output.Attributes); }
public void RenderScriptTags_GlobbedSrc_WithFileVersion() { // Arrange var expectedContent = "<script " + "src=\"HtmlEncode[[/js/site.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk]]\"></script>" + "<script src=\"HtmlEncode[[/common.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk]]\"></script>"; var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { new TagHelperAttribute("src", "/js/site.js"), new TagHelperAttribute("asp-src-include", "*.js"), new TagHelperAttribute("asp-append-version", "true") }); var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList()); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var globbingUrlBuilder = new Mock<GlobbingUrlBuilder>( new TestFileProvider(), Mock.Of<IMemoryCache>(), PathString.Empty); globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "*.js", null)) .Returns(new[] { "/common.js" }); var helper = new ScriptTagHelper( MakeHostingEnvironment(), MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { GlobbingUrlBuilder = globbingUrlBuilder.Object, ViewContext = viewContext, SrcInclude = "*.js", AppendVersion = true, Src = "/js/site.js", }; // Act helper.Process(context, output); // Assert Assert.Equal("script", output.TagName); Assert.Equal("/js/site.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", output.Attributes["src"].Value); var content = HtmlContentUtilities.HtmlContentToString(output, new HtmlTestEncoder()); Assert.Equal(expectedContent, content); }
public void RenderScriptTags_FallbackSrc_WithFileVersion_EncodesAsExpected() { // Arrange var expectedContent = "<script encoded='contains \"quotes\"' literal=\"HtmlEncode[[all HTML encoded]]\" " + "mixed='HtmlEncode[[HTML encoded]] and contains \"quotes\"' " + "src=\"HtmlEncode[[/js/site.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk]]\"></script>" + Environment.NewLine + "<script>(isavailable()||document.write(\"JavaScriptEncode[[<script encoded=\'contains \"quotes\"\' " + "literal=\"HtmlEncode[[all HTML encoded]]\" mixed=\'HtmlEncode[[HTML encoded]] and contains " + "\"quotes\"' src=\"HtmlEncode[[fallback.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk]]\">" + "</script>]]\"));</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-src-include", "fallback.js" }, { "asp-fallback-test", "isavailable()" }, { new TagHelperAttribute("encoded", new HtmlString("contains \"quotes\""), HtmlAttributeValueStyle.SingleQuotes) }, { "literal", "all HTML encoded" }, { new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) }, { "src", "/js/site.js" }, }); var output = MakeTagHelperOutput( "script", 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 helper = new ScriptTagHelper( MakeHostingEnvironment(), MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { AppendVersion = true, FallbackSrc = "fallback.js", FallbackTestExpression = "isavailable()", Src = "/js/site.js", ViewContext = viewContext, }; // Act helper.Process(context, output); // Assert Assert.Equal("script", output.TagName); Assert.Equal("/js/site.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", output.Attributes["src"].Value); var content = HtmlContentUtilities.HtmlContentToString(output, new HtmlTestEncoder()); Assert.Equal(expectedContent, content); }
public void RenderScriptTags_FallbackSrc_WithFileVersion() { // Arrange var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { new TagHelperAttribute("src", "/js/site.js"), new TagHelperAttribute("asp-fallback-src-include", "fallback.js"), new TagHelperAttribute("asp-fallback-test", "isavailable()"), new TagHelperAttribute("asp-append-version", "true") }); var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList()); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var helper = new ScriptTagHelper( MakeHostingEnvironment(), MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, FallbackSrc = "fallback.js", FallbackTestExpression = "isavailable()", AppendVersion = true, Src = "/js/site.js", }; // Act helper.Process(context, output); // Assert Assert.Equal("script", output.TagName); Assert.Equal("/js/site.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", output.Attributes["src"].Value); Assert.Equal(Environment.NewLine + "<script>(isavailable()||document.write(\"JavaScriptEncode[[<script " + "src=\"HtmlEncode[[fallback.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk]]\">" + "</script>]]\"));</script>", output.PostElement.GetContent()); }
public void RenderScriptTags_WithFileVersion_AndRequestPathBase() { // Arrange var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { new TagHelperAttribute("src", "/bar/js/site.js"), new TagHelperAttribute("asp-append-version", "true") }); var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList()); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext("/bar"); var helper = new ScriptTagHelper( MakeHostingEnvironment(), MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, AppendVersion = true, Src = "/bar/js/site.js", }; // Act helper.Process(context, output); // Assert Assert.Equal("script", output.TagName); Assert.Equal("/bar/js/site.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", output.Attributes["src"].Value); }
public void RendersScriptTagsForGlobbedSrcResults_EncodesAsExpected() { // Arrange var expectedContent = "<script encoded='contains \"quotes\"' literal=\"HtmlEncode[[all HTML encoded]]\" " + "mixed='HtmlEncode[[HTML encoded]] and contains \"quotes\"' " + "src=\"HtmlEncode[[/js/site.js]]\"></script>" + "<script encoded='contains \"quotes\"' literal=\"HtmlEncode[[all HTML encoded]]\" " + "mixed='HtmlEncode[[HTML encoded]] and contains \"quotes\"' " + "src=\"HtmlEncode[[/common.js]]\"></script>"; var mixed = new DefaultTagHelperContent(); mixed.Append("HTML encoded"); mixed.AppendHtml(" and contains \"quotes\""); var context = MakeTagHelperContext( attributes: new TagHelperAttributeList { { "asp-src-include", "**/*.js" }, { new TagHelperAttribute("encoded", new HtmlString("contains \"quotes\""), HtmlAttributeValueStyle.SingleQuotes) }, { "literal", "all HTML encoded" }, { new TagHelperAttribute("mixed", mixed, HtmlAttributeValueStyle.SingleQuotes) }, { "src", "/js/site.js" }, }); var output = MakeTagHelperOutput( "script", 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, "**/*.js", null)) .Returns(new[] { "/common.js" }); var helper = new ScriptTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { GlobbingUrlBuilder = globbingUrlBuilder.Object, Src = "/js/site.js", SrcInclude = "**/*.js", ViewContext = viewContext, }; // Act helper.Process(context, output); // Assert Assert.Equal("script", output.TagName); Assert.Equal("/js/site.js", output.Attributes["src"].Value); var content = HtmlContentUtilities.HtmlContentToString(output, new HtmlTestEncoder()); Assert.Equal(expectedContent, content); }
public void PreservesOrderOfNonSrcAttributes() { // Arrange var tagHelperContext = MakeTagHelperContext( attributes: new TagHelperAttributeList { new TagHelperAttribute("data-extra", "something"), new TagHelperAttribute("src", "/blank.js"), new TagHelperAttribute("data-more", "else"), new TagHelperAttribute("asp-fallback-src", "http://www.example.com/blank.js"), new TagHelperAttribute("asp-fallback-test", "isavailable()"), }); var viewContext = MakeViewContext(); var output = MakeTagHelperOutput("src", attributes: new TagHelperAttributeList { new TagHelperAttribute("data-extra", "something"), new TagHelperAttribute("data-more", "else"), }); var hostingEnvironment = MakeHostingEnvironment(); var helper = new ScriptTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, FallbackSrc = "~/blank.js", FallbackTestExpression = "http://www.example.com/blank.js", Src = "/blank.js", }; // Act helper.Process(tagHelperContext, output); // Assert Assert.Equal("data-extra", output.Attributes[0].Name); Assert.Equal("src", output.Attributes[1].Name); Assert.Equal("data-more", output.Attributes[2].Name); }
public void DoesNotRunWhenAllRequiredAttributesAreMissing() { // Arrange var tagHelperContext = MakeTagHelperContext(); var viewContext = MakeViewContext(); var output = MakeTagHelperOutput("script"); var helper = new ScriptTagHelper( MakeHostingEnvironment(), MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, }; // Act helper.Process(tagHelperContext, output); // Assert Assert.Equal("script", output.TagName); Assert.False(output.IsContentModified); Assert.Empty(output.Attributes); Assert.True(output.PostElement.GetContent().Length == 0); }
public void DoesNotRunWhenARequiredAttributeIsMissing( TagHelperAttributeList attributes, Action<ScriptTagHelper> setProperties) { // Arrange var tagHelperContext = MakeTagHelperContext(attributes); var output = MakeTagHelperOutput("script"); var logger = new Mock<ILogger<ScriptTagHelper>>(); var hostingEnvironment = MakeHostingEnvironment(); var viewContext = MakeViewContext(); var helper = new ScriptTagHelper( hostingEnvironment, MakeCache(), new HtmlTestEncoder(), new JavaScriptTestEncoder(), MakeUrlHelperFactory()) { ViewContext = viewContext, }; setProperties(helper); // Act helper.Process(tagHelperContext, output); // Assert Assert.NotNull(output.TagName); Assert.False(output.IsContentModified); Assert.Empty(output.Attributes); Assert.True(output.PostElement.GetContent().Length == 0); }
public void RunsWhenRequiredAttributesArePresent_NoSrc( TagHelperAttributeList attributes, Action<ScriptTagHelper> setProperties) { // Arrange var context = MakeTagHelperContext(attributes); var output = MakeTagHelperOutput("script"); 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.js" }); var helper = new ScriptTagHelper( 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); }