# Teste e Depure Sua Integração

Este guia descreve as melhores práticas para depurar sua integração com a `redsys-tpv-business-lib` e executar testes automatizados em dispositivos físicos.

## Habilitando Logs de Depuração (Timber)

O Get Smart SDK integra a biblioteca **Timber** para facilitar a rastreabilidade e depuração. Para visualizar os logs internos do SDK no Logcat do Android Studio, você deve "plantar" (plant) uma Debug Tree quando sua aplicação iniciar.

### Configuração

Adicione a configuração do Timber ao método `onCreate` da sua classe `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())
        }
    }
}
```

Uma vez configurado, você verá as operações detalhadas do SDK no Logcat, o que é essencial para diagnosticar um `ProtocolError` ou problemas de conexão.

## Executando Testes em Dispositivos Físicos

O SDK foi projetado para ser testado usando **AndroidJUnit4**. Como a biblioteca depende do aplicativo **Get Smart SDK Payment Service** (que interage com hardwares seguros específicos e conexões de host), **você não pode executar esses testes em um Android Emulator padrão**. Você deve usar um dispositivo TPV físico.

### **Pré-requisitos**

1. **TPV Físico**: Um dispositivo Android certificado pela Redsys/Getnet.  
2. **Instalação do Serviço**: O aplicativo Get Smart SDK Payment Service deve estar instalado e em execução no dispositivo.  
3. **Test Runner**: Seu projeto deve estar configurado para executar testes instrumentados (androidTest).

### Exemplo: Teste de Inicialização

Este teste valida se o seu aplicativo consegue se conectar com sucesso ao serviço e recuperar a configuração do 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)
}
```

### Exemplo: Teste de Pagamento

Este teste realiza uma transação real. Use um cartão de teste ou um valor nominal (por exemplo, 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)
}
```

### Exemplo: Teste de Histórico de Transações

Este teste valida se você consegue recuperar o histórico do dia atual.

```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")
    }
}
```

## Resumo

* **Logs**: Use `Timber.plant(Timber.DebugTree())` para habilitar logs detalhados (verbose) do SDK.  
* **Hardware**: Os testes devem ser executados em hardware físico com o serviço instalado.  
* **Framework**: Use `AndroidJUnit4` e `runTest` para suporte a coroutines nos testes.