Skip to content

Commit 295e649

Browse files
authored
merge: develop <- tests/use-cases-test-cases (#7)
Creates test cases for initial use cases.
2 parents ce1292c + 23af766 commit 295e649

10 files changed

Lines changed: 161 additions & 17 deletions

File tree

RecipesApp.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonTestUtilities", "test
2727
EndProject
2828
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Validators.Test", "test\Validators.Test\Validators.Test.csproj", "{993F9D03-5E41-4B0F-8C63-4ADB422814EE}"
2929
EndProject
30+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UseCases.Test", "test\UseCases.Test\UseCases.Test.csproj", "{FAE3D4EC-E66B-4C4E-913A-1E49F4D46C5D}"
31+
EndProject
3032
Global
3133
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3234
Debug|Any CPU = Debug|Any CPU
@@ -65,6 +67,10 @@ Global
6567
{993F9D03-5E41-4B0F-8C63-4ADB422814EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
6668
{993F9D03-5E41-4B0F-8C63-4ADB422814EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
6769
{993F9D03-5E41-4B0F-8C63-4ADB422814EE}.Release|Any CPU.Build.0 = Release|Any CPU
70+
{FAE3D4EC-E66B-4C4E-913A-1E49F4D46C5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
71+
{FAE3D4EC-E66B-4C4E-913A-1E49F4D46C5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
72+
{FAE3D4EC-E66B-4C4E-913A-1E49F4D46C5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
73+
{FAE3D4EC-E66B-4C4E-913A-1E49F4D46C5D}.Release|Any CPU.Build.0 = Release|Any CPU
6874
EndGlobalSection
6975
GlobalSection(SolutionProperties) = preSolution
7076
HideSolutionNode = FALSE
@@ -80,6 +86,7 @@ Global
8086
{68639CA6-1A2C-4A87-8AC5-16F24EAC28A9} = {56BEA599-5A43-4E39-91F4-458CDA73107D}
8187
{57ADA9DB-D6F6-4D89-8D1F-64894A1D0451} = {C1D0FD22-94B4-4FC6-AD0A-8FB3F188E0EE}
8288
{993F9D03-5E41-4B0F-8C63-4ADB422814EE} = {C1D0FD22-94B4-4FC6-AD0A-8FB3F188E0EE}
89+
{FAE3D4EC-E66B-4C4E-913A-1E49F4D46C5D} = {C1D0FD22-94B4-4FC6-AD0A-8FB3F188E0EE}
8390
EndGlobalSection
8491
GlobalSection(ExtensibilityGlobals) = postSolution
8592
SolutionGuid = {655B2453-B859-4205-B05E-64082CF48732}

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

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,25 @@ public class RegisterUserUC(
1717
PasswordEncryptionService service
1818
) : IRegisterUserUC
1919
{
20-
private readonly IUserReadOnlyRepository _readRepo = readRepo;
21-
private readonly IUserWriteOnlyRepository _writeRepo = writeRepo;
22-
private readonly IUnitOfWork _uw = uw;
23-
private readonly IMapper _map = map;
24-
private readonly PasswordEncryptionService _service = service;
25-
2620
public async Task<RegisterUserResponseJSON> Execute(RegisterUserRequestJSON request)
2721
{
28-
await Validate(request);
22+
await ValidateAsync(request);
23+
24+
var user = map.Map<Domain.Entities.User>(request);
25+
user.Password = service.Encrypt(request.Password);
2926

30-
var user = _map.Map<Domain.Entities.User>(request);
31-
user.Password = _service.Encrypt(request.Password);
27+
await writeRepo.AddUserAsync(user);
3228

33-
await _writeRepo.AddUserAsync(user);
34-
35-
await _uw.CommitAsync();
29+
await uw.CommitAsync();
3630

37-
return new(request.Name);
31+
return new RegisterUserResponseJSON(user.Name);
3832
}
39-
private async Task Validate(RegisterUserRequestJSON request)
33+
34+
private async Task ValidateAsync(RegisterUserRequestJSON request)
4035
{
41-
var result = new RegisterUserValidator().Validate(request);
36+
var result = await new RegisterUserValidator().ValidateAsync(request);
4237

43-
var emailExists = await _readRepo.ExistsActiveUserWithEmailAsync(request.Email);
38+
var emailExists = await readRepo.ExistsActiveUserWithEmailAsync(request.Email);
4439

4540
if (emailExists)
4641
result.Errors.Add(new(string.Empty,
@@ -52,4 +47,4 @@ private async Task Validate(RegisterUserRequestJSON request)
5247

5348
throw new ErrorOnValidationException(errorMessages);
5449
}
55-
}
50+
}

test/CommonTestUtilities/CommonTestUtilities.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10+
<ProjectReference Include="..\..\src\BackEnd\RecipesApp.Application\RecipesApp.Application.csproj" />
1011
<ProjectReference Include="..\..\src\Shared\RecipesApp.Communication\RecipesApp.Communication.csproj" />
1112
</ItemGroup>
1213

1314
<ItemGroup>
1415
<PackageReference Include="Bogus" Version="35.6.1" />
16+
<PackageReference Include="Moq" Version="4.20.72" />
1517
</ItemGroup>
1618

1719
</Project>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Moq;
2+
using RecipesApp.Domain.Repositories;
3+
4+
namespace CommonTestUtilities.Repositories;
5+
6+
public class UnitOfWorkMockFactory
7+
{
8+
public static IUnitOfWork CreateMock()
9+
=> new Mock<IUnitOfWork>().Object;
10+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Moq;
2+
using RecipesApp.Domain.Repositories.User;
3+
4+
namespace CommonTestUtilities.Repositories;
5+
6+
public class UserReadOnlyRepositoryMockFactory
7+
{
8+
private readonly Mock<IUserReadOnlyRepository> _repository = new();
9+
10+
public void ExistActiveUserWithEmail(string email)
11+
=> _repository.Setup(repo
12+
=> repo.ExistsActiveUserWithEmailAsync(email)
13+
).ReturnsAsync(true);
14+
15+
public IUserReadOnlyRepository CreateMock()
16+
=> _repository.Object;
17+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Moq;
2+
using RecipesApp.Domain.Repositories.User;
3+
4+
namespace CommonTestUtilities.Repositories;
5+
6+
public class UserWriteOnlyRepositoryMockFactory
7+
{
8+
public static IUserWriteOnlyRepository CreateMock()
9+
=> new Mock<IUserWriteOnlyRepository>().Object;
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using RecipesApp.Application.Services;
2+
3+
namespace CommonTestUtilities.Services;
4+
5+
public class EncryptMockFactory
6+
{
7+
public static PasswordEncryptionService CreateMock()
8+
=> new PasswordEncryptionService("dot");
9+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using AutoMapper;
2+
using RecipesApp.Application.Services;
3+
4+
namespace CommonTestUtilities.Services;
5+
6+
public class MapperMockFactory
7+
{
8+
public static IMapper CreateMock()
9+
{
10+
return new MapperConfiguration(
11+
options => { options.AddProfile(new AutoMappingService()); }
12+
).CreateMapper();
13+
}
14+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
8+
<IsPackable>false</IsPackable>
9+
<IsTestProject>true</IsTestProject>
10+
</PropertyGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="coverlet.collector" Version="6.0.0"/>
14+
<PackageReference Include="FluentAssertions" Version="7.0.0-alpha.5" />
15+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
16+
<PackageReference Include="xunit" Version="2.5.3"/>
17+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3"/>
18+
</ItemGroup>
19+
20+
<ItemGroup>
21+
<Using Include="Xunit"/>
22+
</ItemGroup>
23+
24+
<ItemGroup>
25+
<ProjectReference Include="..\..\src\BackEnd\RecipesApp.Application\RecipesApp.Application.csproj" />
26+
<ProjectReference Include="..\CommonTestUtilities\CommonTestUtilities.csproj" />
27+
</ItemGroup>
28+
29+
</Project>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using CommonTestUtilities.Repositories;
2+
using CommonTestUtilities.Requests;
3+
using CommonTestUtilities.Services;
4+
using FluentAssertions;
5+
using RecipesApp.Application.UseCases.User.Register;
6+
using RecipesApp.Exception.Project;
7+
using RecipesApp.Exception.Resources;
8+
9+
namespace UseCases.Test.User.Register;
10+
11+
public class RegisterUserUCTest
12+
{
13+
private RegisterUserUC CreateUseCase(string? email = null)
14+
{
15+
var factory = new UserReadOnlyRepositoryMockFactory();
16+
17+
if (string.IsNullOrEmpty(email) is false)
18+
factory.ExistActiveUserWithEmail(email);
19+
var w = UserWriteOnlyRepositoryMockFactory.CreateMock();
20+
var uw = UnitOfWorkMockFactory.CreateMock();
21+
var map = MapperMockFactory.CreateMock();
22+
var pw = EncryptMockFactory.CreateMock();
23+
24+
return new RegisterUserUC(factory.CreateMock(), w, uw, map, pw);
25+
}
26+
27+
[Fact]
28+
public async Task Test_OnSuccess()
29+
{
30+
var request = RegisterUserRequestJSONMockFactory.CreateMock();
31+
var uc = CreateUseCase();
32+
33+
var result = await uc.Execute(request);
34+
35+
result.Should().NotBeNull();
36+
result.Name.Should().Be(request.Name);
37+
}
38+
39+
[Fact]
40+
public async Task Test_OnFailure_WithEmailAlreadyRegistered()
41+
{
42+
var request = RegisterUserRequestJSONMockFactory.CreateMock();
43+
var uc = CreateUseCase(request.Email);
44+
45+
Func<Task> act = async () => await uc.Execute(request);
46+
47+
(await act.Should().ThrowAsync<ErrorOnValidationException>())
48+
.Where(e => e.ErrorMessages.Count == 1
49+
&& e.ErrorMessages.Contains(ResourcesAccessor.EMAIL_ALREADY_REGISTERED));
50+
}
51+
}

0 commit comments

Comments
 (0)