// Adds errors for various parts of the model, including the root.
        private void AddMultipleErrors(ModelStateDictionary modelState)
        {
            modelState.AddModelError("Property3.Property2", "This is an error for Property3.Property2.");
            modelState.AddModelError("Property3.OrderedProperty3", "This is an error for Property3.OrderedProperty3.");
            modelState.AddModelError("Property3.OrderedProperty2", "This is an error for Property3.OrderedProperty2.");

            var provider = new EmptyModelMetadataProvider();
            var metadata = provider.GetMetadataForProperty(typeof(ValidationModel), nameof(ValidationModel.Property3));

            modelState.AddModelError("Property3", "This is an error for Property3.");
            modelState.AddModelError("Property3", new InvalidCastException("Exception will be ignored."), metadata);

            metadata = provider.GetMetadataForProperty(typeof(ValidationModel), nameof(ValidationModel.Property2));
            modelState.AddModelError("Property2", "This is an error for Property2.");
            modelState.AddModelError("Property2", "This is another error for Property2.");
            modelState.AddModelError("Property2", new OverflowException("Produces invalid value message"), metadata);

            metadata = provider.GetMetadataForType(typeof(ValidationModel));
            modelState.AddModelError(string.Empty, "This is an error for the model root.");
            modelState.AddModelError(string.Empty, "This is another error for the model root.");
            modelState.AddModelError(string.Empty, new InvalidOperationException("Another ignored Exception."), metadata);
        }
        public void GetErrorMessage_Required()
        {
            IModelMetadataProvider     provider = new EmptyModelMetadataProvider();
            RequiredAdapter            adapter  = new RequiredAdapter(new RequiredAttribute());
            ModelMetadata              metadata = provider.GetMetadataForProperty(typeof(AllTypesView), "StringField");
            ModelValidationContextBase context  = new ModelValidationContextBase(new ActionContext(), metadata, provider);

            String expected = String.Format(Validations.Required, context.ModelMetadata.PropertyName);
            String actual   = adapter.GetErrorMessage(context);

            Assert.Equal(Validations.Required, adapter.Attribute.ErrorMessage);
            Assert.Equal(expected, actual);
        }
예제 #3
0
        public void GetErrorMessage_MinLength()
        {
            IModelMetadataProvider     provider = new EmptyModelMetadataProvider();
            MinLengthAdapter           adapter  = new MinLengthAdapter(new MinLengthAttribute(128));
            ModelMetadata              metadata = provider.GetMetadataForProperty(typeof(AllTypesView), "StringField");
            ModelValidationContextBase context  = new ModelValidationContextBase(new ActionContext(), metadata, provider);

            String expected = Validation.For("MinLength", context.ModelMetadata.PropertyName, 128);
            String actual   = adapter.GetErrorMessage(context);

            Assert.Equal(Validation.For("MinLength"), adapter.Attribute.ErrorMessage);
            Assert.Equal(expected, actual);
        }
예제 #4
0
        public void GetErrorMessage_MinLength()
        {
            IModelMetadataProvider     provider = new EmptyModelMetadataProvider();
            MinLengthAdapter           adapter  = new MinLengthAdapter(new MinLengthAttribute(128));
            ModelMetadata              metadata = provider.GetMetadataForProperty(typeof(AdaptersModel), "MinLength");
            ModelValidationContextBase context  = new ModelValidationContextBase(new ActionContext(), metadata, provider);

            String expected = String.Format(Validations.MinLength, "MinLength", 128);
            String actual   = adapter.GetErrorMessage(context);

            Assert.Equal(Validations.MinLength, adapter.Attribute.ErrorMessage);
            Assert.Equal(expected, actual);
        }
예제 #5
0
        public void GetClientValidationRules_ReturnsEmailValidationRule()
        {
            IServiceProvider       services = Substitute.For <IServiceProvider>();
            IModelMetadataProvider provider = new EmptyModelMetadataProvider();
            ModelMetadata          metadata = provider.GetMetadataForProperty(typeof(AdaptersModel), "EmailAddress");

            ClientModelValidationContext context = new ClientModelValidationContext(metadata, provider, services);
            ModelClientValidationRule    actual  = adapter.GetClientValidationRules(context).Single();
            String expectedMessage = attribute.FormatErrorMessage(metadata.GetDisplayName());

            Assert.Equal(expectedMessage, actual.ErrorMessage);
            Assert.Equal("email", actual.ValidationType);
            Assert.Empty(actual.ValidationParameters);
        }
