Files
adif-api-reverse-engineering/tests
Dasemu 68fac80520 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
2025-12-05 11:22:13 +01:00
..

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:

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:

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

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

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