Esta actualización reorganiza el proyecto de reverse engineering de la API de ADIF con los siguientes cambios: Estructura del proyecto: - Movida documentación principal a carpeta docs/ - Consolidados archivos markdown redundantes en CLAUDE.md (contexto completo del proyecto) - Organización de tests en carpeta tests/ con README explicativo - APK renombrado de base.apk a adif.apk para mayor claridad Archivos de código: - Movidos adif_auth.py y adif_client.py a la raíz (antes en api_testing_scripts/) - Eliminados scripts de testing obsoletos y scripts de Frida no utilizados - Nuevos tests detallados: test_endpoints_detailed.py y test_onepaths_with_real_trains.py Descubrimientos: - Documentados nuevos hallazgos en docs/NEW_DISCOVERIES.md - Actualización de onePaths funcionando con commercialNumber real (devuelve 200) - Extraídos 1587 códigos de estación en station_codes.txt Configuración: - Actualizado .gitignore con mejores patrones para Python e IDEs - Eliminados archivos temporales de depuración y logs
161 lines
4.4 KiB
Markdown
161 lines
4.4 KiB
Markdown
# 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
|