Esempio n. 1
0
        protected virtual TagHelperOutput GetSelectTag(TagHelperContext context, TagHelperOutput output)
        {
            var selectTagHelper = new SelectTagHelper(_generator)
            {
                For         = TagHelper.AspFor,
                Items       = GetSelectItems(context, output),
                ViewContext = TagHelper.ViewContext
            };

            var selectTagHelperOutput = GetInnerTagHelper(GetInputAttributes(context, output), context, selectTagHelper, "select", TagMode.StartTagAndEndTag);

            selectTagHelperOutput.Attributes.AddClass("form-control");
            selectTagHelperOutput.Attributes.AddClass(GetSize(context, output));
            AddDisabledAttribute(selectTagHelperOutput);
            AddInfoTextId(selectTagHelperOutput);

            return(selectTagHelperOutput);
        }
Esempio n. 2
0
        protected virtual async Task <TagHelperOutput> GetSelectTagAsync(TagHelperContext context, TagHelperOutput output)
        {
            var selectTagHelper = new SelectTagHelper(_generator)
            {
                For         = TagHelper.AspFor,
                Items       = GetSelectItems(context, output),
                ViewContext = TagHelper.ViewContext
            };

            var selectTagHelperOutput = await selectTagHelper.ProcessAndGetOutputAsync(GetInputAttributes(context, output), context, "select", TagMode.StartTagAndEndTag).ConfigureAwait(false);

            selectTagHelperOutput.Attributes.AddClass("form-control");
            selectTagHelperOutput.Attributes.AddClass(GetSize(context, output));
            AddDisabledAttribute(selectTagHelperOutput);
            AddInfoTextId(selectTagHelperOutput);

            return(selectTagHelperOutput);
        }
Esempio n. 3
0
        private async Task <TagHelperOutput> CreateSelect(TagHelperContext context)
        {
            SelectItems ??= new List <SelectListItem>();
            var tagHelper = new SelectTagHelper(Generator);

            tagHelper.ViewContext = ViewContext;
            tagHelper.For         = For;
            tagHelper.Items       = SelectItems;
            TagHelperOutput tagHelperOutput = TagHelperExtension.CreateTagHelperOutput("select");

            if (Multiple)
            {
                tagHelperOutput.Attributes.Add("multiple", "multiple");
            }
            tagHelperOutput.SetAttribute("class", "form-control");
            await tagHelper.ProcessAsync(context, tagHelperOutput);

            return(tagHelperOutput);
        }
Esempio n. 4
0
        public async Task ProcessAsync_HasErrorClassWhenErrorSpecified()
        {
            // Arrange
            var context = new TagHelperContext(
                tagName: "govuk-select",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var output = new TagHelperOutput(
                "govuk-select",
                attributes: new TagHelperAttributeList(),
                getChildContentAsync: (useCachedResult, encoder) =>
            {
                var formGroupContext = (FormGroupBuilder)context.Items[typeof(FormGroupBuilder)];
                formGroupContext.TrySetLabel(
                    isPageHeading: false,
                    attributes: null,
                    content: new HtmlString("The label")); formGroupContext.TrySetErrorMessage(
                    visuallyHiddenText: null,
                    attributes: null,
                    content: new HtmlString("Error"));

                var tagHelperContent = new DefaultTagHelperContent();
                return(Task.FromResult <TagHelperContent>(tagHelperContent));
            });

            var tagHelper = new SelectTagHelper(new DefaultGovUkHtmlGenerator(), new DefaultModelHelper())
            {
                Id          = "my-id",
                DescribedBy = "describedby",
                Name        = "my-id"
            };

            // Act
            await tagHelper.ProcessAsync(context, output);

            // Assert
            var html = output.AsString();
            var node = HtmlNode.CreateNode(html);

            Assert.Contains("govuk-select--error", node.ChildNodes.FindFirst("select").GetCssClasses());
        }
Esempio n. 5
0
    public void Process_WithEmptyForName_DoesNotThrow_WithName()
    {
        // Arrange
        var expectedAttributeValue = "-expression-";
        var expectedTagName        = "select";

        var metadataProvider = new EmptyModelMetadataProvider();
        var htmlGenerator    = new TestableHtmlGenerator(metadataProvider);
        var model            = "model-value";
        var modelExplorer    = metadataProvider.GetModelExplorerForType(typeof(string), model);
        var modelExpression  = new ModelExpression(name: string.Empty, modelExplorer: modelExplorer);
        var viewContext      = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider);
        var tagHelper        = new SelectTagHelper(htmlGenerator)
        {
            For         = modelExpression,
            Name        = expectedAttributeValue,
            ViewContext = viewContext,
        };

        var attributes = new TagHelperAttributeList
        {
            { "name", expectedAttributeValue },
        };

        var context = new TagHelperContext(attributes, new Dictionary <object, object>(), "test");
        var output  = new TagHelperOutput(
            expectedTagName,
            new TagHelperAttributeList(),
            (_, __) => Task.FromResult <TagHelperContent>(new DefaultTagHelperContent()));

        // Act
        tagHelper.Process(context, output);

        // Assert
        Assert.Equal(expectedTagName, output.TagName);
        Assert.False(output.IsContentModified);

        var attribute = Assert.Single(output.Attributes);

        Assert.Equal("name", attribute.Name);
        Assert.Equal(expectedAttributeValue, attribute.Value);
    }
