Skip to content

Commit ce1292c

Browse files
authored
develop <- tests/validators-test-cases (#6)
Creating testing layer to first validator
2 parents 527b65b + 023c31b commit ce1292c

7 files changed

Lines changed: 165 additions & 9 deletions

File tree

src/BackEnd/RecipesApp.Application/UseCases/User/Register/RegisterUserValidator.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,27 @@
44

55
namespace RecipesApp.Application.UseCases.User.Register;
66

7-
internal class RegisterUserValidator : AbstractValidator<RegisterUserRequestJSON>
7+
public class RegisterUserValidator : AbstractValidator<RegisterUserRequestJSON>
88
{
9-
internal RegisterUserValidator()
9+
public RegisterUserValidator()
1010
{
1111
RuleFor((u) => u.Name).NotNull().NotEmpty()
1212
.WithMessage(ResourcesAccessor.NAME_REQUIRED);
1313

1414
RuleFor((u) => u.Email).NotNull().NotEmpty()
1515
.WithMessage(ResourcesAccessor.EMAIL_REQUIRED);
16-
RuleFor((u) => u.Email).EmailAddress()
17-
.WithMessage(ResourcesAccessor.EMAIL_INVALID);
16+
17+
When(u => !string.IsNullOrWhiteSpace(u.Email), ()
18+
=> RuleFor((u) => u.Email).EmailAddress()
19+
.WithMessage(ResourcesAccessor.EMAIL_INVALID)
20+
);
1821

1922
RuleFor(u => u.Password).NotNull().NotEmpty()
2023
.WithMessage(ResourcesAccessor.PASSWORD_REQUIRED);
21-
RuleFor((u) => u.Password.Length).GreaterThanOrEqualTo(6)
22-
.WithMessage(ResourcesAccessor.PASSWORD_LENGTH);
24+
25+
When(u => !string.IsNullOrWhiteSpace(u.Password), ()
26+
=> RuleFor((u) => u.Password.Length).GreaterThanOrEqualTo(6)
27+
.WithMessage(ResourcesAccessor.PASSWORD_LENGTH)
28+
);
2329
}
24-
}
30+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
namespace RecipesApp.Communication.Requests;
22

3-
public record RegisterUserRequestJSON(string Name, string Email, string Password);
3+
public record RegisterUserRequestJSON(string Name = "", string Email = "", string Password = "");

src/Shared/RecipesApp.Exception/Resources/ExceptionMessagesResource.pt-BR.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
<value>O campo Password é obrigatório</value>
128128
</data>
129129
<data name="EMAIL_INVALID" xml:space="preserve">
130-
<value>O Email não é inválido</value>
130+
<value>O Email não é válido</value>
131131
</data>
132132
<data name="PASSWORD_LENGTH" xml:space="preserve">
133133
<value>A senha deve conter pelo menos 6 caracteres </value>

test/CommonTestUtilities/CommonTestUtilities.csproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,12 @@
66
<Nullable>enable</Nullable>
77
</PropertyGroup>
88

9+
<ItemGroup>
10+
<ProjectReference Include="..\..\src\Shared\RecipesApp.Communication\RecipesApp.Communication.csproj" />
11+
</ItemGroup>
12+
13+
<ItemGroup>
14+
<PackageReference Include="Bogus" Version="35.6.1" />
15+
</ItemGroup>
16+
917
</Project>
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using Bogus;
2+
using RecipesApp.Communication.Requests;
3+
4+
namespace CommonTestUtilities.Requests;
5+
6+
public static class RegisterUserRequestJSONMockFactory
7+
{
8+
public static RegisterUserRequestJSON CreateMock(int length = 10)
9+
=> new Faker<RegisterUserRequestJSON>()
10+
.CustomInstantiator(f =>
11+
{
12+
var name = f.Person.FirstName;
13+
14+
return new RegisterUserRequestJSON(
15+
name,
16+
f.Internet.Email(name),
17+
f.Internet.Password(length)
18+
);
19+
}).Generate();
20+
21+
public static RegisterUserRequestJSON CreateMockWithoutName()
22+
=> new Faker<RegisterUserRequestJSON>()
23+
.CustomInstantiator(f => new RegisterUserRequestJSON(
24+
Email: f.Internet.Email(),
25+
Password: f.Internet.Password()
26+
)).Generate();
27+
28+
public static RegisterUserRequestJSON CreateMockWithoutEmail()
29+
=> new Faker<RegisterUserRequestJSON>()
30+
.CustomInstantiator(f => new RegisterUserRequestJSON(
31+
Name: f.Person.FirstName,
32+
Password: f.Internet.Password()
33+
)).Generate();
34+
35+
public static RegisterUserRequestJSON CreateMockWithInvalidEmail(string? email = null)
36+
=> new Faker<RegisterUserRequestJSON>()
37+
.CustomInstantiator(f => new RegisterUserRequestJSON(
38+
Name: f.Person.FirstName,
39+
Email: email ?? f.Internet.ExampleEmail(),
40+
Password: f.Internet.Password()
41+
)).Generate();
42+
43+
public static RegisterUserRequestJSON CreateMockWithoutPassword()
44+
=> new Faker<RegisterUserRequestJSON>()
45+
.CustomInstantiator(f =>
46+
{
47+
var name = f.Person.FirstName;
48+
49+
return new RegisterUserRequestJSON(
50+
Name: name,
51+
Email: f.Internet.Email(name)
52+
);
53+
}).Generate();
54+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
using CommonTestUtilities.Requests;
2+
using FluentAssertions;
3+
using RecipesApp.Application.UseCases.User.Register;
4+
using RecipesApp.Exception.Resources;
5+
6+
namespace Validators.Test.User.Register;
7+
8+
public class RegisterUserValidatorTest
9+
{
10+
[Fact]
11+
public void Test_OnSuccess()
12+
{
13+
var v = new RegisterUserValidator();
14+
var request = RegisterUserRequestJSONMockFactory.CreateMock();
15+
var result = v.Validate(request);
16+
17+
result.IsValid.Should().BeTrue();
18+
}
19+
20+
[Fact]
21+
public void Test_OnFailureWith_EmptyName()
22+
{
23+
var v = new RegisterUserValidator();
24+
var request = RegisterUserRequestJSONMockFactory.CreateMockWithoutName();
25+
var result = v.Validate(request);
26+
27+
result.IsValid.Should().BeFalse();
28+
result.Errors.Should().ContainSingle()
29+
.And.Contain(e => e.ErrorMessage.Equals(ResourcesAccessor.NAME_REQUIRED));
30+
}
31+
32+
[Fact]
33+
public void Test_OnFailureWith_EmptyEmail()
34+
{
35+
var v = new RegisterUserValidator();
36+
var request = RegisterUserRequestJSONMockFactory.CreateMockWithoutEmail();
37+
var result = v.Validate(request);
38+
39+
result.IsValid.Should().BeFalse();
40+
result.Errors.Should().ContainSingle()
41+
.And.Contain(e => e.ErrorMessage.Equals(ResourcesAccessor.EMAIL_REQUIRED));
42+
}
43+
[Fact]
44+
public void Test_OnFailureWith_InvalidEmail()
45+
{
46+
var v = new RegisterUserValidator();
47+
var request = RegisterUserRequestJSONMockFactory.CreateMockWithInvalidEmail("email.com");
48+
var result = v.Validate(request);
49+
50+
result.IsValid.Should().BeFalse();
51+
result.Errors.Should().ContainSingle()
52+
.And.Contain(e => e.ErrorMessage.Equals(ResourcesAccessor.EMAIL_INVALID));
53+
}
54+
55+
[Fact]
56+
public void Test_OnFailureWith_EmptyPassword()
57+
{
58+
var v = new RegisterUserValidator();
59+
var request = RegisterUserRequestJSONMockFactory.CreateMockWithoutPassword();
60+
var result = v.Validate(request);
61+
62+
result.IsValid.Should().BeFalse();
63+
result.Errors.Should().ContainSingle()
64+
.And.Contain(e => e.ErrorMessage.Equals(ResourcesAccessor.PASSWORD_REQUIRED));
65+
}
66+
[Theory]
67+
[InlineData(1)]
68+
[InlineData(2)]
69+
[InlineData(3)]
70+
[InlineData(4)]
71+
[InlineData(5)]
72+
public void Test_OnFailureWith_InvalidPassword(int passwordLength)
73+
{
74+
var v = new RegisterUserValidator();
75+
var request = RegisterUserRequestJSONMockFactory.CreateMock(passwordLength);
76+
var result = v.Validate(request);
77+
78+
result.IsValid.Should().BeFalse();
79+
result.Errors.Should().ContainSingle()
80+
.And.Contain(e => e.ErrorMessage.Equals(ResourcesAccessor.PASSWORD_LENGTH));
81+
}
82+
}

test/Validators.Test/Validators.Test.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
<ItemGroup>
1313
<PackageReference Include="coverlet.collector" Version="6.0.0" />
14+
<PackageReference Include="FluentAssertions" Version="7.0.0-alpha.5" />
1415
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
1516
<PackageReference Include="xunit" Version="2.5.3" />
1617
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
@@ -20,4 +21,9 @@
2021
<Using Include="Xunit" />
2122
</ItemGroup>
2223

24+
<ItemGroup>
25+
<ProjectReference Include="..\..\src\BackEnd\RecipesApp.Application\RecipesApp.Application.csproj" />
26+
<ProjectReference Include="..\CommonTestUtilities\CommonTestUtilities.csproj" />
27+
</ItemGroup>
28+
2329
</Project>

0 commit comments

Comments
 (0)