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;
@BeforeEach
void setUp() {
validador = new HorarioDeFuncionamientoClinica();
}
@Test
void validar_fechaDentroDelHorario_noLanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 10, 0)); // Miércoles 10:00 AM
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datos));
}
@Test
void validar_fechaAntesDeApertura_lanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 6, 0)); // Miércoles 6:00 AM
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datos));
}
@Test
void validar_fechaDespuesDeCierre_lanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 20, 0)); // Miércoles 8:00 PM
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datos));
}
@Test
void validar_fechaEnDomingo_lanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(LocalDateTime.of(2025, 1, 19, 10, 0)); // Domingo 10:00 AM
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datos));
}
@Test
void validar_fechaNula_lanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(null);
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datos));
}
@Test
void validar_fechaExactamenteHoraDeApertura_noLanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 7, 0)); // Lunes 7:00 AM
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datos));
}
@Test
void validar_fechaExactamenteHoraDeCierre_noLanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 19, 0)); // Lunes 7:00 PM
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datos));
}
@Test
void validar_fechaEnElPasado_noLanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(LocalDateTime.of(2020, 1, 15, 10, 0)); // Miércoles en el pasado
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datos));
}
@Test
void validar_fechaInmediatamenteDespuesDeApertura_noLanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 7, 1)); // Lunes 7:01 AM
// Act & Assert
assertDoesNotThrow(() -> validador.validar(datos));
}
@Test
void validar_fechaInmediatamenteDespuesDeCierre_lanzaExcepcion() {
// Arrange
DatosAgendarConsulta datos = Mockito.mock(DatosAgendarConsulta.class);
Mockito.when(datos.fecha()).thenReturn(LocalDateTime.of(2025, 1, 15, 19, 1)); // Lunes 7:01 PM
// Act & Assert
assertThrows(ValidationException.class, () -> validador.validar(datos));
}
}