Esempio n. 6
0
        protected virtual async Task <TagHelperOutput> GetSelectTagAsync(TagHelperContext context, TagHelperOutput output)
        {
            var selectTagHelper = new SelectTagHelper(_generator)
            {
                For         = TagHelper.AspFor,
                ViewContext = TagHelper.ViewContext
            };

            if (TagHelper.AutocompleteApiUrl.IsNullOrEmpty())
            {
                selectTagHelper.Items = GetSelectItems(context, output);
            }

            var selectTagHelperOutput = await selectTagHelper.ProcessAndGetOutputAsync(GetInputAttributes(context, output), context, "select", TagMode.StartTagAndEndTag);

            selectTagHelperOutput.Attributes.AddClass("form-control");
            selectTagHelperOutput.Attributes.AddClass(GetSize(context, output));
            AddDisabledAttribute(selectTagHelperOutput);
            AddInfoTextId(selectTagHelperOutput);
            AddAutocompleteAttributes(selectTagHelperOutput);

            return(selectTagHelperOutput);
        }
Esempio n. 7
0
        public TagHelperOutput GenerateSelectTagHelper(ModelExpression f, IEnumerable <SelectListItem> items, string optionName, string optionValue)
        {
            var itemsList = new List <SelectListItem>();

            if (!string.IsNullOrWhiteSpace(optionName))
            {
                itemsList.Add(new SelectListItem(optionName, optionValue));
            }
            if (items != null)
            {
                itemsList.AddRange(items);
            }

            var tagHelper = new SelectTagHelper(generator)
            {
                For         = f,
                Name        = f.Name,
                Items       = itemsList,
                ViewContext = viewContext
            };

            return(GenerateTagHelperCore(f, tagHelper, "select", TagMode.StartTagAndEndTag));
        }