예제 #6
0
        private static ClientModelValidationContext GetValidationContextWithArea(string currentArea)
        {
            var serviceCollection = GetServiceCollection();
            var serviceProvider   = serviceCollection.BuildServiceProvider();
            var routeCollection   = GetRouteCollectionWithArea(serviceProvider);
            var routeData         = new RouteData
            {
                Routers =
                {
                    routeCollection,
                },
                Values =
                {
                    { "action",     "Index" },
                    { "controller", "Home"  },
                },
            };

            if (!string.IsNullOrEmpty(currentArea))
            {
                routeData.Values["area"] = currentArea;
            }

            var actionContext = GetActionContext(serviceProvider, routeData);

            var urlHelper = new UrlHelper(actionContext);
            var factory   = new Mock <IUrlHelperFactory>(MockBehavior.Strict);

            factory
            .Setup(f => f.GetUrlHelper(actionContext))
            .Returns(urlHelper);

            // Make an IUrlHelperFactory available through the ActionContext.
            serviceCollection.AddSingleton <IUrlHelperFactory>(factory.Object);
            serviceProvider = serviceCollection.BuildServiceProvider();
            actionContext.HttpContext.RequestServices = serviceProvider;

            var metadataProvider = new EmptyModelMetadataProvider();
            var metadata         = metadataProvider.GetMetadataForProperty(
                containerType: typeof(string),
                propertyName: nameof(string.Length));

            return(new ClientModelValidationContext(
                       actionContext,
                       metadata,
                       metadataProvider,
                       new AttributeDictionary()));
        }
        public MvcTreeTagHelperTests()
        {
            MvcTree tree = new MvcTree();

            tree.SelectedIds.Add(123456);
            tree.Nodes.Add(new MvcTreeNode("Test"));
            tree.Nodes[0].Children.Add(new MvcTreeNode(4567, "Test2"));
            tree.Nodes[0].Children.Add(new MvcTreeNode(123456, "Test1"));

            EmptyModelMetadataProvider provider = new EmptyModelMetadataProvider();
            ModelExplorer explorer = new ModelExplorer(provider, provider.GetMetadataForProperty(typeof(MvcTreeView), "MvcTree"), tree);

            helper     = new MvcTreeTagHelper();
            helper.For = new ModelExpression("MvcTree", explorer);
            output     = new TagHelperOutput("div", new TagHelperAttributeList(), (_, __) => Task.FromResult <TagHelperContent?>(null));
        }
        public void GetClientValidationRules_ReturnsGreaterValidationRule()
        {
            IServiceProvider       services = Substitute.For <IServiceProvider>();
            IModelMetadataProvider provider = new EmptyModelMetadataProvider();
            GreaterThanAdapter     adapter  = new GreaterThanAdapter(new GreaterThanAttribute(128));
            ModelMetadata          metadata = provider.GetMetadataForProperty(typeof(AdaptersModel), "GreaterThan");

            ClientModelValidationContext context = new ClientModelValidationContext(metadata, provider, services);
            String expectedMessage           = new GreaterThanAttribute(128).FormatErrorMessage("GreaterThan");
            ModelClientValidationRule actual = adapter.GetClientValidationRules(context).Single();

            Assert.Equal(128M, actual.ValidationParameters["min"]);
            Assert.Equal(expectedMessage, actual.ErrorMessage);
            Assert.Equal("greater", actual.ValidationType);
            Assert.Single(actual.ValidationParameters);
        }
예제 #9
0
        public void GetClientValidationRules_ReturnsEqualToValidationRule()
        {
            IServiceProvider       services = Substitute.For <IServiceProvider>();
            IModelMetadataProvider provider = new EmptyModelMetadataProvider();
            ModelMetadata          metadata = provider.GetMetadataForProperty(typeof(AdaptersModel), "EqualTo");
            EqualToAdapter         adapter  = new EqualToAdapter(new EqualToAttribute("StringLength"));

            ClientModelValidationContext context = new ClientModelValidationContext(metadata, provider, services);
            String expectedMessage           = new EqualToAttribute("StringLength").FormatErrorMessage("EqualTo");
            ModelClientValidationRule actual = adapter.GetClientValidationRules(context).Single();

            Assert.Equal("*.StringLength", actual.ValidationParameters["other"]);
            Assert.Equal(expectedMessage, actual.ErrorMessage);
            Assert.Equal("equalto", actual.ValidationType);
            Assert.Single(actual.ValidationParameters);
        }
