public void GenerateErrorMessage_ErrorMessageSetOnContext_ReturnsContent()
        {
            // Arrange
            var tagHelperContext = new TagHelperContext(
                tagName: "test",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var formGroupContext = new TestFormGroupContext();

            formGroupContext.SetErrorMessage(visuallyHiddenText: "vht", attributes: null, content: new HtmlString("Error message"));

            var modelHelper = new Mock <IModelHelper>();

            var tagHelper = new TestFormGroupTagHelper(new ComponentGenerator(), modelHelper.Object)
            {
                Id = "test"
            };

            // Act
            var errorMessage = tagHelper.GenerateErrorMessage(tagHelperContext, formGroupContext);

            // Assert
            Assert.NotNull(errorMessage);
        }
        public void GenerateErrorMessage_NonEmptyErrorMessage_AddsErrorMessageIdToDescribedBy()
        {
            // Arrange
            var tagHelperContext = new TagHelperContext(
                tagName: "test",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var formGroupContext = new TestFormGroupContext();

            formGroupContext.SetErrorMessage(visuallyHiddenText: null, attributes: null, content: new HtmlString("Context error"));

            var modelHelper = new Mock <IModelHelper>();

            var tagHelper = new TestFormGroupTagHelper(new ComponentGenerator(), modelHelper.Object)
            {
                Id = "test"
            };

            // Act
            var errorMessage = tagHelper.GenerateErrorMessage(tagHelperContext, formGroupContext);

            // Assert
            var element = errorMessage.RenderToElement();

            Assert.Equal("test-error", element.GetAttribute("id"));
            Assert.Contains("test-error", tagHelper.DescribedBy?.Split(' ') ?? Array.Empty <string>());
        }
        public void GenerateErrorMessage_NoErrorMessageOnContextOrModelStateErrors_ReturnsNull()
        {
            // Arrange
            var tagHelperContext = new TagHelperContext(
                tagName: "test",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var formGroupContext = new TestFormGroupContext();

            var modelExplorer = new EmptyModelMetadataProvider().GetModelExplorerForType(typeof(Model), new Model())
                                .GetExplorerForProperty(nameof(Model.SimpleProperty));
            var viewContext     = new ViewContext();
            var modelExpression = "Foo";

            var modelHelper = new Mock <IModelHelper>();

            modelHelper.Setup(mock => mock.GetValidationMessage(viewContext, modelExplorer, modelExpression)).Returns((string)null);

            var tagHelper = new TestFormGroupTagHelper(new ComponentGenerator(), modelHelper.Object)
            {
                AspFor      = new ModelExpression(modelExpression, modelExplorer),
                Id          = "test",
                ViewContext = viewContext
            };

            // Act
            var errorMessage = tagHelper.GenerateErrorMessage(tagHelperContext, formGroupContext);

            // Assert
            Assert.Null(errorMessage);
        }
        public void GenerateErrorMessage_AddsErrorToFormErrorContext()
        {
            // Arrange
            var formErrorContext = new FormErrorContext();

            var tagHelperContext = new TagHelperContext(
                tagName: "test",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>()
            {
                { typeof(FormErrorContext), formErrorContext }
            },
                uniqueId: "test");

            var formGroupContext = new TestFormGroupContext();

            formGroupContext.SetErrorMessage(visuallyHiddenText: "vht", attributes: null, content: new HtmlString("Error message"));

            var modelHelper = new Mock <IModelHelper>();

            var tagHelper = new TestFormGroupTagHelper(new ComponentGenerator(), modelHelper.Object)
            {
                Id = "test"
            };

            // Act
            tagHelper.GenerateErrorMessage(tagHelperContext, formGroupContext);

            // Assert
            Assert.Collection(
                formErrorContext.Errors,
                error =>
            {
                Assert.Equal("Error message", error.Content.RenderToString());
            });
        }
        public void GenerateErrorMessage_EmptyErrorMessage_DoesNotAddErrorMessageIdToDescribedBy()
        {
            // Arrange
            var tagHelperContext = new TagHelperContext(
                tagName: "test",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var formGroupContext = new TestFormGroupContext();

            var modelHelper = new Mock <IModelHelper>();

            var tagHelper = new TestFormGroupTagHelper(new ComponentGenerator(), modelHelper.Object)
            {
                Id = "test"
            };

            // Act
            tagHelper.GenerateErrorMessage(tagHelperContext, formGroupContext);

            // Assert
            Assert.DoesNotContain("test-error", tagHelper.DescribedBy?.Split(' ') ?? Array.Empty <string>());
        }
        public void GenerateErrorMessage_NoErrorMessageOnContextOrAspFor_ReturnsNull()
        {
            // Arrange
            var tagHelperContext = new TagHelperContext(
                tagName: "test",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var formGroupContext = new TestFormGroupContext();

            var modelHelper = new Mock <IModelHelper>();

            var tagHelper = new TestFormGroupTagHelper(new ComponentGenerator(), modelHelper.Object)
            {
                Id = "test"
            };

            // Act
            var errorMessage = tagHelper.GenerateErrorMessage(tagHelperContext, formGroupContext);

            // Assert
            Assert.Null(errorMessage);
        }
        public void GenerateErrorMessage_ErrorMessageOnContextAndModelStateUsesContextError_ReturnsContent()
        {
            // Arrange
            var tagHelperContext = new TagHelperContext(
                tagName: "test",
                allAttributes: new TagHelperAttributeList(),
                items: new Dictionary <object, object>(),
                uniqueId: "test");

            var formGroupContext = new TestFormGroupContext();

            formGroupContext.SetErrorMessage(visuallyHiddenText: "vht", attributes: null, content: new HtmlString("Context error"));

            var modelExplorer = new EmptyModelMetadataProvider().GetModelExplorerForType(typeof(Model), new Model())
                                .GetExplorerForProperty(nameof(Model.SimpleProperty));
            var viewContext     = new ViewContext();
            var modelExpression = nameof(Model.SimpleProperty);

            var modelHelper = new Mock <IModelHelper>();

            modelHelper.Setup(mock => mock.GetValidationMessage(viewContext, modelExplorer, modelExpression)).Returns("ModelState error");

            var tagHelper = new TestFormGroupTagHelper(new ComponentGenerator(), modelHelper.Object)
            {
                AspFor      = new ModelExpression(modelExpression, modelExplorer),
                Id          = "test",
                ViewContext = viewContext
            };

            // Act
            var errorMessage = tagHelper.GenerateErrorMessage(tagHelperContext, formGroupContext);

            // Assert
            Assert.NotNull(errorMessage);
            Assert.Contains("Context error", errorMessage.RenderToString());
        }