Esempio n. 8
0
        public async Task ProcessAsync_GeneratesExpectedOutput()
        {
            // Arrange
            var context = new TagHelperContext(
                tagName: "govuk-select",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var output = new TagHelperOutput(
                "govuk-select",
                attributes: new TagHelperAttributeList(),
                getChildContentAsync: (useCachedResult, encoder) =>
            {
                var formGroupContext = (FormGroupBuilder)context.Items[typeof(FormGroupBuilder)];
                formGroupContext.TrySetLabel(
                    isPageHeading: false,
                    attributes: null,
                    content: new HtmlString("The label"));

                var selectContext = (SelectContext)context.Items[typeof(SelectContext)];

                selectContext.AddItem(new SelectListItem()
                {
                    Content = new HtmlString("First")
                });

                selectContext.AddItem(new SelectListItem()
                {
                    Content = new HtmlString("Second"),
                    Value   = "second"
                });

                selectContext.AddItem(new SelectListItem()
                {
                    Content    = new HtmlString("Third"),
                    IsDisabled = true,
                    Value      = "third"
                });

                selectContext.AddItem(new SelectListItem()
                {
                    Content    = new HtmlString("Fourth"),
                    IsSelected = true,
                    Value      = "fourth"
                });

                var tagHelperContent = new DefaultTagHelperContent();
                return(Task.FromResult <TagHelperContent>(tagHelperContent));
            });

            var tagHelper = new SelectTagHelper(new DefaultGovUkHtmlGenerator(), new DefaultModelHelper())
            {
                Id          = "my-id",
                DescribedBy = "describedby",
                Name        = "my-id"
            };

            // Act
            await tagHelper.ProcessAsync(context, output);

            // Assert
            var html  = output.AsString();
            var node  = HtmlNode.CreateNode(html);
            var input = node.ChildNodes.FindFirst("select");

            Assert.Equal(
                "<select aria-describedby=\"describedby\" class=\"govuk-select\" id=\"my-id\" name=\"my-id\">" +
                "<option>First</option>" +
                "<option value=\"second\">Second</option>" +
                "<option disabled=\"disabled\" value=\"third\">Third</option>" +
                "<option selected=\"selected\" value=\"fourth\">Fourth</option>" +
                "</select>",
                input.OuterHtml);
        }
Esempio n. 9
0
    public async Task TagHelper_CallsGeneratorWithExpectedValues_RealModelType(
        Type modelType,
        object model,
        bool allowMultiple)
    {
        // Arrange
        var contextAttributes = new TagHelperAttributeList(
            Enumerable.Empty <TagHelperAttribute>());
        var originalAttributes = new TagHelperAttributeList();
        var propertyName       = "Property1";
        var tagName            = "select";

        var tagHelperContext = new TagHelperContext(
            tagName: "select",
            allAttributes: contextAttributes,
            items: new Dictionary <object, object>(),
            uniqueId: "test");
        var output = new TagHelperOutput(
            tagName,
            originalAttributes,
            getChildContentAsync: (useCachedResult, encoder) =>
        {
            var tagHelperContent = new DefaultTagHelperContent();
            tagHelperContent.SetContent("Something");
            return(Task.FromResult <TagHelperContent>(tagHelperContent));
        });
        var metadataProvider = new EmptyModelMetadataProvider();
        var modelExplorer    = metadataProvider.GetModelExplorerForType(modelType, model);
        var modelExpression  = new ModelExpression(propertyName, modelExplorer);

        var htmlGenerator = new Mock <IHtmlGenerator>(MockBehavior.Strict);
        var viewContext   = TestableHtmlGenerator.GetViewContext(model, htmlGenerator.Object, metadataProvider);
        var currentValues = new string[0];

        htmlGenerator
        .Setup(real => real.GetCurrentValues(
                   viewContext,
                   modelExplorer,
                   propertyName, // expression
                   allowMultiple))
        .Returns(currentValues)
        .Verifiable();
        htmlGenerator
        .Setup(real => real.GenerateSelect(
                   viewContext,
                   modelExplorer,
                   null,         // optionLabel
                   propertyName, // expression
                   It.IsAny <IEnumerable <SelectListItem> >(),
                   currentValues,
                   allowMultiple,
                   null))       // htmlAttributes
        .Returns((TagBuilder)null)
        .Verifiable();

        var tagHelper = new SelectTagHelper(htmlGenerator.Object)
        {
            For         = modelExpression,
            ViewContext = viewContext,
        };

        // Act
        tagHelper.Init(tagHelperContext);
        await tagHelper.ProcessAsync(tagHelperContext, output);

        // Assert
        htmlGenerator.Verify();

        var keyValuePair = Assert.Single(
            tagHelperContext.Items,
            entry => (Type)entry.Key == typeof(SelectTagHelper));
        var actualCurrentValues = Assert.IsType <CurrentValues>(keyValuePair.Value);

        Assert.Same(currentValues, actualCurrentValues.Values);
    }
Esempio n. 10
0
    public async Task ProcessAsync_CallsGeneratorWithExpectedValues_ItemsAndAttribute(
        IEnumerable <SelectListItem> inputItems,
        string attributeName,
        string attributeValue,
        IEnumerable <SelectListItem> expectedItems)
    {
        // Arrange
        var contextAttributes = new TagHelperAttributeList
        {
            // Provided for completeness. Select tag helper does not confirm AllAttributes set is consistent.
            { attributeName, attributeValue },
        };
        var originalAttributes = new TagHelperAttributeList
        {
            { attributeName, attributeValue },
        };
        var propertyName    = "Property1";
        var expectedTagName = "select";

        var tagHelperContext = new TagHelperContext(
            tagName: "select",
            allAttributes: contextAttributes,
            items: new Dictionary <object, object>(),
            uniqueId: "test");

        var output = new TagHelperOutput(
            expectedTagName,
            originalAttributes,
            getChildContentAsync: (useCachedResult, encoder) =>
        {
            var tagHelperContent = new DefaultTagHelperContent();
            tagHelperContent.SetContent("Something");
            return(Task.FromResult <TagHelperContent>(tagHelperContent));
        });
        var    metadataProvider = new EmptyModelMetadataProvider();
        string model            = null;
        var    modelExplorer    = metadataProvider.GetModelExplorerForType(typeof(string), model);

        var htmlGenerator = new Mock <IHtmlGenerator>(MockBehavior.Strict);
        var viewContext   = TestableHtmlGenerator.GetViewContext(model, htmlGenerator.Object, metadataProvider);

        // Simulate a (model => model) scenario. E.g. the calling helper may appear in a low-level template.
        var modelExpression = new ModelExpression(string.Empty, modelExplorer);

        viewContext.ViewData.TemplateInfo.HtmlFieldPrefix = propertyName;

        var currentValues = new string[0];

        htmlGenerator
        .Setup(real => real.GetCurrentValues(
                   viewContext,
                   modelExplorer,
                   string.Empty, // expression
                   false))       // allowMultiple
        .Returns(currentValues)
        .Verifiable();
        htmlGenerator
        .Setup(real => real.GenerateSelect(
                   viewContext,
                   modelExplorer,
                   null,         // optionLabel
                   string.Empty, // expression
                   expectedItems,
                   currentValues,
                   false,       // allowMultiple
                   null))       // htmlAttributes
        .Returns((TagBuilder)null)
        .Verifiable();

        var tagHelper = new SelectTagHelper(htmlGenerator.Object)
        {
            For         = modelExpression,
            Items       = inputItems,
            ViewContext = viewContext,
        };

        // Act
        tagHelper.Init(tagHelperContext);
        await tagHelper.ProcessAsync(tagHelperContext, output);

        // Assert
        htmlGenerator.Verify();

        var keyValuePair = Assert.Single(
            tagHelperContext.Items,
            entry => (Type)entry.Key == typeof(SelectTagHelper));
        var actualCurrentValues = Assert.IsType <CurrentValues>(keyValuePair.Value);

        Assert.Same(currentValues, actualCurrentValues.Values);
    }
Esempio n. 11
0
    public async Task ProcessAsyncInTemplate_WithItems_GeneratesExpectedOutput_DoesNotChangeSelectList(
        object model,
        Type containerType,
        Func <object> modelAccessor,
        NameAndId nameAndId,
        string expectedOptions)
    {
        // Arrange
        var originalAttributes = new TagHelperAttributeList
        {
            { "class", "form-control" },
        };
        var originalPostContent = "original content";

        var expectedAttributes = new TagHelperAttributeList(originalAttributes)
        {
            { "id", nameAndId.Id },
            { "name", nameAndId.Name },
            { "valid", "from validation attributes" },
        };
        var expectedPreContent  = "original pre-content";
        var expectedContent     = "original content";
        var expectedPostContent = originalPostContent + expectedOptions;
        var expectedTagName     = "select";

        var metadataProvider = new TestModelMetadataProvider();

        var containerMetadata = metadataProvider.GetMetadataForType(containerType);
        var containerExplorer = metadataProvider.GetModelExplorerForType(containerType, model);

        var propertyMetadata = metadataProvider.GetMetadataForProperty(containerType, "Text");
        var modelExplorer    = containerExplorer.GetExplorerForExpression(propertyMetadata, modelAccessor());

        var modelExpression = new ModelExpression(name: string.Empty, modelExplorer: modelExplorer);

        var tagHelperContext = new TagHelperContext(
            tagName: "select",
            allAttributes: new TagHelperAttributeList(
                Enumerable.Empty <TagHelperAttribute>()),
            items: new Dictionary <object, object>(),
            uniqueId: "test");
        var output = new TagHelperOutput(
            expectedTagName,
            originalAttributes,
            getChildContentAsync: (useCachedResult, encoder) =>
        {
            var tagHelperContent = new DefaultTagHelperContent();
            tagHelperContent.AppendHtml("Something");
            return(Task.FromResult <TagHelperContent>(tagHelperContent));
        })
        {
            TagMode = TagMode.SelfClosing,
        };

        output.PreContent.AppendHtml(expectedPreContent);
        output.Content.AppendHtml(expectedContent);
        output.PostContent.AppendHtml(originalPostContent);

        var htmlGenerator = new TestableHtmlGenerator(metadataProvider)
        {
            ValidationAttributes =
            {
                { "valid", "from validation attributes" },
            }
        };
        var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider);

        viewContext.ViewData.TemplateInfo.HtmlFieldPrefix = nameAndId.Name;

        var items         = new SelectList(new[] { "", "outer text", "inner text", "other text" });
        var savedDisabled = items.Select(item => item.Disabled).ToList();
        var savedGroup    = items.Select(item => item.Group).ToList();
        var savedSelected = items.Select(item => item.Selected).ToList();
        var savedText     = items.Select(item => item.Text).ToList();
        var savedValue    = items.Select(item => item.Value).ToList();
        var tagHelper     = new SelectTagHelper(htmlGenerator)
        {
            For         = modelExpression,
            Items       = items,
            ViewContext = viewContext,
        };

        // Act
        tagHelper.Init(tagHelperContext);
        await tagHelper.ProcessAsync(tagHelperContext, output);

        // Assert
        Assert.Equal(TagMode.SelfClosing, output.TagMode);
        Assert.Equal(expectedAttributes, output.Attributes);
        Assert.Equal(expectedPreContent, output.PreContent.GetContent());
        Assert.Equal(expectedContent, output.Content.GetContent());
        Assert.Equal(expectedPostContent, HtmlContentUtilities.HtmlContentToString(output.PostContent));
        Assert.Equal(expectedTagName, output.TagName);

        Assert.Single(
            tagHelperContext.Items,
            entry => (Type)entry.Key == typeof(SelectTagHelper));

        Assert.Equal(savedDisabled, items.Select(item => item.Disabled));
        Assert.Equal(savedGroup, items.Select(item => item.Group));
        Assert.Equal(savedSelected, items.Select(item => item.Selected));
        Assert.Equal(savedText, items.Select(item => item.Text));
        Assert.Equal(savedValue, items.Select(item => item.Value));
    }
