1
+ #pragma warning disable ASP0029 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
2
+
3
+ // Licensed to the .NET Foundation under one or more agreements.
4
+ // The .NET Foundation licenses this file to you under the MIT license.
5
+
6
+ using System . ComponentModel . DataAnnotations ;
7
+ using Microsoft . Extensions . DependencyInjection ;
8
+ using Microsoft . Extensions . Options ;
9
+
10
+ namespace Microsoft . Extensions . Validation . Tests ;
11
+
12
+ public class ValidationServiceCollectionExtensionsIntegrationTests
13
+ {
14
+ [ Fact ]
15
+ public void AddValidation_RegistersRuntimeValidatableTypeInfoResolver ( )
16
+ {
17
+ // Arrange
18
+ var services = new ServiceCollection ( ) ;
19
+
20
+ // Act
21
+ services . AddValidation ( ) ;
22
+ var serviceProvider = services . BuildServiceProvider ( ) ;
23
+ var validationOptions = serviceProvider . GetRequiredService < IOptions < ValidationOptions > > ( ) . Value ;
24
+
25
+ // Assert
26
+ Assert . NotEmpty ( validationOptions . Resolvers ) ;
27
+ Assert . Contains ( validationOptions . Resolvers , r => r is RuntimeValidatableTypeInfoResolver ) ;
28
+ Assert . Contains ( validationOptions . Resolvers , r => r is RuntimeValidatableParameterInfoResolver ) ;
29
+ }
30
+
31
+ [ Fact ]
32
+ public void AddValidation_RuntimeTypeResolverCanResolveComplexTypes ( )
33
+ {
34
+ // Arrange
35
+ var services = new ServiceCollection ( ) ;
36
+ services . AddValidation ( ) ;
37
+ var serviceProvider = services . BuildServiceProvider ( ) ;
38
+ var validationOptions = serviceProvider . GetRequiredService < IOptions < ValidationOptions > > ( ) . Value ;
39
+
40
+ // Act
41
+ var result = validationOptions . TryGetValidatableTypeInfo ( typeof ( TestPoco ) , out var validatableInfo ) ;
42
+
43
+ // Assert
44
+ Assert . True ( result ) ;
45
+ Assert . NotNull ( validatableInfo ) ;
46
+ Assert . IsType < RuntimeValidatableTypeInfoResolver . RuntimeValidatableTypeInfo > ( validatableInfo ) ;
47
+ }
48
+
49
+ [ Fact ]
50
+ public void AddValidation_RuntimeTypeResolverReturnsNullForPrimitiveTypes ( )
51
+ {
52
+ // Arrange
53
+ var services = new ServiceCollection ( ) ;
54
+ services . AddValidation ( ) ;
55
+ var serviceProvider = services . BuildServiceProvider ( ) ;
56
+ var validationOptions = serviceProvider . GetRequiredService < IOptions < ValidationOptions > > ( ) . Value ;
57
+
58
+ // Act
59
+ var result = validationOptions . TryGetValidatableTypeInfo ( typeof ( int ) , out var validatableInfo ) ;
60
+
61
+ // Assert
62
+ Assert . False ( result ) ;
63
+ Assert . Null ( validatableInfo ) ;
64
+ }
65
+
66
+ [ Fact ]
67
+ public void AddValidation_ResolversAreInCorrectOrder ( )
68
+ {
69
+ // Arrange
70
+ var services = new ServiceCollection ( ) ;
71
+ services . AddValidation ( ) ;
72
+ var serviceProvider = services . BuildServiceProvider ( ) ;
73
+ var validationOptions = serviceProvider . GetRequiredService < IOptions < ValidationOptions > > ( ) . Value ;
74
+
75
+ // Assert - RuntimeValidatableParameterInfoResolver should come first, then RuntimeValidatableTypeInfoResolver
76
+ var parameterResolverIndex = - 1 ;
77
+ var typeResolverIndex = - 1 ;
78
+
79
+ for ( int i = 0 ; i < validationOptions . Resolvers . Count ; i ++ )
80
+ {
81
+ if ( validationOptions . Resolvers [ i ] is RuntimeValidatableParameterInfoResolver )
82
+ {
83
+ parameterResolverIndex = i ;
84
+ }
85
+ else if ( validationOptions . Resolvers [ i ] is RuntimeValidatableTypeInfoResolver )
86
+ {
87
+ typeResolverIndex = i ;
88
+ }
89
+ }
90
+
91
+ Assert . True ( parameterResolverIndex >= 0 , "RuntimeValidatableParameterInfoResolver should be registered" ) ;
92
+ Assert . True ( typeResolverIndex >= 0 , "RuntimeValidatableTypeInfoResolver should be registered" ) ;
93
+ Assert . True ( parameterResolverIndex < typeResolverIndex , "Parameter resolver should come before type resolver" ) ;
94
+ }
95
+
96
+ public class TestPoco
97
+ {
98
+ [ Required ]
99
+ public string Name { get ; set ; } = string . Empty ;
100
+
101
+ [ Range ( 0 , 100 ) ]
102
+ public int Age { get ; set ; }
103
+ }
104
+ }
0 commit comments