예제 #10
0
        public JsTreeTagHelperTests()
        {
            JsTree tree = new JsTree();

            tree.SelectedIds.Add(4567);
            tree.SelectedIds.Add(12345);
            tree.Nodes.Add(new JsTreeNode("Test"));
            tree.Nodes[0].Nodes.Add(new JsTreeNode(12345, "Test1"));
            tree.Nodes[0].Nodes.Add(new JsTreeNode(23456, "Test2"));

            EmptyModelMetadataProvider provider = new EmptyModelMetadataProvider();
            ModelExplorer explorer = new ModelExplorer(provider, provider.GetMetadataForProperty(typeof(JsTreeView), "JsTree"), tree);

            helper     = new JsTreeTagHelper();
            helper.For = new ModelExpression("JsTree", explorer);
            output     = new TagHelperOutput("div", new TagHelperAttributeList(), (useCachedResult, encoder) => null);
        }
예제 #11
0
        public JsTreeTagHelperTests()
        {
            JsTreeView tree = new JsTreeView();

            tree.JsTree.SelectedIds.Add("4567");
            tree.JsTree.SelectedIds.Add("12345");
            tree.JsTree.Nodes.Add(new JsTreeNode("Test"));
            tree.JsTree.Nodes[0].Nodes.Add(new JsTreeNode("12345", "Test1"));
            tree.JsTree.Nodes[0].Nodes.Add(new JsTreeNode("23456", "Test2"));

            EmptyModelMetadataProvider provider = new EmptyModelMetadataProvider();
            ModelExplorer explorer = new ModelExplorer(provider, provider.GetMetadataForProperty(tree.GetType(), "JsTree"), tree);

            output             = new TagHelperOutput("div", new TagHelperAttributeList(), _ => null);
            helper             = new JsTreeTagHelper(HtmlHelperFactory.CreateHtmlHelper(tree));
            helper.For         = new ModelExpression("JsTree", explorer);
            helper.ViewContext = helper.Html.ViewContext;
        }
예제 #12
0
        public void GetClientValidationRules_SetsOtherPropertyDisplayName()
        {
            IServiceProvider       services  = Substitute.For <IServiceProvider>();
            IModelMetadataProvider provider  = new EmptyModelMetadataProvider();
            ModelMetadata          metadata  = provider.GetMetadataForProperty(typeof(AdaptersModel), "EqualTo");
            EqualToAttribute       attribute = new EqualToAttribute("EqualTo");

            attribute.OtherPropertyDisplayName = null;

            ClientModelValidationContext context = new ClientModelValidationContext(metadata, provider, services);

            new EqualToAdapter(attribute).GetClientValidationRules(context);

            String expected = ResourceProvider.GetPropertyTitle(typeof(AdaptersModel), "EqualTo");
            String actual   = attribute.OtherPropertyDisplayName;

            Assert.Equal(expected, actual);
        }
예제 #13
0
        public void SimpleDisplayTextReturnsFirstPropertyNullDisplayTextForNonNullModelWithNullDisplayColumnPropertyValue()
        {
            // Arrange
            SimpleDisplayTextModelWithoutToString model            = new SimpleDisplayTextModelWithoutToString();
            EmptyModelMetadataProvider            propertyProvider = new EmptyModelMetadataProvider();
            ModelMetadata propertyMetadata = propertyProvider.GetMetadataForProperty(() => model.FirstProperty, typeof(SimpleDisplayTextModelWithoutToString), "FirstProperty");

            propertyMetadata.NullDisplayText = "Null Display Text";
            Mock <ModelMetadataProvider> provider = new Mock <ModelMetadataProvider>();

            provider.Setup(p => p.GetMetadataForProperties(model, typeof(SimpleDisplayTextModelWithoutToString)))
            .Returns(new[] { propertyMetadata });
            ModelMetadata metadata = new ModelMetadata(provider.Object, null, () => model, typeof(SimpleDisplayTextModelWithoutToString), null);

            // Act
            string result = metadata.SimpleDisplayText;

            // Assert
            Assert.Equal(propertyMetadata.NullDisplayText, result);
        }
예제 #14
0
        private static InputTagHelper GetTagHelper(
            IHtmlGenerator htmlGenerator,
            object container,
            Type containerType,
            Func <object> modelAccessor,
            string propertyName,
            string expressionName)
        {
            var metadataProvider = new EmptyModelMetadataProvider();
            var metadata         = metadataProvider.GetMetadataForProperty(modelAccessor, containerType, propertyName);
            var modelExpression  = new ModelExpression(expressionName, metadata);
            var viewContext      = TestableHtmlGenerator.GetViewContext(container, htmlGenerator, metadataProvider);
            var inputTagHelper   = new InputTagHelper
            {
                For         = modelExpression,
                Generator   = htmlGenerator,
                ViewContext = viewContext,
            };

            return(inputTagHelper);
        }