Esempio n. 12
0
    public async Task ProcessAsync_WithItems_AndNoModelExpression_GeneratesExpectedOutput()
    {
        // Arrange
        var originalAttributes = new TagHelperAttributeList
        {
            { "class", "form-control" },
        };
        var originalPostContent = "original content";

        var expectedAttributes = new TagHelperAttributeList(originalAttributes);
        var selectItems        = new SelectList(Enumerable.Range(0, 5));
        var expectedOptions    = "<option>HtmlEncode[[0]]</option>" + Environment.NewLine
                                 + "<option>HtmlEncode[[1]]</option>" + Environment.NewLine
                                 + "<option>HtmlEncode[[2]]</option>" + Environment.NewLine
                                 + "<option>HtmlEncode[[3]]</option>" + Environment.NewLine
                                 + "<option>HtmlEncode[[4]]</option>" + Environment.NewLine;

        var expectedPreContent  = "original pre-content";
        var expectedContent     = "original content";
        var expectedPostContent = originalPostContent + expectedOptions;
        var expectedTagName     = "select";

        var tagHelperContext = new TagHelperContext(
            tagName: "select",
            allAttributes: new TagHelperAttributeList(
                Enumerable.Empty <TagHelperAttribute>()),
            items: new Dictionary <object, object>(),
            uniqueId: "test");
        var output = new TagHelperOutput(
            expectedTagName,
            originalAttributes,
            getChildContentAsync: (useCachedResult, encoder) =>
        {
            var tagHelperContent = new DefaultTagHelperContent();
            tagHelperContent.AppendHtml("Something");
            return(Task.FromResult <TagHelperContent>(tagHelperContent));
        })
        {
            TagMode = TagMode.SelfClosing,
        };

        output.PreContent.AppendHtml(expectedPreContent);
        output.Content.AppendHtml(expectedContent);
        output.PostContent.AppendHtml(originalPostContent);

        var metadataProvider = new TestModelMetadataProvider();
        var htmlGenerator    = new TestableHtmlGenerator(metadataProvider);
        var viewContext      = TestableHtmlGenerator.GetViewContext(
            model: null,
            htmlGenerator: htmlGenerator,
            metadataProvider: metadataProvider);

        var tagHelper = new SelectTagHelper(htmlGenerator)
        {
            Items       = selectItems,
            ViewContext = viewContext,
        };

        // Act
        tagHelper.Init(tagHelperContext);
        await tagHelper.ProcessAsync(tagHelperContext, output);

        // Assert
        Assert.Equal(TagMode.SelfClosing, output.TagMode);
        Assert.Equal(expectedAttributes, output.Attributes);
        Assert.Equal(expectedPreContent, output.PreContent.GetContent());
        Assert.Equal(expectedContent, output.Content.GetContent());
        Assert.Equal(expectedPostContent, HtmlContentUtilities.HtmlContentToString(output.PostContent));
        Assert.Equal(expectedTagName, output.TagName);

        var kvp = Assert.Single(tagHelperContext.Items);

        Assert.Equal(typeof(SelectTagHelper), kvp.Key);
        Assert.Null(kvp.Value);
    }
        public async Task ProcessAsync_WithError_RendersExpectedOutput()
        {
            // Arrange
            var context = new TagHelperContext(
                tagName: "govuk-select",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var output = new TagHelperOutput(
                "govuk-select",
                attributes: new TagHelperAttributeList(),
                getChildContentAsync: (useCachedResult, encoder) =>
            {
                var selectContext = context.GetContextItem <SelectContext>();

                selectContext.SetLabel(
                    isPageHeading: false,
                    attributes: null,
                    content: new HtmlString("The label"));

                selectContext.SetHint(
                    attributes: null,
                    content: new HtmlString("The hint"));

                selectContext.SetErrorMessage(
                    visuallyHiddenText: null,
                    attributes: null,
                    content: new HtmlString("The error"));

                selectContext.AddItem(new SelectItem()
                {
                    Content = new HtmlString("First")
                });

                var tagHelperContent = new DefaultTagHelperContent();
                return(Task.FromResult <TagHelperContent>(tagHelperContent));
            });

            var tagHelper = new SelectTagHelper()
            {
                Id          = "my-id",
                DescribedBy = "describedby",
                Name        = "my-name"
            };

            // Act
            await tagHelper.ProcessAsync(context, output);

            // Assert
            var expectedHtml = @"
<div class=""govuk-form-group govuk-form-group--error"">
    <label for=""my-id"" class=""govuk-label"">The label</label>
    <div id=""my-id-hint"" class=""govuk-hint"">The hint</div>
    <p id=""my-id-error"" class=""govuk-error-message"">
        <span class=""govuk-visually-hidden"">Error:</span>
        The error
    </p>
    <select aria-describedby=""describedby my-id-hint my-id-error"" class=""govuk-select govuk-select--error"" id=""my-id"" name=""my-name"">
        <option>First</option>
    </select>
</div>";

            AssertEx.HtmlEqual(expectedHtml, output.RenderToString());
        }
Esempio n. 14
0
 /// <summary>
 /// 初始化类<see cref="SelectableTagHelper"/>。
 /// </summary>
 /// <param name="generator">Html辅助接口。</param>
 protected SelectableTagHelper(IHtmlGenerator generator)
 {
     _selectTagHelper = new SelectTagHelper(generator);
 }
Esempio n. 15
0
    public async Task ProcessAsync_GeneratesExpectedOutput(
        object model,
        Type containerType,
        Func <object> modelAccessor,
        NameAndId nameAndId,
        string ignored)
    {
        // Arrange
        var originalAttributes = new TagHelperAttributeList
        {
            { "class", "form-control" },
        };
        var originalPostContent = "original content";

        var expectedAttributes = new TagHelperAttributeList(originalAttributes)
        {
            { "id", nameAndId.Id },
            { "name", nameAndId.Name },
            { "valid", "from validation attributes" },
        };
        var expectedPreContent  = "original pre-content";
        var expectedContent     = "original content";
        var expectedPostContent = originalPostContent;
        var expectedTagName     = "not-select";

        var metadataProvider  = new TestModelMetadataProvider();
        var containerMetadata = metadataProvider.GetMetadataForType(containerType);
        var containerExplorer = metadataProvider.GetModelExplorerForType(containerType, model);

        var propertyMetadata = metadataProvider.GetMetadataForProperty(containerType, "Text");
        var modelExplorer    = containerExplorer.GetExplorerForExpression(propertyMetadata, modelAccessor());

        var modelExpression = new ModelExpression(nameAndId.Name, modelExplorer);

        var tagHelperContext = new TagHelperContext(
            tagName: "select",
            allAttributes: new TagHelperAttributeList(
                Enumerable.Empty <TagHelperAttribute>()),
            items: new Dictionary <object, object>(),
            uniqueId: "test");
        var output = new TagHelperOutput(
            expectedTagName,
            originalAttributes,
            getChildContentAsync: (useCachedResult, encoder) =>
        {
            var tagHelperContent = new DefaultTagHelperContent();
            tagHelperContent.SetContent("Something");
            return(Task.FromResult <TagHelperContent>(tagHelperContent));
        })
        {
            TagMode = TagMode.SelfClosing,
        };

        output.PreContent.SetContent(expectedPreContent);
        output.Content.SetContent(expectedContent);
        output.PostContent.SetContent(originalPostContent);

        var htmlGenerator = new TestableHtmlGenerator(metadataProvider)
        {
            ValidationAttributes =
            {
                { "valid", "from validation attributes" },
            }
        };
        var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider);
        var tagHelper   = new SelectTagHelper(htmlGenerator)
        {
            For         = modelExpression,
            ViewContext = viewContext,
        };

        // Act
        tagHelper.Init(tagHelperContext);
        await tagHelper.ProcessAsync(tagHelperContext, output);

        // Assert
        Assert.Equal(TagMode.SelfClosing, output.TagMode);
        Assert.Equal(expectedAttributes, output.Attributes);
        Assert.Equal(expectedPreContent, output.PreContent.GetContent());
        Assert.Equal(expectedContent, output.Content.GetContent());
        Assert.Equal(expectedPostContent, output.PostContent.GetContent());
        Assert.Equal(expectedTagName, output.TagName);

        Assert.Single(
            tagHelperContext.Items,
            entry => (Type)entry.Key == typeof(SelectTagHelper));
    }
