# Tests - ADIF API

Scripts de prueba para validar la funcionalidad de la API de ADIF.

## 🧪 Tests Activos

### test_endpoints_detailed.py
Test exhaustivo de todos los endpoints con información de debug completa.

**Características**:
- Muestra status codes, headers y respuesta JSON
- Prueba múltiples variaciones de payload
- Identifica errores 400, 401 y sus causas
- Útil para debugging de nuevos endpoints

**Uso**:
```bash
python3 tests/test_endpoints_detailed.py
```

**Salida esperada**:
- Información detallada de cada petición
- Análisis de errores con mensajes del servidor
- Diferenciación entre errores de payload vs permisos

---

### test_onepaths_with_real_trains.py
Test funcional que obtiene trenes reales y prueba el endpoint `onepaths`.

**Características**:
- Consulta `departures` para obtener trenes circulando
- Extrae `commercialNumber`, `launchingDate`, códigos de estación
- Prueba `onepaths` con datos reales
- Valida que el endpoint funciona correctamente

**Uso**:
```bash
python3 tests/test_onepaths_with_real_trains.py
```

**Requisitos**:
- Ejecutar durante el día (cuando hay trenes circulando)
- Si se ejecuta de noche/madrugada puede no encontrar trenes

**Salida esperada**:
```
======================================================================
PASO 1: Obteniendo trenes reales de Madrid Atocha
======================================================================
✅ Obtenidos 25 trenes

======================================================================
PASO 2: Probando onePaths con trenes reales
======================================================================
✅ SUCCESS! onePaths funciona con datos reales
```

---

## 📁 Tests Archivados

La carpeta `archived/` contiene tests antiguos que fueron útiles durante el desarrollo pero ya no son necesarios:

- `test_all_endpoints.py` - Versión simple sin debug
- `test_complete_bodies.py` - Pruebas de payloads completos
- `test_corrected_api.py` / `test_corrected_api_v2.py` - Versiones anteriores
- `test_real_auth.py` - Tests de autenticación básicos
- `test_simple.py` - Test minimalista
- `test_with_auth_headers.py` - Validación de headers
- `test_without_auth.py` - Test sin autenticación
- `debug_auth.py` - Debug del algoritmo HMAC

Estos tests se mantienen por si son útiles como referencia, pero los tests activos son más completos.

---

## 🔧 Estructura de un Test

### Template Básico

```python
from adif_auth import AdifAuthenticator
import requests
import uuid

ACCESS_KEY = "and20210615"
SECRET_KEY = "Jthjtr946RTt"

def test_endpoint():
    auth = AdifAuthenticator(access_key=ACCESS_KEY, secret_key=SECRET_KEY)

    url = "https://circulacion.api.adif.es/portroyalmanager/secure/..."
    payload = {
        # Tu payload aquí
    }

    user_id = str(uuid.uuid4())
    headers = auth.get_auth_headers("POST", url, payload, user_id=user_id)
    headers["User-key"] = auth.USER_KEY_CIRCULATION

    response = requests.post(url, json=payload, headers=headers, timeout=10)

    assert response.status_code == 200
    print(f"✅ Test passed: {response.json()}")

if __name__ == "__main__":
    test_endpoint()
```

### Análisis de Status Codes

```python
if response.status_code == 200:
    print("✅ SUCCESS - Endpoint funcional")
    data = response.json()

elif response.status_code == 204:
    print("⚠️ NO CONTENT - Autenticación correcta pero sin datos")

elif response.status_code == 400:
    print("❌ BAD REQUEST - Payload incorrecto")
    print(f"Error: {response.json()}")

elif response.status_code == 401:
    print("❌ UNAUTHORIZED - Sin permisos")
    print(f"Error: {response.json()}")
```

---

## 📊 Resultados Esperados

### Endpoints Funcionales (200)
- `/departures/traffictype/`
- `/arrivals/traffictype/`
- `/onepaths/` (con commercialNumber real)
- `/stationsobservations/`

### Endpoints Bloqueados (401)
- `/betweenstations/traffictype/`
- `/onestation/`
- `/severalpaths/`
- `/compositions/path/`

---

## 💡 Tips para Crear Nuevos Tests

1. **Usar `test_endpoints_detailed.py` como base** - Tiene buen manejo de errores
2. **Validar timestamps** - Usar milisegundos, no segundos
3. **Probar con datos reales** - Como hace `test_onepaths_with_real_trains.py`
4. **Diferenciar errores**:
   - 400 = Payload incorrecto → Revisar campos
   - 401 = Sin permisos → Las claves no tienen acceso
   - 204 = Sin datos → Autenticación OK, pero respuesta vacía

---

**Última actualización**: 2025-12-05
