Skip to content

Commit c6e9f3a

Browse files
committed
test(validators): add isolated unit tests for all request validators
Implemented strict, isolated unit tests for all validation classes without relying on the database, infrastructure services, or the ASP.NET Core pipeline. Covered validators: - CreateTesterValidator - UpdateTesterValidator - ValidateTesterAccessValidator - GetAllTestersAccessHistoryValidator These tests ensure validation logic behaves correctly and consistently, focusing solely on business validation rules. This improves reliability and prevents regressions in input validation behavior.
1 parent 4c39785 commit c6e9f3a

4 files changed

Lines changed: 452 additions & 0 deletions

File tree

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using FluentValidation.TestHelper;
2+
using Playtesters.API.UseCases.Testers;
3+
4+
namespace Playtesters.API.Tests.Validators;
5+
6+
public class CreateTesterValidatorTests
7+
{
8+
[Test]
9+
public void Name_WhenNull_ShouldHaveError()
10+
{
11+
// Arrange
12+
var validator = new CreateTesterValidator();
13+
var request = new CreateTesterRequest(Name: null);
14+
15+
// Act
16+
var result = validator.TestValidate(request);
17+
18+
// Assert
19+
result.ShouldHaveValidationErrorFor(r => r.Name);
20+
}
21+
22+
[Test]
23+
public void Name_WhenEmpty_ShouldHaveError()
24+
{
25+
// Arrange
26+
var validator = new CreateTesterValidator();
27+
var request = new CreateTesterRequest(Name: string.Empty);
28+
29+
// Act
30+
var result = validator.TestValidate(request);
31+
32+
// Assert
33+
result.ShouldHaveValidationErrorFor(r => r.Name);
34+
}
35+
36+
[Test]
37+
public void Name_WhenShorterThanThreeCharacters_ShouldHaveError()
38+
{
39+
// Arrange
40+
var validator = new CreateTesterValidator();
41+
var request = new CreateTesterRequest(Name: "ab");
42+
43+
// Act
44+
var result = validator.TestValidate(request);
45+
46+
// Assert
47+
result.ShouldHaveValidationErrorFor(r => r.Name);
48+
}
49+
50+
[Test]
51+
public void Name_WhenHasThreeCharacters_ShouldNotHaveError()
52+
{
53+
// Arrange
54+
var validator = new CreateTesterValidator();
55+
var request = new CreateTesterRequest(Name: "abc");
56+
57+
// Act
58+
var result = validator.TestValidate(request);
59+
60+
// Assert
61+
result.ShouldNotHaveValidationErrorFor(r => r.Name);
62+
}
63+
64+
[Test]
65+
public void Name_WhenLongerThanThreeCharacters_ShouldNotHaveError()
66+
{
67+
// Arrange
68+
var validator = new CreateTesterValidator();
69+
var request = new CreateTesterRequest(Name: "tester");
70+
71+
// Act
72+
var result = validator.TestValidate(request);
73+
74+
// Assert
75+
result.ShouldNotHaveValidationErrorFor(r => r.Name);
76+
}
77+
}
Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
using FluentValidation.TestHelper;
2+
using Playtesters.API.UseCases.TesterAccessHistory;
3+
4+
namespace Playtesters.API.Tests.Validators;
5+
6+
public class GetAllTestersAccessHistoryValidatorTests
7+
{
8+
[Test]
9+
public void PageNumber_WhenLessOrEqualToZero_ShouldHaveError()
10+
{
11+
// Arrange
12+
var validator = new GetAllTestersAccessHistoryValidator();
13+
var request = new GetAllTestersAccessHistoryRequest(
14+
Name: null,
15+
IpAddress: null,
16+
Country: null,
17+
FromDate: null,
18+
ToDate: null,
19+
PageNumber: 0,
20+
PageSize: 20
21+
);
22+
23+
// Act
24+
var result = validator.TestValidate(request);
25+
26+
// Assert
27+
result.ShouldHaveValidationErrorFor(r => r.PageNumber);
28+
}
29+
30+
[Test]
31+
public void PageNumber_WhenGreaterThanZero_ShouldNotHaveError()
32+
{
33+
// Arrange
34+
var validator = new GetAllTestersAccessHistoryValidator();
35+
var request = new GetAllTestersAccessHistoryRequest(
36+
Name: null,
37+
IpAddress: null,
38+
Country: null,
39+
FromDate: null,
40+
ToDate: null,
41+
PageNumber: 1,
42+
PageSize: 20
43+
);
44+
45+
// Act
46+
var result = validator.TestValidate(request);
47+
48+
// Assert
49+
result.ShouldNotHaveValidationErrorFor(r => r.PageNumber);
50+
}
51+
52+
[Test]
53+
public void PageSize_WhenLessThan10_ShouldHaveError()
54+
{
55+
// Arrange
56+
var validator = new GetAllTestersAccessHistoryValidator();
57+
var request = new GetAllTestersAccessHistoryRequest(
58+
Name: null,
59+
IpAddress: null,
60+
Country: null,
61+
FromDate: null,
62+
ToDate: null,
63+
PageNumber: 1,
64+
PageSize: 5
65+
);
66+
67+
// Act
68+
var result = validator.TestValidate(request);
69+
70+
// Assert
71+
result.ShouldHaveValidationErrorFor(r => r.PageSize);
72+
}
73+
74+
[Test]
75+
public void PageSize_WhenGreaterThan100_ShouldHaveError()
76+
{
77+
// Arrange
78+
var validator = new GetAllTestersAccessHistoryValidator();
79+
var request = new GetAllTestersAccessHistoryRequest(
80+
Name: null,
81+
IpAddress: null,
82+
Country: null,
83+
FromDate: null,
84+
ToDate: null,
85+
PageNumber: 1,
86+
PageSize: 150
87+
);
88+
89+
// Act
90+
var result = validator.TestValidate(request);
91+
92+
// Assert
93+
result.ShouldHaveValidationErrorFor(r => r.PageSize);
94+
}
95+
96+
[Test]
97+
public void PageSize_WhenWithinRange_ShouldNotHaveError()
98+
{
99+
// Arrange
100+
var validator = new GetAllTestersAccessHistoryValidator();
101+
var request = new GetAllTestersAccessHistoryRequest(
102+
Name: null,
103+
IpAddress: null,
104+
Country: null,
105+
FromDate: null,
106+
ToDate: null,
107+
PageNumber: 1,
108+
PageSize: 50
109+
);
110+
111+
// Act
112+
var result = validator.TestValidate(request);
113+
114+
// Assert
115+
result.ShouldNotHaveValidationErrorFor(r => r.PageSize);
116+
}
117+
118+
[Test]
119+
public void FromDate_WhenInvalidFormat_ShouldHaveError()
120+
{
121+
// Arrange
122+
var validator = new GetAllTestersAccessHistoryValidator();
123+
var request = new GetAllTestersAccessHistoryRequest(
124+
Name: null,
125+
IpAddress: null,
126+
Country: null,
127+
FromDate: "2024/05/01",
128+
ToDate: null,
129+
PageNumber: 1,
130+
PageSize: 20
131+
);
132+
133+
// Act
134+
var result = validator.TestValidate(request);
135+
136+
// Assert
137+
result.ShouldHaveValidationErrorFor(r => r.FromDate);
138+
}
139+
140+
[Test]
141+
public void FromDate_WhenValidFormat_ShouldNotHaveError()
142+
{
143+
// Arrange
144+
var validator = new GetAllTestersAccessHistoryValidator();
145+
var request = new GetAllTestersAccessHistoryRequest(
146+
Name: null,
147+
IpAddress: null,
148+
Country: null,
149+
FromDate: "2024-05-01",
150+
ToDate: null,
151+
PageNumber: 1,
152+
PageSize: 20
153+
);
154+
155+
// Act
156+
var result = validator.TestValidate(request);
157+
158+
// Assert
159+
result.ShouldNotHaveValidationErrorFor(r => r.FromDate);
160+
}
161+
162+
[Test]
163+
public void ToDate_WhenInvalidFormat_ShouldHaveError()
164+
{
165+
// Arrange
166+
var validator = new GetAllTestersAccessHistoryValidator();
167+
var request = new GetAllTestersAccessHistoryRequest(
168+
Name: null,
169+
IpAddress: null,
170+
Country: null,
171+
FromDate: null,
172+
ToDate: "05-01-2024",
173+
PageNumber: 1,
174+
PageSize: 20
175+
);
176+
177+
// Act
178+
var result = validator.TestValidate(request);
179+
180+
// Assert
181+
result.ShouldHaveValidationErrorFor(r => r.ToDate);
182+
}
183+
184+
[Test]
185+
public void ToDate_WhenValidFormat_ShouldNotHaveError()
186+
{
187+
// Arrange
188+
var validator = new GetAllTestersAccessHistoryValidator();
189+
var request = new GetAllTestersAccessHistoryRequest(
190+
Name: null,
191+
IpAddress: null,
192+
Country: null,
193+
FromDate: null,
194+
ToDate: "2024-05-01",
195+
PageNumber: 1,
196+
PageSize: 20
197+
);
198+
199+
// Act
200+
var result = validator.TestValidate(request);
201+
202+
// Assert
203+
result.ShouldNotHaveValidationErrorFor(r => r.ToDate);
204+
}
205+
206+
[Test]
207+
public void DateRange_WhenFromDateAfterToDate_ShouldHaveError()
208+
{
209+
// Arrange
210+
var validator = new GetAllTestersAccessHistoryValidator();
211+
var request = new GetAllTestersAccessHistoryRequest(
212+
Name: null,
213+
IpAddress: null,
214+
Country: null,
215+
FromDate: "2024-05-10",
216+
ToDate: "2024-05-01",
217+
PageNumber: 1,
218+
PageSize: 20
219+
);
220+
221+
// Act
222+
var result = validator.TestValidate(request);
223+
224+
// Assert
225+
result.ShouldHaveValidationErrorFor(r => r);
226+
}
227+
228+
[Test]
229+
public void DateRange_WhenFromDateBeforeOrEqualToDate_ShouldNotHaveError()
230+
{
231+
// Arrange
232+
var validator = new GetAllTestersAccessHistoryValidator();
233+
var request = new GetAllTestersAccessHistoryRequest(
234+
Name: null,
235+
IpAddress: null,
236+
Country: null,
237+
FromDate: "2024-05-01",
238+
ToDate: "2024-05-10",
239+
PageNumber: 1,
240+
PageSize: 20
241+
);
242+
243+
// Act
244+
var result = validator.TestValidate(request);
245+
246+
// Assert
247+
result.ShouldNotHaveValidationErrorFor(r => r);
248+
}
249+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using FluentValidation.TestHelper;
2+
using Playtesters.API.UseCases.Testers;
3+
4+
namespace Playtesters.API.Tests.Validators;
5+
6+
public class UpdateTesterValidatorTests
7+
{
8+
[Test]
9+
public void AccessKey_WhenNull_ShouldNotHaveError()
10+
{
11+
// Arrange
12+
var validator = new UpdateTesterValidator();
13+
var request = new UpdateTesterRequest(AccessKey: null);
14+
15+
// Act
16+
var result = validator.TestValidate(request);
17+
18+
// Assert
19+
result.ShouldNotHaveValidationErrorFor(r => r.AccessKey);
20+
}
21+
22+
[Test]
23+
public void AccessKey_WhenEmpty_ShouldNotHaveError()
24+
{
25+
// Arrange
26+
var validator = new UpdateTesterValidator();
27+
var request = new UpdateTesterRequest(AccessKey: string.Empty);
28+
29+
// Act
30+
var result = validator.TestValidate(request);
31+
32+
// Assert
33+
result.ShouldNotHaveValidationErrorFor(r => r.AccessKey);
34+
}
35+
36+
[Test]
37+
public void AccessKey_WhenNotValidGuid_ShouldHaveError()
38+
{
39+
// Arrange
40+
var validator = new UpdateTesterValidator();
41+
var request = new UpdateTesterRequest(AccessKey: "not-a-guid");
42+
43+
// Act
44+
var result = validator.TestValidate(request);
45+
46+
// Assert
47+
result.ShouldHaveValidationErrorFor(r => r.AccessKey);
48+
}
49+
50+
[Test]
51+
public void AccessKey_WhenValidGuid_ShouldNotHaveError()
52+
{
53+
// Arrange
54+
var validator = new UpdateTesterValidator();
55+
var request = new UpdateTesterRequest(AccessKey: Guid.NewGuid().ToString());
56+
57+
// Act
58+
var result = validator.TestValidate(request);
59+
60+
// Assert
61+
result.ShouldNotHaveValidationErrorFor(r => r.AccessKey);
62+
}
63+
}

0 commit comments

Comments
 (0)