diff --git a/backend/RESTful API/Controllers/ClientesController.cs b/backend/RESTful API/Controllers/ClientesController.cs index 1ca7891..578bf28 100644 --- a/backend/RESTful API/Controllers/ClientesController.cs +++ b/backend/RESTful API/Controllers/ClientesController.cs @@ -100,7 +100,19 @@ public async Task> GetCliente(int id) .Include(c => c.CodigoPostalCpNavigation) .Include(c => c.LoginIdloginNavigation) .Where(c => c.Idcliente == id) - .Select(c => new ClienteResponseDto { /* Mapping */ }) + .Select(c => new ClienteResponseDto { + Idcliente = c.Idcliente, + NomeCliente = c.NomeCliente, + DataNascCliente = c.DataNascCliente, + NifCliente = c.Nifcliente, + RuaCliente = c.RuaCliente, + CodigoPostal = c.CodigoPostalCpNavigation != null ? c.CodigoPostalCpNavigation.Cp.ToString("0000000") : null, + Localidade = c.CodigoPostalCpNavigation != null ? c.CodigoPostalCpNavigation.Localidade : null, + Email = c.LoginIdloginNavigation != null ? c.LoginIdloginNavigation.Email : null, + ContactoC1 = c.ContactoC1, + ContactoC2 = c.ContactoC2, + EstadoValCc = c.EstadoValCc + }) .FirstOrDefaultAsync(); if (cliente == null) return NotFound(); diff --git a/backend/Tests/CarXPress Unit Tests/ClientesControllerTests.cs b/backend/Tests/CarXPress Unit Tests/ClientesControllerTests.cs new file mode 100644 index 0000000..730d6bb --- /dev/null +++ b/backend/Tests/CarXPress Unit Tests/ClientesControllerTests.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Security.Claims; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using RESTful_API.Controllers; +using RESTful_API.Models; +using Xunit; + +namespace Unit_Tests +{ + public class ClientesControllerTests + { + private PdsContext GetDbContextWithData() + { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString()) + .Options; + var context = new PdsContext(options); + + var login1 = new Login { Idlogin = 1, Email = "test@test.com", HashPassword = "hashedpassword" }; + var login2 = new Login { Idlogin = 2, Email = "test2@test.com", HashPassword = "hashedpassword2" }; + + var cp = new CodigoPostal { Cp = 1234567, Localidade = "Lisboa" }; + + var cliente1 = new Cliente + { + Idcliente = 1, + NomeCliente = "Joao", + Nifcliente = 123456789, + DataNascCliente = new DateTime(1990, 1, 1), + RuaCliente = "Rua A", + CodigoPostalCp = 1234567, + CodigoPostalCpNavigation = cp, + LoginIdlogin = 1, + LoginIdloginNavigation = login1, + ContactoC1 = 910000000, + EstadoValCc = true + }; + + var cliente2 = new Cliente + { + Idcliente = 2, + NomeCliente = "Maria", + Nifcliente = 987654321, + DataNascCliente = new DateTime(1995, 1, 1), + RuaCliente = "Rua B", + CodigoPostalCp = 1234567, + CodigoPostalCpNavigation = cp, + LoginIdlogin = 2, + LoginIdloginNavigation = login2, + ContactoC1 = 920000000, + EstadoValCc = false + }; + + context.Logins.AddRange(login1, login2); + context.CodigoPostals.Add(cp); + context.Clientes.AddRange(cliente1, cliente2); + context.SaveChanges(); + + return context; + } + + [Fact] + public async Task GetCliente_ValidId_ReturnsCliente() + { + var context = GetDbContextWithData(); + var controller = new ClientesController(context); + + var result = await controller.GetCliente(1); + + var actionResult = Assert.IsType>(result); + var clienteResponse = Assert.IsType(actionResult.Value); + Assert.Equal("Joao", clienteResponse.NomeCliente); + Assert.Equal(123456789, clienteResponse.NifCliente); + } + + [Fact] + public async Task GetCliente_InvalidId_ReturnsNotFound() + { + var context = GetDbContextWithData(); + var controller = new ClientesController(context); + + var result = await controller.GetCliente(999); + + Assert.IsType(result.Result); + } + + [Fact] + public async Task GetMe_ValidUser_ReturnsCliente() + { + var context = GetDbContextWithData(); + var controller = new ClientesController(context); + + var user = new ClaimsPrincipal(new ClaimsIdentity(new[] + { + new Claim(ClaimTypes.NameIdentifier, "1") + }, "mock")); + + controller.ControllerContext = new ControllerContext + { + HttpContext = new DefaultHttpContext { User = user } + }; + + var result = await controller.GetMe(); + + var okResult = Assert.IsType(result.Result); + var clienteResponse = Assert.IsType(okResult.Value); + Assert.Equal("Joao", clienteResponse.NomeCliente); + } + + [Fact] + public async Task GetClientesAdmin_ReturnsAllClientes() + { + var context = GetDbContextWithData(); + var controller = new ClientesController(context); + + var user = new ClaimsPrincipal(new ClaimsIdentity(new[] + { + new Claim(ClaimTypes.NameIdentifier, "1"), + new Claim("roleId", "3") // Admin role + }, "mock")); + + controller.ControllerContext = new ControllerContext + { + HttpContext = new DefaultHttpContext { User = user } + }; + + var login1 = context.Logins.Find(1); + login1.TipoLoginIdtlogin = 3; + context.SaveChanges(); + + var result = await controller.GetClientesAdmin(); + + var actionResult = Assert.IsType>>(result); + var list = Assert.IsType>(actionResult.Value); + Assert.Equal(2, list.Count); + } + + [Fact] + public async Task PostCliente_ValidCliente_ReturnsCreated() + { + var context = GetDbContextWithData(); + var controller = new ClientesController(context); + + var newLogin = new Login { Idlogin = 3, Email = "new@test.com", HashPassword = "pwd" }; + context.Logins.Add(newLogin); + context.SaveChanges(); + + var clienteDto = new ClienteCreateDto + { + NomeCliente = "Carlos", + NifCliente = 111222333, + DataNascCliente = new DateTime(2000, 1, 1), + RuaCliente = "Rua C", + CodigoPostal = "1234567", + Localidade = "Lisboa", + LoginIdlogin = 3, + ContactoC1 = 930000000 + }; + + var result = await controller.PostCliente(clienteDto); + + var createdAtActionResult = Assert.IsType(result.Result); + var createdCliente = Assert.IsType(createdAtActionResult.Value); + + Assert.Equal("Carlos", createdCliente.NomeCliente); + Assert.Equal("1234567", createdCliente.CodigoPostal); + + var dbCliente = context.Clientes.FirstOrDefault(c => c.NomeCliente == "Carlos"); + Assert.NotNull(dbCliente); + Assert.Equal(111222333, dbCliente.Nifcliente); + } + + [Fact] + public async Task DeleteClienteAndAnonymizeLogin_ValidId_AnonymizesLogin() + { + var context = GetDbContextWithData(); + var controller = new ClientesController(context); + + var user = new ClaimsPrincipal(new ClaimsIdentity(new[] + { + new Claim(ClaimTypes.NameIdentifier, "1"), + new Claim(ClaimTypes.Role, "admin") + }, "mock")); + + controller.ControllerContext = new ControllerContext + { + HttpContext = new DefaultHttpContext { User = user } + }; + + var result = await controller.DeleteClienteAndAnonymizeLogin(2); + + Assert.IsType(result); + + var anonymizedLogin = context.Logins.Find(2); + Assert.Null(anonymizedLogin.Email); + Assert.Null(anonymizedLogin.HashPassword); + } + } +} \ No newline at end of file