# Prueba y depura tu integración

Esta guía describe las mejores prácticas para depurar tu integración con `redsys-tpv-business-lib` y ejecutar pruebas automatizadas en dispositivos físicos.

## Habilitar logs de depuración (Timber)

El Get Smart SDK integra la biblioteca **Timber** para facilitar la trazabilidad y la depuración. Para ver los logs internos del SDK en el Logcat de Android Studio, debes "plantar" (plant) un Debug Tree cuando se inicie tu aplicación.

### Configuración

Añade la configuración de Timber al método `onCreate` de tu clase `Application`.

```kotlin
@HiltAndroidApp
class Application : Application() {

    override fun onCreate() {
        super.onCreate()

        // Plant the debug tree only in Debug builds
        if (BuildConfig.DEBUG) {
            Timber.plant(Timber.DebugTree())
        }
    }
}
```

Una vez configurado, verás las operaciones detalladas del SDK en el Logcat, lo cual es esencial para diagnosticar un `ProtocolError` o problemas de conexión.

## Ejecutar pruebas en dispositivos físicos

El SDK está diseñado para ser probado utilizando **AndroidJUnit4**. Debido a que la biblioteca depende de la aplicación **Get Smart SDK Payment Service** (que interactúa con hardware seguro específico y conexiones de host), **no puedes ejecutar estas pruebas en un Android Emulator estándar**. Debes utilizar un dispositivo TPV físico.

### **Requisitos Previos**

1. **TPV Físico**: Un dispositivo Android certificado por Redsys/Getnet.  
2. **Instalación del Servicio**: La aplicación Get Smart SDK Payment Service debe estar instalada y en ejecución en el dispositivo.  
3. **Test Runner**: Tu proyecto debe estar configurado para ejecutar pruebas instrumentadas (androidTest).

### Ejemplo: Prueba de inicialización

Esta prueba valida que tu aplicación pueda conectarse correctamente al servicio y recuperar la configuración del terminal.

```kotlin
@Test
fun executeInitTpv() = runTest {
    // 1. Get the Context
    val appContext = InstrumentationRegistry.getInstrumentation().targetContext

    // 2. Instantiate the repository manually (bypassing Dagger for this isolated test)
    val initializationRepository = PsaInitializationRepository.newInstance(appContext)

    // 3. Execute Initialization
    val result = initializationRepository.initTpv()

    // 4. Validate results
    println("TPV Info: $result")
    assert(result is RepositoryResult.Success)
}
```

### Ejemplo: Prueba de pago

Esta prueba realiza una transacción real. Utiliza una tarjeta de prueba o un importe nominal (por ejemplo, 1.00€).

```kotlin
@Test
fun executePayment() = runTest {
    val appContext = InstrumentationRegistry.getInstrumentation().targetContext

    // Initialize first
    val initializationRepository = PsaInitializationRepository.newInstance(appContext)
    initializationRepository.initTpv()

    val paymentRepository = PsaPaymentRepository.newInstance(appContext)

    // Execute Payment
    val result = paymentRepository.makePayment(
        amount = Money(BigDecimal("1.00"), Currency.getInstance("EUR"))
    )

    println("Payment Result: $result")

    // Assert Success
    assert(result is RepositoryResult.Success)
}
```

### Ejemplo: Prueba de historial de transacciones

Esta prueba valida que puedes recuperar el historial del día actual.

```kotlin
@Test
fun getTransactions() = runTest {
    val appContext = InstrumentationRegistry.getInstrumentation().targetContext
    val transactionRepository = PsaTransactionRepository.newInstance(appContext)

    // Define query range (Today)
    val calendar = Calendar.getInstance()
    val endDate = calendar.time
    calendar.set(Calendar.HOUR_OF_DAY, 0)
    val initDate = calendar.time

    val result = transactionRepository.getTransactions(
        initDate = initDate,
        endDate = endDate
    )

    if (result is RepositoryResult.Success) {
        println("Found ${result.data.transactionList.size} transactions")
    } else {
        println("Error fetching transactions: $result")
    }
}
```

## Resumen

* **Logs**: Utiliza `Timber.plant(Timber.DebugTree())` para habilitar los logs detallados (verbose) del SDK.  
* **Hardware**: Las pruebas deben ejecutarse en hardware físico con el servicio instalado.  
* **Framework**: Utiliza `AndroidJUnit4` y `runTest` para el soporte de corrutinas en las pruebas.