Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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());
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }