🏛️ Facade - EmilioCrespoPeran/pattern-designs GitHub Wiki

📚 Descripción del patrón

El patrón Facade proporciona una interfaz unificada y simplificada a un conjunto de interfaces más complejas.

🧩 Enunciado del ejercicio

En una biblioteca digital hay múltiples servicios: ServicioLibros, ServicioUsuarios, ServicioPrestamos, ServicioNotificaciones.

Tareas:

  • Crea una clase BibliotecaFacade que simplifique el préstamo de un libro:
    • Verifica disponibilidad del libro.
    • Verifica si el usuario está activo.
    • Registra el préstamo.
    • Envía notificación.

Método principal: String prestarLibro(String tituloLibro, String idUsuario)

Debe devolver mensajes claros según el estado del proceso.

🛠️ Clases base

Las clases base para el ejercicio las puedes descargar de src/main/java/es/cresdev/patterns/facade/biblioteca/servicios

🧪 Test

@SpringBootTest
public class FacadeBibliotecaTests {

    private BibliotecaFacade facade;

    @BeforeEach
    void setUp() {
        facade = new BibliotecaFacade(
                new ServicioLibrosDummy(),
                new ServicioPrestamosDummy(),
                new ServicioUsuariosDummy(),
                new ServicioNotificacionesDummy()
        );
    }

    @Test
    void deberiaPrestarLibroCuandoTodoEsCorrecto() {
        String resultado = facade.prestarLibro("Clean Code", "user001");
        assertEquals("Préstamo completado para el libro: Clean Code", resultado);
    }

    @Test
    void noDeberiaPrestarLibroCuandoNoEstaDisponible() {
        String resultado = facade.prestarLibro("LibroInexistente", "user002");
        assertEquals("El libro LibroInexistente no está disponible", resultado);
    }

    @Test
    void noDeberiaPrestarLibroSiUsuarioNoEstaActivo() {
        String resultado = facade.prestarLibro("Clean Code", "inactivo123");
        assertEquals("El usuario inactivo123 no está activo", resultado);
    }

    @Test
    void noDeberiaPrestarLibroSiFallaRegistroPrestamo() {
        String resultado = facade.prestarLibro("Fallo", "user004");
        assertEquals("Error al registrar el préstamo", resultado);
    }

    @Test
    void deberiaPrestarLibroPeroFallaNotificacion() {
        String resultado = facade.prestarLibro("Kafka en la orilla", "noNotificar");
        assertEquals("Préstamo completado para el libro: Kafka en la orilla (pero no se pudo notificar al usuario)", resultado);
    }

}