public void Create_Factory_Action_Will_Return_An_Action_That_Can_Be_Passed_Back_And_Actioned_Later()
        {
            Action <IValidatorConfigurationExpression> configure = cfg =>
            {
                cfg.AddProfile <Profile2>();
                cfg.AddProfile <Profile2>();
            };

            _subject = new AutoValidation(configure);

            var model = new Model1
            {
                Age  = 23,
                Name = "Jon Hawkins"
            };

            // act
            var factoryFunc = _subject.CreateFactoryFunc();

            var factory = factoryFunc();

            // assert
            factory.Should().BeOfType <ValidatorFactory>();

            var validator = factory.Create <Model1>();

            validator.Should().NotBeNull();
            var validationResult = validator.Validate(model);

            validationResult.Should().NotBeNull();
            validationResult.Success.Should().BeTrue();
        }
        public void Create_Factory_Will_Return_A_Valid_Factory()
        {
            // arrange
            Action <IValidatorConfigurationExpression> configure = cfg =>
            {
                cfg.AddProfile <Profile2>();
                cfg.AddProfile <Profile2>();
            };

            _subject = new AutoValidation(configure);

            var model = new Model1
            {
                Age  = 23,
                Name = "Jon Hawkins"
            };

            // act
            var factory = _subject.CreateFactory();

            // assert
            factory.Should().NotBeNull();

            var validator = factory.Create <Model1>();

            validator.Should().NotBeNull();
            var validationResult = validator.Validate(model);

            validationResult.Should().NotBeNull();
            validationResult.Success.Should().BeTrue();
        }
        public void Passing_Null_Configuration_By_Constructor_Throws()
        {
            // arrange
            _subject = new AutoValidation((ValidatorConfigurationExpression)null);

            // act
            Action action = () => _subject.AssertExpressionsAreValid();

            // assert
            action.Should().Throw <ConfigurationExpressionException>().WithMessage("No configuration has been setup");
        }
        public void Create_Factory_For_Config_That_Is_Not_Setup_Will_Throw_Exception()
        {
            // arrange
            _subject = new AutoValidation((ValidatorConfigurationExpression)null);

            // act
            Action action = () => _subject.CreateFactory();

            // assert
            action.Should().Throw <ArgumentNullException>().WithMessage("Configuration has not been configured");
        }
        public void Has_CreateMap_For_Class_NoMapping_Returns_False()
        {
            Action <IValidatorConfigurationExpression> configure = cfg =>
            {
                cfg.AddProfile <Profile2>();
            };

            _subject = new AutoValidation(configure);

            var mapType = typeof(Model2);

            var result = _subject.HasMap(mapType);

            result.Should().BeFalse();
        }
        public void Passing_Good_Configuration_Will_Not_Throw_Any_Exceptions_On_Assert()
        {
            // arrange
            var expression = new ValidatorConfigurationExpression();

            expression.AddProfile <Profile2>();
            expression.AddProfile <Profile1>();

            _subject = new AutoValidation(expression);

            // act
            Action action = () => _subject.AssertExpressionsAreValid();

            // assert
            action.Should().NotThrow();
        }
        public void Create_Factory_Action_Will_Return_New_Instance_Each_Time()
        {
            _subject = new AutoValidation(cfg =>
            {
                cfg.AddProfile <Profile2>();
                cfg.AddProfile <Profile2>();
            });

            // act
            var factoryFunc = _subject.CreateFactoryFunc();

            var factory1 = factoryFunc();
            var factory2 = factoryFunc();

            // assert
            factory1.Equals(factory2).Should().BeFalse();
        }
        public void Passing_Good_Configuration_Action_Will_Not_Throw_Any_Exceptions_On_Assert()
        {
            // arrange
            Action <IValidatorConfigurationExpression> configure = cfg =>
            {
                cfg.AddProfile <Profile2>();
                cfg.AddProfile <Profile2>();
            };

            _subject = new AutoValidation(configure);

            // act
            Action action = () => _subject.AssertExpressionsAreValid();

            // assert
            action.Should().NotThrow();
        }
        public void Passing_Bad_Configuration_Will_Throw()
        {
            // arrange
            var expression = new ValidatorConfigurationExpression();

            expression.AddProfile <DuplicateInvalidMappingProfile>();
            expression.AddProfile <MissingMappingProfile>();

            _subject = new AutoValidation(expression);

            try
            {
                _subject.AssertExpressionsAreValid();
            }
            catch (ConfigurationExpressionException ex)
            {
                ex.Errors.ToList().Count.Should().Be(2);
                ex.Errors.Should().Contain(e => e.ProfileType == typeof(DuplicateInvalidMappingProfile));
                ex.Errors.Should().Contain(e => e.ProfileType == typeof(MissingMappingProfile));
            }
        }
        public void Passing_Bad_Configuration_Action__Will_Throw_Will_Not_Contain_Good_Profile()
        {
            // arrange
            Action <IValidatorConfigurationExpression> configure = cfg =>
            {
                cfg.AddProfile <DuplicateInvalidMappingProfile>();
                cfg.AddProfile <MissingMappingProfile>();
                cfg.AddProfile <Profile1>();
            };

            _subject = new AutoValidation(configure);

            try
            {
                _subject.AssertExpressionsAreValid();
            }
            catch (ConfigurationExpressionException ex)
            {
                ex.Errors.ToList().Count.Should().Be(2);
                ex.Errors.Should().Contain(e => e.ProfileType == typeof(DuplicateInvalidMappingProfile));
                ex.Errors.Should().Contain(e => e.ProfileType == typeof(MissingMappingProfile));
            }
        }