public void NonIValidatableObjectInsideMetadataThrows() {
            // Arrange
            var context = new ControllerContext();
            var validatable = new Mock<IValidatableObject>();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => 42, typeof(IValidatableObject));
            var validator = new ValidatableObjectAdapter(metadata, context);

            // Act & Assert
            ExceptionHelper.ExpectInvalidOperationException(
                () => validator.Validate(null),
                "The model object inside the metadata claimed to be compatible with System.ComponentModel.DataAnnotations.IValidatableObject, but was actually System.Int32.");
        }
        public void IValidatableObjectWithNoErrors() {
            // Arrange
            var context = new ControllerContext();
            var validatable = new Mock<IValidatableObject>();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => validatable.Object, validatable.Object.GetType());
            var validator = new ValidatableObjectAdapter(metadata, context);
            validatable.Setup(vo => vo.Validate(It.IsAny<ValidationContext>()))
                       .Returns(Enumerable.Empty<ValidationResult>());

            // Act
            IEnumerable<ModelValidationResult> results = validator.Validate(null);

            // Assert
            Assert.AreEqual(0, results.Count());
        }
        public void IValidatableObjectWithModelLevelError() {
            // Arrange
            var context = new ControllerContext();
            var validatable = new Mock<IValidatableObject>();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => validatable.Object, validatable.Object.GetType());
            var validator = new ValidatableObjectAdapter(metadata, context);
            validatable.Setup(vo => vo.Validate(It.IsAny<ValidationContext>()))
                       .Returns(new ValidationResult[] { new ValidationResult("Error Message") });

            // Act
            ModelValidationResult result = validator.Validate(null).Single();

            // Assert
            Assert.AreEqual("Error Message", result.Message);
            Assert.AreEqual(String.Empty, result.MemberName);
        }
        public void IValidatableObjectGetsAProperlyPopulatedValidationContext() {
            // Arrange
            var context = new ControllerContext();
            var validatable = new Mock<IValidatableObject>();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => validatable.Object, validatable.Object.GetType());
            var validator = new ValidatableObjectAdapter(metadata, context);
            ValidationContext validationContext = null;
            validatable.Setup(vo => vo.Validate(It.IsAny<ValidationContext>()))
                       .Callback<ValidationContext>(vc => validationContext = vc)
                       .Returns(Enumerable.Empty<ValidationResult>())
                       .Verifiable();

            // Act
            validator.Validate(null);

            // Assert
            validatable.Verify();
            Assert.AreSame(validatable.Object, validationContext.ObjectInstance);
            Assert.IsNull(validationContext.MemberName);
        }
        public void IValidatableObjectWithMultipleModelLevelErrors() {
            // Arrange
            var context = new ControllerContext();
            var validatable = new Mock<IValidatableObject>();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => validatable.Object, validatable.Object.GetType());
            var validator = new ValidatableObjectAdapter(metadata, context);
            validatable.Setup(vo => vo.Validate(It.IsAny<ValidationContext>()))
                       .Returns(new ValidationResult[] {
                           new ValidationResult("Error Message 1"),
                           new ValidationResult("Error Message 2")
                       });

            // Act
            ModelValidationResult[] results = validator.Validate(null).ToArray();

            // Assert
            Assert.AreEqual(2, results.Length);
            Assert.AreEqual("Error Message 1", results[0].Message);
            Assert.AreEqual("Error Message 2", results[1].Message);
        }
        public void IValidatableObjectWhichReturnsValidationResultSuccessReturnsNoErrors() {
            // Arrange
            var context = new ControllerContext();
            var validatable = new Mock<IValidatableObject>();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => validatable.Object, validatable.Object.GetType());
            var validator = new ValidatableObjectAdapter(metadata, context);
            validatable.Setup(vo => vo.Validate(It.IsAny<ValidationContext>()))
                       .Returns(new[] { ValidationResult.Success })
                       .Verifiable();

            // Act
            ModelValidationResult[] results = validator.Validate(null).ToArray();

            // Assert
            validatable.Verify();
            Assert.IsFalse(results.Any());
        }
        public void IValidatableObjectWhichIsNullReturnsNoErrors() {
            // Arrange
            var context = new ControllerContext();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => null, typeof(IValidatableObject));
            var validator = new ValidatableObjectAdapter(metadata, context);

            // Act
            IEnumerable<ModelValidationResult> results = validator.Validate(null);

            // Assert
            Assert.AreEqual(0, results.Count());
        }
        public void IValidatableObjectWithMultiPropertyValidationFailure() {
            // Arrange
            var context = new ControllerContext();
            var validatable = new Mock<IValidatableObject>();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => validatable.Object, validatable.Object.GetType());
            var validator = new ValidatableObjectAdapter(metadata, context);
            validatable.Setup(vo => vo.Validate(It.IsAny<ValidationContext>()))
                       .Returns(new[] { new ValidationResult("Error Message", new[] { "Property1", "Property2" }) })
                       .Verifiable();

            // Act
            ModelValidationResult[] results = validator.Validate(null).ToArray();

            // Assert
            validatable.Verify();
            Assert.AreEqual(2, results.Length);
            Assert.AreEqual("Error Message", results[0].Message);
            Assert.AreEqual("Property1", results[0].MemberName);
            Assert.AreEqual("Error Message", results[1].Message);
            Assert.AreEqual("Property2", results[1].MemberName);
        }