Skip to content

Commit 658d475

Browse files
Copilotcaptainsafia
andcommitted
Add integration tests for RuntimeValidatableTypeInfoResolver registration
Co-authored-by: captainsafia <[email protected]>
1 parent a09624a commit 658d475

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
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

Comments
 (0)