Refactor: reorganización completa del proyecto y documentación consolidada
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
This commit is contained in:
160
tests/README.md
Normal file
160
tests/README.md
Normal file
@@ -0,0 +1,160 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user