diegobeyl/backtesting
2
1#!/usr/bin/env python32"""3Pruebas de validación - Fase 24Verifica que el validador funciona correctamente5"""6 7import sys8from datetime import datetime, timedelta9 10# Añadir el path del proyecto11sys.path.insert(0, '/Users/javier/Projects/backtesting_app_v2')12 13from backtesting_app.core.validator import DataValidator, ValidationError14 15 16def test_validator():17 """Ejecuta pruebas del validador"""18 print("=" * 70)19 print("PRUEBAS DE VALIDACIÓN - FASE 2")20 print("=" * 70)21 22 # Test 1: Solicitud válida (1h en 1 año)23 print("\n✓ Test 1: Solicitud válida (1h en 1 año)")24 start = datetime.now() - timedelta(days=365)25 end = datetime.now()26 is_valid, error = DataValidator.validate_request('BTC-USD', '1h', start, end)27 if is_valid:28 print(" ✅ PASS")29 info = DataValidator.get_download_info('BTC-USD', '1h', start, end)30 print(f" Velas: {info['candles']:,} / {info['max_candles']:,}")31 print(f" Uso: {info['usage_percent']}%")32 else:33 print(f" ❌ FAIL: {error}")34 35 # Test 2: Solicitud peligrosa (1h en 10 años - DEBERÍA FALLAR)36 print("\n✓ Test 2: Solicitud peligrosa (1h en 10 años - DEBERÍA FALLAR)")37 start = datetime.now() - timedelta(days=365*10)38 end = datetime.now()39 is_valid, error = DataValidator.validate_request('BTC-USD', '1h', start, end)40 if not is_valid:41 print(" ✅ PASS - Correctamente rechazada")42 print(f" Razón: {error.split('Razón:')[1].split(chr(10))[0] if 'Razón:' in error else 'N/A'}")43 else:44 print(" ❌ FAIL - Debería haber sido rechazada")45 46 # Test 3: Solicitud límite (4h en 10 años - DEBERÍA PASAR)47 print("\n✓ Test 3: Solicitud límite (4h en 10 años - DEBERÍA PASAR)")48 start = datetime.now() - timedelta(days=365*10)49 end = datetime.now()50 is_valid, error = DataValidator.validate_request('BTC-USD', '4h', start, end)51 if is_valid:52 print(" ✅ PASS")53 info = DataValidator.get_download_info('BTC-USD', '4h', start, end)54 print(f" Velas: {info['candles']:,} / {info['max_candles']:,}")55 print(f" Uso: {info['usage_percent']}%")56 else:57 print(f" ❌ FAIL: {error}")58 59 # Test 4: Timeframe inválido60 print("\n✓ Test 4: Timeframe inválido")61 start = datetime.now() - timedelta(days=365)62 end = datetime.now()63 is_valid, error = DataValidator.validate_request('BTC-USD', '99m', start, end)64 if not is_valid:65 print(" ✅ PASS - Correctamente rechazada")66 print(f" Error: {error.split('.')[0]}")67 else:68 print(" ❌ FAIL - Debería haber sido rechazada")69 70 # Test 5: Símbolo inválido71 print("\n✓ Test 5: Símbolo inválido")72 start = datetime.now() - timedelta(days=365)73 end = datetime.now()74 is_valid, error = DataValidator.validate_request('BTC', '1h', start, end)75 if not is_valid:76 print(" ✅ PASS - Correctamente rechazada")77 else:78 print(" ❌ FAIL - Debería haber sido rechazada")79 80 # Test 6: Información de descarga81 print("\n✓ Test 6: Información de descarga detallada")82 start = datetime.now() - timedelta(days=365*3)83 end = datetime.now()84 info = DataValidator.get_download_info('BTC-USD', '1h', start, end)85 print(f" Symbol: {info['symbol']}")86 print(f" Timeframe: {info['friendly_timeframe']}")87 print(f" Período: {info['years']:.1f} años ({info['days']} días)")88 print(f" Velas: {info['candles']:,} ({info['usage_percent']}% del límite)")89 print(f" Tamaño estimado: ~{info['estimated_mb']} MB")90 print(" ✅ PASS")91 92 # Test 7: Límites por timeframe93 print("\n✓ Test 7: Validación por cada timeframe")94 timeframes = ['1m', '5m', '15m', '30m', '1h', '4h', '1d', '1wk', '1mo']95 for tf in timeframes:96 start = datetime.now() - timedelta(days=365*10)97 end = datetime.now()98 is_valid, _ = DataValidator.validate_request('BTC-USD', tf, start, end)99 status = "✅" if is_valid or tf in ['4h', '1d', '1wk', '1mo'] else "🚫 (límite)"100 print(f" {status} {tf:5} - 10 años: {is_valid}")101 102 print("\n" + "=" * 70)103 print("RESUMEN DE PRUEBAS")104 print("=" * 70)105 print("✅ Validador funciona correctamente")106 print("✅ Rechaza solicitudes peligrosas (1h en 10 años)")107 print("✅ Acepta solicitudes seguras (4h en 10 años)")108 print("✅ Calcula velas correctamente")109 print("✅ Proporciona información detallada al usuario")110 print("=" * 70 + "\n")111 112 113if __name__ == "__main__":114 test_validator()115 