You've already forked linux-packaging-mono
acceptance-tests
data
debian
docs
external
Newtonsoft.Json
api-doc-tools
api-snapshot
aspnetwebstack
packages
src
test
Microsoft.TestCommon
Microsoft.Web.Helpers.Test
Microsoft.Web.Http.Data.Test
Microsoft.Web.Mvc.Test
Microsoft.Web.WebPages.OAuth.Test
SPA.Test
System.Json.Test.Integration
System.Json.Test.Unit
System.Net.Http.Formatting.Test.Integration
System.Net.Http.Formatting.Test.Unit
System.Web.Helpers.Test
System.Web.Http.Integration.Test
System.Web.Http.SelfHost.Test
System.Web.Http.Test
System.Web.Http.WebHost.Test
System.Web.Mvc.Test
System.Web.Razor.Test
System.Web.WebPages.Administration.Test
System.Web.WebPages.Deployment.Test
System.Web.WebPages.Razor.Test
System.Web.WebPages.Test
ApplicationParts
Extensions
Helpers
Html
Instrumentation
Mvc
Properties
ScopeStorage
TestFiles
Utils
Validation
ValidationHelperTest.cs
ValidatorTest.cs
WebPage
App.config
PreApplicationStartCodeTest.cs
System.Web.WebPages.Test.csproj
packages.config
WebMatrix.Data.Test
WebMatrix.WebData.Test
Settings.StyleCop
tools
.gitattributes
.gitignore
License.txt
README.md
Runtime.msbuild
Runtime.sln
Runtime.xunit
Settings.StyleCop
build.cmd
binary-reference-assemblies
bockbuild
boringssl
cecil
cecil-legacy
corefx
corert
ikdasm
ikvm
linker
nuget-buildtasks
nunit-lite
roslyn-binaries
rx
xunit-binaries
ikvm-native
libgc
llvm
m4
man
mcs
mk
mono
msvc
po
runtime
samples
scripts
support
tools
COPYING.LIB
LICENSE
Makefile.am
Makefile.in
NEWS
README.md
acinclude.m4
aclocal.m4
autogen.sh
code_of_conduct.md
compile
config.guess
config.h.in
config.rpath
config.sub
configure.REMOVED.git-id
configure.ac.REMOVED.git-id
depcomp
install-sh
ltmain.sh.REMOVED.git-id
missing
mkinstalldirs
mono-uninstalled.pc.in
test-driver
winconfig.h
837 lines
35 KiB
C#
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=""<Biz error.>"" data-val-biz-qux=""<some ' data>"" 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(); }
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|