예제 #15
0
        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            var input = Model.ModelExplorer.GetExplorerForProperty("SearchTerm");

            IModelMetadataProvider metadataProvider = new EmptyModelMetadataProvider();

            ModelMetadata   metadata      = metadataProvider.GetMetadataForProperty(Model.ModelExplorer.Model.GetType(), Prop);
            ModelExplorer   container     = input;
            ModelExplorer   modelExplorer = new ModelExplorer(metadataProvider, input, metadata, null);
            ModelExpression nm            = new ModelExpression("SearchTerm", modelExplorer);

            TagHelperAttribute     aspFor = new TagHelperAttribute("asp-for", nm, HtmlAttributeValueStyle.DoubleQuotes);
            TagHelperAttributeList attrs  = new TagHelperAttributeList();

            attrs.Add(aspFor);

            TagHelperContext newContext = new TagHelperContext(context.TagName, attrs, context.Items, context.UniqueId);
            TagHelperOutput  newOutput  = new TagHelperOutput("input", output.Attributes, output.GetChildContentAsync);

            await base.ProcessAsync(newContext, newOutput);

            var test = output;
        }
예제 #16
0
    public void Constructor_SerializesErrorsFromModelStateDictionary_AddsDefaultMessage()
    {
        // Arrange
        var modelStateDictionary = new ModelStateDictionary();
        var provider             = new EmptyModelMetadataProvider();
        var metadata             = provider.GetMetadataForProperty(typeof(string), nameof(string.Length));

        modelStateDictionary.AddModelError("unsafeError",
                                           new Exception("This message should not be returned to clients"),
                                           metadata);

        // Act
        var problemDescription = new ValidationProblemDetails(modelStateDictionary);

        // Assert
        Assert.Equal("One or more validation errors occurred.", problemDescription.Title);
        Assert.Collection(
            problemDescription.Errors,
            item =>
        {
            Assert.Equal("unsafeError", item.Key);
            Assert.Equal(new[] { "The input was not valid." }, item.Value);
        });
    }
        // Adds one or more errors for all properties in OrderedModel. But adds errors out of order.
        private void AddOrderedErrors(ModelStateDictionary modelState)
        {
            var provider = new EmptyModelMetadataProvider();
            var metadata = provider.GetMetadataForProperty(typeof(OrderedModel), nameof(OrderedModel.Property3));

            modelState.AddModelError("Property3", "This is an error for Property3.");
            modelState.AddModelError("Property3", new InvalidCastException("An ignored Exception."), metadata);

            modelState.AddModelError("Property2", "This is an error for Property2.");
            modelState.AddModelError("Property2", "This is another error for Property2.");

            modelState.AddModelError("OrderedProperty3", "This is an error for OrderedProperty3.");

            modelState.AddModelError("OrderedProperty2", "This is an error for OrderedProperty2.");
            modelState.AddModelError("OrderedProperty2", "This is another error for OrderedProperty2.");

            modelState.AddModelError("LastProperty", "This is an error for LastProperty.");

            modelState.AddModelError("Property1", "This is an error for Property1.");
            modelState.AddModelError("Property1", "This is another error for Property1.");

            modelState.AddModelError("OrderedProperty1", "This is an error for OrderedProperty1.");
            modelState.AddModelError("OrderedProperty2", "This is yet-another error for OrderedProperty2.");
        }
예제 #18
0
        public void SimpleDisplayTextReturnsFirstPropertyNullDisplayTextForNonNullModelWithNullDisplayColumnPropertyValue()
        {
            // Arrange
            SimpleDisplayTextModelWithoutToString model = new SimpleDisplayTextModelWithoutToString();
            EmptyModelMetadataProvider propertyProvider = new EmptyModelMetadataProvider();
            ModelMetadata propertyMetadata = propertyProvider.GetMetadataForProperty(() => model.FirstProperty, typeof(SimpleDisplayTextModelWithoutToString), "FirstProperty");
            propertyMetadata.NullDisplayText = "Null Display Text";
            Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
            provider.Setup(p => p.GetMetadataForProperties(model, typeof(SimpleDisplayTextModelWithoutToString)))
                .Returns(new[] { propertyMetadata });
            ModelMetadata metadata = new ModelMetadata(provider.Object, null, () => model, typeof(SimpleDisplayTextModelWithoutToString), null);

            // Act
            string result = metadata.SimpleDisplayText;

            // Assert
            Assert.Equal(propertyMetadata.NullDisplayText, result);
        }