Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Sugerencia] Otra opcion by gemini.io

package med.voll.api.domain.consulta.validaciones;

import jakarta.validation.ValidationException;
import med.voll.api.domain.consulta.dto.DatosAgendarConsulta;
import org.springframework.stereotype.Component;

import java.time.DayOfWeek;

@Component
public class HorarioDeFuncionamientoClinica implements ValidadorDeConsultas{
    public void validar(DatosAgendarConsulta datos) {

        var domingo = DayOfWeek.SUNDAY.equals(datos.fecha().getDayOfWeek());

        var antesdDeApertura=datos.fecha().getHour()<7;
        var despuesDeCierre=datos.fecha().getHour() >=19;
        if(domingo || antesdDeApertura || despuesDeCierre){
            throw  new ValidationException("El horario de atención de la clínica es de lunes a sábado, de 07:00 a 19:00 horas");
        }
    }
}
package med.voll.api.domain.consulta.validaciones;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

import java.time.LocalDateTime;

import jakarta.validation.ValidationException;
import med.voll.api.domain.consulta.dto.DatosAgendarConsulta;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;


class HorarioDeFuncionamientoClinicaTest {

    private HorarioDeFuncionamientoClinica validador;
    private DatosAgendarConsulta datos;

    @BeforeEach
    void setup() {
        validador = new HorarioDeFuncionamientoClinica();
        datos = mock(DatosAgendarConsulta.class); // Mockeamos el DTO de entrada
    }

   

    @Test
    @DisplayName("Debería lanzar excepción antes de las 7:00 AM")
    void validarEscenarioAntesApertura() {
        var lunesMuyTemprano = LocalDateTime.now().with(java.time.temporal.TemporalAdjusters.next(java.time.DayOfWeek.MONDAY)).withHour(6);
        when(datos.fecha()).thenReturn(lunesMuyTemprano);

        assertThrows(ValidationException.class, () -> validador.validar(datos));
    }

    @Test
    @DisplayName("Debería lanzar excepción después de las 7:00 PM")
    void validarEscenarioDespuesCierre() {
        var lunesMuyTarde = LocalDateTime.now().with(java.time.temporal.TemporalAdjusters.next(java.time.DayOfWeek.MONDAY)).withHour(20);
        when(datos.fecha()).thenReturn(lunesMuyTarde);

        assertThrows(ValidationException.class, () -> validador.validar(datos));
    }

    @Test
    @DisplayName("Debería permitir agendar exactamente a las 07:00:00")
    void validarEscenarioHoraExactaApertura() {
        // Un lunes a las 07:00:00
        var lunesSieteAM = LocalDateTime.now()
                .with(java.time.temporal.TemporalAdjusters.next(java.time.DayOfWeek.MONDAY))
                .withHour(7).withMinute(0).withSecond(0);

        when(datos.fecha()).thenReturn(lunesSieteAM);

        assertDoesNotThrow(() -> validador.validar(datos));
    }

    @Test
    @DisplayName("Debería lanzar excepción si los datos o la fecha son nulos")
    void validarEscenarioNulo() {
        // Caso 1: Datos es null
        assertThrows(NullPointerException.class, () -> validador.validar(null));

        // Caso 2: La fecha dentro de datos es null
        when(datos.fecha()).thenReturn(null);
        assertThrows(NullPointerException.class, () -> validador.validar(datos));
    }

    @ParameterizedTest
    @ValueSource(ints = {0, 5, 6, 20, 23}) // Horas inválidas
    @DisplayName("Debería fallar para todas las horas fuera del rango 7-19")
    void validarHorariosInvalidosParametrizados(int hora) {
        var fechaInvalida = LocalDateTime.now()
                .with(java.time.temporal.TemporalAdjusters.next(java.time.DayOfWeek.MONDAY))
                .withHour(hora);

        when(datos.fecha()).thenReturn(fechaInvalida);

        assertThrows(ValidationException.class, () -> validador.validar(datos));
    }

    @Test
    void verificarInteraccion() {
        var fecha = LocalDateTime.now().withHour(10);
        when(datos.fecha()).thenReturn(fecha);

        validador.validar(datos);

        // Verifica que el método fecha() fue invocado al menos una vez
        verify(datos, atLeastOnce()).fecha();
    }
}
1 respuesta

Hola Christian, espero que estés bien

¡Gracias por compartir tu código y tu pregunta! Parece que ya has cubierto varios escenarios de prueba para validar el horario de funcionamiento de la clínica. Sin embargo, siempre es bueno considerar otros casos de borde para asegurarnos de que la validación sea lo más completa posible.

Aquí te dejo algunas sugerencias de escenarios adicionales que podrías considerar:

  1. Consulta en el último minuto de operación: Asegúrate de que una consulta programada exactamente a las 18:59 sea aceptada. Esto es importante para verificar que el límite superior del horario de atención sea correcto.

  2. Consulta justo después del cierre: Aunque mencionas que ya has probado con las 19:01, verifica también con segundos, como las 19:00:01, para asegurarte de que el sistema rechaza correctamente cualquier consulta fuera del horario.

  3. Consulta en la medianoche: Aunque es poco probable que alguien intente agendar una consulta a medianoche, es un buen caso de borde para asegurarse de que el sistema lo maneja correctamente.

  4. Consulta en el primer minuto del día: Similar al caso anterior, verifica cómo el sistema maneja una consulta programada a las 00:01.

  5. Días festivos: Aunque mencionaste que no estás interesado en validar días festivos, si en algún momento decides incluir esta funcionalidad, sería bueno tener pruebas que verifiquen que las consultas no se pueden agendar en esos días.

Recuerda que al implementar estos casos de prueba, es importante asegurarse de que los mensajes de error sean claros y consistentes, como has mencionado en tu descripción.

Espero que estas sugerencias te sean útiles y que puedas implementarlas para robustecer aún más tus pruebas. ¡Espero haber ayudado y buenos estudios!