Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

837 lines
35 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Specialized;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using System.Web.WebPages.Html;
using System.Web.WebPages.Scope;
using Moq;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.WebPages.Validation.Test
{
public class ValidationHelperTest
{
[Fact]
public void FormFieldKeyIsCommonToModelStateAndValidationHelper()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string key = "_FORM";
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act and Assert
Assert.Equal(key, ModelStateDictionary.FormFieldKey);
Assert.Equal(key, validationHelper.FormField);
}
[Fact]
public void AddThrowsIfFieldIsEmpty()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act and Assert
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.Add(field: null), "field");
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.Add(field: String.Empty), "field");
}
[Fact]
public void AddThrowsIfValidatorsParamsArrayIsNull()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act and Assert
Assert.ThrowsArgumentNull(() => validationHelper.Add("foo", null), "validators");
}
[Fact]
public void AddThrowsIfValidatorsAreNull()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act and Assert
Assert.ThrowsArgumentNull(() => validationHelper.Add("foo", Validator.Required(), null, Validator.Range(0, 10)), "validators");
}
[Fact]
public void RequiredReturnsErrorMessageIfFieldIsNotPresentInForm()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "Foo is required.";
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act
validationHelper.RequireField("foo", message);
var results = validationHelper.Validate();
// Assert
Assert.Equal(1, results.Count());
Assert.Equal(message, results.First().ErrorMessage);
}
[Fact]
public void RequiredReturnsErrorMessageIfFieldIsEmpty()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "Foo is required.";
ValidationHelper validationHelper = GetValidationHelper(GetContext(new { foo = "" }));
// Act
validationHelper.RequireField("foo", message);
var results = validationHelper.Validate();
// Assert
Assert.Equal(1, results.Count());
Assert.Equal(message, results.First().ErrorMessage);
}
[Fact]
public void RequiredReturnsNoValidationResultsIfFieldIsPresent()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "Foo is required.";
ValidationHelper validationHelper = GetValidationHelper(GetContext(new { foo = "some value" }));
// Act
validationHelper.RequireField("foo", message);
var results = validationHelper.Validate();
// Assert
Assert.Equal(0, results.Count());
}
[Fact]
public void RequiredUsesDefaultErrorMessageIfNoValueIsProvided()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act
validationHelper.RequireField("foo");
var results = validationHelper.Validate();
// Assert
Assert.Equal(1, results.Count());
Assert.Equal("This field is required.", results.First().ErrorMessage);
}
[Fact]
public void RequiredReturnsValidationResultForEachFieldThatFailed()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "This field is required.";
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act
validationHelper.RequireFields("foo", "bar");
var results = validationHelper.Validate();
// Assert
Assert.Equal(2, results.Count());
Assert.Equal(message, results.First().ErrorMessage);
Assert.Equal("foo", results.First().MemberNames.Single());
Assert.Equal(message, results.Last().ErrorMessage);
Assert.Equal("bar", results.Last().MemberNames.Single());
}
[Fact]
public void RequiredReturnsValidationResultForEachFieldThatFailedWhenFieldsIsEmpty()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "This field is required.";
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act
validationHelper.RequireFields("foo", "bar");
var results = validationHelper.Validate(fields: null);
// Assert
Assert.Equal(2, results.Count());
Assert.Equal(message, results.First().ErrorMessage);
Assert.Equal("foo", results.First().MemberNames.Single());
Assert.Equal(message, results.Last().ErrorMessage);
Assert.Equal("bar", results.Last().MemberNames.Single());
}
[Fact]
public void GetValidationHtmlThrowsIfArgumentIsNullOrEmpty()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act and Assert
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.For(field: null), "field");
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.For(field: String.Empty), "field");
}
[Fact]
public void RequireFieldThrowsIfValueIsNullOrEmpty()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act and Assert
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.RequireField(field: null), "field");
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.RequireField(field: String.Empty), "field");
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.RequireField(field: null, errorMessage: "baz"), "field");
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.RequireField(field: String.Empty, errorMessage: null), "field");
}
[Fact]
public void RequireFieldsThrowsIfFieldsAreNullOrHasEmptyValues()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act and Assert
Assert.ThrowsArgumentNull(() => validationHelper.RequireFields(fields: null), "fields");
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.RequireFields(fields: new[] { "foo", null }), "field");
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.RequireFields(fields: new[] { "foo", "" }), "field");
}
[Fact]
public void AddThrowsIfFieldIsNullOrEmpty()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act and Assert
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.Add(field: null), "field");
Assert.ThrowsArgumentNullOrEmptyString(() => validationHelper.Add(field: String.Empty), "field");
}
[Fact]
public void AddThrowsIfValidatorsIsNullOrAnyValidatorIsNull()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act and Assert
Assert.ThrowsArgumentNull(() => validationHelper.Add(field: "foo", validators: null), "validators");
Assert.ThrowsArgumentNull(() => validationHelper.Add(field: "foo", validators: new[] { Validator.DateTime(), null }), "validators");
}
[Fact]
public void AddFormErrorCallsMethodInUnderlyingModelStateDictionary()
{
// Arrange
var message = "This is a form error.";
var dictionary = new ModelStateDictionary();
ValidationHelper validationHelper = GetValidationHelper(GetContext(), dictionary);
// Act
validationHelper.AddFormError(message);
// Assert
Assert.Equal(message, dictionary["_FORM"].Errors.Single());
}
[Fact]
public void GetValidationHtmlForRequired()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "Foo is required.";
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act
validationHelper.RequireField("foo", message);
var validationHtml = validationHelper.For("foo");
// Assert
Assert.Equal(@"data-val-required=""Foo is required."" data-val=""true""", validationHtml.ToString());
}
[Fact]
public void ValidateReturnsAnEmptySequenceIfNoValidationsAreRegistered()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act
var results = validationHelper.Validate();
// Assert
Assert.False(results.Any());
}
[Fact]
public void ValidatePopulatesModelStateDictionary()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var modelStateDictionary = new ModelStateDictionary();
ValidationHelper validationHelper = GetValidationHelper(GetContext(), modelStateDictionary);
// Act
validationHelper.RequireFields(new[] { "foo", "bar" });
validationHelper.Validate();
// Assert
Assert.False(modelStateDictionary.IsValid);
Assert.False(modelStateDictionary.IsValidField("foo"));
Assert.False(modelStateDictionary.IsValidField("bar"));
Assert.Equal("This field is required.", modelStateDictionary["foo"].Errors.Single());
Assert.Equal("This field is required.", modelStateDictionary["bar"].Errors.Single());
}
[Fact]
public void IsValidPopulatesModelStateDictionary()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var modelStateDictionary = new ModelStateDictionary();
ValidationHelper validationHelper = GetValidationHelper(GetContext(), modelStateDictionary);
// Act
validationHelper.RequireFields("foo", "bar");
validationHelper.IsValid();
// Assert
Assert.False(modelStateDictionary.IsValid);
Assert.False(modelStateDictionary.IsValidField("foo"));
Assert.False(modelStateDictionary.IsValidField("bar"));
Assert.Equal("This field is required.", modelStateDictionary["foo"].Errors.Single());
Assert.Equal("This field is required.", modelStateDictionary["bar"].Errors.Single());
}
[Fact]
public void GetErrorsPopulatesModelStateDictionary()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var modelStateDictionary = new ModelStateDictionary();
ValidationHelper validationHelper = GetValidationHelper(GetContext(), modelStateDictionary);
// Act
validationHelper.RequireFields("foo", "bar");
validationHelper.GetErrors();
// Assert
Assert.False(modelStateDictionary.IsValid);
Assert.False(modelStateDictionary.IsValidField("foo"));
Assert.False(modelStateDictionary.IsValidField("bar"));
Assert.Equal("This field is required.", modelStateDictionary["foo"].Errors.Single());
Assert.Equal("This field is required.", modelStateDictionary["bar"].Errors.Single());
}
[Fact]
public void GetErrorsReturnsAnEmptySequenceIfNoValidationsAreRegistered()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act
var results = validationHelper.GetErrors();
// Assert
Assert.False(results.Any());
}
[Fact]
public void GetErrorsReturnsErrorsAddedViaAddError()
{
// Arrange
var modelStateDictionary = new ModelStateDictionary();
ValidationHelper validationHelper = GetValidationHelper(GetContext(), modelStateDictionary);
// Act
modelStateDictionary.AddError("foo", "Foo error");
var errors = validationHelper.GetErrors("foo");
// Assert
Assert.Equal(new[] { "Foo error" }, errors);
}
[Fact]
public void GetErrorsReturnsFormErrors()
{
// Arrange
string error = "Unable to connect to remote servers.";
var modelStateDictionary = new ModelStateDictionary();
ValidationHelper validationHelper = GetValidationHelper(GetContext(), modelStateDictionary);
// Act
validationHelper.AddFormError(error);
var errors = validationHelper.GetErrors();
// Assert
Assert.Equal(error, errors.Single());
}
[Fact]
public void InvokingValidateMultipleTimesDoesNotCauseErrorMessagesToBeDuplicated()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var modelStateDictionary = new ModelStateDictionary();
ValidationHelper validationHelper = GetValidationHelper(GetContext(), modelStateDictionary);
// Act
validationHelper.RequireField("foo", "Foo is required.");
validationHelper.RequireField("bar", "Bar is required.");
validationHelper.Validate();
Assert.False(validationHelper.IsValid());
validationHelper.Validate();
validationHelper.Validate();
// Assert
Assert.False(modelStateDictionary.IsValid);
Assert.False(modelStateDictionary.IsValidField("foo"));
Assert.False(modelStateDictionary.IsValidField("bar"));
Assert.Equal("Foo is required.", modelStateDictionary["foo"].Errors.Single());
Assert.Equal("Bar is required.", modelStateDictionary["bar"].Errors.Single());
}
[Fact]
public void AddWorksForCustomValidator()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "Foo is not an odd number.";
var oddValidator = new Mock<IValidator>();
oddValidator.Setup(c => c.Validate(It.IsAny<ValidationContext>())).Returns<ValidationContext>(v =>
{
Assert.IsAssignableFrom<HttpContextBase>(v.ObjectInstance);
var context = (HttpContextBase)v.ObjectInstance;
var value = Int32.Parse(context.Request.Form["foo"]);
if (value % 2 != 0)
{
return ValidationResult.Success;
}
return new ValidationResult(message);
}).Verifiable();
ValidationHelper validationHelper = GetValidationHelper(GetContext(new { foo = "6" }));
// Act
validationHelper.Add("foo", oddValidator.Object);
var result = validationHelper.Validate();
// Assert
Assert.Equal(1, result.Count());
Assert.Equal(message, result.First().ErrorMessage);
oddValidator.Verify();
}
[Fact]
public void ValidateRunsForSpecifiedFields()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "Foo is not an odd number.";
var oddValidator = new Mock<IValidator>();
oddValidator.Setup(c => c.Validate(It.IsAny<ValidationContext>())).Returns<ValidationContext>(v =>
{
Assert.IsAssignableFrom<HttpContextBase>(v.ObjectInstance);
var context = (HttpContextBase)v.ObjectInstance;
if (context.Request.Form["foo"].IsEmpty())
{
return ValidationResult.Success;
}
int value = context.Request.Form["foo"].AsInt();
if (value % 2 != 0)
{
return ValidationResult.Success;
}
return new ValidationResult(message);
}).Verifiable();
ValidationHelper validationHelper = GetValidationHelper(GetContext(new { foo = "", bar = "" }));
// Act
validationHelper.Add(new[] { "foo", "bar" }, oddValidator.Object);
validationHelper.RequireField("foo");
var result = validationHelper.Validate("foo");
// Assert
Assert.Equal(1, result.Count());
Assert.Equal("This field is required.", result.First().ErrorMessage);
}
[Fact]
public void GetErrorsReturnsAllErrorsIfNoParametersAreSpecified()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "Foo is not an odd number.";
var oddValidator = new Mock<IValidator>();
oddValidator.Setup(c => c.Validate(It.IsAny<ValidationContext>())).Returns<ValidationContext>(v =>
{
Assert.IsAssignableFrom<HttpContextBase>(v.ObjectInstance);
var context = (HttpContextBase)v.ObjectInstance;
if (context.Request.Form["foo"].IsEmpty())
{
return ValidationResult.Success;
}
int value = context.Request.Form["foo"].AsInt();
if (value % 2 != 0)
{
return ValidationResult.Success;
}
return new ValidationResult(message);
}).Verifiable();
ValidationHelper validationHelper = GetValidationHelper(GetContext(new { foo = "4", bar = "" }));
// Act
validationHelper.Add("foo", oddValidator.Object);
validationHelper.RequireFields(new[] { "bar", "foo" });
var result = validationHelper.GetErrors();
// Assert
Assert.Equal(2, result.Count());
Assert.Equal("Foo is not an odd number.", result.First());
Assert.Equal("This field is required.", result.Last());
}
[Fact]
public void IsValidReturnsTrueIfAllValuesPassValidation()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "Foo is not an odd number.";
var oddValidator = new Mock<IValidator>();
oddValidator.Setup(c => c.Validate(It.IsAny<ValidationContext>())).Returns<ValidationContext>(v =>
{
Assert.IsAssignableFrom<HttpContextBase>(v.ObjectInstance);
var context = (HttpContextBase)v.ObjectInstance;
if (context.Request.Form["foo"].IsEmpty())
{
return ValidationResult.Success;
}
int value = context.Request.Form["foo"].AsInt();
if (value % 2 != 0)
{
return ValidationResult.Success;
}
return new ValidationResult(message);
}).Verifiable();
ValidationHelper validationHelper = GetValidationHelper(GetContext(new { foo = "5", bar = "2" }));
// Act
validationHelper.Add(new[] { "foo", "bar" }, oddValidator.Object);
validationHelper.RequireField("foo");
var result = validationHelper.IsValid();
// Assert
Assert.True(result);
}
[Fact]
public void IsValidValidatesSpecifiedFields()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
string message = "Foo is not an odd number.";
var oddValidator = new Mock<IValidator>();
oddValidator.Setup(c => c.Validate(It.IsAny<ValidationContext>())).Returns<ValidationContext>(v =>
{
Assert.IsAssignableFrom<HttpContextBase>(v.ObjectInstance);
var context = (HttpContextBase)v.ObjectInstance;
int value;
if (!Int32.TryParse(context.Request.Form["foo"], out value))
{
return ValidationResult.Success;
}
if (value % 2 != 0)
{
return ValidationResult.Success;
}
return new ValidationResult(message);
}).Verifiable();
ValidationHelper validationHelper = GetValidationHelper(GetContext(new { foo = "3", bar = "" }));
// Act
validationHelper.Add(new[] { "foo", "bar" }, oddValidator.Object);
validationHelper.RequireFields(new[] { "foo", "bar" });
var result = validationHelper.IsValid("foo");
// Assert
Assert.True(result);
}
[Fact]
public void GetValidationHtmlReturnsNullIfNoRulesAreRegistered()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Assert
var validationAttributes = validationHelper.For("bar");
// Assert
Assert.Null(validationAttributes);
}
[Fact]
public void GetValidationHtmlReturnsAttributesForRegisteredValidators()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var validator = new Mock<IValidator>();
var clientRules = new ModelClientValidationRule { ValidationType = "foo", ErrorMessage = "Foo error." };
clientRules.ValidationParameters["qux"] = "some data";
validator.Setup(c => c.ClientValidationRule).Returns(clientRules).Verifiable();
var expected = @"data-val-required=""This field is required."" data-val-foo=""Foo error."" data-val-foo-qux=""some data"" data-val=""true""";
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Act
validationHelper.RequireField("foo");
validationHelper.Add("foo", validator.Object);
var validationAttributes = validationHelper.For("foo");
// Assert
Assert.Equal(expected, validationAttributes.ToString());
}
[Fact]
public void GetValidationHtmlHtmlEncodesAttributeValues()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var validator = new Mock<IValidator>();
var clientRules = new ModelClientValidationRule { ValidationType = "biz", ErrorMessage = "<Biz error.>" };
clientRules.ValidationParameters["qux"] = "<some ' data>";
validator.Setup(c => c.ClientValidationRule).Returns(clientRules).Verifiable();
var expected = @"data-val-required=""This field is required."" data-val-biz=""&lt;Biz error.&gt;"" data-val-biz-qux=""&lt;some &#39; data&gt;"" data-val=""true""";
// Act
ValidationHelper validationHelper = GetValidationHelper(GetContext());
// Assert
validationHelper.RequireField("foo");
validationHelper.Add("foo", validator.Object);
var validationAttributes = validationHelper.For("foo");
// Assert
Assert.Equal(expected, validationAttributes.ToString());
}
[Fact]
public void GetValidationFromClientValidationRulesThrowsIfValidationTypeIsNullOrEmpty()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var clientRule = new ModelClientValidationRule { ValidationType = null };
// Act and Assert
Assert.Throws<InvalidOperationException>(() => ValidationHelper.GenerateHtmlFromClientValidationRules(new[] { clientRule }),
"Validation type names in unobtrusive client validation rules cannot be empty. Client rule type: System.Web.Mvc.ModelClientValidationRule");
clientRule.ValidationType = String.Empty;
Assert.Throws<InvalidOperationException>(() => ValidationHelper.GenerateHtmlFromClientValidationRules(new[] { clientRule }),
"Validation type names in unobtrusive client validation rules cannot be empty. Client rule type: System.Web.Mvc.ModelClientValidationRule");
}
[Fact]
public void GetValidationFromClientValidationRulesThrowsIfSameValidationTypeIsSpecifiedMultipleTimes()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var clientRule1 = new ModelClientValidationRule { ValidationType = "foo" };
var clientRule2 = new ModelClientValidationRule { ValidationType = "foo" };
// Act and Assert
Assert.Throws<InvalidOperationException>(() => ValidationHelper.GenerateHtmlFromClientValidationRules(new[] { clientRule1, clientRule2 }),
"Validation type names in unobtrusive client validation rules must be unique. The following validation type was seen more than once: foo");
}
[Fact]
public void GetValidationFromClientValidationRulesThrowsIfValidationTypeDoesNotContainAllLowerCaseCharacters()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var clientRule = new ModelClientValidationRule { ValidationType = "Foo" };
// Act and Assert
Assert.Throws<InvalidOperationException>(() => ValidationHelper.GenerateHtmlFromClientValidationRules(new[] { clientRule }),
"Validation type names in unobtrusive client validation rules must consist of only lowercase letters. Invalid name: \"Foo\", client rule type: System.Web.Mvc.ModelClientValidationRule");
clientRule.ValidationType = "bAr";
Assert.Throws<InvalidOperationException>(() => ValidationHelper.GenerateHtmlFromClientValidationRules(new[] { clientRule }),
"Validation type names in unobtrusive client validation rules must consist of only lowercase letters. Invalid name: \"bAr\", client rule type: System.Web.Mvc.ModelClientValidationRule");
clientRule.ValidationType = "bar123";
Assert.Throws<InvalidOperationException>(() => ValidationHelper.GenerateHtmlFromClientValidationRules(new[] { clientRule }),
"Validation type names in unobtrusive client validation rules must consist of only lowercase letters. Invalid name: \"bar123\", client rule type: System.Web.Mvc.ModelClientValidationRule");
}
[Fact]
public void GetValidationFromClientValidationRulesThrowsIfValidationParamaterContainsNonAlphaNumericCharacters()
{
// Arrange
RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
var clientRule = new ModelClientValidationRule { ValidationType = "required" };
clientRule.ValidationParameters["min^"] = "some-val";
// Act and Assert
Assert.Throws<InvalidOperationException>(() => ValidationHelper.GenerateHtmlFromClientValidationRules(new[] { clientRule }),
"Validation parameter names in unobtrusive client validation rules must start with a lowercase letter and consist of only lowercase letters or digits. Validation parameter name: min^, client rule type: System.Web.Mvc.ModelClientValidationRule");
clientRule.ValidationParameters.Clear();
clientRule.ValidationParameters["Min"] = "some-val";
Assert.Throws<InvalidOperationException>(() => ValidationHelper.GenerateHtmlFromClientValidationRules(new[] { clientRule }),
"Validation parameter names in unobtrusive client validation rules must start with a lowercase letter and consist of only lowercase letters or digits. Validation parameter name: Min, client rule type: System.Web.Mvc.ModelClientValidationRule");
}
[Fact]
public void DefaultValidCssClassIsNull()
{
Assert.Null(ValidationHelper.ValidCssClass);
}
[Fact]
public void DefaultInvalidCssClassIsSameAsHtmlHelper()
{
Assert.Equal(HtmlHelper.DefaultValidationInputErrorCssClass, ValidationHelper.InvalidCssClass);
}
[Fact]
public void InvalidCssClassIsNullIfExplicitlySetToNull()
{
using (ValidationHelper.OverrideScope())
{
ValidationHelper.InvalidCssClass = null;
Assert.Null(ValidationHelper.InvalidCssClass);
}
}
[Fact]
public void ValidCssClassIsScopeBacked()
{
// Set a value
string old = ValidationHelper.ValidCssClass;
ValidationHelper.ValidCssClass = "outer";
using (ScopeStorage.CreateTransientScope())
{
ValidationHelper.ValidCssClass = "inner";
Assert.Equal("inner", ValidationHelper.ValidCssClass);
}
Assert.Equal("outer", ValidationHelper.ValidCssClass);
ValidationHelper.ValidCssClass = old;
}
[Fact]
public void InvalidCssClassIsScopeBacked()
{
// Set a value
string old = ValidationHelper.InvalidCssClass;
ValidationHelper.InvalidCssClass = "outer";
using (ScopeStorage.CreateTransientScope())
{
ValidationHelper.InvalidCssClass = "inner";
Assert.Equal("inner", ValidationHelper.InvalidCssClass);
}
Assert.Equal("outer", ValidationHelper.InvalidCssClass);
ValidationHelper.InvalidCssClass = old;
}
[Fact]
public void ClassForReturnsNullIfNotPost()
{
// Arrange
ValidationHelper helper = GetValidationHelper();
// Act/Assert
Assert.Null(helper.ClassFor("foo"));
}
[Fact]
public void ClassForReturnsValidClassNameIfNoErrorsAddedForField()
{
// Arrange
ValidationHelper helper = GetPostValidationHelper();
// Act/Assert
HtmlString html = helper.ClassFor("foo");
string str = html == null ? null : html.ToHtmlString();
Assert.Equal(ValidationHelper.ValidCssClass, str);
}
[Fact]
public void ClassForReturnsInvalidClassNameIfFieldHasErrors()
{
// Arrange
ValidationHelper helper = GetPostValidationHelper();
helper.Add("foo", new AutoFailValidator());
// Act/Assert
Assert.Equal(ValidationHelper.InvalidCssClass, helper.ClassFor("foo").ToHtmlString());
}
private static ValidationHelper GetPostValidationHelper()
{
HttpContextBase context = GetContext();
Mock.Get(context.Request).SetupGet(c => c.HttpMethod).Returns("POST");
ValidationHelper helper = GetValidationHelper(httpContext: context);
return helper;
}
private static HttpContextBase GetContext(object formValues = null)
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var nameValueCollection = new NameValueCollection();
if (formValues != null)
{
foreach (var prop in formValues.GetType().GetProperties())
{
nameValueCollection.Add(prop.Name, prop.GetValue(formValues, null).ToString());
}
}
request.SetupGet(c => c.Form).Returns(nameValueCollection);
context.SetupGet(c => c.Request).Returns(request.Object);
return context.Object;
}
private static ValidationHelper GetValidationHelper(HttpContextBase httpContext = null, ModelStateDictionary modelStateDictionary = null)
{
httpContext = httpContext ?? GetContext();
modelStateDictionary = modelStateDictionary ?? new ModelStateDictionary();
return new ValidationHelper(httpContext, modelStateDictionary);
}
private class AutoFailValidator : IValidator
{
public ValidationResult Validate(ValidationContext validationContext)
{
return new ValidationResult("Failed!");
}
public ModelClientValidationRule ClientValidationRule
{
get { throw new NotImplementedException(); }
}
}
}
}