Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
3013027
Move registration endpoint to new RegisterController
Foqsz Apr 7, 2026
42bcc0f
Update password and email validation in client use cases
Foqsz Apr 7, 2026
54ed0e3
Update login error messages to cover email and password
Foqsz Apr 7, 2026
da1174a
Refactor product use cases to use authenticated user ID
Foqsz Apr 8, 2026
f725125
Add unit tests for UpdateClientUseCase and refactor helpers
Foqsz Apr 8, 2026
b353c73
Integrate RabbitMQ messaging for client creation events
Foqsz Apr 9, 2026
8e76df4
#
Foqsz Apr 11, 2026
7af0a1c
#
Foqsz Apr 13, 2026
b6f1b0b
Merge branch 'master' into develop
Foqsz Apr 13, 2026
03daf8b
#
Foqsz Apr 14, 2026
68f5577
Merge branch 'develop' of https://github.com/Foqsz/ProductClientHub i…
Foqsz Apr 14, 2026
91cba1d
#
Foqsz Apr 15, 2026
f350e18
Merge branch 'master' into develop
Foqsz Apr 15, 2026
a57d179
#
Foqsz Apr 15, 2026
5359eb5
Merge branch 'develop' of https://github.com/Foqsz/ProductClientHub i…
Foqsz Apr 15, 2026
9c4ad17
#
Foqsz Apr 16, 2026
e08b4a6
Merge branch 'master' into develop
Foqsz Apr 16, 2026
8111877
feat: remove open api
Foqsz Apr 19, 2026
1b9657a
feat: update client integration test.
Foqsz Apr 20, 2026
7e38534
feat: Moq realizado para a integração test
Foqsz Apr 20, 2026
fee32f4
feat: teste para caso ja exista um e-mail na tentativa de update.
Foqsz Apr 20, 2026
ffa46d8
Merge branch 'master' into develop
Foqsz Apr 20, 2026
00cb12a
feat: adicionando logged user ao teste
Foqsz Apr 22, 2026
5c6fe04
feat: agora nao preciso mais do clientid no endpoint, ja recebo via l…
Foqsz Apr 22, 2026
dcb366e
Merge branch 'develop' of https://github.com/Foqsz/ProductClientHub i…
Foqsz Apr 22, 2026
adeeacb
fix: fiz esse ajuste pq mesmo se o usuario tentasse trocar seu e-mail…
Foqsz Apr 24, 2026
68a0b64
feat: teste de integração para o update do usuario. Tudo ok, devidame…
Foqsz Apr 24, 2026
c33bab1
feat: teste de integração para o update client finalizado.
Foqsz Apr 27, 2026
40aae98
fix: pequeno ajuste para gerar o guid.
Foqsz Apr 27, 2026
86525e7
feat: teste de integração para o change password.
Foqsz Apr 27, 2026
9a9a692
feat: teste de integração para deletar um client.
Foqsz Apr 27, 2026
fb3af55
feat: teste de integração para registrar um novo client.
Foqsz Apr 27, 2026
adf13e9
Merge branch 'master' into feat-integrationTests
Foqsz Apr 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CommonTestUtilities/Entities/ClientBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public static (Client client, string password) Build()
var password = new Faker().Internet.Password();

