-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathFluentValidationAutoValidationObjectModelValidatorTest.cs
More file actions
92 lines (81 loc) · 3.7 KB
/
FluentValidationAutoValidationObjectModelValidatorTest.cs
File metadata and controls
92 lines (81 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System.Collections.Generic;
using System.Linq;
using FluentValidation;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using NSubstitute;
using SharpGrip.FluentValidation.AutoValidation.Mvc.Extensions;
using SharpGrip.FluentValidation.AutoValidation.Mvc.Validation;
using Xunit;
namespace SharpGrip.FluentValidation.AutoValidation.Tests.FluentValidation.AutoValidation.Mvc.Validation;
public class FluentValidationAutoValidationObjectModelValidatorTest
{
[Fact]
public void TestGetValidationVisitor()
{
var modelMetadataProvider = Substitute.For<IModelMetadataProvider>();
var modelMetadataProviders = Substitute.For<IList<IModelValidatorProvider>>();
var actionContext = Substitute.For<ActionContext>();
var modelValidatorProvider = Substitute.For<IModelValidatorProvider>();
var validatorCache = Substitute.For<ValidatorCache>();
var fluentValidationAutoValidationObjectModelValidator = new FluentValidationAutoValidationObjectModelValidator(
modelMetadataProvider, modelMetadataProviders, true);
Assert.IsType<FluentValidationAutoValidationValidationVisitor>(
fluentValidationAutoValidationObjectModelValidator.GetValidationVisitor(actionContext, modelValidatorProvider, validatorCache, modelMetadataProvider, null));
}
[Fact]
public void TryValidateModel_WithInvalidModel_ShouldUpdateModelState()
{
// Arrange
var serviceCollection = new ServiceCollection();
serviceCollection.AddControllersWithViews();
serviceCollection.AddFluentValidationAutoValidation();
serviceCollection.AddTransient<IValidator<Test1Controller.Action1ViewModel>, Test1Controller.Action1ViewModel.Action1ViewModelValidator>();
var serviceProvider = serviceCollection.BuildServiceProvider();
var viewModel = new Test1Controller.Action1ViewModel
{
ValueMustEqual1 = 0 // Invalid value to trigger validation error
};
var httpContext = new DefaultHttpContext
{
RequestServices = serviceProvider
};
var routeData = Substitute.For<RouteData>();
var actionDescriptor = Substitute.For<ControllerActionDescriptor>();
var actionContext = new ActionContext(httpContext, routeData, actionDescriptor);
var controller = new Test1Controller
{
ControllerContext = new ControllerContext(actionContext)
};
// Act
bool result = controller.TryValidateModel(viewModel);
// Assert
Assert.False(result);
Assert.False(controller.ModelState.IsValid);
Assert.True(controller.ModelState.ContainsKey(nameof(Test1Controller.Action1ViewModel.ValueMustEqual1)));
var modelError = controller.ModelState[nameof(Test1Controller.Action1ViewModel.ValueMustEqual1)]!.Errors.Single();
Assert.NotNull(modelError);
Assert.Equal("'ValueMustEqual1' must be equal to '1'.", modelError.ErrorMessage);
}
public class Test1Controller : Controller
{
public class Action1ViewModel
{
public int ValueMustEqual1 { get; set; }
internal class Action1ViewModelValidator : AbstractValidator<Action1ViewModel>
{
public Action1ViewModelValidator()
{
this.RuleFor(x => x.ValueMustEqual1)
.Equal(1)
.WithName(nameof(ValueMustEqual1));
}
}
}
}
}