diff --git a/README.md b/README.md index 6175d1e..8787ac9 100644 --- a/README.md +++ b/README.md @@ -56,5 +56,53 @@ Asegúrate de definir las siguientes variables de entorno: `Authorization: Bearer ` - El control de acceso (roles, permisos) debe ser gestionado desde el microservicio de autenticación. + +# Guía Completa de las Pruebas de Cobertura + +Este proyecto utiliza **JaCoCo** para generar reportes de cobertura de pruebas. A continuación +se explican los pasos necesarios para ejecutar las pruebas y visualizar el reporte generado. + --- +### 🔹 Paso 1: Limpiar el proyecto y ejecutar pruebas + +> mvn clean test + +Este comando realiza una limpieza del proyecto y luego ejecuta todas las pruebas configuradas: + +- clean: Elimina archivos temporales y la carpeta target para asegurar una compilación limpia. + +- test: Ejecuta todas las pruebas unitarias e integrales definidas en el proyecto. + +### 🔹 Paso 2: Preparar JaCoCo e instalar el proyecto + +> mvn org.jacoco:jacoco-maven-plugin:0.8.11:prepare-agent install + +Este comando configura el agente de JaCoCo y compila el proyecto: + +- prepare-agent: Inicializa el agente de JaCoCo que recolectará los datos de cobertura. + +- install: Compila e instala el proyecto en el repositorio local de Maven, +ejecutando nuevamente las pruebas con el agente activado. + +### 🔹 Paso 3: Generar el reporte de cobertura +> mvn org.jacoco:jacoco-maven-plugin:0.8.11:report + +Este comando genera un informe detallado de cobertura de código basado en las pruebas ejecutadas anteriormente. + +### 🔹📊 Visualizar el reporte de cobertura + +1. Una vez ejecutados los comandos anteriores, navega hasta la +siguiente ruta del proyecto: + +target/site/jacoco/ + +2. Dentro de esta carpeta, ubica el archivo: + +index.html + +3. Arrastra este archivo a tu navegador o ábrelo directamente con doble clic. + +Esto te permitirá visualizar un informe completo con métricas como cobertura por clase, +línea, rama, etc., generado por JaCoCo. + diff --git a/pom.xml b/pom.xml index 2a82dbd..3e1652b 100644 --- a/pom.xml +++ b/pom.xml @@ -163,6 +163,8 @@ + + maven-resources-plugin 3.3.1 @@ -170,6 +172,33 @@ UTF-8 + + + org.jacoco + jacoco-maven-plugin + 0.8.11 + + + pre-test + + prepare-agent + + + + post-test + test + + report + + + target/site/jacoco + + + + + + + diff --git a/src/test/java/com/example/user_microservice/SaveUserUseCaseTest.java b/src/test/java/com/example/user_microservice/IntegrationUseCaseTest.java similarity index 99% rename from src/test/java/com/example/user_microservice/SaveUserUseCaseTest.java rename to src/test/java/com/example/user_microservice/IntegrationUseCaseTest.java index 1695b5a..71756bf 100644 --- a/src/test/java/com/example/user_microservice/SaveUserUseCaseTest.java +++ b/src/test/java/com/example/user_microservice/IntegrationUseCaseTest.java @@ -12,7 +12,7 @@ import static org.junit.jupiter.api.Assertions.*; -class SaveUserUseCaseTest { +class IntegrationUseCaseTest { private SaveUserUseCase saveUserUseCase; private InMemoryUserRepository userRepository; diff --git a/src/test/java/com/example/user_microservice/UserMicroserviceApplicationTests.java b/src/test/java/com/example/user_microservice/UserMicroserviceApplicationTests.java deleted file mode 100644 index ba7a03d..0000000 --- a/src/test/java/com/example/user_microservice/UserMicroserviceApplicationTests.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.example.user_microservice; - -import com.example.user_microservice.application.usecase.SaveUserUseCase; -import com.example.user_microservice.domain.model.User; -import com.example.user_microservice.domain.model.Role; -import jakarta.transaction.Transactional; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ActiveProfiles; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.UUID; - - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -@ActiveProfiles("test") -@Transactional -class UserMicroserviceApplicationTests { - - @Autowired - private SaveUserUseCase saveUserUseCase; - - @Test - @Rollback - void testCrearUsuario() throws ParseException { - - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - - User nuevo = new User(); - nuevo.setFirstName("Juan"); - nuevo.setLastName("Trin"); - nuevo.setEmail("juantrin"+ UUID.randomUUID().toString() +"@gmail.com"); - nuevo.setPassword("Wosito123"); // >= 8 caracteres - nuevo.setBornDate(sdf.parse("1990-01-01")); - nuevo.setPhone("+1234567890"); - nuevo.setAccessLevel(1); - nuevo.setDepartment("Valle del Cauca"); - nuevo.setCity("Tuluá york"); - nuevo.setAddress("Calle Falsa 123"); - nuevo.setPostalCode("12345"); - nuevo.setRole(Role.CLIENT); - - //----------Guardamos el Usuario test----------- - User creado = saveUserUseCase.execute(nuevo); - assertNotNull(creado); - assertNotNull(creado.getId()); - assertEquals("Juan", creado.getFirstName()); - assertEquals(Role.CLIENT, creado.getRole()); - } - -} diff --git a/src/test/java/com/example/user_microservice/usecase/DeleteUserUseCaseTest.java b/src/test/java/com/example/user_microservice/application/UnitTests/DeleteUserUseCaseTest.java similarity index 94% rename from src/test/java/com/example/user_microservice/usecase/DeleteUserUseCaseTest.java rename to src/test/java/com/example/user_microservice/application/UnitTests/DeleteUserUseCaseTest.java index b127944..b820a16 100644 --- a/src/test/java/com/example/user_microservice/usecase/DeleteUserUseCaseTest.java +++ b/src/test/java/com/example/user_microservice/application/UnitTests/DeleteUserUseCaseTest.java @@ -1,4 +1,4 @@ -package com.example.user_microservice.usecase; +package com.example.user_microservice.application.UnitTests; import com.example.user_microservice.application.usecase.DeleteUserUseCase; import com.example.user_microservice.domain.repository.UserRepository; diff --git a/src/test/java/com/example/user_microservice/usecase/GetUserByEmailUseCaseTest.java b/src/test/java/com/example/user_microservice/application/UnitTests/GetUserByEmailUseCaseTest.java similarity index 97% rename from src/test/java/com/example/user_microservice/usecase/GetUserByEmailUseCaseTest.java rename to src/test/java/com/example/user_microservice/application/UnitTests/GetUserByEmailUseCaseTest.java index 74ff000..1365c1c 100644 --- a/src/test/java/com/example/user_microservice/usecase/GetUserByEmailUseCaseTest.java +++ b/src/test/java/com/example/user_microservice/application/UnitTests/GetUserByEmailUseCaseTest.java @@ -1,4 +1,4 @@ -package com.example.user_microservice.usecase; +package com.example.user_microservice.application.UnitTests; import com.example.user_microservice.application.usecase.GetUserByEmailUseCase; import com.example.user_microservice.domain.model.Role; diff --git a/src/test/java/com/example/user_microservice/usecase/GetUserByIdUseCaseTest.java b/src/test/java/com/example/user_microservice/application/UnitTests/GetUserByIdUseCaseTest.java similarity index 97% rename from src/test/java/com/example/user_microservice/usecase/GetUserByIdUseCaseTest.java rename to src/test/java/com/example/user_microservice/application/UnitTests/GetUserByIdUseCaseTest.java index f3c0fe7..c41917d 100644 --- a/src/test/java/com/example/user_microservice/usecase/GetUserByIdUseCaseTest.java +++ b/src/test/java/com/example/user_microservice/application/UnitTests/GetUserByIdUseCaseTest.java @@ -1,4 +1,4 @@ -package com.example.user_microservice.usecase; +package com.example.user_microservice.application.UnitTests; import com.example.user_microservice.application.usecase.GetUserByIdUseCase; import com.example.user_microservice.domain.model.Role; diff --git a/src/test/java/com/example/user_microservice/usecase/SaveUserUseCaseTest.java b/src/test/java/com/example/user_microservice/application/UnitTests/SaveUserUseCaseTest.java similarity index 98% rename from src/test/java/com/example/user_microservice/usecase/SaveUserUseCaseTest.java rename to src/test/java/com/example/user_microservice/application/UnitTests/SaveUserUseCaseTest.java index 9d3c41f..7507046 100644 --- a/src/test/java/com/example/user_microservice/usecase/SaveUserUseCaseTest.java +++ b/src/test/java/com/example/user_microservice/application/UnitTests/SaveUserUseCaseTest.java @@ -1,9 +1,8 @@ -package com.example.user_microservice.usecase; +package com.example.user_microservice.application.UnitTests; +import com.example.user_microservice.application.usecase.SaveUserUseCase; import com.example.user_microservice.domain.model.Role; import com.example.user_microservice.domain.model.User; - -import com.example.user_microservice.application.usecase.SaveUserUseCase; import com.example.user_microservice.domain.repository.UserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/com/example/user_microservice/usecase/UpdateUserUseCaseTest.java b/src/test/java/com/example/user_microservice/application/UnitTests/UpdateUserUseCaseTest.java similarity index 98% rename from src/test/java/com/example/user_microservice/usecase/UpdateUserUseCaseTest.java rename to src/test/java/com/example/user_microservice/application/UnitTests/UpdateUserUseCaseTest.java index 296f53d..9ef3b96 100644 --- a/src/test/java/com/example/user_microservice/usecase/UpdateUserUseCaseTest.java +++ b/src/test/java/com/example/user_microservice/application/UnitTests/UpdateUserUseCaseTest.java @@ -1,9 +1,8 @@ -package com.example.user_microservice.usecase; +package com.example.user_microservice.application.UnitTests; +import com.example.user_microservice.application.usecase.UpdateUserUseCase; import com.example.user_microservice.domain.model.Role; import com.example.user_microservice.domain.model.User; - -import com.example.user_microservice.application.usecase.UpdateUserUseCase; import com.example.user_microservice.domain.repository.UserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/com/example/user_microservice/application/usecase/DeleteUserUseCaseTest.java b/src/test/java/com/example/user_microservice/application/usecase/DeleteUserUseCaseTest.java deleted file mode 100644 index ff0c87a..0000000 --- a/src/test/java/com/example/user_microservice/application/usecase/DeleteUserUseCaseTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.example.user_microservice.application.usecase; - -import com.example.user_microservice.domain.repository.UserRepository; -import org.junit.jupiter.api.BeforeEach; -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.UUID; - -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -class DeleteUserUseCaseTest { - - @Mock - private UserRepository userRepository; - - @InjectMocks - private DeleteUserUseCase deleteUserUseCase; - - private UUID userId; - - @BeforeEach - void setUp() { - userId = UUID.randomUUID(); - } - - @Test - @DisplayName("Debería eliminar el usuario cuando el ID es válido") - void shouldDeleteUserWhenIdIsValid() { - // Act - deleteUserUseCase.execute(userId); - - // Assert - verify(userRepository).deleteById(userId); - } - - -} diff --git a/src/test/java/com/example/user_microservice/application/usecase/GetUserByEmailUseCaseTest.java b/src/test/java/com/example/user_microservice/application/usecase/GetUserByEmailUseCaseTest.java deleted file mode 100644 index fc7e115..0000000 --- a/src/test/java/com/example/user_microservice/application/usecase/GetUserByEmailUseCaseTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.example.user_microservice.application.usecase; - -import com.example.user_microservice.domain.model.Role; -import com.example.user_microservice.domain.model.User; -import com.example.user_microservice.domain.repository.UserRepository; -import org.junit.jupiter.api.BeforeEach; -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.Date; -import java.util.Optional; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -class GetUserByEmailUseCaseTest { - - @Mock - private UserRepository userRepository; - - @InjectMocks - private GetUserByEmailUseCase getUserByEmailUseCase; - - private User testUser; - - @BeforeEach - void setUp() { - testUser = new User(); - testUser.setId(UUID.randomUUID()); - testUser.setFirstName("John"); - testUser.setLastName("Doe"); - testUser.setEmail("john.doe@gmail.com"); - testUser.setPassword("password123"); - testUser.setBornDate(new Date(90, 0, 1)); // 1 de enero de 1990 - testUser.setPhone("+57313652345"); - testUser.setAccessLevel(1); - testUser.setDepartment("Valle del Cauca"); - testUser.setCity("Buga"); - testUser.setAddress("Calle Principal 123"); - testUser.setPostalCode("12345"); - testUser.setRole(Role.CLIENT); - } - - @Test - @DisplayName("Debería retornar un usuario cuando el correo existe") - void shouldReturnUserWhenEmailExists() { - // Arrange - when(userRepository.findByEmail(testUser.getEmail())).thenReturn(Optional.of(testUser)); - - // Act - User result = getUserByEmailUseCase.execute(testUser.getEmail()); - - // Assert - assertNotNull(result); - assertEquals("john.doe@gmail.com", result.getEmail()); - assertEquals("John", result.getFirstName()); - assertEquals("Doe", result.getLastName()); - verify(userRepository, times(1)).findByEmail(testUser.getEmail()); - } - - @Test - @DisplayName("Debería retornar null cuando el correo no existe") - void shouldReturnNullWhenEmailDoesNotExist() { - // Arrange - String email = "no.exist@example.com"; - when(userRepository.findByEmail(email)).thenReturn(Optional.empty()); - - // Act - User result = getUserByEmailUseCase.execute(email); - - // Assert - assertNull(result); - verify(userRepository, times(1)).findByEmail(email); - } - - - -} diff --git a/src/test/java/com/example/user_microservice/application/usecase/GetUserByIdUseCaseTest.java b/src/test/java/com/example/user_microservice/application/usecase/GetUserByIdUseCaseTest.java deleted file mode 100644 index a42f37d..0000000 --- a/src/test/java/com/example/user_microservice/application/usecase/GetUserByIdUseCaseTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.example.user_microservice.application.usecase; - -import com.example.user_microservice.domain.model.Role; -import com.example.user_microservice.domain.model.User; -import com.example.user_microservice.domain.repository.UserRepository; -import org.junit.jupiter.api.BeforeEach; -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.Date; -import java.util.Optional; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -class GetUserByIdUseCaseTest { - - @Mock - private UserRepository userRepository; - - @InjectMocks - private GetUserByIdUseCase getUserByIdUseCase; - - private User testUser; - - @BeforeEach - void setUp() { - testUser = new User(); - testUser.setId(UUID.randomUUID()); - testUser.setFirstName("John"); - testUser.setLastName("Doe"); - testUser.setEmail("john.doe@gmail.com"); - testUser.setPassword("password123"); - testUser.setBornDate(new Date(90, 0, 1)); // 1 de enero de 1990 - testUser.setPhone("+57313652345"); - testUser.setAccessLevel(1); - testUser.setDepartment("Valle del Cauca"); - testUser.setCity("Buga"); - testUser.setAddress("Calle Principal 123"); - testUser.setPostalCode("12345"); - testUser.setRole(Role.CLIENT); - } - - @Test - @DisplayName("Debería retornar un usuario cuando el ID existe") - void shouldReturnUserWhenIdExists() { - // Arrange - UUID id = testUser.getId(); - when(userRepository.findById(id)).thenReturn(Optional.of(testUser)); - - // Act - User result = getUserByIdUseCase.execute(id); - - // Assert - assertNotNull(result); - assertEquals(testUser.getId(), result.getId()); - verify(userRepository).findById(id); - } - - @Test - @DisplayName("Debería retornar null cuando el ID no existe") - void shouldReturnNullWhenIdDoesNotExist() { - // Arrange - UUID randomId = UUID.randomUUID(); - when(userRepository.findById(randomId)).thenReturn(Optional.empty()); - - // Act - User result = getUserByIdUseCase.execute(randomId); - - // Assert - assertNull(result); - verify(userRepository).findById(randomId); - } - - -} diff --git a/src/test/java/com/example/user_microservice/application/usecase/SaveUserUseCaseTest.java b/src/test/java/com/example/user_microservice/application/usecase/SaveUserUseCaseTest.java deleted file mode 100644 index b407767..0000000 --- a/src/test/java/com/example/user_microservice/application/usecase/SaveUserUseCaseTest.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.example.user_microservice.application.usecase; - -import com.example.user_microservice.domain.model.Role; -import com.example.user_microservice.domain.model.User; -import com.example.user_microservice.domain.repository.UserRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.security.crypto.password.PasswordEncoder; - -import java.util.Date; -import java.util.Optional; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -class SaveUserUseCaseTest { - - @Mock - private UserRepository userRepository; - - @Mock - private PasswordEncoder passwordEncoder; - - @InjectMocks - private SaveUserUseCase saveUserUseCase; - - @Captor - private ArgumentCaptor userCaptor; - - private User testUser; - - @BeforeEach - void setUp() { - testUser = new User(); - testUser.setId(UUID.randomUUID()); - testUser.setFirstName("John"); - testUser.setLastName("Doe"); - testUser.setEmail("john.doe@gmail.com"); - testUser.setPassword("password123"); - testUser.setBornDate(new Date(90, 0, 1)); // 1 de enero de 1990 - testUser.setPhone("+57313652345"); - testUser.setAccessLevel(1); - testUser.setDepartment("Valle del Cauca"); - testUser.setCity("Buga"); - testUser.setAddress("Calle Principal 123"); - testUser.setPostalCode("12345"); - testUser.setRole(Role.CLIENT); - } - - @Test - @DisplayName("Debería guardar un usuario correctamente cuando el correo no existe") - void shouldSaveUserSuccessfully() { - // Arrange - String originalPassword = "password123"; - String encryptedPassword = "encrypted_password"; - when(userRepository.findByEmail(testUser.getEmail())).thenReturn(Optional.empty()); - when(passwordEncoder.encode(originalPassword)).thenReturn(encryptedPassword); - when(userRepository.save(any(User.class))).thenReturn(testUser); - - // Act - User savedUser = saveUserUseCase.execute(testUser); - - // Assert - assertNotNull(savedUser); - assertEquals(encryptedPassword, testUser.getPassword()); - verify(userRepository).findByEmail(testUser.getEmail()); - verify(passwordEncoder).encode(originalPassword); // Corregido: verificar con originalPassword - verify(userRepository).save(testUser); - } - - @Test - @DisplayName("Debería lanzar excepción cuando el correo ya existe") - void shouldThrowExceptionWhenEmailAlreadyExists() { - // Arrange - when(userRepository.findByEmail(testUser.getEmail())).thenReturn(Optional.of(new User())); - - // Act & Assert - IllegalArgumentException exception = assertThrows( - IllegalArgumentException.class, - () -> saveUserUseCase.execute(testUser) - ); - - assertEquals("El correo ya está registrado", exception.getMessage()); - verify(userRepository).findByEmail(testUser.getEmail()); - verify(passwordEncoder, never()).encode(anyString()); - verify(userRepository, never()).save(any(User.class)); - } - - @Test - @DisplayName("Debería encriptar la contraseña antes de guardar") - void shouldEncryptPasswordBeforeSaving() { - // Arrange - String originalPassword = "password123"; - String encryptedPassword = "encrypted_password"; - testUser.setPassword(originalPassword); - - when(userRepository.findByEmail(testUser.getEmail())).thenReturn(Optional.empty()); - when(passwordEncoder.encode(originalPassword)).thenReturn(encryptedPassword); - when(userRepository.save(any(User.class))).thenReturn(testUser); - - // Act - saveUserUseCase.execute(testUser); - - // Assert - assertEquals(encryptedPassword, testUser.getPassword()); - verify(passwordEncoder).encode(originalPassword); - } - - @Test - @DisplayName("Debería guardar con los datos correctos usando ArgumentCaptor") - void shouldSaveWithCorrectDataUsingArgumentCaptor() { - // Arrange - String originalPassword = "password123"; - String encryptedPassword = "encrypted_password"; - when(userRepository.findByEmail(anyString())).thenReturn(Optional.empty()); - when(passwordEncoder.encode(originalPassword)).thenReturn(encryptedPassword); - when(userRepository.save(any(User.class))).thenReturn(testUser); - - // Act - saveUserUseCase.execute(testUser); - - // Assert - verify(userRepository).save(userCaptor.capture()); - User capturedUser = userCaptor.getValue(); - - assertEquals(testUser.getFirstName(), capturedUser.getFirstName()); - assertEquals(testUser.getLastName(), capturedUser.getLastName()); - assertEquals(testUser.getEmail(), capturedUser.getEmail()); - assertEquals(encryptedPassword, capturedUser.getPassword()); - assertEquals(testUser.getRole(), capturedUser.getRole()); - } - - @Test - @DisplayName("Debería manejar caso nulo") - void shouldHandleNullInput() { - // Act & Assert - assertThrows( - NullPointerException.class, - () -> saveUserUseCase.execute(null) - ); - - verify(userRepository, never()).findByEmail(anyString()); - verify(passwordEncoder, never()).encode(anyString()); - verify(userRepository, never()).save(any(User.class)); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/user_microservice/application/usecase/UpdateUserUseCaseTest.java b/src/test/java/com/example/user_microservice/application/usecase/UpdateUserUseCaseTest.java deleted file mode 100644 index 7ec2337..0000000 --- a/src/test/java/com/example/user_microservice/application/usecase/UpdateUserUseCaseTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.example.user_microservice.application.usecase; - -import com.example.user_microservice.domain.model.Role; -import com.example.user_microservice.domain.model.User; -import com.example.user_microservice.domain.repository.UserRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.util.Date; -import java.util.Optional; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -class UpdateUserUseCaseTest { - - @Mock - private UserRepository userRepository; - - @InjectMocks - private UpdateUserUseCase updateUserUseCase; - - @Captor - private ArgumentCaptor userCaptor; - - private User existingUser; - private User updatedUser; - - @BeforeEach - void setUp() { - UUID userId = UUID.randomUUID(); - - existingUser = new User(); - existingUser.setId(userId); - existingUser.setFirstName("John"); - existingUser.setLastName("Doe"); - existingUser.setEmail("john.doe@gmail.com"); - existingUser.setPassword("password123"); - existingUser.setBornDate(new Date(90, 0, 1)); - existingUser.setPhone("+57313652345"); - existingUser.setAccessLevel(1); - existingUser.setDepartment("Valle del Cauca"); - existingUser.setCity("Buga"); - existingUser.setAddress("Calle Principal 123"); - existingUser.setPostalCode("12345"); - existingUser.setRole(Role.CLIENT); - - updatedUser = new User(); - updatedUser.setId(userId); - updatedUser.setFirstName("Johnny"); - updatedUser.setCity("Cali"); - updatedUser.setAccessLevel(2); // Será actualizado porque es diferente de 0 - } - - @Test - @DisplayName("Debería actualizar campos existentes correctamente") - void shouldUpdateFieldsSuccessfully() { - // Arrange - when(userRepository.findById(updatedUser.getId())).thenReturn(Optional.of(existingUser)); - when(userRepository.save(any(User.class))).thenAnswer(invocation -> invocation.getArgument(0)); - - // Act - User result = updateUserUseCase.execute(updatedUser); - - // Assert - assertNotNull(result); - assertEquals("Johnny", result.getFirstName()); - assertEquals("Doe", result.getLastName()); // No cambió - assertEquals("Cali", result.getCity()); - assertEquals(2, result.getAccessLevel()); - - verify(userRepository).save(userCaptor.capture()); - User savedUser = userCaptor.getValue(); - assertEquals("Johnny", savedUser.getFirstName()); - assertEquals("Cali", savedUser.getCity()); - } - - @Test - @DisplayName("Debería lanzar excepción si el usuario no existe") - void shouldThrowExceptionIfUserNotFound() { - // Arrange - when(userRepository.findById(updatedUser.getId())).thenReturn(Optional.empty()); - - // Act & Assert - IllegalArgumentException exception = assertThrows( - IllegalArgumentException.class, - () -> updateUserUseCase.execute(updatedUser) - ); - - assertEquals("Usuario no encontrado", exception.getMessage()); - verify(userRepository, never()).save(any()); - } - - @Test - @DisplayName("Debería ignorar campos nulos o no actualizables") - void shouldIgnoreNullOrUnchangeableFields() { - // Arrange - updatedUser.setFirstName(null); - updatedUser.setAccessLevel(0); // No se actualiza - when(userRepository.findById(updatedUser.getId())).thenReturn(Optional.of(existingUser)); - when(userRepository.save(any(User.class))).thenAnswer(invocation -> invocation.getArgument(0)); - - // Act - User result = updateUserUseCase.execute(updatedUser); - - // Assert - assertEquals("John", result.getFirstName()); // No se cambió - assertEquals(1, result.getAccessLevel()); // No se cambió - } -}