var client = new Faker<Client>()
.RuleFor(client => client.Id, () => new Guid())
.RuleFor(client => client.Id, () => Guid.NewGuid())
.RuleFor(client => client.Name, (f) => f.Person.FirstName)
.RuleFor(client => client.Email, (f, user) => f.Internet.Email(user.Name))
.RuleFor(client => client.Password, (f) => passwordEncripter.Encrypt(password));
Expand Down
7 changes: 6 additions & 1 deletion UseCase.Test/Client/Update/UpdateClientUseCaseTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,12 @@ private static UpdateClientUseCase CreateUseCase(ProductClientHub.Domain.Entitie
clientReadOnlyRepository.GetById(client);

if(emailExistsTest.IsTrue())
clientReadOnlyRepository.EmailAlreadyExists(client);
{
var (clientWithSameEmail, _) = ClientBuilder.Build();
clientWithSameEmail.Email = client!.Email;

clientReadOnlyRepository.EmailAlreadyExists(clientWithSameEmail);
}

return new UpdateClientUseCase(clientWriteOnlyRepository, clientReadOnlyRepository.Build(), unitOfWork, loggedUser);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
using Microsoft.AspNetCore.Mvc.Testing;
using CommonTestUtilities.Cryptografhy;
using ProductClientHub.Communication.Requests;
using Shouldly;
using System.Net;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
using ClientEntity = ProductClientHub.Domain.Entities.Client;

namespace WebApi.Test.Client.ChangePassword;

public class ChangePasswordClientIntegrationTest : IClassFixture<CustomWebApplicationFactory>
{
private readonly CustomWebApplicationFactory _factory;
private readonly HttpClient _httpClient;

public ChangePasswordClientIntegrationTest(CustomWebApplicationFactory factory)
{
_factory = factory;
_httpClient = factory.CreateClient(new WebApplicationFactoryClientOptions
{
BaseAddress = new Uri("https://localhost")
});

_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "fake-token");
}

[Fact]
public async Task ChangePassword_ShouldReturnNoContent_WhenRequestIsValid()
{
var clientId = Guid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
var passwordEncripter = PasswordEncripterBuilder.Build();

_factory.ClientsToReturn =
[
new ClientEntity
{
Id = clientId,
Name = "Client 1",
Email = "client1@email.com",
Password = passwordEncripter.Encrypt("password123")
}
];

var request = new RequestChangePassword
{
CurrentPassword = "password123",
NewPassword = "newPassword123"
};

var response = await _httpClient.PostAsync(
$"/api/clients/changePassword/{clientId}",
new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"));

response.StatusCode.ShouldBe(HttpStatusCode.NoContent);
}

[Fact]
public async Task ChangePassword_ShouldReturnBadRequest_WhenCurrentPasswordIsInvalid()
{
var clientId = Guid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
var passwordEncripter = PasswordEncripterBuilder.Build();

_factory.ClientsToReturn =
[
new ClientEntity
{
Id = clientId,
Name = "Client 1",
Email = "client1@email.com",
Password = passwordEncripter.Encrypt("password123")
}
];

var request = new RequestChangePassword
{
CurrentPassword = "wrong-password",
NewPassword = "newPassword123"
};

var response = await _httpClient.PostAsync(
$"/api/clients/changePassword/{clientId}",
new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"));

response.StatusCode.ShouldBe(HttpStatusCode.BadRequest);

var body = await response.Content.ReadAsStringAsync();
body.ShouldNotBeNullOrWhiteSpace();
}
}
25 changes: 21 additions & 4 deletions WebApi.Test/Client/Delete/DeleteClientIntegrationTest.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using Microsoft.AspNetCore.Mvc.Testing;
using Shouldly;
using System.Net;
using System.Net.Http.Headers;
using ClientEntity = ProductClientHub.Domain.Entities.Client;

namespace WebApi.Test.Client.Delete;

Expand All @@ -22,23 +24,38 @@ public DeleteClientIntegrationTest(CustomWebApplicationFactory factory)


[Fact]
public async Task Delete_ShouldReturnNoContent_WhenClientIsDeleted()
public async Task DeleteClient_ShouldReturnNoContent_WhenClientExists()
{
var clientId = Guid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");

_factory.ClientsToReturn =
[
new ProductClientHub.Domain.Entities.Client
new ClientEntity
{
Id = clientId,
Name = "Client 1",
Email = "oioi@gmail.com",
Password = "password123",
Products = new List<ProductClientHub.Domain.Entities.Product>()
Products = []
}
];

var response = await _httpClient.DeleteAsync($"/api/clients/{clientId}");
response.StatusCode.ShouldBe(System.Net.HttpStatusCode.NoContent);

response.StatusCode.ShouldBe(HttpStatusCode.NoContent);
}

[Fact]
public async Task DeleteClient_ShouldReturnNotFound_WhenClientDoesNotExist()
{
var nonExistentClientId = Guid.Parse("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb");
_factory.ClientsToReturn = [];

var response = await _httpClient.DeleteAsync($"/api/clients/{nonExistentClientId}");

response.StatusCode.ShouldBe(HttpStatusCode.NotFound);

var body = await response.Content.ReadAsStringAsync();
body.ShouldNotBeNullOrWhiteSpace();
}
}
80 changes: 80 additions & 0 deletions WebApi.Test/Client/Register/RegisterClientIntegrationTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
using Microsoft.AspNetCore.Mvc.Testing;
using ProductClientHub.Communication.Requests;
using ProductClientHub.Communication.Responses;
using Newtonsoft.Json;
using Shouldly;
using System.Net;
using System.Net.Http.Json;
using System.Text;
using ClientEntity = ProductClientHub.Domain.Entities.Client;

namespace WebApi.Test.Client.Register;

public class RegisterClientIntegrationTest : IClassFixture<CustomWebApplicationFactory>
{
private readonly CustomWebApplicationFactory _factory;
private readonly HttpClient _httpClient;

public RegisterClientIntegrationTest(CustomWebApplicationFactory factory)
{
_factory = factory;
_httpClient = factory.CreateClient(new WebApplicationFactoryClientOptions
{
BaseAddress = new Uri("https://localhost")
});
}

[Fact]
public async Task RegisterClient_ShouldReturnCreated_WhenRequestIsValid()
{
_factory.ClientsToReturn = [];

var request = new RequestClientJson
{
Name = "Client Register",
Email = "client.register@email.com",
Password = "password123"
};

var response = await _httpClient.PostAsync(
"/api/register",
new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"));

response.StatusCode.ShouldBe(HttpStatusCode.Created);

var body = JsonConvert.DeserializeObject<ResponseShortClientJson>(await response.Content.ReadAsStringAsync());
body.ShouldNotBeNull();
body!.Name.ShouldBe(request.Name);
}

[Fact]
public async Task RegisterClient_ShouldReturnBadRequest_WhenEmailAlreadyExists()
{
_factory.ClientsToReturn =
[
new ClientEntity
{
Id = Guid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"),
Name = "Existing Client",
Email = "existing@email.com",
Password = "password123"
}
];

var request = new RequestClientJson
{
Name = "New Client",
Email = "existing@email.com",
Password = "password123"
};

var response = await _httpClient.PostAsync(
"/api/register",
new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"));

response.StatusCode.ShouldBe(HttpStatusCode.BadRequest);

var body = await response.Content.ReadAsStringAsync();
body.ShouldNotBeNullOrWhiteSpace();
}
}
Loading