Esempio n. 16
0
 /// <summary>
 /// 测试初始化
 /// </summary>
 public SelectTagHelperTest(ITestOutputHelper output)
 {
     _output           = output;
     _component        = new SelectTagHelper();
     Config.IsValidate = false;
 }
        public async Task ProcessAsync_GeneratesExpectedOutput()
        {
            // Arrange
            var context = new TagHelperContext(
                tagName: "govuk-select",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var output = new TagHelperOutput(
                "govuk-select",
                attributes: new TagHelperAttributeList(),
                getChildContentAsync: (useCachedResult, encoder) =>
            {
                var selectContext = context.GetContextItem <SelectContext>();

                selectContext.SetLabel(
                    isPageHeading: false,
                    attributes: null,
                    content: new HtmlString("The label"));

                selectContext.SetHint(
                    attributes: null,
                    content: new HtmlString("The hint"));

                selectContext.AddItem(new SelectItem()
                {
                    Content = new HtmlString("First")
                });

                selectContext.AddItem(new SelectItem()
                {
                    Content = new HtmlString("Second"),
                    Value   = "second"
                });

                selectContext.AddItem(new SelectItem()
                {
                    Content  = new HtmlString("Third"),
                    Disabled = true,
                    Value    = "third"
                });

                selectContext.AddItem(new SelectItem()
                {
                    Content  = new HtmlString("Fourth"),
                    Selected = true,
                    Value    = "fourth"
                });

                var tagHelperContent = new DefaultTagHelperContent();
                return(Task.FromResult <TagHelperContent>(tagHelperContent));
            });

            var tagHelper = new SelectTagHelper()
            {
                Id          = "my-id",
                DescribedBy = "describedby",
                Name        = "my-name"
            };

            // Act
            await tagHelper.ProcessAsync(context, output);

            // Assert
            var expectedHtml = @"
<div class=""govuk-form-group"">
    <label for=""my-id"" class=""govuk-label"">The label</label>
    <div id=""my-id-hint"" class=""govuk-hint"">The hint</div>
    <select aria-describedby=""describedby my-id-hint"" class=""govuk-select"" id=""my-id"" name=""my-name"">
        <option>First</option>
        <option value=""second"">Second</option>
        <option disabled=""disabled"" value=""third"">Third</option>
        <option selected=""selected"" value=""fourth"">Fourth</option>
    </select>
</div>";

            AssertEx.HtmlEqual(expectedHtml, output.RenderToString());
        }