🔌 Adapter - EmilioCrespoPeran/pattern-designs GitHub Wiki

📚 Descripción del patrón

El patrón Adapter permite adaptar la interfaz de una clase existente a otra esperada por el cliente. Útil cuando necesitas integrar servicios o librerías con interfaces incompatibles.

🧩 Enunciado del ejercicio

Supón que tienes dos servicios de pago externos: StripeService y PayUService, cada uno con métodos distintos para procesar pagos.

Tareas:

  • Crea una interfaz común ProcesadorPago con método String procesarPago(double monto).

  • Implementa dos adaptadores:

    • StripeAdapter adapta StripeService.charge().
    • PayUAdapter adapta PayUService.realizarPago().

Objetivo: Usar ambas pasarelas de pago sin que el cliente sepa cómo están implementadas.

public class PayUService {
    public String realizarPago(double cantidadEnPesos) {
        return "Pago realizado en PayU por $" + cantidadEnPesos;
    }
}
public class StripeService {
    public boolean charge(double amountUSD) {
        System.out.println("Stripe procesó el pago de $" + amountUSD);
        return true;
    }
}

🧪 Test

@SpringBootTest
public class PayUAdapterTests {

    @Test
    void debeProcesarPagoUsandoPayU() {
        ProcesadorPago procesador = new PayUAdapter(new PayUService());
        String resultado = procesador.procesarPago(250.00);

        assertNotNull(resultado);
        assertTrue(resultado.contains("PayU"));
        assertEquals("Pago realizado en PayU por $250.0", resultado);
    }

    @Test
    void debeProcesarPagoUsandoStripe() {
        ProcesadorPago procesador = new StripeAdapter(new StripeService());
        String resultado = procesador.procesarPago(150.00);

        assertNotNull(resultado);
        assertEquals("Pago procesado exitosamente en Stripe: $150.0", resultado);
    }

    @Test
    void debePermitirUsoPolimorficoDelAdapter() {
        ProcesadorPago payU = new PayUAdapter(new PayUService());
        ProcesadorPago stripe = new StripeAdapter(new StripeService());

        assertEquals("Pago realizado en PayU por $100.0", payU.procesarPago(100.00));
        assertEquals("Pago procesado exitosamente en Stripe: $100.0", stripe.procesarPago(100.00));
    }

    @Test
    void debeRetornarMensajeErrorSiStripeFalla() {
        ProcesadorPago procesador = new StripeAdapter(new StripeService() {
            @Override
            public boolean charge(double amountUSD) {
                return false; // simula fallo
            }
        });

        String resultado = procesador.procesarPago(75.00);
        assertEquals("Error al procesar pago con Stripe", resultado);
    }
    
}