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:
2025-12-05 11:22:13 +01:00
parent aa02d7c896
commit 68fac80520
42 changed files with 66402 additions and 4876 deletions

160
tests/README.md Normal file
View 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