Se agrega el ServiceUzyTUsuarioTests para el servicio de ServiceUzyTUsuario,…

Se agrega el ServiceUzyTUsuarioTests para el servicio de ServiceUzyTUsuario, además se agrega el manejo de excepciones en el ServiceUzyTUsuario, por lo que se agrega la clase de GlobalExceptionHandler
parent e2642237
......@@ -39,9 +39,10 @@ dependencies {
compileOnly 'org.projectlombok:lombok' // Dependencia para generar automáticamente código repetitivo en Java
runtimeOnly 'com.oracle.database.jdbc:ojdbc8' // Dependencia para el controlador JDBC de Oracle
annotationProcessor 'org.projectlombok:lombok' // Procesador de anotaciones para Lombok
testImplementation 'org.springframework.boot:spring-boot-starter-test' // Dependencia para pruebas unitarias en Spring Boot
// Dependencia para pruebas unitarias en Spring Boot
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
testImplementation 'org.mockito:mockito-core:3.12.4'
}
tasks.named('test') {
......
......@@ -7,6 +7,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import java.util.Set;
......@@ -29,7 +30,7 @@ public class UzyTUsuarioController {
@GetMapping("/exampleFindId/{id}")
public ResponseEntity<DtoUzyTUsuario> ListarPorID(@PathVariable Long id) {
return new ResponseEntity<>(serviceUzyTUsuario.ListarPorID(id), HttpStatus.OK);
return ResponseEntity.ok(serviceUzyTUsuario.ListarPorID(id));
}
@GetMapping("/getAll")
......@@ -44,25 +45,30 @@ public class UzyTUsuarioController {
}
@PostMapping("/asignar_perfil/{uzytusuario_id}/{uzytperfil_id}")
public void asignarPerfilAUsuario(@PathVariable("uzytusuario_id") Long uzytusuario_id,
@PathVariable("uzytperfil_id") Long uzytperfil_id) {
serviceUzyTUsuario.asignarPerfilAUsuario(uzytusuario_id, uzytperfil_id);
public ResponseEntity<DtoUzyTUsuario> asignarPerfilAUsuario(
@PathVariable("uzytusuario_id") Long uzytusuario_id,
@PathVariable("uzytperfil_id") Long uzytperfil_id) {
DtoUzyTUsuario usuarioAsignado = serviceUzyTUsuario.asignarPerfilAUsuario(uzytusuario_id, uzytperfil_id);
if (usuarioAsignado != null) {
return new ResponseEntity<>(usuarioAsignado, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
@GetMapping("/buscarUsuario")
public ResponseEntity<List<DtoUzyTUsuario>> buscarUsuarios(@RequestParam(required = false) String usuario) {
List<DtoUzyTUsuario> usuarios = serviceUzyTUsuario.findByUsuario(usuario);
return ResponseEntity.ok(usuarios);
return new ResponseEntity<>(serviceUzyTUsuario.findByUsuario(usuario), HttpStatus.OK);
}
@PostMapping("/guardar")
public ResponseEntity<DtoUzyTUsuario> guardar(@RequestBody DtoUzyTUsuario dtoUzyTUsuario) {
public ResponseEntity<DtoUzyTUsuario> guardar( @Valid @RequestBody DtoUzyTUsuario dtoUzyTUsuario) throws Exception {
return new ResponseEntity<>(serviceUzyTUsuario.guardar(dtoUzyTUsuario), HttpStatus.OK);
}
@PutMapping("/editar/{id}")
public ResponseEntity<DtoUzyTUsuario> editar(@PathVariable Long id, @RequestBody DtoUzyTUsuario dtoUzyTUsuario) {
public ResponseEntity<DtoUzyTUsuario> editar(@PathVariable Long id, @Valid @RequestBody DtoUzyTUsuario dtoUzyTUsuario) {
return new ResponseEntity<>(serviceUzyTUsuario.editar(id, dtoUzyTUsuario), HttpStatus.OK);
}
......
package ec.edu.espe.movilidad.MovilidadWS.Exceptions.Configuration;
import ec.edu.espe.movilidad.MovilidadWS.Exceptions.ResourceNotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.NoSuchElementException;
//Clase para capturar y manejar globalmente las excepciones producidas
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
@ExceptionHandler(NoSuchElementException.class)
public ResponseEntity<String> handleNoSuchElementException(NoSuchElementException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
}
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleRuntimeException(RuntimeException ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.getMessage());
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGenericException(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Ha ocurrido un error inesperado -> "+ ex.getMessage());
}
}
package ec.edu.espe.movilidad.MovilidadWS.Exceptions;
import org.springframework.http.HttpStatus;
public class Error extends RuntimeException{
private HttpStatus estado;
private String mensaje;
public Error(HttpStatus estado, String mensaje) {
super();
this.estado = estado;
this.mensaje = mensaje;
}
public Error(HttpStatus estado, String mensaje, String mensaje1) {
super();
this.estado = estado;
this.mensaje = mensaje;
this.mensaje = mensaje1;
}
public HttpStatus getEstado() {
return estado;
}
public void setEstado(HttpStatus estado) {
this.estado = estado;
}
public String getMensaje() {
return mensaje;
}
public void setMensaje(String mensaje) {
this.mensaje = mensaje;
}
}
......@@ -3,39 +3,9 @@ package ec.edu.espe.movilidad.MovilidadWS.Exceptions;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value = HttpStatus.NOT_FOUND) //cuando no se encuentre un registro
public class ResourceNotFoundException extends RuntimeException{
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) // error interno del servidor
public static class InternalServerErrorException extends RuntimeException {
public InternalServerErrorException(String message) {
super(message);
}
}
@ResponseStatus(value = HttpStatus.UNAUTHORIZED) // no autorizado
public static class UnauthorizedException extends RuntimeException {
public UnauthorizedException(String message) {
super(message);
}
}
@ResponseStatus(value = HttpStatus.BAD_REQUEST) // solicitud incorrecta
public static class ValidationException extends RuntimeException {
public ValidationException(String message) {
super(message);
}
}
@ResponseStatus(value = HttpStatus.NOT_FOUND) // acceso a datos incorrecto
public static class DataAccessException extends RuntimeException {
public DataAccessException(String message) {
super(message);
}
}
}
......@@ -3,6 +3,7 @@ package ec.edu.espe.movilidad.MovilidadWS.Mapper.Components_Class;
import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUzyTUsuario;
import ec.edu.espe.movilidad.MovilidadWS.Model.ModelUzyTUsuario;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
......@@ -10,11 +11,10 @@ import java.util.stream.Collectors;
@Component
public class UzyTUsuarioMapper {
private final ModelMapper modelMapper;
@Autowired
private ModelMapper modelMapper;
public UzyTUsuarioMapper(ModelMapper modelMapper) {
this.modelMapper = modelMapper;
}
public DtoUzyTUsuario entityToDto(ModelUzyTUsuario entity) {
return modelMapper.map(entity, DtoUzyTUsuario.class);
......
......@@ -49,7 +49,6 @@ public class UzyTavProgObjEstartegicoMapper {
ModelUzyTavProyec proyec = entityManager.find(ModelUzyTavProyec.class, proyectoID);
entity.setUzytavproyec(proyec);
}
return entity;
}
}
......@@ -31,7 +31,7 @@ public class ModelUzyTUsuario {
@Column(name = "uzytusuario_nombres")
private String uzytusuario_nombres;
@Column(name = "uzytusuario_apellidos")
@Column(name = "uzytusuario_apellidos", nullable = false)
private String uzytusuario_apellidos;
@Column(name = "uzytusuario_email")
......
......@@ -10,16 +10,16 @@ public interface IServiceUzyTUsuario {
DtoUzyTUsuario ListarPorID(Long id);
List<DtoUzyTUsuario> ListarRegistros();
List<DtoUzyTUsuario> ListarRegistros() ;
List<DtoUzyTUsuario> findByUsuario(String usuario);
DtoUzyTUsuario guardar(DtoUzyTUsuario dtoUzyTUsuario);
DtoUzyTUsuario guardar(DtoUzyTUsuario dtoUzyTUsuario) throws Exception;
DtoUzyTUsuario editar( Long id, DtoUzyTUsuario dtoUzyTUsuario);
Set<DtoUzyTPerfil> findPerfilesByUsuarioId(Long uzytusuario_id);
void asignarPerfilAUsuario(Long uzytusuario_id, Long uzytperfil_id);
DtoUzyTUsuario asignarPerfilAUsuario(Long uzytusuario_id, Long uzytperfil_id);
boolean eliminar(Long id);
}
package ec.edu.espe.movilidad.MovilidadWS.Service;
import ec.edu.espe.movilidad.MovilidadWS.Dao.DaoUzyTPerfil;
import ec.edu.espe.movilidad.MovilidadWS.Dao.DaoUzyTUsuario;
import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUzyTPerfil;
import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUzyTUsuario;
import ec.edu.espe.movilidad.MovilidadWS.Exceptions.ResourceNotFoundException;
import ec.edu.espe.movilidad.MovilidadWS.Mapper.Components_Class.UzyTPerfilMapper;
import ec.edu.espe.movilidad.MovilidadWS.Mapper.Components_Class.UzyTUsuarioMapper;
import ec.edu.espe.movilidad.MovilidadWS.Model.ModelUzyTPerfil;
import ec.edu.espe.movilidad.MovilidadWS.Model.ModelUzyTUsuario;
import ec.edu.espe.movilidad.MovilidadWS.Service.UzyTUsuario.ServiceUzyTUsuario;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.*;
import static org.hibernate.validator.internal.util.Contracts.assertNotNull;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
class ServiceUzyTUsuarioTests {
@Mock
private DaoUzyTUsuario daoUzyTUsuario;
@Mock
private DaoUzyTPerfil daoUzyTPerfil;
@Mock
private UzyTUsuarioMapper mapper;
@Mock
private UzyTPerfilMapper mapperPerfil;
@InjectMocks
private ServiceUzyTUsuario serviceUzyTUsuario;
@DisplayName("Test para listar a los usuarios por el ID")
@Test
void testListarPorID() {
Long id = 1L;
ModelUzyTUsuario usuario = new ModelUzyTUsuario();
DtoUzyTUsuario dtoUsuario = new DtoUzyTUsuario();
dtoUsuario.setUzytusuario_id(id);
when(daoUzyTUsuario.findById(id)).thenReturn(Optional.of(usuario));
when(mapper.entityToDto(usuario)).thenReturn(dtoUsuario);
DtoUzyTUsuario result = serviceUzyTUsuario.ListarPorID(id);
assertEquals(id, result.getUzytusuario_id());
}
@DisplayName("Test para listar a los registros del usuario")
@Test
void testListarRegistros() {
List<ModelUzyTUsuario> usuarios = Collections.singletonList(new ModelUzyTUsuario());
DtoUzyTUsuario dtoUsuario = new DtoUzyTUsuario();
when(daoUzyTUsuario.findAll()).thenReturn(usuarios);
when(mapper.entitiesToDtos(usuarios)).thenReturn(Collections.singletonList(dtoUsuario));
List<DtoUzyTUsuario> result = serviceUzyTUsuario.ListarRegistros();
assertEquals(1, result.size());
assertEquals(dtoUsuario, result.get(0));
}
@DisplayName("Test para buscar un usuario")
@Test
void testFindByUsuario() {
String usuario = "example";
ModelUzyTUsuario modelUzyTUsuario = new ModelUzyTUsuario();
DtoUzyTUsuario dtoUzyTUsuario = new DtoUzyTUsuario();
when(daoUzyTUsuario.findByUsuario(usuario)).thenReturn(Collections.singletonList(modelUzyTUsuario));
when(mapper.entitiesToDtos(Collections.singletonList(modelUzyTUsuario))).thenReturn(Collections.singletonList(dtoUzyTUsuario));
List<DtoUzyTUsuario> result = serviceUzyTUsuario.findByUsuario(usuario);
assertEquals(1, result.size());
assertEquals(dtoUzyTUsuario, result.get(0));
}
@DisplayName("Test para buscar cuando son parametos incorrectos")
@Test
void testFindByUsuario_ResultadosVacios() {
String usuario = null; // Simular que no se proporcionaron parámetros válidos
// Ejecutar el método a probar
List<DtoUzyTUsuario> result = serviceUzyTUsuario.findByUsuario(usuario);
// Verificar que el resultado es una lista vacía
assertNotNull(result);
assertTrue(result.isEmpty());
}
@DisplayName("Test para buscar guardar un usuario")
@Test
void testGuardar() throws Exception {
// Datos del usuario a simular
DtoUzyTUsuario dtoUzyTUsuario = new DtoUzyTUsuario();
dtoUzyTUsuario.setUzytusuario_nombres("NombreUsuario");
dtoUzyTUsuario.setUzytusuario_apellidos("ApellidosUsuario");
dtoUzyTUsuario.setUzytusuario_email("usuario@example.com");
// Convertir el objeto DtoUzyTUsuario a ModelUzyTUsuario
ModelUzyTUsuario modelUzyTUsuario = new ModelUzyTUsuario();
modelUzyTUsuario.setUzytusuario_nombres(dtoUzyTUsuario.getUzytusuario_nombres());
modelUzyTUsuario.setUzytusuario_apellidos(dtoUzyTUsuario.getUzytusuario_apellidos());
modelUzyTUsuario.setUzytusuario_email(dtoUzyTUsuario.getUzytusuario_email());
// Configurar el comportamiento esperado del mapper y el daoUzyTUsuario
when(mapper.dtoToEntity(dtoUzyTUsuario)).thenReturn(modelUzyTUsuario);
when(daoUzyTUsuario.save(modelUzyTUsuario)).thenReturn(modelUzyTUsuario);
when(mapper.entityToDto(modelUzyTUsuario)).thenReturn(dtoUzyTUsuario);
// Ejecutar el método a probar
DtoUzyTUsuario result = serviceUzyTUsuario.guardar(dtoUzyTUsuario);
// Verificar el resultado
assertNotNull(result);
assertEquals(dtoUzyTUsuario, result);
}
@DisplayName("Test para editar un usuario inexistente")
@Test
void testEditar_IdNoExistente() {
// Configuración de prueba
Long id = 1L;
DtoUzyTUsuario dtoUzyTUsuario = new DtoUzyTUsuario();
dtoUzyTUsuario.setUzytusuario_nombres("NuevoNombre");
// Simular el comportamiento del método findById con un Optional vacío
when(daoUzyTUsuario.findById(id)).thenReturn(Optional.empty());
// Ejecutar el método a probar y verificar que se lance la excepción
assertThrows(ResourceNotFoundException.class, () -> serviceUzyTUsuario.editar(id, dtoUzyTUsuario));
}
@DisplayName("Test para asignar un perfil a un usuario")
@Test
void testAsignarPerfilAUsuario() {
Long usuarioId = 1L;
Long perfilId = 1L;
ModelUzyTUsuario usuario = new ModelUzyTUsuario();
ModelUzyTPerfil perfil = new ModelUzyTPerfil();
when(daoUzyTUsuario.findById(usuarioId)).thenReturn(Optional.of(usuario));
when(daoUzyTPerfil.findById(perfilId)).thenReturn(Optional.of(perfil));
when(daoUzyTUsuario.save(usuario)).thenReturn(usuario);
serviceUzyTUsuario.asignarPerfilAUsuario(usuarioId, perfilId);
assertTrue(usuario.getUzytperfils().contains(perfil));
// Prueba de error cuando no se encuentra el usuario por su ID
when(daoUzyTUsuario.findById(usuarioId)).thenReturn(Optional.empty());
try {
serviceUzyTUsuario.asignarPerfilAUsuario(usuarioId, perfilId);
fail("Debería haber lanzado una ResourceNotFoundException");
} catch (ResourceNotFoundException ex) {
assertEquals("No se encontró el usuario con ID: " + usuarioId, ex.getMessage());
}
}
@DisplayName("Test buscar los perfiles de un usuario")
@Test
void testFindPerfilesByUsuarioId() {
// Prueba exitosa de encontrar perfiles por ID de usuario
Long usuarioId = 1L;
ModelUzyTPerfil modelUzyTPerfil = new ModelUzyTPerfil();
modelUzyTPerfil.setUzytperfil_id(1L);
Set<ModelUzyTPerfil> perfiles = new HashSet<>();
perfiles.add(modelUzyTPerfil);
when(daoUzyTUsuario.findPerfilesByUsuarioId(usuarioId)).thenReturn(perfiles);
when(mapperPerfil.entitiesToDtosSet(perfiles)).thenReturn(Collections.singleton(new DtoUzyTPerfil()));
Set<DtoUzyTPerfil> result = serviceUzyTUsuario.findPerfilesByUsuarioId(usuarioId);
assertNotNull(result);
assertEquals(1, result.size());
}
@DisplayName("Test buscar eliminar un usuario")
@Test
void testEliminar() {
// Prueba exitosa de eliminar un usuario
Long id = 1L;
ModelUzyTUsuario modelUzyTUsuario = new ModelUzyTUsuario();
when(daoUzyTUsuario.findById(id)).thenReturn(Optional.of(modelUzyTUsuario));
boolean result = serviceUzyTUsuario.eliminar(id);
assertTrue(result);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment