package med.voll.api.domain.consulta.validaciones;
import jakarta.validation.ValidationException; import med.voll.api.domain.consulta.dto.DatosAgendarConsulta; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito;
import java.time.LocalDateTime;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows;
class HorarioDeFuncionamientoClinicaTest {
private HorarioDeFuncionamientoClinica validador;
private DatosAgendarConsulta datosMock;
@BeforeEach
void setUp() {
validador = new HorarioDeFuncionamientoClinica();
datosMock = Mockito.mock(DatosAgendarConsulta.class); // Crear el mock una sola vez
}
@Test
void validar_citaDentroDelHorario_noLanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 10, 0)); // Miércoles 10:00 AM
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datosMock),
"Una cita dentro del horario de atención no debería lanzar una excepción.");
}
@Test
void validar_citaAntesDeApertura_lanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 6, 0)); // Miércoles 6:00 AM
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datosMock),
"Una cita antes de la hora de apertura debería lanzar una excepción.");
}
@Test
void validar_citaDespuesDeCierre_lanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 20, 0)); // Miércoles 8:00 PM
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datosMock),
"Una cita después de la hora de cierre debería lanzar una excepción.");
}
@Test
void validar_citaEnDomingo_lanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(LocalDateTime.of(2025, 1, 19, 10, 0)); // Domingo 10:00 AM
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datosMock),
"Una cita en domingo debería lanzar una excepción.");
}
@Test
void validar_fechaNula_lanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(null);
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datosMock),
"Una cita con fecha nula debería lanzar una excepción.");
}
@Test
void validar_citaExactamenteHoraDeApertura_noLanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 7, 0)); // Miércoles 7:00 AM
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datosMock),
"Una cita a la hora exacta de apertura no debería lanzar una excepción.");
}
@Test
void validar_citaExactamenteHoraDeCierre_noLanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 19, 0)); // Miércoles 7:00 PM
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datosMock),
"Una cita a la hora exacta de cierre no debería lanzar una excepción.");
}
@Test
void validar_citaEnElPasado_noLanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(LocalDateTime.of(2020, 1, 15, 10, 0)); // Miércoles en el pasado
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datosMock),
"Una cita en el pasado no debería lanzar una excepción según las reglas actuales.");
}
@Test
void validar_citaInmediatamenteDespuesDeApertura_noLanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 7, 1)); // Miércoles 7:01 AM
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datosMock),
"Una cita justo después de la hora de apertura no debería lanzar una excepción.");
}
@Test
void validar_citaInmediatamenteDespuesDeCierre_lanzaExcepcion() {
// Arrange
Mockito.when(datosMock.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 19, 1)); // Miércoles 7:01 PM
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datosMock),
"Una cita justo después de la hora de cierre debería lanzar una excepción.");
}
}