public async Task ProcessAsync_WithValueAndAspFor_RendersTextAreaWithValue() { // Arrange var modelValue = "Foo value"; var model = new Model() { Foo = modelValue }; var modelExplorer = new EmptyModelMetadataProvider().GetModelExplorerForType(typeof(Model), model) .GetExplorerForProperty(nameof(Model.Foo)); var viewContext = new ViewContext(); var modelExpression = nameof(Model.Foo); var modelHelper = new Mock <IModelHelper>(); modelHelper.Setup(mock => mock.GetModelValue(viewContext, modelExplorer, modelExpression)).Returns(modelValue); var context = new TagHelperContext( tagName: "govuk-character-count", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-character-count", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var characterCountContext = context.GetContextItem <CharacterCountContext>(); characterCountContext.SetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); characterCountContext.SetValue(new HtmlString("Value")); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new CharacterCountTagHelper(modelHelper: modelHelper.Object) { AspFor = new ModelExpression(modelExpression, modelExplorer), Name = "my-name", MaxWords = 10, ViewContext = viewContext }; // Act await tagHelper.ProcessAsync(context, output); // Assert var element = output.RenderToElement(); var textarea = element.GetElementsByTagName("textarea")[0]; Assert.Equal("Value", textarea.InnerHtml); }
public async Task ProcessAsync_WithMaxLengthGeneratesExpectedOutput() { // Arrange var context = new TagHelperContext( tagName: "govuk-character-count", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-character-count", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var formGroupContext = (TextAreaBuilder)context.Items[typeof(FormGroupBuilder)]; formGroupContext.TrySetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); formGroupContext.TrySetElementContent(new HtmlString("The content")); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new CharacterCountTagHelper(new DefaultGovUkHtmlGenerator(), new DefaultModelHelper()) { Id = "my-id", Name = "my-name", MaxLength = 200, Threshold = 90 }; // Act await tagHelper.ProcessAsync(context, output); // Assert var html = output.AsString(); var node = HtmlNode.CreateNode(html); Assert.Equal("govuk-character-count", node.Attributes["class"].Value); Assert.Equal("govuk-character-count", node.Attributes["data-module"].Value); Assert.Equal("200", node.Attributes["data-maxlength"].Value); Assert.Equal("90", node.Attributes["data-threshold"].Value); Assert.DoesNotContain(node.Attributes, a => a.Name == "data-maxwords"); var textarea = node.ChildNodes.FindFirst("textarea"); Assert.Contains("govuk-js-character-count", textarea.GetCssClasses()); var hint = node.SelectSingleNode("//div[contains(@class, 'govuk-hint')]"); Assert.Equal("my-id-info", hint.Id); Assert.Contains("govuk-character-count__message", hint.GetCssClasses()); Assert.Equal("polite", hint.Attributes["aria-live"].Value); Assert.Equal("You can enter up to 200 characters", hint.InnerText); }
public async Task ProcessAsync_WithMaxLength_GeneratesExpectedOutput() { // Arrange var context = new TagHelperContext( tagName: "govuk-character-count", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-character-count", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var characterCountContext = context.GetContextItem <CharacterCountContext>(); characterCountContext.SetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); characterCountContext.SetHint( attributes: null, content: new HtmlString("The hint")); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new CharacterCountTagHelper() { Id = "my-id", Name = "my-name", MaxLength = 200, Threshold = 90 }; // Act await tagHelper.ProcessAsync(context, output); // Assert var expectedHtml = @" <div class=""govuk-character-count"" data-module=""govuk-character-count"" data-maxlength=""200"" data-threshold=""90""> <div class=""govuk-form-group""> <label class=""govuk-label"" for=""my-id"">The label</label> <div class=""govuk-hint"" id=""my-id-hint"">The hint</div> <textarea class=""govuk-textarea govuk-js-character-count"" id=""my-id"" name=""my-name"" rows=""5"" aria-describedby=""my-id-hint""></textarea> </div> <div id=""my-id-info"" class=""govuk-hint govuk-character-count__message""> You can enter up to 200 characters </div> </div>"; AssertEx.HtmlEqual(expectedHtml, output.RenderToString()); }
public async Task ProcessAsync_BothMaxLengthAndMaxWords_ThrowsInvalidOperationException() { // Arrange var context = new TagHelperContext( tagName: "govuk-character-count", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-character-count", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var characterCountContext = context.GetContextItem <CharacterCountContext>(); characterCountContext.SetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); characterCountContext.SetHint( attributes: null, content: new HtmlString("The hint")); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new CharacterCountTagHelper() { Id = "my-id", Name = "my-name", MaxLength = 100, MaxWords = 10 }; // Act var ex = await Record.ExceptionAsync(() => tagHelper.ProcessAsync(context, output)); // Assert Assert.IsType <InvalidOperationException>(ex); Assert.Equal("Only one of the 'max-length' or 'max-words' attributes can be specified.", ex.Message); }
public async Task ProcessAsync_WithValue_RendersTextAreaWithValue() { // Arrange var context = new TagHelperContext( tagName: "govuk-character-count", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-character-count", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var characterCountContext = context.GetContextItem <CharacterCountContext>(); characterCountContext.SetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); characterCountContext.SetValue(new HtmlString("Value")); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new CharacterCountTagHelper() { Name = "my-name", MaxWords = 10, }; // Act await tagHelper.ProcessAsync(context, output); // Assert var element = output.RenderToElement(); var textarea = element.GetElementsByTagName("textarea")[0]; Assert.Equal("Value", textarea.InnerHtml); }
public async Task ProcessAsync_ThresholdInvalidThrowsInvalidOperationException(decimal threshold) { // Arrange var context = new TagHelperContext( tagName: "govuk-character-count", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-character-count", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var formGroupContext = (TextAreaBuilder)context.Items[typeof(FormGroupBuilder)]; formGroupContext.TrySetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); formGroupContext.TrySetElementContent(new HtmlString("The content")); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new CharacterCountTagHelper(new DefaultGovUkHtmlGenerator(), new DefaultModelHelper()) { Id = "my-id", Name = "my-name", MaxWords = 10, Threshold = threshold }; // Act & Assert var ex = await Assert.ThrowsAsync <InvalidOperationException>(() => tagHelper.ProcessAsync(context, output)); Assert.Equal("The 'threshold' attribute is invalid.", ex.Message); }