public void Each_returned_error_has_a_key_that_reflects_the_tested_member() { var req1 = new Mock <IRequirement <int> >(); req1.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError { Message = "A" } }); var req2 = new Mock <IRequirement <int> >(); req2.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError { Message = "B" } }); var req3 = new Mock <IRequirement <int> >(); req3.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError { Message = "C" } }); var list = new RequirementList <string, int>(t => t.Length); list.Add(req1.Object); list.Add(req2.Object); list.Add(req3.Object); var errors = list.Check("").ToArray(); Assert.Equal("Length", errors[0].Key); Assert.Equal("Length", errors[1].Key); Assert.Equal("Length", errors[2].Key); }
private AggregateResult <ExamplePerson> SetName(string name) { Action action = () => _name = name.Trim(); var requirements = RequirementList.Create() .AddExceptionRequirement( () => name != null, new ArgumentNullException(nameof(name))) .AddNotificationRequirement( () => name.Trim().Length > 0, nameof(Name), "A name is required.") .AddNotificationRequirement( // TODO: Remove. Here for a UI test () => name != "Jar Jar Binks", nameof(Name), "Jar Jar Binks is not wanted here!"); return(AggregateExecution .CheckRequirements(requirements) .ExecuteAction(action) .ReturnAggregateResult(this)); }
public void Each_returned_error_contains_the_message_returned_by_the_requirement() { var req1 = new Mock <IRequirement <int> >(); req1.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError { Message = "A" } }); var req2 = new Mock <IRequirement <int> >(); req2.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError { Message = "B" } }); var req3 = new Mock <IRequirement <int> >(); req3.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError { Message = "C" } }); var list = new RequirementList <string, int>(t => t.Length); list.Add(req1.Object); list.Add(req2.Object); list.Add(req3.Object); var errors = list.Check("").ToArray(); Assert.Equal("A", errors[0].Message); Assert.Equal("B", errors[1].Message); Assert.Equal("C", errors[2].Message); }
public void Returns_an_error_string_for_each_failed_requirement() { var reqA = new Mock <IRequirement <object> >(); reqA.Setup(t => t.Check(It.IsAny <object>())).Returns(new[] { new ValidationError { Message = "errorA" } }).Verifiable(); var reqB = new Mock <IRequirement <object> >(); reqB.Setup(t => t.Check(It.IsAny <object>())).Returns(new ValidationError[0]).Verifiable(); var reqC = new Mock <IRequirement <object> >(); reqC.Setup(t => t.Check(It.IsAny <object>())).Returns(new[] { new ValidationError { Message = "errorC" } }).Verifiable(); var list = new RequirementList <object, object>(t => ToString()); list.Add(reqA.Object); list.Add(reqB.Object); list.Add(reqC.Object); var errors = list.Check("").ToArray(); reqA.Verify(); reqB.Verify(); reqC.Verify(); Assert.Equal(2, errors.Count()); Assert.NotEmpty(errors.Where(t => t.Message == "errorA")); Assert.NotEmpty(errors.Where(t => t.Message == "errorC")); }
public void If_a_key_is_specified_it_overrides_the_generated_key() { var req = new Mock<AbstractRequirement<int>>() { CallBase = true }; req.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "A" } }); var list = new RequirementList<string, int>(t => t.Length, "Overridden"); list.Add(req.Object); var errors = list.Check("").ToArray(); Assert.Equal("Overridden", errors[0].Key); }
public void Do_not_shortcircuit_null_values() { var reqA = new Mock<AbstractRequirement<object>>() { CallBase = true }; reqA.Setup(t => t.Check(It.IsAny<object>())).Returns(new[] { new ValidationError { Message = "errorA" } }); var list = new RequirementList<object, object>(t => ToString()); list.Add(reqA.Object); var errors = list.Check(null).ToArray(); Assert.NotEmpty(errors); }
public void If_error_from_requirement_already_has_a_key_that_key_is_appended_to_the_member_name_separated_by_a_dot() { var req1 = new Mock<IRequirement<int>>(); req1.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "A", Key="X" } }); var list = new RequirementList<string, int>(t => t.Length); list.Add(req1.Object); var errors = list.Check("").ToArray(); Assert.Equal("Length.X", errors[0].Key); }
public void Stop_at_first_failing_validator() { var reqA = new Mock<AbstractRequirement<object>> { CallBase = true }; var reqB = new Mock<AbstractRequirement<object>> { CallBase = true }; reqA.Setup(t => t.Check(It.IsAny<object>())).Returns(new []{ new ValidationError() }); var list = new RequirementList<object, object>(t => ToString()); list.Add(reqA.Object); list.Add(reqB.Object); list.Check(null).ToArray(); reqB.Verify(t=>t.Check(It.IsAny<object>(),It.IsAny<object>()),Times.Never()); }
public static IRequirementList <TProperty, TProperty> If <T, TProperty>(this IRequirementList <T, TProperty> list, Func <T, TProperty, bool> predicate) where T : class { var nested = new RequirementList <TProperty, TProperty>(t => t, String.Empty); list.Add(new NestedRequirement <T, TProperty>(nested) { Predicate = predicate }); return(nested); }
public void If_error_from_requirement_already_has_a_key_that_key_is_appended_to_the_member_name_separated_by_a_dot() { var req1 = new Mock <IRequirement <int> >(); req1.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError { Message = "A", Key = "X" } }); var list = new RequirementList <string, int>(t => t.Length); list.Add(req1.Object); var errors = list.Check("").ToArray(); Assert.Equal("Length.X", errors[0].Key); }
public void Should_apply_nested_requirements() { var obj = new Model { Value = "Bob" }; var req = new StringRequirement(); var list = new RequirementList <Model, string>(t => t.Value); list.Add(req); var nestedRequirement = new NestedRequirement <object, Model>(list); nestedRequirement.Check(obj).ToArray(); Assert.Same(obj, req.Container); Assert.Same(obj.Value, req.Value); }
public void Each_returned_error_has_a_key_that_reflects_the_tested_member() { var req1 = new Mock<AbstractRequirement<int>>() { CallBase = true }; req1.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "A" } }); var req2 = new Mock<AbstractRequirement<int>>() { CallBase = true }; req2.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "B" } }); var req3 = new Mock<AbstractRequirement<int>>() { CallBase = true }; req3.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "C" } }); var list = new RequirementList<string, int>(t => t.Length) { ContinueOnError = true }; ; list.Add(req1.Object); list.Add(req2.Object); list.Add(req3.Object); var errors = list.Check("").ToArray(); Assert.Equal("Length", errors[0].Key); Assert.Equal("Length", errors[1].Key); Assert.Equal("Length", errors[2].Key); }
public void Containing_object_is_passed_as_context_to_property_requirements() { var req = new Mock <AbstractRequirement <string> >() { CallBase = true }; var list = new RequirementList <Model, string>(t => t.Name); list.Add(req.Object); var obj = new Model { Name = "Bob" }; list.Check(obj).ToArray(); req.Verify(t => t.Check(obj, It.IsAny <string>())); }
public void Each_returned_error_contains_the_message_returned_by_the_requirement() { var req1 = new Mock<IRequirement<int>>(); req1.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "A" } }); var req2 = new Mock<IRequirement<int>>(); req2.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "B" } }); var req3 = new Mock<IRequirement<int>>(); req3.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "C" } }); var list = new RequirementList<string, int>(t => t.Length); list.Add(req1.Object); list.Add(req2.Object); list.Add(req3.Object); var errors = list.Check("").ToArray(); Assert.Equal("A", errors[0].Message); Assert.Equal("B", errors[1].Message); Assert.Equal("C", errors[2].Message); }
public void Stop_at_first_failing_validator() { var reqA = new Mock <AbstractRequirement <object> > { CallBase = true }; var reqB = new Mock <AbstractRequirement <object> > { CallBase = true }; reqA.Setup(t => t.Check(It.IsAny <object>())).Returns(new [] { new ValidationError() }); var list = new RequirementList <object, object>(t => ToString()); list.Add(reqA.Object); list.Add(reqB.Object); list.Check(null).ToArray(); reqB.Verify(t => t.Check(It.IsAny <object>(), It.IsAny <object>()), Times.Never()); }
public void If_a_key_is_specified_it_overrides_the_generated_key() { var req = new Mock <AbstractRequirement <int> >() { CallBase = true }; req.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError { Message = "A" } }); var list = new RequirementList <string, int>(t => t.Length, "Overridden"); list.Add(req.Object); var errors = list.Check("").ToArray(); Assert.Equal("Overridden", errors[0].Key); }
public void Do_not_shortcircuit_null_values() { var reqA = new Mock <AbstractRequirement <object> >() { CallBase = true }; reqA.Setup(t => t.Check(It.IsAny <object>())).Returns(new[] { new ValidationError { Message = "errorA" } }); var list = new RequirementList <object, object>(t => ToString()); list.Add(reqA.Object); var errors = list.Check(null).ToArray(); Assert.NotEmpty(errors); }
private AggregateResult <ExamplePerson> SetEmailAddress(string emailAddress) { Action action = () => _emailAddress = emailAddress.Trim(); var requirements = RequirementList.Create() .AddExceptionRequirement( () => emailAddress != null, new ArgumentNullException(nameof(emailAddress))) .AddNotificationRequirement( () => RegexUtilities.IsValidEmail(emailAddress), nameof(EmailAddress), "A valid email address is required."); return(AggregateExecution // TODO: Inject as 'AggregateService'? .CheckRequirements(requirements) .ExecuteAction(action) .ReturnAggregateResult(this)); }
public void Returns_an_error_string_for_each_failed_requirement_if_continue_on_error_is_true() { var reqA = new Mock<AbstractRequirement<object>>() { CallBase = true }; reqA.Setup(t => t.Check(It.IsAny<object>())).Returns(new[] { new ValidationError { Message = "errorA" } }).Verifiable(); var reqB = new Mock<AbstractRequirement<object>>() { CallBase = true }; reqB.Setup(t => t.Check(It.IsAny<object>())).Returns(new ValidationError[0]).Verifiable(); var reqC = new Mock<AbstractRequirement<object>>() { CallBase = true }; reqC.Setup(t => t.Check(It.IsAny<object>())).Returns(new[] { new ValidationError { Message = "errorC" } }).Verifiable(); var list = new RequirementList<object, object>(t => ToString()) { ContinueOnError = true }; ; list.Add(reqA.Object); list.Add(reqB.Object); list.Add(reqC.Object); var errors = list.Check("").ToArray(); reqA.Verify(); reqB.Verify(); reqC.Verify(); Assert.Equal(2, errors.Count()); Assert.NotEmpty(errors.Where(t => t.Message=="errorA")); Assert.NotEmpty(errors.Where(t => t.Message=="errorC")); }
public void Containing_object_is_passed_as_context_to_property_requirements() { var req = new Mock<AbstractRequirement<string>>() { CallBase = true }; var list = new RequirementList<Model, string>(t => t.Name); list.Add(req.Object); var obj = new Model {Name = "Bob"}; list.Check(obj).ToArray(); req.Verify(t => t.Check(obj, It.IsAny<string>())); }